blob: 91015d7257a9f0e0bf79c3a81863da2f6395fa27 [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
2 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
Michael Lentine0a369f62016-02-03 16:51:46 -06005 * Copyright (c) 2015-2016 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>
Karl Schultz6addd812016-02-02 17:17:23 -070021 */
Tony Barbour65c48b32015-11-17 10:02:56 -070022
Cody Northrop8e54a402016-03-08 22:25:52 -070023#ifdef ANDROID
24#include "vulkan_wrapper.h"
25#else
David Pinedo9316d3b2015-11-06 12:54:48 -070026#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070027#endif
Cody Northrop1242dfd2016-07-13 17:24:59 -060028
29#if defined(ANDROID) && defined(VALIDATION_APK)
30#include <android/log.h>
31#include <android_native_app_glue.h>
32#endif
33
Jon Ashburn7fa7e222016-02-02 12:08:10 -070034#include "icd-spv.h"
Mark Lobodzinskice751c62016-09-08 10:45:35 -060035#include "test_common.h"
36#include "vk_layer_config.h"
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060037#include "vk_validation_error_messages.h"
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060038#include "vkrenderframework.h"
39#include <limits.h>
40#include <unordered_set>
Tony Barbour300a6082015-04-07 13:44:53 -060041
Mark Lobodzinski3780e142015-05-14 15:08:13 -050042#define GLM_FORCE_RADIANS
43#include "glm/glm.hpp"
44#include <glm/gtc/matrix_transform.hpp>
45
Dustin Gravesffa90fa2016-05-06 11:20:38 -060046#define PARAMETER_VALIDATION_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060047#define MEM_TRACKER_TESTS 1
48#define OBJ_TRACKER_TESTS 1
49#define DRAW_STATE_TESTS 1
50#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120051#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060052#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060053#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060054
Mark Lobodzinski3780e142015-05-14 15:08:13 -050055//--------------------------------------------------------------------------------------
56// Mesh and VertexFormat Data
57//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070058struct Vertex {
59 float posX, posY, posZ, posW; // Position data
60 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050061};
62
Karl Schultz6addd812016-02-02 17:17:23 -070063#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050064
65typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070066 BsoFailNone = 0x00000000,
67 BsoFailLineWidth = 0x00000001,
68 BsoFailDepthBias = 0x00000002,
69 BsoFailViewport = 0x00000004,
70 BsoFailScissor = 0x00000008,
71 BsoFailBlend = 0x00000010,
72 BsoFailDepthBounds = 0x00000020,
73 BsoFailStencilReadMask = 0x00000040,
74 BsoFailStencilWriteMask = 0x00000080,
75 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060076 BsoFailCmdClearAttachments = 0x00000200,
Tobin Ehlis379ba3b2016-07-19 11:22:29 -060077 BsoFailIndexBuffer = 0x00000400,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050078} BsoFailSelect;
79
80struct vktriangle_vs_uniform {
81 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070082 float mvp[4][4];
83 float position[3][4];
84 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050085};
86
Mark Lobodzinskice751c62016-09-08 10:45:35 -060087static const char bindStateVertShaderText[] = "#version 450\n"
88 "vec2 vertices[3];\n"
89 "out gl_PerVertex {\n"
90 " vec4 gl_Position;\n"
91 "};\n"
92 "void main() {\n"
93 " vertices[0] = vec2(-1.0, -1.0);\n"
94 " vertices[1] = vec2( 1.0, -1.0);\n"
95 " vertices[2] = vec2( 0.0, 1.0);\n"
96 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
97 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050098
Mark Lobodzinskice751c62016-09-08 10:45:35 -060099static const char bindStateFragShaderText[] = "#version 450\n"
100 "\n"
101 "layout(location = 0) out vec4 uFragColor;\n"
102 "void main(){\n"
103 " uFragColor = vec4(0,1,0,1);\n"
104 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500105
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600106static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
107 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
108 void *pUserData);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600109
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600110// ErrorMonitor Usage:
111//
Dave Houltonfbf52152017-01-06 12:55:29 -0700112// Call SetDesiredFailureMsg with a string to be compared against all
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600113// encountered log messages, or a validation error enum identifying
114// desired error message. Passing NULL or VALIDATION_ERROR_MAX_ENUM
115// will match all log messages. logMsg will return true for skipCall
116// only if msg is matched or NULL.
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600117//
Dave Houltonfbf52152017-01-06 12:55:29 -0700118// Call VerifyFound to determine if all desired failure messages
119// were encountered. Call VerifyNotFound to determine if any unexpected
120// failure was encountered.
Tony Barbour300a6082015-04-07 13:44:53 -0600121class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700122 public:
123 ErrorMonitor() {
Dave Houltonfbf52152017-01-06 12:55:29 -0700124 test_platform_thread_create_mutex(&mutex_);
125 test_platform_thread_lock_mutex(&mutex_);
126 Reset();
127 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600128 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600129
Dave Houltonfbf52152017-01-06 12:55:29 -0700130 ~ErrorMonitor() { test_platform_thread_delete_mutex(&mutex_); }
Dustin Graves48458142016-04-29 16:11:55 -0600131
Dave Houltonfbf52152017-01-06 12:55:29 -0700132 // Set monitor to pristine state
133 void Reset() {
134 message_flags_ = VK_DEBUG_REPORT_ERROR_BIT_EXT;
135 bailout_ = NULL;
136 message_found_ = VK_FALSE;
137 failure_message_strings_.clear();
138 desired_message_strings_.clear();
139 desired_message_ids_.clear();
140 other_messages_.clear();
141 message_outstanding_count_ = 0;
142 }
143
144 // ErrorMonitor will look for an error message containing the specified string(s)
Karl Schultz6addd812016-02-02 17:17:23 -0700145 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700146 test_platform_thread_lock_mutex(&mutex_);
147 desired_message_strings_.insert(msgString);
148 message_flags_ |= msgFlags;
149 message_outstanding_count_++;
150 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600151 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600152
Dave Houltonfbf52152017-01-06 12:55:29 -0700153 // ErrorMonitor will look for a message ID matching the specified one(s)
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600154 void SetDesiredFailureMsg(VkFlags msgFlags, UNIQUE_VALIDATION_ERROR_CODE msg_id) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700155 test_platform_thread_lock_mutex(&mutex_);
156 desired_message_ids_.insert(msg_id);
157 message_flags_ |= msgFlags;
158 message_outstanding_count_++;
159 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600160 }
161
162 VkBool32 CheckForDesiredMsg(uint32_t message_code, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600163 VkBool32 result = VK_FALSE;
Dave Houltonfbf52152017-01-06 12:55:29 -0700164 test_platform_thread_lock_mutex(&mutex_);
165 if (bailout_ != NULL) {
166 *bailout_ = true;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600167 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600168 string errorString(msgString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600169 bool found_expected = false;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600170
Dave Houltonfbf52152017-01-06 12:55:29 -0700171 for (auto desired_msg : desired_message_strings_) {
Karl Schultz05cc4e32016-10-12 13:25:23 -0600172 if (desired_msg.length() == 0) {
173 // An empty desired_msg string "" indicates a positive test - not expecting an error.
174 // Return true to avoid calling layers/driver with this error.
175 // And don't erase the "" string, so it remains if another error is found.
176 result = VK_TRUE;
Tony Barbourae58dba2016-12-13 16:30:36 -0700177 found_expected = true;
Dave Houltonfbf52152017-01-06 12:55:29 -0700178 message_found_ = VK_TRUE;
179 failure_message_strings_.insert(errorString);
Karl Schultz05cc4e32016-10-12 13:25:23 -0600180 } else if (errorString.find(desired_msg) != string::npos) {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600181 found_expected = true;
Dave Houltonfbf52152017-01-06 12:55:29 -0700182 message_outstanding_count_--;
183 failure_message_strings_.insert(errorString);
184 message_found_ = VK_TRUE;
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600185 result = VK_TRUE;
186 // We only want one match for each expected error so remove from set here
187 // Since we're about the break the loop it's ok to remove from set we're iterating over
Dave Houltonfbf52152017-01-06 12:55:29 -0700188 desired_message_strings_.erase(desired_msg);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600189 break;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600190 }
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600191 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700192 for (auto desired_id : desired_message_ids_) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600193 if (desired_id == VALIDATION_ERROR_MAX_ENUM) {
194 // A message ID set to MAX_ENUM indicates a positive test - not expecting an error.
195 // Return true to avoid calling layers/driver with this error.
196 result = VK_TRUE;
197 } else if (desired_id == message_code) {
198 // Double-check that the string matches the error enum
199 if (errorString.find(validation_error_map[desired_id]) != string::npos) {
200 found_expected = true;
Dave Houltonfbf52152017-01-06 12:55:29 -0700201 message_outstanding_count_--;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600202 result = VK_TRUE;
Dave Houltonfbf52152017-01-06 12:55:29 -0700203 message_found_ = VK_TRUE;
204 desired_message_ids_.erase(desired_id);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600205 break;
206 } else {
207 // Treat this message as a regular unexpected error, but print a warning jic
208 printf("Message (%s) from MessageID %d does not correspond to expected message from error Database (%s)\n",
209 errorString.c_str(), desired_id, validation_error_map[desired_id]);
210 }
211 }
212 }
213
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600214 if (!found_expected) {
Chris Forbes5b9442b2016-09-13 16:49:57 +1200215 printf("Unexpected: %s\n", msgString);
Dave Houltonfbf52152017-01-06 12:55:29 -0700216 other_messages_.push_back(errorString);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600217 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700218 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600219 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600220 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600221
Dave Houltonfbf52152017-01-06 12:55:29 -0700222 vector<string> GetOtherFailureMsgs(void) { return other_messages_; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600223
Dave Houltonfbf52152017-01-06 12:55:29 -0700224 VkDebugReportFlagsEXT GetMessageFlags(void) { return message_flags_; }
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600225
Dave Houltonfbf52152017-01-06 12:55:29 -0700226 VkBool32 AnyDesiredMsgFound(void) { return message_found_; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600227
Dave Houltonfbf52152017-01-06 12:55:29 -0700228 VkBool32 AllDesiredMsgsFound(void) { return (0 == message_outstanding_count_); }
229
230 void SetBailout(bool *bailout) { bailout_ = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600231
Karl Schultz6addd812016-02-02 17:17:23 -0700232 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600233 vector<string> otherMsgs = GetOtherFailureMsgs();
Tony Barbour59b42282016-11-03 13:31:28 -0600234 if (otherMsgs.size()) {
235 cout << "Other error messages logged for this test were:" << endl;
236 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
237 cout << " " << *iter << endl;
238 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600239 }
240 }
241
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600242 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200243
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600244 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
245 void ExpectSuccess(VkDebugReportFlagsEXT message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600246 // Match ANY message matching specified type
247 SetDesiredFailureMsg(message_flag_mask, "");
Dave Houltonfbf52152017-01-06 12:55:29 -0700248 message_flags_ = message_flag_mask; // override mask handling in SetDesired...
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200249 }
250
251 void VerifyFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600252 // Not seeing the desired message is a failure. /Before/ throwing, dump any other messages.
Dave Houltonfbf52152017-01-06 12:55:29 -0700253 if (!AllDesiredMsgsFound()) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200254 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700255 for (auto desired_msg : desired_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700256 ADD_FAILURE() << "Did not receive expected error '" << desired_msg << "'";
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600257 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700258 for (auto desired_id : desired_message_ids_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700259 ADD_FAILURE() << "Did not receive expected error ENUM '" << desired_id << "'";
Tony Barbour59b42282016-11-03 13:31:28 -0600260 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200261 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700262 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200263 }
264
265 void VerifyNotFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600266 // ExpectSuccess() configured us to match anything. Any error is a failure.
Dave Houltonfbf52152017-01-06 12:55:29 -0700267 if (AnyDesiredMsgFound()) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200268 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700269 for (auto msg : failure_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700270 ADD_FAILURE() << "Expected to succeed but got error: " << msg;
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600271 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200272 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700273 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200274 }
275
Karl Schultz6addd812016-02-02 17:17:23 -0700276 private:
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700277 VkFlags message_flags_;
278 std::unordered_set<uint32_t> desired_message_ids_;
279 std::unordered_set<string> desired_message_strings_;
280 std::unordered_set<string> failure_message_strings_;
281 vector<string> other_messages_;
282 test_platform_thread_mutex mutex_;
283 bool *bailout_;
284 VkBool32 message_found_;
285 int message_outstanding_count_;
Tony Barbour300a6082015-04-07 13:44:53 -0600286};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500287
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600288static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
289 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
290 void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600291 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
292 if (msgFlags & errMonitor->GetMessageFlags()) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600293 return errMonitor->CheckForDesiredMsg(msgCode, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600294 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600295 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600296}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500297
Karl Schultz6addd812016-02-02 17:17:23 -0700298class VkLayerTest : public VkRenderFramework {
299 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600300 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
301 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
Karl Schultz6addd812016-02-02 17:17:23 -0700302 BsoFailSelect failMask);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600303 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
304 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, failMask);
Karl Schultz6addd812016-02-02 17:17:23 -0700305 }
Tony Barbour300a6082015-04-07 13:44:53 -0600306
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600307 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
308 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700309 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600310 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
Karl Schultz6addd812016-02-02 17:17:23 -0700311 uint32_t firstInstance) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600312 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700313 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600314 void QueueCommandBuffer(bool checkSuccess = true) { m_commandBuffer->QueueCommandBuffer(checkSuccess); }
315 void QueueCommandBuffer(const VkFence &fence) { m_commandBuffer->QueueCommandBuffer(fence); }
316 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding) {
Karl Schultz6addd812016-02-02 17:17:23 -0700317 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
318 }
319 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
320 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
321 }
322
323 protected:
324 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600325 bool m_enableWSI;
Tony Barbour300a6082015-04-07 13:44:53 -0600326
327 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600328 std::vector<const char *> instance_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600329 std::vector<const char *> instance_extension_names;
330 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600331
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700332 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600333 /*
334 * Since CreateDbgMsgCallback is an instance level extension call
335 * any extension / layer that utilizes that feature also needs
336 * to be enabled at create instance time.
337 */
Karl Schultz6addd812016-02-02 17:17:23 -0700338 // Use Threading layer first to protect others from
339 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700340 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600341 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800342 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700343 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800344 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600345 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700346 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600347
Ian Elliott2c1daf52016-05-12 09:41:46 -0600348 if (m_enableWSI) {
349 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
350 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
351#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
352#if defined(VK_USE_PLATFORM_ANDROID_KHR)
353 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
354#endif // VK_USE_PLATFORM_ANDROID_KHR
355#if defined(VK_USE_PLATFORM_MIR_KHR)
356 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
357#endif // VK_USE_PLATFORM_MIR_KHR
358#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
359 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
360#endif // VK_USE_PLATFORM_WAYLAND_KHR
361#if defined(VK_USE_PLATFORM_WIN32_KHR)
362 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
363#endif // VK_USE_PLATFORM_WIN32_KHR
364#endif // NEED_TO_TEST_THIS_ON_PLATFORM
365#if defined(VK_USE_PLATFORM_XCB_KHR)
366 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
367#elif defined(VK_USE_PLATFORM_XLIB_KHR)
368 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
369#endif // VK_USE_PLATFORM_XLIB_KHR
370 }
371
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600372 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600373 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800374 this->app_info.pApplicationName = "layer_tests";
375 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600376 this->app_info.pEngineName = "unittest";
377 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600378 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600379
Tony Barbour15524c32015-04-29 17:34:29 -0600380 m_errorMonitor = new ErrorMonitor;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600381 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600382 }
383
384 virtual void TearDown() {
385 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600386 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600387 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600388 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600389
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600390 VkLayerTest() { m_enableWSI = false; }
Tony Barbour300a6082015-04-07 13:44:53 -0600391};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500392
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600393void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500394 // Create identity matrix
395 int i;
396 struct vktriangle_vs_uniform data;
397
398 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700399 glm::mat4 View = glm::mat4(1.0f);
400 glm::mat4 Model = glm::mat4(1.0f);
401 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500402 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700403 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500404
405 memcpy(&data.mvp, &MVP[0][0], matrixSize);
406
Karl Schultz6addd812016-02-02 17:17:23 -0700407 static const Vertex tri_data[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600408 {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 -0500409 };
410
Karl Schultz6addd812016-02-02 17:17:23 -0700411 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500412 data.position[i][0] = tri_data[i].posX;
413 data.position[i][1] = tri_data[i].posY;
414 data.position[i][2] = tri_data[i].posZ;
415 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700416 data.color[i][0] = tri_data[i].r;
417 data.color[i][1] = tri_data[i].g;
418 data.color[i][2] = tri_data[i].b;
419 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500420 }
421
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500422 ASSERT_NO_FATAL_FAILURE(InitViewport());
423
Chris Forbesbcfaadd2016-09-16 14:13:53 +1200424 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), (const void *)&data,
425 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500426
Karl Schultz6addd812016-02-02 17:17:23 -0700427 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600428 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500429
430 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800431 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500432 pipelineobj.AddShader(&vs);
433 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600434 if (failMask & BsoFailLineWidth) {
435 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600436 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600437 ia_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600438 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
439 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600440 }
441 if (failMask & BsoFailDepthBias) {
442 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600443 VkPipelineRasterizationStateCreateInfo rs_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600444 rs_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600445 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600446 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600447 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600448 }
Rene Lindsayacbf5e62016-12-15 18:47:11 -0700449 // Viewport and scissors must stay in sync or other errors will occur than
Karl Schultz6addd812016-02-02 17:17:23 -0700450 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600451 if (failMask & BsoFailViewport) {
452 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
453 }
454 if (failMask & BsoFailScissor) {
455 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
456 }
457 if (failMask & BsoFailBlend) {
458 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600459 VkPipelineColorBlendAttachmentState att_state = {};
460 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
461 att_state.blendEnable = VK_TRUE;
462 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600463 }
464 if (failMask & BsoFailDepthBounds) {
465 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
466 }
467 if (failMask & BsoFailStencilReadMask) {
468 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
469 }
470 if (failMask & BsoFailStencilWriteMask) {
471 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
472 }
473 if (failMask & BsoFailStencilReference) {
474 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
475 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500476
477 VkDescriptorSetObj descriptorSet(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600478 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500479
480 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbour552f6c02016-12-21 14:34:07 -0700481 m_commandBuffer->BeginCommandBuffer();
482 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500483
Tony Barbourfe3351b2015-07-28 10:17:20 -0600484 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500485
486 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600487 if (failMask & BsoFailIndexBuffer) {
488 // Use DrawIndexed w/o an index buffer bound
489 DrawIndexed(3, 1, 0, 0, 0);
490 } else {
491 Draw(3, 1, 0, 0);
492 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500493
Mark Muellerd4914412016-06-13 17:52:06 -0600494 if (failMask & BsoFailCmdClearAttachments) {
495 VkClearAttachment color_attachment = {};
496 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
497 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
498 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
499
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600500 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Muellerd4914412016-06-13 17:52:06 -0600501 }
502
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500503 // finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -0700504 m_commandBuffer->EndRenderPass();
505 m_commandBuffer->EndCommandBuffer();
Tony Barbourfe3351b2015-07-28 10:17:20 -0600506 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500507}
508
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600509void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj,
510 VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500511 if (m_depthStencil->Initialized()) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600512 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500513 } else {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600514 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500515 }
516
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800517 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700518 // Make sure depthWriteEnable is set so that Depth fail test will work
519 // correctly
520 // Make sure stencilTestEnable is set so that Stencil fail test will work
521 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600522 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800523 stencil.failOp = VK_STENCIL_OP_KEEP;
524 stencil.passOp = VK_STENCIL_OP_KEEP;
525 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
526 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600527
528 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
529 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600530 ds_ci.pNext = NULL;
531 ds_ci.depthTestEnable = VK_FALSE;
532 ds_ci.depthWriteEnable = VK_TRUE;
533 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
534 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600535 if (failMask & BsoFailDepthBounds) {
536 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600537 ds_ci.maxDepthBounds = 0.0f;
538 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600539 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600540 ds_ci.stencilTestEnable = VK_TRUE;
541 ds_ci.front = stencil;
542 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600543
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600544 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600545 pipelineobj.SetViewport(m_viewports);
546 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800547 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600548 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600549 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800550 commandBuffer->BindPipeline(pipelineobj);
551 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500552}
553
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600554class VkPositiveLayerTest : public VkLayerTest {
555 public:
556 protected:
557};
558
Ian Elliott2c1daf52016-05-12 09:41:46 -0600559class VkWsiEnabledLayerTest : public VkLayerTest {
560 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600561 protected:
562 VkWsiEnabledLayerTest() { m_enableWSI = true; }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600563};
564
Mark Muellerdfe37552016-07-07 14:47:42 -0600565class VkBufferTest {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600566 public:
Mark Muellerdfe37552016-07-07 14:47:42 -0600567 enum eTestEnFlags {
568 eDoubleDelete,
569 eInvalidDeviceOffset,
570 eInvalidMemoryOffset,
571 eBindNullBuffer,
572 eFreeInvalidHandle,
Mark Mueller4042b652016-09-05 22:52:21 -0600573 eNone,
Mark Muellerdfe37552016-07-07 14:47:42 -0600574 };
575
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600576 enum eTestConditions { eOffsetAlignment = 1 };
Mark Muellerdfe37552016-07-07 14:47:42 -0600577
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600578 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage = 0) {
579 if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600580 return true;
581 }
582 VkDeviceSize offset_limit = 0;
583 if (eInvalidMemoryOffset == aTestFlag) {
584 VkBuffer vulkanBuffer;
585 VkBufferCreateInfo buffer_create_info = {};
586 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
587 buffer_create_info.size = 32;
588 buffer_create_info.usage = aBufferUsage;
589
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600590 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr, &vulkanBuffer);
Mark Mueller4042b652016-09-05 22:52:21 -0600591 VkMemoryRequirements memory_reqs = {};
Mark Muellerdfe37552016-07-07 14:47:42 -0600592
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600593 vkGetBufferMemoryRequirements(aVulkanDevice->device(), vulkanBuffer, &memory_reqs);
Mark Muellerdfe37552016-07-07 14:47:42 -0600594 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
595 offset_limit = memory_reqs.alignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600596 } else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
597 offset_limit = aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600598 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600599 offset_limit = aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600600 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600601 offset_limit = aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600602 }
603 if (eOffsetAlignment < offset_limit) {
604 return true;
605 }
606 return false;
607 }
608
609 // A constructor which performs validation tests within construction.
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600610 VkBufferTest(VkDeviceObj *aVulkanDevice, VkBufferUsageFlags aBufferUsage, eTestEnFlags aTestFlag = eNone)
611 : AllocateCurrent(false), BoundCurrent(false), CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600612
613 if (eBindNullBuffer == aTestFlag) {
614 VulkanMemory = 0;
615 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
616 } else {
617 VkBufferCreateInfo buffer_create_info = {};
618 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
619 buffer_create_info.size = 32;
620 buffer_create_info.usage = aBufferUsage;
621
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600622 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr, &VulkanBuffer);
Mark Muellerdfe37552016-07-07 14:47:42 -0600623
624 CreateCurrent = true;
625
626 VkMemoryRequirements memory_requirements;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600627 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer, &memory_requirements);
Mark Muellerdfe37552016-07-07 14:47:42 -0600628
629 VkMemoryAllocateInfo memory_allocate_info = {};
630 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
631 memory_allocate_info.allocationSize = memory_requirements.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600632 bool pass = aVulkanDevice->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info,
633 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Muellerdfe37552016-07-07 14:47:42 -0600634 if (!pass) {
635 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
636 return;
637 }
638
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600639 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL, &VulkanMemory);
Mark Muellerdfe37552016-07-07 14:47:42 -0600640 AllocateCurrent = true;
641 // NB: 1 is intentionally an invalid offset value
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600642 const bool offset_en = eInvalidDeviceOffset == aTestFlag || eInvalidMemoryOffset == aTestFlag;
643 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, offset_en ? eOffsetAlignment : 0);
Mark Muellerdfe37552016-07-07 14:47:42 -0600644 BoundCurrent = true;
645
646 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
647 }
648 }
649
650 ~VkBufferTest() {
651 if (CreateCurrent) {
652 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
653 }
654 if (AllocateCurrent) {
655 if (InvalidDeleteEn) {
656 union {
657 VkDeviceMemory device_memory;
658 unsigned long long index_access;
659 } bad_index;
660
661 bad_index.device_memory = VulkanMemory;
662 bad_index.index_access++;
663
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600664 vkFreeMemory(VulkanDevice, bad_index.device_memory, nullptr);
Mark Muellerdfe37552016-07-07 14:47:42 -0600665 }
666 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
667 }
668 }
669
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600670 bool GetBufferCurrent() { return AllocateCurrent && BoundCurrent && CreateCurrent; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600671
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600672 const VkBuffer &GetBuffer() { return VulkanBuffer; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600673
674 void TestDoubleDestroy() {
675 // Destroy the buffer but leave the flag set, which will cause
676 // the buffer to be destroyed again in the destructor.
677 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
678 }
679
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600680 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600681 bool AllocateCurrent;
682 bool BoundCurrent;
683 bool CreateCurrent;
684 bool InvalidDeleteEn;
685
686 VkBuffer VulkanBuffer;
687 VkDevice VulkanDevice;
688 VkDeviceMemory VulkanMemory;
Mark Muellerdfe37552016-07-07 14:47:42 -0600689};
690
691class VkVerticesObj {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600692 public:
693 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount, unsigned aBindingCount, unsigned aByteStride,
Mark Muellerdfe37552016-07-07 14:47:42 -0600694 VkDeviceSize aVertexCount, const float *aVerticies)
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600695 : BoundCurrent(false), AttributeCount(aAttributeCount), BindingCount(aBindingCount), BindId(BindIdGenerator),
Mark Muellerdfe37552016-07-07 14:47:42 -0600696 PipelineVertexInputStateCreateInfo(),
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600697 VulkanMemoryBuffer(aVulkanDevice, 1, static_cast<int>(aByteStride * aVertexCount),
698 reinterpret_cast<const void *>(aVerticies), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600699 BindIdGenerator++; // NB: This can wrap w/misuse
700
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600701 VertexInputAttributeDescription = new VkVertexInputAttributeDescription[AttributeCount];
702 VertexInputBindingDescription = new VkVertexInputBindingDescription[BindingCount];
Mark Muellerdfe37552016-07-07 14:47:42 -0600703
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600704 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = VertexInputAttributeDescription;
705 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = AttributeCount;
706 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = VertexInputBindingDescription;
707 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = BindingCount;
708 PipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -0600709
710 unsigned i = 0;
711 do {
712 VertexInputAttributeDescription[i].binding = BindId;
713 VertexInputAttributeDescription[i].location = i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600714 VertexInputAttributeDescription[i].format = VK_FORMAT_R32G32B32_SFLOAT;
715 VertexInputAttributeDescription[i].offset = sizeof(float) * aByteStride;
Mark Muellerdfe37552016-07-07 14:47:42 -0600716 i++;
717 } while (AttributeCount < i);
718
719 i = 0;
720 do {
721 VertexInputBindingDescription[i].binding = BindId;
722 VertexInputBindingDescription[i].stride = aByteStride;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600723 VertexInputBindingDescription[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
Mark Muellerdfe37552016-07-07 14:47:42 -0600724 i++;
725 } while (BindingCount < i);
726 }
727
728 ~VkVerticesObj() {
729 if (VertexInputAttributeDescription) {
730 delete[] VertexInputAttributeDescription;
731 }
732 if (VertexInputBindingDescription) {
733 delete[] VertexInputBindingDescription;
734 }
735 }
736
737 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600738 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription, AttributeCount);
739 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription, BindingCount);
Mark Muellerdfe37552016-07-07 14:47:42 -0600740 return true;
741 }
742
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600743 void BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount = 0, VkDeviceSize *aOffsetList = nullptr) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600744 VkDeviceSize *offsetList;
745 unsigned offsetCount;
746
747 if (aOffsetCount) {
748 offsetList = aOffsetList;
749 offsetCount = aOffsetCount;
750 } else {
751 offsetList = new VkDeviceSize[1]();
752 offsetCount = 1;
753 }
754
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600755 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount, &VulkanMemoryBuffer.handle(), offsetList);
Mark Muellerdfe37552016-07-07 14:47:42 -0600756 BoundCurrent = true;
757
758 if (!aOffsetCount) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600759 delete[] offsetList;
Mark Muellerdfe37552016-07-07 14:47:42 -0600760 }
761 }
762
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600763 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600764 static uint32_t BindIdGenerator;
765
766 bool BoundCurrent;
767 unsigned AttributeCount;
768 unsigned BindingCount;
769 uint32_t BindId;
770
771 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
772 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
773 VkVertexInputBindingDescription *VertexInputBindingDescription;
774 VkConstantBufferObj VulkanMemoryBuffer;
775};
776
777uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500778// ********************************************************************************************************************
779// ********************************************************************************************************************
780// ********************************************************************************************************************
781// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600782#if PARAMETER_VALIDATION_TESTS
783TEST_F(VkLayerTest, RequiredParameter) {
784 TEST_DESCRIPTION("Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
785 "pointer, array, and array count parameters");
786
787 ASSERT_NO_FATAL_FAILURE(InitState());
788
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600789 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600790 // Specify NULL for a pointer to a handle
791 // Expected to trigger an error with
792 // parameter_validation::validate_required_pointer
793 vkGetPhysicalDeviceFeatures(gpu(), NULL);
794 m_errorMonitor->VerifyFound();
795
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600796 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
797 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600798 // Specify NULL for pointer to array count
799 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600800 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600801 m_errorMonitor->VerifyFound();
802
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600803 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter viewportCount must be greater than 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600804 // Specify 0 for a required array count
805 // Expected to trigger an error with parameter_validation::validate_array
806 VkViewport view_port = {};
807 m_commandBuffer->SetViewport(0, 0, &view_port);
808 m_errorMonitor->VerifyFound();
809
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600810 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pViewports specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600811 // Specify NULL for a required array
812 // Expected to trigger an error with parameter_validation::validate_array
813 m_commandBuffer->SetViewport(0, 1, NULL);
814 m_errorMonitor->VerifyFound();
815
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600816 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600817 // Specify VK_NULL_HANDLE for a required handle
818 // Expected to trigger an error with
819 // parameter_validation::validate_required_handle
820 vkUnmapMemory(device(), VK_NULL_HANDLE);
821 m_errorMonitor->VerifyFound();
822
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600823 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
824 "required parameter pFences[0] specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600825 // Specify VK_NULL_HANDLE for a required handle array entry
826 // Expected to trigger an error with
827 // parameter_validation::validate_required_handle_array
828 VkFence fence = VK_NULL_HANDLE;
829 vkResetFences(device(), 1, &fence);
830 m_errorMonitor->VerifyFound();
831
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600832 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600833 // Specify NULL for a required struct pointer
834 // Expected to trigger an error with
835 // parameter_validation::validate_struct_type
836 VkDeviceMemory memory = VK_NULL_HANDLE;
837 vkAllocateMemory(device(), NULL, NULL, &memory);
838 m_errorMonitor->VerifyFound();
839
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600840 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600841 // Specify 0 for a required VkFlags parameter
842 // Expected to trigger an error with parameter_validation::validate_flags
843 m_commandBuffer->SetStencilReference(0, 0);
844 m_errorMonitor->VerifyFound();
845
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600846 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 -0600847 // Specify 0 for a required VkFlags array entry
848 // Expected to trigger an error with
849 // parameter_validation::validate_flags_array
850 VkSemaphore semaphore = VK_NULL_HANDLE;
851 VkPipelineStageFlags stageFlags = 0;
852 VkSubmitInfo submitInfo = {};
853 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
854 submitInfo.waitSemaphoreCount = 1;
855 submitInfo.pWaitSemaphores = &semaphore;
856 submitInfo.pWaitDstStageMask = &stageFlags;
857 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
858 m_errorMonitor->VerifyFound();
859}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600860
Dustin Gravesfce74c02016-05-10 11:42:58 -0600861TEST_F(VkLayerTest, ReservedParameter) {
862 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
863
864 ASSERT_NO_FATAL_FAILURE(InitState());
865
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600866 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
Dustin Gravesfce74c02016-05-10 11:42:58 -0600867 // Specify 0 for a reserved VkFlags parameter
868 // Expected to trigger an error with
869 // parameter_validation::validate_reserved_flags
870 VkEvent event_handle = VK_NULL_HANDLE;
871 VkEventCreateInfo event_info = {};
872 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
873 event_info.flags = 1;
874 vkCreateEvent(device(), &event_info, NULL, &event_handle);
875 m_errorMonitor->VerifyFound();
876}
877
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600878TEST_F(VkLayerTest, InvalidStructSType) {
879 TEST_DESCRIPTION("Specify an invalid VkStructureType for a Vulkan "
880 "structure's sType field");
881
882 ASSERT_NO_FATAL_FAILURE(InitState());
883
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600884 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600885 // Zero struct memory, effectively setting sType to
886 // VK_STRUCTURE_TYPE_APPLICATION_INFO
887 // Expected to trigger an error with
888 // parameter_validation::validate_struct_type
889 VkMemoryAllocateInfo alloc_info = {};
890 VkDeviceMemory memory = VK_NULL_HANDLE;
891 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
892 m_errorMonitor->VerifyFound();
893
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600894 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600895 // Zero struct memory, effectively setting sType to
896 // VK_STRUCTURE_TYPE_APPLICATION_INFO
897 // Expected to trigger an error with
898 // parameter_validation::validate_struct_type_array
899 VkSubmitInfo submit_info = {};
900 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
901 m_errorMonitor->VerifyFound();
902}
903
904TEST_F(VkLayerTest, InvalidStructPNext) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600905 TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600906
907 ASSERT_NO_FATAL_FAILURE(InitState());
908
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600910 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be NULL.
Karl Schultz38b50992016-07-11 16:09:09 -0600911 // Need to pick a function that has no allowed pNext structure types.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600912 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Karl Schultz38b50992016-07-11 16:09:09 -0600913 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600914 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600915 // Zero-initialization will provide the correct sType
916 VkApplicationInfo app_info = {};
917 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
918 event_alloc_info.pNext = &app_info;
919 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
920 m_errorMonitor->VerifyFound();
921
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600922 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
923 " chain includes a structure with unexpected VkStructureType ");
Karl Schultz38b50992016-07-11 16:09:09 -0600924 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
925 // a function that has allowed pNext structure types and specify
926 // a structure type that is not allowed.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600927 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600928 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -0600929 VkMemoryAllocateInfo memory_alloc_info = {};
930 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
931 memory_alloc_info.pNext = &app_info;
932 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600933 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600934}
Dustin Graves5d33d532016-05-09 16:21:12 -0600935
936TEST_F(VkLayerTest, UnrecognizedValue) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600937 TEST_DESCRIPTION("Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
Dustin Graves5d33d532016-05-09 16:21:12 -0600938
939 ASSERT_NO_FATAL_FAILURE(InitState());
940
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600941 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not fall within the begin..end "
942 "range of the core VkFormat "
943 "enumeration tokens");
Dustin Graves5d33d532016-05-09 16:21:12 -0600944 // Specify an invalid VkFormat value
945 // Expected to trigger an error with
946 // parameter_validation::validate_ranged_enum
947 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600948 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -0600949 m_errorMonitor->VerifyFound();
950
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600951 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 -0600952 // Specify an invalid VkFlags bitmask value
953 // Expected to trigger an error with parameter_validation::validate_flags
954 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600955 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
956 static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -0600957 m_errorMonitor->VerifyFound();
958
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600959 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 -0600960 // Specify an invalid VkFlags array entry
961 // Expected to trigger an error with
962 // parameter_validation::validate_flags_array
963 VkSemaphore semaphore = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600964 VkPipelineStageFlags stage_flags = static_cast<VkPipelineStageFlags>(1 << 25);
Dustin Graves5d33d532016-05-09 16:21:12 -0600965 VkSubmitInfo submit_info = {};
966 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
967 submit_info.waitSemaphoreCount = 1;
968 submit_info.pWaitSemaphores = &semaphore;
969 submit_info.pWaitDstStageMask = &stage_flags;
970 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
971 m_errorMonitor->VerifyFound();
972
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600973 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
Dustin Graves5d33d532016-05-09 16:21:12 -0600974 // Specify an invalid VkBool32 value
975 // Expected to trigger a warning with
976 // parameter_validation::validate_bool32
977 VkSampler sampler = VK_NULL_HANDLE;
978 VkSamplerCreateInfo sampler_info = {};
979 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
980 sampler_info.pNext = NULL;
981 sampler_info.magFilter = VK_FILTER_NEAREST;
982 sampler_info.minFilter = VK_FILTER_NEAREST;
983 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
984 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
985 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
986 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
987 sampler_info.mipLodBias = 1.0;
988 sampler_info.maxAnisotropy = 1;
989 sampler_info.compareEnable = VK_FALSE;
990 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
991 sampler_info.minLod = 1.0;
992 sampler_info.maxLod = 1.0;
993 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
994 sampler_info.unnormalizedCoordinates = VK_FALSE;
995 // Not VK_TRUE or VK_FALSE
996 sampler_info.anisotropyEnable = 3;
997 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
998 m_errorMonitor->VerifyFound();
999}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001000
1001TEST_F(VkLayerTest, FailedReturnValue) {
1002 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1003
1004 ASSERT_NO_FATAL_FAILURE(InitState());
1005
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001006 // Find an unsupported image format
1007 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1008 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1009 VkFormat format = static_cast<VkFormat>(f);
1010 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001011 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001012 unsupported = format;
1013 break;
1014 }
1015 }
1016
1017 if (unsupported != VK_FORMAT_UNDEFINED) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001018 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1019 "the requested format is not supported on this device");
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001020 // Specify an unsupported VkFormat value to generate a
1021 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1022 // Expected to trigger a warning from
1023 // parameter_validation::validate_result
1024 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001025 VkResult err = vkGetPhysicalDeviceImageFormatProperties(gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1026 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001027 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1028 m_errorMonitor->VerifyFound();
1029 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001030}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001031
1032TEST_F(VkLayerTest, UpdateBufferAlignment) {
1033 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001034 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001035
1036 ASSERT_NO_FATAL_FAILURE(InitState());
1037
1038 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1039 vk_testing::Buffer buffer;
1040 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1041
Tony Barbour552f6c02016-12-21 14:34:07 -07001042 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001043 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001044 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001045 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1046 m_errorMonitor->VerifyFound();
1047
1048 // Introduce failure by using dataSize that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001049 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001050 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1051 m_errorMonitor->VerifyFound();
1052
1053 // Introduce failure by using dataSize that is < 0
1054 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001055 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001056 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1057 m_errorMonitor->VerifyFound();
1058
1059 // Introduce failure by using dataSize that is > 65536
1060 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001061 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001062 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1063 m_errorMonitor->VerifyFound();
1064
Tony Barbour552f6c02016-12-21 14:34:07 -07001065 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001066}
1067
1068TEST_F(VkLayerTest, FillBufferAlignment) {
1069 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1070
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
1079 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001080 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001081 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1082 m_errorMonitor->VerifyFound();
1083
1084 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001085 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001086 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1087 m_errorMonitor->VerifyFound();
1088
1089 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001090 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001091 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1092 m_errorMonitor->VerifyFound();
1093
Tony Barbour552f6c02016-12-21 14:34:07 -07001094 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001095}
Dustin Graves40f35822016-06-23 11:12:53 -06001096
Cortd889ff92016-07-27 09:51:27 -07001097TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1098 VkResult err;
1099
1100 TEST_DESCRIPTION("Attempt to use a non-solid polygon fill mode in a "
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001101 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001102
1103 ASSERT_NO_FATAL_FAILURE(InitState());
1104 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1105
1106 std::vector<const char *> device_extension_names;
1107 auto features = m_device->phy().features();
1108 // Artificially disable support for non-solid fill modes
1109 features.fillModeNonSolid = false;
1110 // The sacrificial device object
1111 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1112
1113 VkRenderpassObj render_pass(&test_device);
1114
1115 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1116 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1117 pipeline_layout_ci.setLayoutCount = 0;
1118 pipeline_layout_ci.pSetLayouts = NULL;
1119
1120 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001121 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001122 ASSERT_VK_SUCCESS(err);
1123
1124 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1125 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1126 rs_ci.pNext = nullptr;
1127 rs_ci.lineWidth = 1.0f;
1128 rs_ci.rasterizerDiscardEnable = true;
1129
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001130 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1131 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001132
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001133 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001134 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1135 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001136 {
1137 VkPipelineObj pipe(&test_device);
1138 pipe.AddShader(&vs);
1139 pipe.AddShader(&fs);
1140 pipe.AddColorAttachment();
1141 // Introduce failure by setting unsupported polygon mode
1142 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1143 pipe.SetRasterization(&rs_ci);
1144 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1145 }
1146 m_errorMonitor->VerifyFound();
1147
1148 // Try again with polygonMode=LINE, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001149 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1150 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001151 {
1152 VkPipelineObj pipe(&test_device);
1153 pipe.AddShader(&vs);
1154 pipe.AddShader(&fs);
1155 pipe.AddColorAttachment();
1156 // Introduce failure by setting unsupported polygon mode
1157 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1158 pipe.SetRasterization(&rs_ci);
1159 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1160 }
1161 m_errorMonitor->VerifyFound();
1162
Cortd889ff92016-07-27 09:51:27 -07001163 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1164}
1165
Dustin Gravesffa90fa2016-05-06 11:20:38 -06001166#endif // PARAMETER_VALIDATION_TESTS
1167
Tobin Ehlis0788f522015-05-26 16:11:58 -06001168#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001169#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001170TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001171{
1172 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001173 VkFenceCreateInfo fenceInfo = {};
1174 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1175 fenceInfo.pNext = NULL;
1176 fenceInfo.flags = 0;
1177
Mike Weiblencce7ec72016-10-17 19:33:05 -06001178 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001179
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001180 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001181
1182 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1183 vk_testing::Buffer buffer;
1184 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001185
Tony Barbourfe3351b2015-07-28 10:17:20 -06001186 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001187 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001188 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001189
1190 testFence.init(*m_device, fenceInfo);
1191
1192 // Bypass framework since it does the waits automatically
1193 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001194 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001195 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1196 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001197 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001198 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001199 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001200 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001201 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001202 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001203 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001204
1205 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001206 ASSERT_VK_SUCCESS( err );
1207
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001208 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001209 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001210
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001211 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001212}
1213
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001214TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001215{
1216 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001217 VkFenceCreateInfo fenceInfo = {};
1218 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1219 fenceInfo.pNext = NULL;
1220 fenceInfo.flags = 0;
1221
Mike Weiblencce7ec72016-10-17 19:33:05 -06001222 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001223
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001224 ASSERT_NO_FATAL_FAILURE(InitState());
1225 ASSERT_NO_FATAL_FAILURE(InitViewport());
1226 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1227
Tony Barbourfe3351b2015-07-28 10:17:20 -06001228 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001229 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001230 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001231
1232 testFence.init(*m_device, fenceInfo);
1233
1234 // Bypass framework since it does the waits automatically
1235 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001236 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001237 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1238 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001239 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001240 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001241 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001242 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001243 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001244 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001245 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001246
1247 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001248 ASSERT_VK_SUCCESS( err );
1249
Jon Ashburnf19916e2016-01-11 13:12:43 -07001250 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001251 VkCommandBufferBeginInfo info = {};
1252 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1253 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001254 info.renderPass = VK_NULL_HANDLE;
1255 info.subpass = 0;
1256 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001257 info.occlusionQueryEnable = VK_FALSE;
1258 info.queryFlags = 0;
1259 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001260
1261 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001262 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001263
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001264 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001265}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001266#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001267
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001268TEST_F(VkLayerTest, SparseBindingImageBufferCreate) {
1269 TEST_DESCRIPTION("Create buffer/image with sparse attributes but without the sparse_binding bit set");
1270
1271 ASSERT_NO_FATAL_FAILURE(InitState());
1272
1273 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00669);
1274 VkBuffer buffer;
1275 VkBufferCreateInfo buf_info = {};
1276 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1277 buf_info.pNext = NULL;
1278 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
1279 buf_info.size = 2048;
1280 buf_info.queueFamilyIndexCount = 0;
1281 buf_info.pQueueFamilyIndices = NULL;
1282 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1283 buf_info.flags = VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
1284 vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1285 m_errorMonitor->VerifyFound();
1286
1287 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02160);
1288 VkImage image;
1289 VkImageCreateInfo image_create_info = {};
1290 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1291 image_create_info.pNext = NULL;
1292 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1293 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1294 image_create_info.extent.width = 512;
1295 image_create_info.extent.height = 64;
1296 image_create_info.extent.depth = 1;
1297 image_create_info.mipLevels = 1;
1298 image_create_info.arrayLayers = 1;
1299 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1300 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1301 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1302 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1303 image_create_info.queueFamilyIndexCount = 0;
1304 image_create_info.pQueueFamilyIndices = NULL;
1305 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1306 image_create_info.flags = VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
1307 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1308 m_errorMonitor->VerifyFound();
1309}
1310
Tobin Ehlisf11be982016-05-11 13:52:53 -06001311TEST_F(VkLayerTest, InvalidMemoryAliasing) {
1312 TEST_DESCRIPTION("Create a buffer and image, allocate memory, and bind the "
1313 "buffer and image to memory such that they will alias.");
1314 VkResult err;
1315 bool pass;
1316 ASSERT_NO_FATAL_FAILURE(InitState());
1317
Tobin Ehlis077ded32016-05-12 17:39:13 -06001318 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001319 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001320 VkImage image2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001321 VkDeviceMemory mem; // buffer will be bound first
1322 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001323 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Rene Lindsayd14f5572016-12-16 14:57:18 -07001324 VkMemoryRequirements buff_mem_reqs2, img_mem_reqs2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001325
1326 VkBufferCreateInfo buf_info = {};
1327 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1328 buf_info.pNext = NULL;
1329 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1330 buf_info.size = 256;
1331 buf_info.queueFamilyIndexCount = 0;
1332 buf_info.pQueueFamilyIndices = NULL;
1333 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1334 buf_info.flags = 0;
1335 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1336 ASSERT_VK_SUCCESS(err);
1337
Tobin Ehlis077ded32016-05-12 17:39:13 -06001338 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001339
1340 VkImageCreateInfo image_create_info = {};
1341 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1342 image_create_info.pNext = NULL;
1343 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1344 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1345 image_create_info.extent.width = 64;
1346 image_create_info.extent.height = 64;
1347 image_create_info.extent.depth = 1;
1348 image_create_info.mipLevels = 1;
1349 image_create_info.arrayLayers = 1;
1350 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001351 // Image tiling must be optimal to trigger error when aliasing linear buffer
1352 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001353 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1354 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1355 image_create_info.queueFamilyIndexCount = 0;
1356 image_create_info.pQueueFamilyIndices = NULL;
1357 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1358 image_create_info.flags = 0;
1359
Tobin Ehlisf11be982016-05-11 13:52:53 -06001360 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1361 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001362 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1363 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001364
Tobin Ehlis077ded32016-05-12 17:39:13 -06001365 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1366
1367 VkMemoryAllocateInfo alloc_info = {};
1368 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1369 alloc_info.pNext = NULL;
1370 alloc_info.memoryTypeIndex = 0;
1371 // Ensure memory is big enough for both bindings
1372 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001373 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1374 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001375 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001376 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001377 vkDestroyImage(m_device->device(), image, NULL);
1378 return;
1379 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001380 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1381 ASSERT_VK_SUCCESS(err);
1382 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1383 ASSERT_VK_SUCCESS(err);
1384
Rene Lindsayd14f5572016-12-16 14:57:18 -07001385 vkGetImageMemoryRequirements(m_device->device(), image2, &img_mem_reqs2);
1386
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001387 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001388 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001389 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1390 m_errorMonitor->VerifyFound();
1391
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001392 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001393 // aliasing buffer2
1394 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1395 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001396 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1397 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001398 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001399 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001400 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Rene Lindsayd14f5572016-12-16 14:57:18 -07001401 vkGetBufferMemoryRequirements(m_device->device(), buffer2, &buff_mem_reqs2);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001402 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001403 m_errorMonitor->VerifyFound();
1404
1405 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001406 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001407 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001408 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001409 vkFreeMemory(m_device->device(), mem, NULL);
1410 vkFreeMemory(m_device->device(), mem_img, NULL);
1411}
1412
Tobin Ehlis35372522016-05-12 08:32:31 -06001413TEST_F(VkLayerTest, InvalidMemoryMapping) {
1414 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1415 VkResult err;
1416 bool pass;
1417 ASSERT_NO_FATAL_FAILURE(InitState());
1418
1419 VkBuffer buffer;
1420 VkDeviceMemory mem;
1421 VkMemoryRequirements mem_reqs;
1422
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001423 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1424
Tobin Ehlis35372522016-05-12 08:32:31 -06001425 VkBufferCreateInfo buf_info = {};
1426 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1427 buf_info.pNext = NULL;
1428 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1429 buf_info.size = 256;
1430 buf_info.queueFamilyIndexCount = 0;
1431 buf_info.pQueueFamilyIndices = NULL;
1432 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1433 buf_info.flags = 0;
1434 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1435 ASSERT_VK_SUCCESS(err);
1436
1437 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1438 VkMemoryAllocateInfo alloc_info = {};
1439 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1440 alloc_info.pNext = NULL;
1441 alloc_info.memoryTypeIndex = 0;
1442
1443 // Ensure memory is big enough for both bindings
1444 static const VkDeviceSize allocation_size = 0x10000;
1445 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001446 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 -06001447 if (!pass) {
1448 vkDestroyBuffer(m_device->device(), buffer, NULL);
1449 return;
1450 }
1451 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1452 ASSERT_VK_SUCCESS(err);
1453
1454 uint8_t *pData;
1455 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001456 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 -06001457 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1458 m_errorMonitor->VerifyFound();
1459 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001460 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001461 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001462 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1463 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1464 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001465 m_errorMonitor->VerifyFound();
1466
1467 // Unmap the memory to avoid re-map error
1468 vkUnmapMemory(m_device->device(), mem);
1469 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001470 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1471 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1472 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001473 m_errorMonitor->VerifyFound();
1474 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001475 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1476 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001477 m_errorMonitor->VerifyFound();
1478 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001480 vkUnmapMemory(m_device->device(), mem);
1481 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001482
Tobin Ehlis35372522016-05-12 08:32:31 -06001483 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001484 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001485 ASSERT_VK_SUCCESS(err);
1486 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001487 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001488 mmr.memory = mem;
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001489 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001490 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001491 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1492 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001493
Tobin Ehlis35372522016-05-12 08:32:31 -06001494 // Now flush range that oversteps mapped range
1495 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001496 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001497 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001498 mmr.offset = atom_size;
1499 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001500 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1501 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1502 m_errorMonitor->VerifyFound();
1503
1504 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1505 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001506 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001507 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001508 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001509 mmr.size = VK_WHOLE_SIZE;
1510 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001511 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1512 m_errorMonitor->VerifyFound();
1513
Tony Barboure3975eb2016-12-15 14:52:44 -07001514#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001515 // Some platforms have an atomsize of 1 which makes the test meaningless
1516 if (atom_size > 3) {
1517 // Now with an offset NOT a multiple of the device limit
1518 vkUnmapMemory(m_device->device(), mem);
1519 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1520 ASSERT_VK_SUCCESS(err);
1521 mmr.offset = 3; // Not a multiple of atom_size
1522 mmr.size = VK_WHOLE_SIZE;
1523 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1524 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1525 m_errorMonitor->VerifyFound();
1526
1527 // Now with a size NOT a multiple of the device limit
1528 vkUnmapMemory(m_device->device(), mem);
1529 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1530 ASSERT_VK_SUCCESS(err);
1531 mmr.offset = atom_size;
1532 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1533 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1534 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1535 m_errorMonitor->VerifyFound();
1536 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001537#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001538 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1539 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001540 if (!pass) {
1541 vkFreeMemory(m_device->device(), mem, NULL);
1542 vkDestroyBuffer(m_device->device(), buffer, NULL);
1543 return;
1544 }
1545 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1546 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1547
1548 vkDestroyBuffer(m_device->device(), buffer, NULL);
1549 vkFreeMemory(m_device->device(), mem, NULL);
1550}
1551
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001552#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001553TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1554 VkResult err;
1555 bool pass;
1556
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001557 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1558 // following declaration (which is temporarily being moved below):
1559 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001560 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001561 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001562 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001563 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001564 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001565 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001566
1567 ASSERT_NO_FATAL_FAILURE(InitState());
1568
Ian Elliott3f06ce52016-04-29 14:46:21 -06001569#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1570#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1571 // Use the functions from the VK_KHR_android_surface extension without
1572 // enabling that extension:
1573
1574 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001575 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001576 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1577 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001578 pass = (err != VK_SUCCESS);
1579 ASSERT_TRUE(pass);
1580 m_errorMonitor->VerifyFound();
1581#endif // VK_USE_PLATFORM_ANDROID_KHR
1582
Ian Elliott3f06ce52016-04-29 14:46:21 -06001583#if defined(VK_USE_PLATFORM_MIR_KHR)
1584 // Use the functions from the VK_KHR_mir_surface extension without enabling
1585 // that extension:
1586
1587 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001588 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001589 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001590 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1591 pass = (err != VK_SUCCESS);
1592 ASSERT_TRUE(pass);
1593 m_errorMonitor->VerifyFound();
1594
1595 // Tell whether an mir_connection supports presentation:
1596 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001597 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1598 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001599 m_errorMonitor->VerifyFound();
1600#endif // VK_USE_PLATFORM_MIR_KHR
1601
Ian Elliott3f06ce52016-04-29 14:46:21 -06001602#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1603 // Use the functions from the VK_KHR_wayland_surface extension without
1604 // enabling that extension:
1605
1606 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001607 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001608 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1609 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001610 pass = (err != VK_SUCCESS);
1611 ASSERT_TRUE(pass);
1612 m_errorMonitor->VerifyFound();
1613
1614 // Tell whether an wayland_display supports presentation:
1615 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001616 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1617 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001618 m_errorMonitor->VerifyFound();
1619#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -06001620#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001621
Ian Elliott3f06ce52016-04-29 14:46:21 -06001622#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001623 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1624 // TO NON-LINUX PLATFORMS:
1625 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001626 // Use the functions from the VK_KHR_win32_surface extension without
1627 // enabling that extension:
1628
1629 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001630 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001631 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1632 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001633 pass = (err != VK_SUCCESS);
1634 ASSERT_TRUE(pass);
1635 m_errorMonitor->VerifyFound();
1636
1637 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001638 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001639 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001640 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001641// Set this (for now, until all platforms are supported and tested):
1642#define NEED_TO_TEST_THIS_ON_PLATFORM
1643#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001644#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001645 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1646 // TO NON-LINUX PLATFORMS:
1647 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001648#endif
1649#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001650 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1651 // that extension:
1652
1653 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001654 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001655 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001656 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1657 pass = (err != VK_SUCCESS);
1658 ASSERT_TRUE(pass);
1659 m_errorMonitor->VerifyFound();
1660
1661 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001662 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001663 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001664 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1665 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001666 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001667// Set this (for now, until all platforms are supported and tested):
1668#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001669#endif // VK_USE_PLATFORM_XCB_KHR
1670
Ian Elliott12630812016-04-29 14:35:43 -06001671#if defined(VK_USE_PLATFORM_XLIB_KHR)
1672 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1673 // that extension:
1674
1675 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001676 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001677 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001678 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1679 pass = (err != VK_SUCCESS);
1680 ASSERT_TRUE(pass);
1681 m_errorMonitor->VerifyFound();
1682
1683 // Tell whether an Xlib VisualID supports presentation:
1684 Display *dpy = NULL;
1685 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001686 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001687 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1688 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001689// Set this (for now, until all platforms are supported and tested):
1690#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06001691#endif // VK_USE_PLATFORM_XLIB_KHR
1692
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001693// Use the functions from the VK_KHR_surface extension without enabling
1694// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001695
Ian Elliott489eec02016-05-05 14:12:44 -06001696#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001697 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001698 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001699 vkDestroySurfaceKHR(instance(), surface, NULL);
1700 m_errorMonitor->VerifyFound();
1701
1702 // Check if surface supports presentation:
1703 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001704 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001705 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1706 pass = (err != VK_SUCCESS);
1707 ASSERT_TRUE(pass);
1708 m_errorMonitor->VerifyFound();
1709
1710 // Check surface capabilities:
1711 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001712 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1713 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001714 pass = (err != VK_SUCCESS);
1715 ASSERT_TRUE(pass);
1716 m_errorMonitor->VerifyFound();
1717
1718 // Check surface formats:
1719 uint32_t format_count = 0;
1720 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001721 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1722 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001723 pass = (err != VK_SUCCESS);
1724 ASSERT_TRUE(pass);
1725 m_errorMonitor->VerifyFound();
1726
1727 // Check surface present modes:
1728 uint32_t present_mode_count = 0;
1729 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001730 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1731 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001732 pass = (err != VK_SUCCESS);
1733 ASSERT_TRUE(pass);
1734 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001735#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001736
Ian Elliott1c32c772016-04-28 14:47:13 -06001737 // Use the functions from the VK_KHR_swapchain extension without enabling
1738 // that extension:
1739
1740 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001741 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001742 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1743 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001744 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001745 pass = (err != VK_SUCCESS);
1746 ASSERT_TRUE(pass);
1747 m_errorMonitor->VerifyFound();
1748
1749 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001750 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1751 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001752 pass = (err != VK_SUCCESS);
1753 ASSERT_TRUE(pass);
1754 m_errorMonitor->VerifyFound();
1755
Chris Forbeseb7d5502016-09-13 18:19:21 +12001756 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1757 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
1758 VkFence fence;
1759 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
1760
Ian Elliott1c32c772016-04-28 14:47:13 -06001761 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001762 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12001763 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06001764 pass = (err != VK_SUCCESS);
1765 ASSERT_TRUE(pass);
1766 m_errorMonitor->VerifyFound();
1767
Chris Forbeseb7d5502016-09-13 18:19:21 +12001768 vkDestroyFence(m_device->device(), fence, nullptr);
1769
Ian Elliott1c32c772016-04-28 14:47:13 -06001770 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001771 //
1772 // NOTE: Currently can't test this because a real swapchain is needed (as
1773 // opposed to the fake one we created) in order for the layer to lookup the
1774 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001775
1776 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001778 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1779 m_errorMonitor->VerifyFound();
1780}
Chris Forbes09368e42016-10-13 11:59:22 +13001781#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06001782
Karl Schultz6addd812016-02-02 17:17:23 -07001783TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1784 VkResult err;
1785 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001786
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001787 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1788 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001789
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001790 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001791
1792 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001793 VkImage image;
1794 VkDeviceMemory mem;
1795 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001796
Karl Schultz6addd812016-02-02 17:17:23 -07001797 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1798 const int32_t tex_width = 32;
1799 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001800
Tony Barboureb254902015-07-15 12:50:33 -06001801 VkImageCreateInfo image_create_info = {};
1802 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001803 image_create_info.pNext = NULL;
1804 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1805 image_create_info.format = tex_format;
1806 image_create_info.extent.width = tex_width;
1807 image_create_info.extent.height = tex_height;
1808 image_create_info.extent.depth = 1;
1809 image_create_info.mipLevels = 1;
1810 image_create_info.arrayLayers = 1;
1811 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1812 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1813 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1814 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12001815 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001816
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001817 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001818 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001819 mem_alloc.pNext = NULL;
1820 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001821
Chia-I Wuf7458c52015-10-26 21:10:41 +08001822 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001823 ASSERT_VK_SUCCESS(err);
1824
Karl Schultz6addd812016-02-02 17:17:23 -07001825 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001826
Mark Lobodzinski23065352015-05-29 09:32:35 -05001827 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001828
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001829 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Karl Schultz6addd812016-02-02 17:17:23 -07001830 if (!pass) { // If we can't find any unmappable memory this test doesn't
1831 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08001832 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06001833 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06001834 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06001835
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001836 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001837 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001838 ASSERT_VK_SUCCESS(err);
1839
1840 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06001841 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001842 ASSERT_VK_SUCCESS(err);
1843
1844 // Map memory as if to initialize the image
1845 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001846 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001847
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001848 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001849
Chia-I Wuf7458c52015-10-26 21:10:41 +08001850 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06001851 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001852}
1853
Karl Schultz6addd812016-02-02 17:17:23 -07001854TEST_F(VkLayerTest, RebindMemory) {
1855 VkResult err;
1856 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001857
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001858 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001859
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001860 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001861
1862 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001863 VkImage image;
1864 VkDeviceMemory mem1;
1865 VkDeviceMemory mem2;
1866 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001867
Karl Schultz6addd812016-02-02 17:17:23 -07001868 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1869 const int32_t tex_width = 32;
1870 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001871
Tony Barboureb254902015-07-15 12:50:33 -06001872 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001873 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1874 image_create_info.pNext = NULL;
1875 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1876 image_create_info.format = tex_format;
1877 image_create_info.extent.width = tex_width;
1878 image_create_info.extent.height = tex_height;
1879 image_create_info.extent.depth = 1;
1880 image_create_info.mipLevels = 1;
1881 image_create_info.arrayLayers = 1;
1882 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1883 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1884 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1885 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001886
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001887 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001888 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1889 mem_alloc.pNext = NULL;
1890 mem_alloc.allocationSize = 0;
1891 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06001892
Karl Schultz6addd812016-02-02 17:17:23 -07001893 // Introduce failure, do NOT set memProps to
1894 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06001895 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08001896 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001897 ASSERT_VK_SUCCESS(err);
1898
Karl Schultz6addd812016-02-02 17:17:23 -07001899 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001900
1901 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001902 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001903 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001904
1905 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001906 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001907 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001908 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001909 ASSERT_VK_SUCCESS(err);
1910
1911 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06001912 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001913 ASSERT_VK_SUCCESS(err);
1914
Karl Schultz6addd812016-02-02 17:17:23 -07001915 // Introduce validation failure, try to bind a different memory object to
1916 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06001917 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001918
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001919 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001920
Chia-I Wuf7458c52015-10-26 21:10:41 +08001921 vkDestroyImage(m_device->device(), image, NULL);
1922 vkFreeMemory(m_device->device(), mem1, NULL);
1923 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001924}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001925
Karl Schultz6addd812016-02-02 17:17:23 -07001926TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001927 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001928
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
1930 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001931
1932 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001933 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1934 fenceInfo.pNext = NULL;
1935 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06001936
Tony Barbour300a6082015-04-07 13:44:53 -06001937 ASSERT_NO_FATAL_FAILURE(InitState());
1938 ASSERT_NO_FATAL_FAILURE(InitViewport());
1939 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1940
Tony Barbour552f6c02016-12-21 14:34:07 -07001941 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001942 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07001943 m_commandBuffer->EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06001944
1945 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001946
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001947 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001948 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1949 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001950 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001951 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001952 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001953 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001954 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001955 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001956 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001957
1958 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07001959 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001960
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001961 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001962}
Chris Forbes4e44c912016-06-16 10:20:00 +12001963
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001964TEST_F(VkLayerTest, InvalidUsageBits) {
1965 TEST_DESCRIPTION("Specify wrong usage for image then create conflicting view of image "
1966 "Initialize buffer with wrong usage then perform copy expecting errors "
1967 "from both the image and the buffer (2 calls)");
1968 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06001969
1970 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesd2b5fe42016-11-28 18:00:00 +13001971
1972 auto format = VK_FORMAT_D24_UNORM_S8_UINT;
1973
Tony Barbourf92621a2016-05-02 14:28:12 -06001974 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06001975 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Chris Forbesd2b5fe42016-11-28 18:00:00 +13001976 image.init(128, 128, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001977 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06001978
Tony Barbourf92621a2016-05-02 14:28:12 -06001979 VkImageView dsv;
1980 VkImageViewCreateInfo dsvci = {};
1981 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
1982 dsvci.image = image.handle();
1983 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13001984 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06001985 dsvci.subresourceRange.layerCount = 1;
1986 dsvci.subresourceRange.baseMipLevel = 0;
1987 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001988 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06001989
Tony Barbourf92621a2016-05-02 14:28:12 -06001990 // Create a view with depth / stencil aspect for image with different usage
1991 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001992
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001993 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06001994
1995 // Initialize buffer with TRANSFER_DST usage
1996 vk_testing::Buffer buffer;
1997 VkMemoryPropertyFlags reqs = 0;
1998 buffer.init_as_dst(*m_device, 128 * 128, reqs);
1999 VkBufferImageCopy region = {};
2000 region.bufferRowLength = 128;
2001 region.bufferImageHeight = 128;
2002 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2003 region.imageSubresource.layerCount = 1;
2004 region.imageExtent.height = 16;
2005 region.imageExtent.width = 16;
2006 region.imageExtent.depth = 1;
2007
Tony Barbourf92621a2016-05-02 14:28:12 -06002008 // Buffer usage not set to TRANSFER_SRC and image usage not set to
2009 // TRANSFER_DST
Tony Barbour552f6c02016-12-21 14:34:07 -07002010 m_commandBuffer->BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002011
Chris Forbesda581202016-10-06 18:25:26 +13002012 // two separate errors from this call:
2013 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2014 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "buffer should have VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
2015
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002016 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2017 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002018 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002019}
Tony Barbour75d79f02016-08-30 09:39:07 -06002020
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002021#endif // MEM_TRACKER_TESTS
2022
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06002023#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002024
2025TEST_F(VkLayerTest, LeakAnObject) {
2026 VkResult err;
2027
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002028 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002029
2030 // Note that we have to create a new device since destroying the
2031 // framework's device causes Teardown() to fail and just calling Teardown
2032 // will destroy the errorMonitor.
2033
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002034 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002035
2036 ASSERT_NO_FATAL_FAILURE(InitState());
2037
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002038 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002039 std::vector<VkDeviceQueueCreateInfo> queue_info;
2040 queue_info.reserve(queue_props.size());
2041 std::vector<std::vector<float>> queue_priorities;
2042 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2043 VkDeviceQueueCreateInfo qi = {};
2044 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2045 qi.pNext = NULL;
2046 qi.queueFamilyIndex = i;
2047 qi.queueCount = queue_props[i].queueCount;
2048 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2049 qi.pQueuePriorities = queue_priorities[i].data();
2050 queue_info.push_back(qi);
2051 }
2052
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002053 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002054
2055 // The sacrificial device object
2056 VkDevice testDevice;
2057 VkDeviceCreateInfo device_create_info = {};
2058 auto features = m_device->phy().features();
2059 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2060 device_create_info.pNext = NULL;
2061 device_create_info.queueCreateInfoCount = queue_info.size();
2062 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002063 device_create_info.enabledLayerCount = 0;
2064 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002065 device_create_info.pEnabledFeatures = &features;
2066 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2067 ASSERT_VK_SUCCESS(err);
2068
2069 VkFence fence;
2070 VkFenceCreateInfo fence_create_info = {};
2071 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2072 fence_create_info.pNext = NULL;
2073 fence_create_info.flags = 0;
2074 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2075 ASSERT_VK_SUCCESS(err);
2076
2077 // Induce failure by not calling vkDestroyFence
2078 vkDestroyDevice(testDevice, NULL);
2079 m_errorMonitor->VerifyFound();
2080}
2081
2082TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
2083
2084 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
2085 "attempt to delete them from another.");
2086
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002087 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002088
Cody Northropc31a84f2016-08-22 10:41:47 -06002089 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002090 VkCommandPool command_pool_one;
2091 VkCommandPool command_pool_two;
2092
2093 VkCommandPoolCreateInfo pool_create_info{};
2094 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2095 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2096 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2097
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002098 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002099
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002100 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002101
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002102 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002103 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002104 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002105 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002106 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002107 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002108 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002109
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002110 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002111
2112 m_errorMonitor->VerifyFound();
2113
2114 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2115 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2116}
2117
2118TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2119 VkResult err;
2120
2121 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002122 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002123
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002124 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002125
2126 ASSERT_NO_FATAL_FAILURE(InitState());
2127 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2128
2129 VkDescriptorPoolSize ds_type_count = {};
2130 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2131 ds_type_count.descriptorCount = 1;
2132
2133 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2134 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2135 ds_pool_ci.pNext = NULL;
2136 ds_pool_ci.flags = 0;
2137 ds_pool_ci.maxSets = 1;
2138 ds_pool_ci.poolSizeCount = 1;
2139 ds_pool_ci.pPoolSizes = &ds_type_count;
2140
2141 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002142 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002143 ASSERT_VK_SUCCESS(err);
2144
2145 // Create a second descriptor pool
2146 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002147 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002148 ASSERT_VK_SUCCESS(err);
2149
2150 VkDescriptorSetLayoutBinding dsl_binding = {};
2151 dsl_binding.binding = 0;
2152 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2153 dsl_binding.descriptorCount = 1;
2154 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2155 dsl_binding.pImmutableSamplers = NULL;
2156
2157 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2158 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2159 ds_layout_ci.pNext = NULL;
2160 ds_layout_ci.bindingCount = 1;
2161 ds_layout_ci.pBindings = &dsl_binding;
2162
2163 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002164 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002165 ASSERT_VK_SUCCESS(err);
2166
2167 VkDescriptorSet descriptorSet;
2168 VkDescriptorSetAllocateInfo alloc_info = {};
2169 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2170 alloc_info.descriptorSetCount = 1;
2171 alloc_info.descriptorPool = ds_pool_one;
2172 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002173 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002174 ASSERT_VK_SUCCESS(err);
2175
2176 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2177
2178 m_errorMonitor->VerifyFound();
2179
2180 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2181 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2182 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2183}
2184
2185TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002186 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002187
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002188 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002189
2190 ASSERT_NO_FATAL_FAILURE(InitState());
2191
2192 // Pass bogus handle into GetImageMemoryRequirements
2193 VkMemoryRequirements mem_reqs;
2194 uint64_t fakeImageHandle = 0xCADECADE;
2195 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2196
2197 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2198
2199 m_errorMonitor->VerifyFound();
2200}
2201
Karl Schultz6addd812016-02-02 17:17:23 -07002202TEST_F(VkLayerTest, PipelineNotBound) {
2203 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002204
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002205 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002206
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002207 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002208
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002209 ASSERT_NO_FATAL_FAILURE(InitState());
2210 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002211
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002212 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002213 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2214 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002215
2216 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002217 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2218 ds_pool_ci.pNext = NULL;
2219 ds_pool_ci.maxSets = 1;
2220 ds_pool_ci.poolSizeCount = 1;
2221 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002222
2223 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002224 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002225 ASSERT_VK_SUCCESS(err);
2226
2227 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002228 dsl_binding.binding = 0;
2229 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2230 dsl_binding.descriptorCount = 1;
2231 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2232 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002233
2234 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002235 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2236 ds_layout_ci.pNext = NULL;
2237 ds_layout_ci.bindingCount = 1;
2238 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002239
2240 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002241 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002242 ASSERT_VK_SUCCESS(err);
2243
2244 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002245 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002246 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002247 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002248 alloc_info.descriptorPool = ds_pool;
2249 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002250 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002251 ASSERT_VK_SUCCESS(err);
2252
2253 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002254 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2255 pipeline_layout_ci.pNext = NULL;
2256 pipeline_layout_ci.setLayoutCount = 1;
2257 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002258
2259 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002260 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002261 ASSERT_VK_SUCCESS(err);
2262
Mark Youngad779052016-01-06 14:26:04 -07002263 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002264
Tony Barbour552f6c02016-12-21 14:34:07 -07002265 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002266 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002267
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002268 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002269
Chia-I Wuf7458c52015-10-26 21:10:41 +08002270 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2271 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2272 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002273}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002274
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002275TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2276 VkResult err;
2277
2278 TEST_DESCRIPTION("Test validation check for an invalid memory type index "
2279 "during bind[Buffer|Image]Memory time");
2280
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002281 ASSERT_NO_FATAL_FAILURE(InitState());
2282
2283 // Create an image, allocate memory, set a bad typeIndex and then try to
2284 // bind it
2285 VkImage image;
2286 VkDeviceMemory mem;
2287 VkMemoryRequirements mem_reqs;
2288 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2289 const int32_t tex_width = 32;
2290 const int32_t tex_height = 32;
2291
2292 VkImageCreateInfo image_create_info = {};
2293 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2294 image_create_info.pNext = NULL;
2295 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2296 image_create_info.format = tex_format;
2297 image_create_info.extent.width = tex_width;
2298 image_create_info.extent.height = tex_height;
2299 image_create_info.extent.depth = 1;
2300 image_create_info.mipLevels = 1;
2301 image_create_info.arrayLayers = 1;
2302 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2303 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2304 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2305 image_create_info.flags = 0;
2306
2307 VkMemoryAllocateInfo mem_alloc = {};
2308 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2309 mem_alloc.pNext = NULL;
2310 mem_alloc.allocationSize = 0;
2311 mem_alloc.memoryTypeIndex = 0;
2312
2313 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2314 ASSERT_VK_SUCCESS(err);
2315
2316 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2317 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002318
2319 // Introduce Failure, select invalid TypeIndex
2320 VkPhysicalDeviceMemoryProperties memory_info;
2321
2322 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2323 unsigned int i;
2324 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2325 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2326 mem_alloc.memoryTypeIndex = i;
2327 break;
2328 }
2329 }
2330 if (i >= memory_info.memoryTypeCount) {
2331 printf("No invalid memory type index could be found; skipped.\n");
2332 vkDestroyImage(m_device->device(), image, NULL);
2333 return;
2334 }
2335
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002336 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 -06002337
2338 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2339 ASSERT_VK_SUCCESS(err);
2340
2341 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2342 (void)err;
2343
2344 m_errorMonitor->VerifyFound();
2345
2346 vkDestroyImage(m_device->device(), image, NULL);
2347 vkFreeMemory(m_device->device(), mem, NULL);
2348}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002349
Karl Schultz6addd812016-02-02 17:17:23 -07002350TEST_F(VkLayerTest, BindInvalidMemory) {
2351 VkResult err;
2352 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002353
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002354 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002355
Tobin Ehlisec598302015-09-15 15:02:17 -06002356 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06002357
2358 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002359 VkImage image;
2360 VkDeviceMemory mem;
2361 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002362
Karl Schultz6addd812016-02-02 17:17:23 -07002363 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2364 const int32_t tex_width = 32;
2365 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002366
2367 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002368 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2369 image_create_info.pNext = NULL;
2370 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2371 image_create_info.format = tex_format;
2372 image_create_info.extent.width = tex_width;
2373 image_create_info.extent.height = tex_height;
2374 image_create_info.extent.depth = 1;
2375 image_create_info.mipLevels = 1;
2376 image_create_info.arrayLayers = 1;
2377 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2378 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2379 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2380 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002381
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002382 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002383 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2384 mem_alloc.pNext = NULL;
2385 mem_alloc.allocationSize = 0;
2386 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002387
Chia-I Wuf7458c52015-10-26 21:10:41 +08002388 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002389 ASSERT_VK_SUCCESS(err);
2390
Karl Schultz6addd812016-02-02 17:17:23 -07002391 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002392
2393 mem_alloc.allocationSize = mem_reqs.size;
2394
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002395 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002396 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002397
2398 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002399 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002400 ASSERT_VK_SUCCESS(err);
2401
2402 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002403 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002404
2405 // Try to bind free memory that has been freed
2406 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2407 // This may very well return an error.
2408 (void)err;
2409
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002410 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002411
Chia-I Wuf7458c52015-10-26 21:10:41 +08002412 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002413}
2414
Karl Schultz6addd812016-02-02 17:17:23 -07002415TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2416 VkResult err;
2417 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002418
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002419 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002420
Tobin Ehlisec598302015-09-15 15:02:17 -06002421 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06002422
Karl Schultz6addd812016-02-02 17:17:23 -07002423 // Create an image object, allocate memory, destroy the object and then try
2424 // to bind it
2425 VkImage image;
2426 VkDeviceMemory mem;
2427 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002428
Karl Schultz6addd812016-02-02 17:17:23 -07002429 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2430 const int32_t tex_width = 32;
2431 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002432
2433 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002434 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2435 image_create_info.pNext = NULL;
2436 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2437 image_create_info.format = tex_format;
2438 image_create_info.extent.width = tex_width;
2439 image_create_info.extent.height = tex_height;
2440 image_create_info.extent.depth = 1;
2441 image_create_info.mipLevels = 1;
2442 image_create_info.arrayLayers = 1;
2443 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2444 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2445 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2446 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002447
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002448 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002449 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2450 mem_alloc.pNext = NULL;
2451 mem_alloc.allocationSize = 0;
2452 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002453
Chia-I Wuf7458c52015-10-26 21:10:41 +08002454 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002455 ASSERT_VK_SUCCESS(err);
2456
Karl Schultz6addd812016-02-02 17:17:23 -07002457 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002458
2459 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002460 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002461 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002462
2463 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002464 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002465 ASSERT_VK_SUCCESS(err);
2466
2467 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002468 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002469 ASSERT_VK_SUCCESS(err);
2470
2471 // Now Try to bind memory to this destroyed object
2472 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2473 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07002474 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06002475
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002476 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002477
Chia-I Wuf7458c52015-10-26 21:10:41 +08002478 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002479}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06002480
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002481#endif // OBJ_TRACKER_TESTS
2482
Tobin Ehlis0788f522015-05-26 16:11:58 -06002483#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002484
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07002485TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
2486 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
2487
2488 ASSERT_NO_FATAL_FAILURE(InitState());
2489 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2490
2491 VkVertexInputBindingDescription input_binding;
2492 memset(&input_binding, 0, sizeof(input_binding));
2493
2494 VkVertexInputAttributeDescription input_attribs;
2495 memset(&input_attribs, 0, sizeof(input_attribs));
2496
2497 // Pick a really bad format for this purpose and make sure it should fail
2498 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
2499 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
2500 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
2501 printf("Format unsuitable for test; skipped.\n");
2502 return;
2503 }
2504
2505 input_attribs.location = 0;
2506 char const *vsSource = "#version 450\n"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002507 "\n"
2508 "out gl_PerVertex {\n"
2509 " vec4 gl_Position;\n"
2510 "};\n"
2511 "void main(){\n"
2512 " gl_Position = vec4(1);\n"
2513 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07002514 char const *fsSource = "#version 450\n"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002515 "\n"
2516 "layout(location=0) out vec4 color;\n"
2517 "void main(){\n"
2518 " color = vec4(1);\n"
2519 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07002520
2521 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
2522 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2523 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
2524
2525 VkPipelineObj pipe(m_device);
2526 pipe.AddColorAttachment();
2527 pipe.AddShader(&vs);
2528 pipe.AddShader(&fs);
2529
2530 pipe.AddVertexInputBindings(&input_binding, 1);
2531 pipe.AddVertexInputAttribs(&input_attribs, 1);
2532
2533 VkDescriptorSetObj descriptorSet(m_device);
2534 descriptorSet.AppendDummy();
2535 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
2536
2537 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
2538
2539 m_errorMonitor->VerifyFound();
2540}
2541
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002542TEST_F(VkLayerTest, ImageSampleCounts) {
2543
2544 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger "
2545 "validation errors.");
2546 ASSERT_NO_FATAL_FAILURE(InitState());
2547
2548 VkMemoryPropertyFlags reqs = 0;
2549 VkImageCreateInfo image_create_info = {};
2550 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2551 image_create_info.pNext = NULL;
2552 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2553 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
2554 image_create_info.extent.width = 256;
2555 image_create_info.extent.height = 256;
2556 image_create_info.extent.depth = 1;
2557 image_create_info.mipLevels = 1;
2558 image_create_info.arrayLayers = 1;
2559 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2560 image_create_info.flags = 0;
2561
2562 VkImageBlit blit_region = {};
2563 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2564 blit_region.srcSubresource.baseArrayLayer = 0;
2565 blit_region.srcSubresource.layerCount = 1;
2566 blit_region.srcSubresource.mipLevel = 0;
2567 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2568 blit_region.dstSubresource.baseArrayLayer = 0;
2569 blit_region.dstSubresource.layerCount = 1;
2570 blit_region.dstSubresource.mipLevel = 0;
2571
2572 // Create two images, the source with sampleCount = 2, and attempt to blit
2573 // between them
2574 {
2575 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002576 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002577 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002578 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002579 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002580 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002581 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002582 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002583 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002584 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was created with a sample count "
2585 "of VK_SAMPLE_COUNT_2_BIT but "
2586 "must be VK_SAMPLE_COUNT_1_BIT");
2587 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
2588 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002589 m_errorMonitor->VerifyFound();
2590 m_commandBuffer->EndCommandBuffer();
2591 }
2592
2593 // Create two images, the dest with sampleCount = 4, and attempt to blit
2594 // between them
2595 {
2596 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002597 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002598 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002599 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002600 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002601 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002602 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002603 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002604 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002605 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was created with a sample count "
2606 "of VK_SAMPLE_COUNT_4_BIT but "
2607 "must be VK_SAMPLE_COUNT_1_BIT");
2608 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
2609 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002610 m_errorMonitor->VerifyFound();
2611 m_commandBuffer->EndCommandBuffer();
2612 }
2613
2614 VkBufferImageCopy copy_region = {};
2615 copy_region.bufferRowLength = 128;
2616 copy_region.bufferImageHeight = 128;
2617 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2618 copy_region.imageSubresource.layerCount = 1;
2619 copy_region.imageExtent.height = 64;
2620 copy_region.imageExtent.width = 64;
2621 copy_region.imageExtent.depth = 1;
2622
2623 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
2624 // buffer to image
2625 {
2626 vk_testing::Buffer src_buffer;
2627 VkMemoryPropertyFlags reqs = 0;
2628 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
2629 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002630 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002631 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002632 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002633 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002634 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was created with a sample count "
2635 "of VK_SAMPLE_COUNT_8_BIT but "
2636 "must be VK_SAMPLE_COUNT_1_BIT");
2637 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
2638 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002639 m_errorMonitor->VerifyFound();
2640 m_commandBuffer->EndCommandBuffer();
2641 }
2642
2643 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
2644 // image to buffer
2645 {
2646 vk_testing::Buffer dst_buffer;
2647 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
2648 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002649 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002650 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002651 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002652 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was created with a sample count "
2654 "of VK_SAMPLE_COUNT_2_BIT but "
2655 "must be VK_SAMPLE_COUNT_1_BIT");
2656 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002657 dst_buffer.handle(), 1, &copy_region);
2658 m_errorMonitor->VerifyFound();
2659 m_commandBuffer->EndCommandBuffer();
2660 }
2661}
2662
Mike Stroyanac5afeb2016-10-17 13:58:10 -06002663TEST_F(VkLayerTest, BlitImageFormats) {
Mike Stroyanac5afeb2016-10-17 13:58:10 -06002664 ASSERT_NO_FATAL_FAILURE(InitState());
2665
2666 VkImageObj src_image(m_device);
2667 src_image.init(64, 64, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
2668 VkImageObj dst_image(m_device);
2669 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
2670 VkImageObj dst_image2(m_device);
Mike Stroyan131f3e72016-10-18 11:10:23 -06002671 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 -06002672
2673 VkImageBlit blitRegion = {};
2674 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2675 blitRegion.srcSubresource.baseArrayLayer = 0;
2676 blitRegion.srcSubresource.layerCount = 1;
2677 blitRegion.srcSubresource.mipLevel = 0;
2678 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2679 blitRegion.dstSubresource.baseArrayLayer = 0;
2680 blitRegion.dstSubresource.layerCount = 1;
2681 blitRegion.dstSubresource.mipLevel = 0;
2682
Dave Houlton34df4cb2016-12-01 16:43:06 -07002683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
2684
2685 // TODO: there are 9 permutations of signed, unsigned, & other for source and dest
2686 // this test is only checking 2 of them at the moment
Mike Stroyanac5afeb2016-10-17 13:58:10 -06002687
2688 // Unsigned int vs not an int
Tony Barbour552f6c02016-12-21 14:34:07 -07002689 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002690 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image.image(), dst_image.layout(), 1,
2691 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06002692
2693 m_errorMonitor->VerifyFound();
2694
Dave Houlton34df4cb2016-12-01 16:43:06 -07002695 // Test should generate 2 VU failures
2696 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02190);
2697 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06002698
2699 // Unsigned int vs signed int
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002700 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image2.image(), dst_image2.layout(), 1,
2701 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06002702
Dave Houlton34df4cb2016-12-01 16:43:06 -07002703 // TODO: Note that this only verifies that at least one of the VU enums was found
2704 // 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 -06002705 m_errorMonitor->VerifyFound();
2706
Tony Barbour552f6c02016-12-21 14:34:07 -07002707 m_commandBuffer->EndCommandBuffer();
Mike Stroyanac5afeb2016-10-17 13:58:10 -06002708}
2709
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002710TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
2711 VkResult err;
2712 bool pass;
2713
2714 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
2715 ASSERT_NO_FATAL_FAILURE(InitState());
2716
2717 // If w/d/h granularity is 1, test is not meaningful
2718 // TODO: When virtual device limits are available, create a set of limits for this test that
2719 // will always have a granularity of > 1 for w, h, and d
2720 auto index = m_device->graphics_queue_node_index_;
2721 auto queue_family_properties = m_device->phy().queue_properties();
2722
2723 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
2724 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
2725 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
2726 return;
2727 }
2728
2729 // Create two images of different types and try to copy between them
2730 VkImage srcImage;
2731 VkImage dstImage;
2732 VkDeviceMemory srcMem;
2733 VkDeviceMemory destMem;
2734 VkMemoryRequirements memReqs;
2735
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002736 VkImageCreateInfo image_create_info = {};
2737 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2738 image_create_info.pNext = NULL;
2739 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2740 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
2741 image_create_info.extent.width = 32;
2742 image_create_info.extent.height = 32;
2743 image_create_info.extent.depth = 1;
2744 image_create_info.mipLevels = 1;
2745 image_create_info.arrayLayers = 4;
2746 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2747 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2748 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2749 image_create_info.flags = 0;
2750
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002751 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002752 ASSERT_VK_SUCCESS(err);
2753
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002754 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002755 ASSERT_VK_SUCCESS(err);
2756
2757 // Allocate memory
2758 VkMemoryAllocateInfo memAlloc = {};
2759 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2760 memAlloc.pNext = NULL;
2761 memAlloc.allocationSize = 0;
2762 memAlloc.memoryTypeIndex = 0;
2763
2764 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
2765 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002766 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002767 ASSERT_TRUE(pass);
2768 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
2769 ASSERT_VK_SUCCESS(err);
2770
2771 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
2772 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002773 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002774 ASSERT_VK_SUCCESS(err);
2775 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
2776 ASSERT_VK_SUCCESS(err);
2777
2778 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
2779 ASSERT_VK_SUCCESS(err);
2780 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
2781 ASSERT_VK_SUCCESS(err);
2782
Tony Barbour552f6c02016-12-21 14:34:07 -07002783 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002784 VkImageCopy copyRegion;
2785 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2786 copyRegion.srcSubresource.mipLevel = 0;
2787 copyRegion.srcSubresource.baseArrayLayer = 0;
2788 copyRegion.srcSubresource.layerCount = 1;
2789 copyRegion.srcOffset.x = 0;
2790 copyRegion.srcOffset.y = 0;
2791 copyRegion.srcOffset.z = 0;
2792 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2793 copyRegion.dstSubresource.mipLevel = 0;
2794 copyRegion.dstSubresource.baseArrayLayer = 0;
2795 copyRegion.dstSubresource.layerCount = 1;
2796 copyRegion.dstOffset.x = 0;
2797 copyRegion.dstOffset.y = 0;
2798 copyRegion.dstOffset.z = 0;
2799 copyRegion.extent.width = 1;
2800 copyRegion.extent.height = 1;
2801 copyRegion.extent.depth = 1;
2802
2803 // Introduce failure by setting srcOffset to a bad granularity value
2804 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2806 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002807 m_errorMonitor->VerifyFound();
2808
2809 // Introduce failure by setting extent to a bad granularity value
2810 copyRegion.srcOffset.y = 0;
2811 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002812 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2813 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002814 m_errorMonitor->VerifyFound();
2815
2816 // Now do some buffer/image copies
2817 vk_testing::Buffer buffer;
2818 VkMemoryPropertyFlags reqs = 0;
2819 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2820 VkBufferImageCopy region = {};
2821 region.bufferOffset = 0;
2822 region.bufferRowLength = 3;
2823 region.bufferImageHeight = 128;
2824 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2825 region.imageSubresource.layerCount = 1;
2826 region.imageExtent.height = 16;
2827 region.imageExtent.width = 16;
2828 region.imageExtent.depth = 1;
2829 region.imageOffset.x = 0;
2830 region.imageOffset.y = 0;
2831 region.imageOffset.z = 0;
2832
2833 // Introduce failure by setting bufferRowLength to a bad granularity value
2834 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2836 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2837 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002838 m_errorMonitor->VerifyFound();
2839 region.bufferRowLength = 128;
2840
2841 // Introduce failure by setting bufferOffset to a bad granularity value
2842 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2844 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
2845 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002846 m_errorMonitor->VerifyFound();
2847 region.bufferOffset = 0;
2848
2849 // Introduce failure by setting bufferImageHeight to a bad granularity value
2850 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002851 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2852 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
2853 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002854 m_errorMonitor->VerifyFound();
2855 region.bufferImageHeight = 128;
2856
2857 // Introduce failure by setting imageExtent to a bad granularity value
2858 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002859 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2860 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
2861 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002862 m_errorMonitor->VerifyFound();
2863 region.imageExtent.width = 16;
2864
2865 // Introduce failure by setting imageOffset to a bad granularity value
2866 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2868 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2869 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002870 m_errorMonitor->VerifyFound();
2871
Tony Barbour552f6c02016-12-21 14:34:07 -07002872 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002873
2874 vkDestroyImage(m_device->device(), srcImage, NULL);
2875 vkDestroyImage(m_device->device(), dstImage, NULL);
2876 vkFreeMemory(m_device->device(), srcMem, NULL);
2877 vkFreeMemory(m_device->device(), destMem, NULL);
2878}
2879
Mark Lobodzinski570efc62016-08-09 16:43:19 -06002880TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski570efc62016-08-09 16:43:19 -06002881 TEST_DESCRIPTION("Submit command buffer created using one queue family and "
2882 "attempt to submit them on a queue created in a different "
2883 "queue family.");
2884
Cody Northropc31a84f2016-08-22 10:41:47 -06002885 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski570efc62016-08-09 16:43:19 -06002886 // This test is meaningless unless we have multiple queue families
2887 auto queue_family_properties = m_device->phy().queue_properties();
2888 if (queue_family_properties.size() < 2) {
2889 return;
2890 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06002892 // Get safe index of another queue family
2893 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
2894 ASSERT_NO_FATAL_FAILURE(InitState());
2895 // Create a second queue using a different queue family
2896 VkQueue other_queue;
2897 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
2898
2899 // Record an empty cmd buffer
2900 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
2901 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2902 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
2903 vkEndCommandBuffer(m_commandBuffer->handle());
2904
2905 // And submit on the wrong queue
2906 VkSubmitInfo submit_info = {};
2907 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2908 submit_info.commandBufferCount = 1;
2909 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06002910 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06002911
2912 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06002913}
2914
Chris Forbes4c24a922016-11-16 08:59:10 +13002915TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
2916 ASSERT_NO_FATAL_FAILURE(InitState());
2917
Chris Forbes2d9b2a82016-11-21 10:45:39 +13002918 // There are no attachments, but refer to attachment 0.
2919 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13002920 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002921 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13002922 };
2923
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002924 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, subpasses, 0, nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13002925 VkRenderPass rp;
2926
Chris Forbes2d9b2a82016-11-21 10:45:39 +13002927 // "... must be less than the total number of attachments ..."
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13002929 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
2930 m_errorMonitor->VerifyFound();
2931}
2932
Chris Forbesa58c4522016-09-28 15:19:39 +13002933TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
2934 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
2935 ASSERT_NO_FATAL_FAILURE(InitState());
2936
2937 // A renderpass with two subpasses, both writing the same attachment.
2938 VkAttachmentDescription attach[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002939 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
2940 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
2941 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesa58c4522016-09-28 15:19:39 +13002942 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002943 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbesa58c4522016-09-28 15:19:39 +13002944 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002945 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
2946 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbesa58c4522016-09-28 15:19:39 +13002947 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002948 VkSubpassDependency dep = {0,
2949 1,
2950 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
2951 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
2952 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
2953 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
2954 VK_DEPENDENCY_BY_REGION_BIT};
2955 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 1, &dep};
Chris Forbesa58c4522016-09-28 15:19:39 +13002956 VkRenderPass rp;
2957 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
2958 ASSERT_VK_SUCCESS(err);
2959
2960 VkImageObj image(m_device);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002961 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 +13002962 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
2963
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002964 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
Chris Forbesa58c4522016-09-28 15:19:39 +13002965 VkFramebuffer fb;
2966 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
2967 ASSERT_VK_SUCCESS(err);
2968
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002969 char const *vsSource = "#version 450\n"
2970 "void main() { gl_Position = vec4(1); }\n";
2971 char const *fsSource = "#version 450\n"
2972 "layout(location=0) out vec4 color;\n"
2973 "void main() { color = vec4(1); }\n";
Chris Forbesa58c4522016-09-28 15:19:39 +13002974
2975 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2976 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
2977 VkPipelineObj pipe(m_device);
2978 pipe.AddColorAttachment();
2979 pipe.AddShader(&vs);
2980 pipe.AddShader(&fs);
2981 VkViewport view_port = {};
2982 m_viewports.push_back(view_port);
2983 pipe.SetViewport(m_viewports);
2984 VkRect2D rect = {};
2985 m_scissors.push_back(rect);
2986 pipe.SetScissor(m_scissors);
2987
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002988 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13002989 VkPipelineLayout pl;
2990 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
2991 ASSERT_VK_SUCCESS(err);
2992 pipe.CreateVKPipeline(pl, rp);
2993
Tony Barbour552f6c02016-12-21 14:34:07 -07002994 m_commandBuffer->BeginCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13002995
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07002996 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
2997 nullptr,
2998 rp,
2999 fb,
3000 {{
3001 0, 0,
3002 },
3003 {32, 32}},
3004 0,
3005 nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003006
3007 // subtest 1: bind in the wrong subpass
3008 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3009 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003010 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 +13003011 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3012 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3013 m_errorMonitor->VerifyFound();
3014
3015 vkCmdEndRenderPass(m_commandBuffer->handle());
3016
3017 // subtest 2: bind in correct subpass, then transition to next subpass
3018 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3019 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3020 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003021 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 +13003022 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3023 m_errorMonitor->VerifyFound();
3024
3025 vkCmdEndRenderPass(m_commandBuffer->handle());
3026
Tony Barbour552f6c02016-12-21 14:34:07 -07003027 m_commandBuffer->EndCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003028
3029 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3030 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3031 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3032}
3033
Tony Barbour4e919972016-08-09 13:27:40 -06003034TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
3035 TEST_DESCRIPTION("Generate INVALID_RENDER_AREA error by beginning renderpass"
3036 "with extent outside of framebuffer");
3037 ASSERT_NO_FATAL_FAILURE(InitState());
3038 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3039
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003040 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot execute a render pass with renderArea "
3041 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003042
3043 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3044 m_renderPassBeginInfo.renderArea.extent.width = 257;
3045 m_renderPassBeginInfo.renderArea.extent.height = 257;
Tony Barbour552f6c02016-12-21 14:34:07 -07003046 m_commandBuffer->BeginCommandBuffer();
3047 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour4e919972016-08-09 13:27:40 -06003048 m_errorMonitor->VerifyFound();
3049}
3050
3051TEST_F(VkLayerTest, DisabledIndependentBlend) {
3052 TEST_DESCRIPTION("Generate INDEPENDENT_BLEND by disabling independent "
3053 "blend and then specifying different blend states for two "
3054 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003055 VkPhysicalDeviceFeatures features = {};
3056 features.independentBlend = VK_FALSE;
Cody Northropc31a84f2016-08-22 10:41:47 -06003057 ASSERT_NO_FATAL_FAILURE(InitState(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003058
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003059 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3060 "Invalid Pipeline CreateInfo: If independent blend feature not "
3061 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003062
Cody Northropc31a84f2016-08-22 10:41:47 -06003063 VkDescriptorSetObj descriptorSet(m_device);
3064 descriptorSet.AppendDummy();
3065 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003066
Cody Northropc31a84f2016-08-22 10:41:47 -06003067 VkPipelineObj pipeline(m_device);
3068 VkRenderpassObj renderpass(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003069 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003070 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003071
Cody Northropc31a84f2016-08-22 10:41:47 -06003072 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3073 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3074 att_state1.blendEnable = VK_TRUE;
3075 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3076 att_state2.blendEnable = VK_FALSE;
3077 pipeline.AddColorAttachment(0, &att_state1);
3078 pipeline.AddColorAttachment(1, &att_state2);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003079 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass.handle());
Cody Northropc31a84f2016-08-22 10:41:47 -06003080 m_errorMonitor->VerifyFound();
Tony Barbour4e919972016-08-09 13:27:40 -06003081}
3082
Chris Forbes26ec2122016-11-29 08:58:33 +13003083#if 0
Tony Barbour4e919972016-08-09 13:27:40 -06003084TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
3085 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
3086 "depth attachments in subpass");
Cody Northropc31a84f2016-08-22 10:41:47 -06003087 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbour4e919972016-08-09 13:27:40 -06003088
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003089 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3090 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
Tony Barbour4e919972016-08-09 13:27:40 -06003091
3092 // Create a renderPass with a single color attachment
3093 VkAttachmentReference attach = {};
3094 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3095 VkSubpassDescription subpass = {};
3096 VkRenderPassCreateInfo rpci = {};
3097 rpci.subpassCount = 1;
3098 rpci.pSubpasses = &subpass;
3099 rpci.attachmentCount = 1;
3100 VkAttachmentDescription attach_desc = {};
3101 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3102 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3103 rpci.pAttachments = &attach_desc;
3104 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3105 VkRenderPass rp;
3106 subpass.pDepthStencilAttachment = &attach;
3107 subpass.pColorAttachments = NULL;
3108 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3109 m_errorMonitor->VerifyFound();
3110}
Chris Forbes26ec2122016-11-29 08:58:33 +13003111#endif
Tony Barbour4e919972016-08-09 13:27:40 -06003112
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003113TEST_F(VkLayerTest, UnusedPreserveAttachment) {
3114 TEST_DESCRIPTION("Create a framebuffer where a subpass has a preserve "
3115 "attachment reference of VK_ATTACHMENT_UNUSED");
3116
3117 ASSERT_NO_FATAL_FAILURE(InitState());
3118 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3119
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003120 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must not be VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003121
3122 VkAttachmentReference color_attach = {};
3123 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3124 color_attach.attachment = 0;
3125 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
3126 VkSubpassDescription subpass = {};
3127 subpass.colorAttachmentCount = 1;
3128 subpass.pColorAttachments = &color_attach;
3129 subpass.preserveAttachmentCount = 1;
3130 subpass.pPreserveAttachments = &preserve_attachment;
3131
3132 VkRenderPassCreateInfo rpci = {};
3133 rpci.subpassCount = 1;
3134 rpci.pSubpasses = &subpass;
3135 rpci.attachmentCount = 1;
3136 VkAttachmentDescription attach_desc = {};
3137 attach_desc.format = VK_FORMAT_UNDEFINED;
3138 rpci.pAttachments = &attach_desc;
3139 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3140 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003141 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003142
3143 m_errorMonitor->VerifyFound();
3144
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003145 if (result == VK_SUCCESS) {
3146 vkDestroyRenderPass(m_device->device(), rp, NULL);
3147 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003148}
3149
Chris Forbesc5389742016-06-29 11:49:23 +12003150TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Chris Forbes6655bb32016-07-01 18:27:30 +12003151 TEST_DESCRIPTION("Ensure that CreateRenderPass produces a validation error "
3152 "when the source of a subpass multisample resolve "
3153 "does not have multiple samples.");
3154
Chris Forbesc5389742016-06-29 11:49:23 +12003155 ASSERT_NO_FATAL_FAILURE(InitState());
3156
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003157 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3158 "Subpass 0 requests multisample resolve from attachment 0 which has "
3159 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003160
3161 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003162 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3163 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3164 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3165 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3166 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3167 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003168 };
3169
3170 VkAttachmentReference color = {
3171 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3172 };
3173
3174 VkAttachmentReference resolve = {
3175 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3176 };
3177
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003178 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003179
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003180 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003181
3182 VkRenderPass rp;
3183 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3184
3185 m_errorMonitor->VerifyFound();
3186
3187 if (err == VK_SUCCESS)
3188 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3189}
3190
3191TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Chris Forbes6655bb32016-07-01 18:27:30 +12003192 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
3193 "when a subpass multisample resolve operation is "
3194 "requested, and the destination of that resolve has "
3195 "multiple samples.");
3196
Chris Forbesc5389742016-06-29 11:49:23 +12003197 ASSERT_NO_FATAL_FAILURE(InitState());
3198
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003199 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3200 "Subpass 0 requests multisample resolve into attachment 1, which "
3201 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003202
3203 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003204 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3205 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3206 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3207 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3208 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3209 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003210 };
3211
3212 VkAttachmentReference color = {
3213 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3214 };
3215
3216 VkAttachmentReference resolve = {
3217 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3218 };
3219
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003220 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003221
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003222 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003223
3224 VkRenderPass rp;
3225 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3226
3227 m_errorMonitor->VerifyFound();
3228
3229 if (err == VK_SUCCESS)
3230 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3231}
3232
Chris Forbes3f128ef2016-06-29 14:58:53 +12003233TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Chris Forbes6655bb32016-07-01 18:27:30 +12003234 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
3235 "when the color and depth attachments used by a subpass "
3236 "have inconsistent sample counts");
3237
Chris Forbes3f128ef2016-06-29 14:58:53 +12003238 ASSERT_NO_FATAL_FAILURE(InitState());
3239
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003240 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3241 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
Chris Forbes3f128ef2016-06-29 14:58:53 +12003242
3243 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003244 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3245 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3246 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3247 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3248 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3249 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbes3f128ef2016-06-29 14:58:53 +12003250 };
3251
3252 VkAttachmentReference color[] = {
3253 {
3254 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3255 },
3256 {
3257 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3258 },
3259 };
3260
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003261 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, color, nullptr, nullptr, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003262
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003263 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003264
3265 VkRenderPass rp;
3266 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3267
3268 m_errorMonitor->VerifyFound();
3269
3270 if (err == VK_SUCCESS)
3271 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3272}
3273
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003274TEST_F(VkLayerTest, FramebufferCreateErrors) {
3275 TEST_DESCRIPTION("Hit errors when attempting to create a framebuffer :\n"
Mike Weiblencce7ec72016-10-17 19:33:05 -06003276 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003277 " 2. Use a color image as depthStencil attachment\n"
Mike Weiblencce7ec72016-10-17 19:33:05 -06003278 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3279 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3280 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3281 " 6. Framebuffer attachment where dimensions don't match\n"
3282 " 7. Framebuffer attachment w/o identity swizzle\n"
3283 " 8. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003284
3285 ASSERT_NO_FATAL_FAILURE(InitState());
3286 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3287
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003288 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3289 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 "
3290 "does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003291
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003292 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003293 VkAttachmentReference attach = {};
3294 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3295 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003296 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003297 VkRenderPassCreateInfo rpci = {};
3298 rpci.subpassCount = 1;
3299 rpci.pSubpasses = &subpass;
3300 rpci.attachmentCount = 1;
3301 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003302 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003303 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003304 rpci.pAttachments = &attach_desc;
3305 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3306 VkRenderPass rp;
3307 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3308 ASSERT_VK_SUCCESS(err);
3309
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003310 VkImageView ivs[2];
3311 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3312 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003313 VkFramebufferCreateInfo fb_info = {};
3314 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3315 fb_info.pNext = NULL;
3316 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003317 // Set mis-matching attachmentCount
3318 fb_info.attachmentCount = 2;
3319 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003320 fb_info.width = 100;
3321 fb_info.height = 100;
3322 fb_info.layers = 1;
3323
3324 VkFramebuffer fb;
3325 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3326
3327 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003328 if (err == VK_SUCCESS) {
3329 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3330 }
3331 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003332
3333 // Create a renderPass with a depth-stencil attachment created with
3334 // IMAGE_USAGE_COLOR_ATTACHMENT
3335 // Add our color attachment to pDepthStencilAttachment
3336 subpass.pDepthStencilAttachment = &attach;
3337 subpass.pColorAttachments = NULL;
3338 VkRenderPass rp_ds;
3339 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3340 ASSERT_VK_SUCCESS(err);
3341 // Set correct attachment count, but attachment has COLOR usage bit set
3342 fb_info.attachmentCount = 1;
3343 fb_info.renderPass = rp_ds;
3344
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " conflicts with the image's IMAGE_USAGE flags ");
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003346 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3347
3348 m_errorMonitor->VerifyFound();
3349 if (err == VK_SUCCESS) {
3350 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3351 }
3352 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003353
3354 // Create new renderpass with alternate attachment format from fb
3355 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3356 subpass.pDepthStencilAttachment = NULL;
3357 subpass.pColorAttachments = &attach;
3358 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3359 ASSERT_VK_SUCCESS(err);
3360
3361 // Cause error due to mis-matched formats between rp & fb
3362 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3363 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003364 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3365 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003366 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3367
3368 m_errorMonitor->VerifyFound();
3369 if (err == VK_SUCCESS) {
3370 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3371 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003372 vkDestroyRenderPass(m_device->device(), rp, NULL);
3373
3374 // Create new renderpass with alternate sample count from fb
3375 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3376 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3377 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3378 ASSERT_VK_SUCCESS(err);
3379
3380 // Cause error due to mis-matched sample count between rp & fb
3381 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003382 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has VK_SAMPLE_COUNT_1_BIT samples "
3383 "that do not match the "
3384 "VK_SAMPLE_COUNT_4_BIT ");
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003385 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3386
3387 m_errorMonitor->VerifyFound();
3388 if (err == VK_SUCCESS) {
3389 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3390 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003391
3392 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003393
3394 // Create a custom imageView with non-1 mip levels
3395 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003396 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 -06003397 ASSERT_TRUE(image.initialized());
3398
3399 VkImageView view;
3400 VkImageViewCreateInfo ivci = {};
3401 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3402 ivci.image = image.handle();
3403 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3404 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3405 ivci.subresourceRange.layerCount = 1;
3406 ivci.subresourceRange.baseMipLevel = 0;
3407 // Set level count 2 (only 1 is allowed for FB attachment)
3408 ivci.subresourceRange.levelCount = 2;
3409 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3410 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3411 ASSERT_VK_SUCCESS(err);
3412 // Re-create renderpass to have matching sample count
3413 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3414 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3415 ASSERT_VK_SUCCESS(err);
3416
3417 fb_info.renderPass = rp;
3418 fb_info.pAttachments = &view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003419 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has mip levelCount of 2 but only ");
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003420 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3421
3422 m_errorMonitor->VerifyFound();
3423 if (err == VK_SUCCESS) {
3424 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3425 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003426 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003427 // Update view to original color buffer and grow FB dimensions too big
3428 fb_info.pAttachments = ivs;
3429 fb_info.height = 1024;
3430 fb_info.width = 1024;
3431 fb_info.layers = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003432 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " Attachment dimensions must be at "
3433 "least as large. ");
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003434 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3435
3436 m_errorMonitor->VerifyFound();
3437 if (err == VK_SUCCESS) {
3438 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3439 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06003440 // Create view attachment with non-identity swizzle
3441 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3442 ivci.image = image.handle();
3443 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3444 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3445 ivci.subresourceRange.layerCount = 1;
3446 ivci.subresourceRange.baseMipLevel = 0;
3447 ivci.subresourceRange.levelCount = 1;
3448 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3449 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
3450 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
3451 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
3452 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
3453 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3454 ASSERT_VK_SUCCESS(err);
3455
3456 fb_info.pAttachments = &view;
3457 fb_info.height = 100;
3458 fb_info.width = 100;
3459 fb_info.layers = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003460 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has non-identy swizzle. All "
3461 "framebuffer attachments must have "
3462 "been created with the identity "
3463 "swizzle. ");
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06003464 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3465
3466 m_errorMonitor->VerifyFound();
3467 if (err == VK_SUCCESS) {
3468 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3469 }
3470 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003471 // reset attachment to color attachment
3472 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07003473
3474 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003475 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07003476 fb_info.height = 100;
3477 fb_info.layers = 1;
3478 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
3479 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3480
3481 m_errorMonitor->VerifyFound();
3482 if (err == VK_SUCCESS) {
3483 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3484 }
3485
3486 // Request fb that exceeds max height
3487 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003488 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07003489 fb_info.layers = 1;
3490 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
3491 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3492
3493 m_errorMonitor->VerifyFound();
3494 if (err == VK_SUCCESS) {
3495 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3496 }
3497
3498 // Request fb that exceeds max layers
3499 fb_info.width = 100;
3500 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003501 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07003502 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003503 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3504
3505 m_errorMonitor->VerifyFound();
3506 if (err == VK_SUCCESS) {
3507 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3508 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003509
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003510 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003511}
3512
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003513TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003514 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Depth Bias dynamic "
3515 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003516
Cody Northropc31a84f2016-08-22 10:41:47 -06003517 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003518 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003519 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
3520 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003521 m_errorMonitor->VerifyFound();
3522}
3523
3524TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003525 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Line Width dynamic "
3526 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003527
Cody Northropc31a84f2016-08-22 10:41:47 -06003528 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003529 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003530 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
3531 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003532 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003533}
3534
3535TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003536 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Viewport dynamic "
3537 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003538
Cody Northropc31a84f2016-08-22 10:41:47 -06003539 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003540 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003541 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3542 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003543 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003544 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003545}
3546
3547TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003548 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Scissor dynamic "
3549 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003550
Cody Northropc31a84f2016-08-22 10:41:47 -06003551 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003552 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003553 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3554 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003555 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003556 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003557}
3558
Cortd713fe82016-07-27 09:51:27 -07003559TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003560 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Blend Constants "
3561 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003562
3563 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis21c88352016-05-26 06:15:45 -06003564 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003565 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3566 "Dynamic blend constants state not set for this command buffer");
3567 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06003568 m_errorMonitor->VerifyFound();
3569}
3570
3571TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003572 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Depth Bounds dynamic "
3573 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003574
3575 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis21c88352016-05-26 06:15:45 -06003576 if (!m_device->phy().features().depthBounds) {
3577 printf("Device does not support depthBounds test; skipped.\n");
3578 return;
3579 }
3580 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3582 "Dynamic depth bounds state not set for this command buffer");
3583 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003584 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003585}
3586
3587TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003588 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Stencil Read dynamic "
3589 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003590
3591 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003592 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003593 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3594 "Dynamic stencil read mask state not set for this command buffer");
3595 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003596 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003597}
3598
3599TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003600 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Stencil Write dynamic"
3601 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003602
3603 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003604 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003605 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3606 "Dynamic stencil write mask state not set for this command buffer");
3607 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003608 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003609}
3610
3611TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003612 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Stencil Ref dynamic "
3613 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003614
3615 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003616 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003617 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3618 "Dynamic stencil reference state not set for this command buffer");
3619 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003620 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06003621}
3622
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06003623TEST_F(VkLayerTest, IndexBufferNotBound) {
3624 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003625
3626 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003627 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3628 "Index buffer object not bound to this command buffer when Indexed ");
3629 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06003630 m_errorMonitor->VerifyFound();
3631}
3632
Karl Schultz6addd812016-02-02 17:17:23 -07003633TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003634 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3635 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
3636 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003637
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003638 ASSERT_NO_FATAL_FAILURE(InitState());
3639 ASSERT_NO_FATAL_FAILURE(InitViewport());
3640 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3641
Karl Schultz6addd812016-02-02 17:17:23 -07003642 // We luck out b/c by default the framework creates CB w/ the
3643 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07003644 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003645 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07003646 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003647
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003648 // Bypass framework since it does the waits automatically
3649 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003650 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08003651 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3652 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003653 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003654 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07003655 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003656 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003657 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08003658 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003659 submit_info.pSignalSemaphores = NULL;
3660
Chris Forbes40028e22016-06-13 09:59:34 +12003661 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07003662 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07003663 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003664
Karl Schultz6addd812016-02-02 17:17:23 -07003665 // Cause validation error by re-submitting cmd buffer that should only be
3666 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12003667 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07003668 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003669
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003670 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003671}
3672
Karl Schultz6addd812016-02-02 17:17:23 -07003673TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003674 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07003675 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003676
3677 ASSERT_NO_FATAL_FAILURE(InitState());
3678 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003679
Karl Schultz6addd812016-02-02 17:17:23 -07003680 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
3681 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003682 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003683 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003684 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003685
3686 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003687 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3688 ds_pool_ci.pNext = NULL;
3689 ds_pool_ci.flags = 0;
3690 ds_pool_ci.maxSets = 1;
3691 ds_pool_ci.poolSizeCount = 1;
3692 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003693
3694 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003695 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003696 ASSERT_VK_SUCCESS(err);
3697
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003698 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
3699 dsl_binding_samp.binding = 0;
3700 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3701 dsl_binding_samp.descriptorCount = 1;
3702 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
3703 dsl_binding_samp.pImmutableSamplers = NULL;
3704
3705 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3706 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3707 ds_layout_ci.pNext = NULL;
3708 ds_layout_ci.bindingCount = 1;
3709 ds_layout_ci.pBindings = &dsl_binding_samp;
3710
3711 VkDescriptorSetLayout ds_layout_samp;
3712 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
3713 ASSERT_VK_SUCCESS(err);
3714
3715 // Try to allocate 2 sets when pool only has 1 set
3716 VkDescriptorSet descriptor_sets[2];
3717 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
3718 VkDescriptorSetAllocateInfo alloc_info = {};
3719 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3720 alloc_info.descriptorSetCount = 2;
3721 alloc_info.descriptorPool = ds_pool;
3722 alloc_info.pSetLayouts = set_layouts;
3723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
3724 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
3725 m_errorMonitor->VerifyFound();
3726
3727 alloc_info.descriptorSetCount = 1;
3728 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003729 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003730 dsl_binding.binding = 0;
3731 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3732 dsl_binding.descriptorCount = 1;
3733 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3734 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003735
Karl Schultz6addd812016-02-02 17:17:23 -07003736 ds_layout_ci.bindingCount = 1;
3737 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003738
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003739 VkDescriptorSetLayout ds_layout_ub;
3740 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003741 ASSERT_VK_SUCCESS(err);
3742
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003743 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003744 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003745 alloc_info.pSetLayouts = &ds_layout_ub;
3746 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
3747 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003748
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003749 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003750
Karl Schultz2825ab92016-12-02 08:23:14 -07003751 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003752 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08003753 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003754}
3755
Karl Schultz6addd812016-02-02 17:17:23 -07003756TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
3757 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06003758
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07003759 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003760
Tobin Ehlise735c692015-10-08 13:13:50 -06003761 ASSERT_NO_FATAL_FAILURE(InitState());
3762 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06003763
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003764 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003765 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3766 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06003767
3768 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003769 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3770 ds_pool_ci.pNext = NULL;
3771 ds_pool_ci.maxSets = 1;
3772 ds_pool_ci.poolSizeCount = 1;
3773 ds_pool_ci.flags = 0;
3774 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
3775 // app can only call vkResetDescriptorPool on this pool.;
3776 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06003777
3778 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003779 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06003780 ASSERT_VK_SUCCESS(err);
3781
3782 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003783 dsl_binding.binding = 0;
3784 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3785 dsl_binding.descriptorCount = 1;
3786 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3787 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06003788
3789 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003790 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3791 ds_layout_ci.pNext = NULL;
3792 ds_layout_ci.bindingCount = 1;
3793 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06003794
3795 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003796 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06003797 ASSERT_VK_SUCCESS(err);
3798
3799 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003800 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003801 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003802 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003803 alloc_info.descriptorPool = ds_pool;
3804 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003805 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06003806 ASSERT_VK_SUCCESS(err);
3807
3808 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003809 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06003810
Chia-I Wuf7458c52015-10-26 21:10:41 +08003811 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3812 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06003813}
3814
Karl Schultz6addd812016-02-02 17:17:23 -07003815TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003816 // Attempt to clear Descriptor Pool with bad object.
3817 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06003818
3819 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07003820 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003821 uint64_t fake_pool_handle = 0xbaad6001;
3822 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
3823 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06003824 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003825}
3826
Karl Schultzf78bcdd2016-11-30 12:36:01 -07003827TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003828 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
3829 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003830 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06003831 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003832
3833 uint64_t fake_set_handle = 0xbaad6001;
3834 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06003835 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07003836 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06003837
3838 ASSERT_NO_FATAL_FAILURE(InitState());
3839
3840 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
3841 layout_bindings[0].binding = 0;
3842 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3843 layout_bindings[0].descriptorCount = 1;
3844 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
3845 layout_bindings[0].pImmutableSamplers = NULL;
3846
3847 VkDescriptorSetLayout descriptor_set_layout;
3848 VkDescriptorSetLayoutCreateInfo dslci = {};
3849 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3850 dslci.pNext = NULL;
3851 dslci.bindingCount = 1;
3852 dslci.pBindings = layout_bindings;
3853 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06003854 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06003855
3856 VkPipelineLayout pipeline_layout;
3857 VkPipelineLayoutCreateInfo plci = {};
3858 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3859 plci.pNext = NULL;
3860 plci.setLayoutCount = 1;
3861 plci.pSetLayouts = &descriptor_set_layout;
3862 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06003863 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06003864
Tony Barbour552f6c02016-12-21 14:34:07 -07003865 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003866 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
3867 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06003868 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07003869 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06003870 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
3871 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003872}
3873
Karl Schultz6addd812016-02-02 17:17:23 -07003874TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003875 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
3876 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003877 uint64_t fake_layout_handle = 0xbaad6001;
3878 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07003879 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Cody Northropc31a84f2016-08-22 10:41:47 -06003880 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultzbdb75952016-04-19 11:36:49 -06003881 VkPipelineLayout pipeline_layout;
3882 VkPipelineLayoutCreateInfo plci = {};
3883 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3884 plci.pNext = NULL;
3885 plci.setLayoutCount = 1;
3886 plci.pSetLayouts = &bad_layout;
3887 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
3888
3889 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003890}
3891
Mark Muellerd4914412016-06-13 17:52:06 -06003892TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
3893 TEST_DESCRIPTION("This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
3894 "1) A uniform buffer update must have a valid buffer index."
3895 "2) When using an array of descriptors in a single WriteDescriptor,"
3896 " the descriptor types and stageflags must all be the same."
3897 "3) Immutable Sampler state must match across descriptors");
3898
Mike Weiblena6666382017-01-05 15:16:11 -07003899 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06003900
3901 ASSERT_NO_FATAL_FAILURE(InitState());
3902 VkDescriptorPoolSize ds_type_count[4] = {};
3903 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3904 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07003905 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06003906 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07003907 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06003908 ds_type_count[2].descriptorCount = 1;
3909 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
3910 ds_type_count[3].descriptorCount = 1;
3911
3912 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3913 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3914 ds_pool_ci.maxSets = 1;
3915 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
3916 ds_pool_ci.pPoolSizes = ds_type_count;
3917
3918 VkDescriptorPool ds_pool;
3919 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
3920 ASSERT_VK_SUCCESS(err);
3921
Mark Muellerb9896722016-06-16 09:54:29 -06003922 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06003923 layout_binding[0].binding = 0;
3924 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3925 layout_binding[0].descriptorCount = 1;
3926 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
3927 layout_binding[0].pImmutableSamplers = NULL;
3928
3929 layout_binding[1].binding = 1;
3930 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3931 layout_binding[1].descriptorCount = 1;
3932 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
3933 layout_binding[1].pImmutableSamplers = NULL;
3934
3935 VkSamplerCreateInfo sampler_ci = {};
3936 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3937 sampler_ci.pNext = NULL;
3938 sampler_ci.magFilter = VK_FILTER_NEAREST;
3939 sampler_ci.minFilter = VK_FILTER_NEAREST;
3940 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
3941 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3942 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3943 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3944 sampler_ci.mipLodBias = 1.0;
3945 sampler_ci.anisotropyEnable = VK_FALSE;
3946 sampler_ci.maxAnisotropy = 1;
3947 sampler_ci.compareEnable = VK_FALSE;
3948 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3949 sampler_ci.minLod = 1.0;
3950 sampler_ci.maxLod = 1.0;
3951 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
3952 sampler_ci.unnormalizedCoordinates = VK_FALSE;
3953 VkSampler sampler;
3954
3955 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
3956 ASSERT_VK_SUCCESS(err);
3957
3958 layout_binding[2].binding = 2;
3959 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3960 layout_binding[2].descriptorCount = 1;
3961 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
3962 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
3963
Mark Muellerd4914412016-06-13 17:52:06 -06003964 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3965 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3966 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
3967 ds_layout_ci.pBindings = layout_binding;
3968 VkDescriptorSetLayout ds_layout;
3969 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
3970 ASSERT_VK_SUCCESS(err);
3971
3972 VkDescriptorSetAllocateInfo alloc_info = {};
3973 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3974 alloc_info.descriptorSetCount = 1;
3975 alloc_info.descriptorPool = ds_pool;
3976 alloc_info.pSetLayouts = &ds_layout;
3977 VkDescriptorSet descriptorSet;
3978 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
3979 ASSERT_VK_SUCCESS(err);
3980
3981 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
3982 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3983 pipeline_layout_ci.pNext = NULL;
3984 pipeline_layout_ci.setLayoutCount = 1;
3985 pipeline_layout_ci.pSetLayouts = &ds_layout;
3986
3987 VkPipelineLayout pipeline_layout;
3988 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
3989 ASSERT_VK_SUCCESS(err);
3990
Mark Mueller5c838ce2016-06-16 09:54:29 -06003991 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06003992 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3993 descriptor_write.dstSet = descriptorSet;
3994 descriptor_write.dstBinding = 0;
3995 descriptor_write.descriptorCount = 1;
3996 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3997
Mark Mueller5c838ce2016-06-16 09:54:29 -06003998 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06003999 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4000 m_errorMonitor->VerifyFound();
4001
4002 // Create a buffer to update the descriptor with
4003 uint32_t qfi = 0;
4004 VkBufferCreateInfo buffCI = {};
4005 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4006 buffCI.size = 1024;
4007 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4008 buffCI.queueFamilyIndexCount = 1;
4009 buffCI.pQueueFamilyIndices = &qfi;
4010
4011 VkBuffer dyub;
4012 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4013 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004014
Tony Barboure132c5f2016-12-12 11:50:20 -07004015 VkDeviceMemory mem;
4016 VkMemoryRequirements mem_reqs;
4017 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4018
4019 VkMemoryAllocateInfo mem_alloc_info = {};
4020 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4021 mem_alloc_info.allocationSize = mem_reqs.size;
4022 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4023 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4024 ASSERT_VK_SUCCESS(err);
4025
4026 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4027 ASSERT_VK_SUCCESS(err);
4028
4029 VkDescriptorBufferInfo buffInfo[2] = {};
4030 buffInfo[0].buffer = dyub;
4031 buffInfo[0].offset = 0;
4032 buffInfo[0].range = 1024;
4033 buffInfo[1].buffer = dyub;
4034 buffInfo[1].offset = 0;
4035 buffInfo[1].range = 1024;
4036 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004037 descriptor_write.descriptorCount = 2;
4038
Mark Mueller5c838ce2016-06-16 09:54:29 -06004039 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004040 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004041 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4042 m_errorMonitor->VerifyFound();
4043
Mark Mueller5c838ce2016-06-16 09:54:29 -06004044 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4045 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004046 descriptor_write.dstBinding = 1;
4047 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004048
Mark Mueller5c838ce2016-06-16 09:54:29 -06004049 // Make pImageInfo index non-null to avoid complaints of it missing
4050 VkDescriptorImageInfo imageInfo = {};
4051 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4052 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004053 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004054 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4055 m_errorMonitor->VerifyFound();
4056
Mark Muellerd4914412016-06-13 17:52:06 -06004057 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004058 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004059 vkDestroySampler(m_device->device(), sampler, NULL);
4060 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4061 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4062 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4063}
4064
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004065TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
4066 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4067 "due to a buffer dependency being destroyed.");
4068 ASSERT_NO_FATAL_FAILURE(InitState());
4069
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004070 VkBuffer buffer;
4071 VkDeviceMemory mem;
4072 VkMemoryRequirements mem_reqs;
4073
4074 VkBufferCreateInfo buf_info = {};
4075 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004076 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004077 buf_info.size = 256;
4078 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4079 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4080 ASSERT_VK_SUCCESS(err);
4081
4082 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4083
4084 VkMemoryAllocateInfo alloc_info = {};
4085 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4086 alloc_info.allocationSize = 256;
4087 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004088 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 -06004089 if (!pass) {
4090 vkDestroyBuffer(m_device->device(), buffer, NULL);
4091 return;
4092 }
4093 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4094 ASSERT_VK_SUCCESS(err);
4095
4096 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4097 ASSERT_VK_SUCCESS(err);
4098
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004099 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004100 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004101 m_commandBuffer->EndCommandBuffer();
4102
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004103 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004104 // Destroy buffer dependency prior to submit to cause ERROR
4105 vkDestroyBuffer(m_device->device(), buffer, NULL);
4106
4107 VkSubmitInfo submit_info = {};
4108 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4109 submit_info.commandBufferCount = 1;
4110 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4111 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4112
4113 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004114 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004115 vkFreeMemory(m_device->handle(), mem, NULL);
4116}
4117
Tobin Ehlisea413442016-09-28 10:23:59 -06004118TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4119 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4120
4121 ASSERT_NO_FATAL_FAILURE(InitState());
4122 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4123
4124 VkDescriptorPoolSize ds_type_count;
4125 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4126 ds_type_count.descriptorCount = 1;
4127
4128 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4129 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4130 ds_pool_ci.maxSets = 1;
4131 ds_pool_ci.poolSizeCount = 1;
4132 ds_pool_ci.pPoolSizes = &ds_type_count;
4133
4134 VkDescriptorPool ds_pool;
4135 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4136 ASSERT_VK_SUCCESS(err);
4137
4138 VkDescriptorSetLayoutBinding layout_binding;
4139 layout_binding.binding = 0;
4140 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4141 layout_binding.descriptorCount = 1;
4142 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4143 layout_binding.pImmutableSamplers = NULL;
4144
4145 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4146 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4147 ds_layout_ci.bindingCount = 1;
4148 ds_layout_ci.pBindings = &layout_binding;
4149 VkDescriptorSetLayout ds_layout;
4150 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4151 ASSERT_VK_SUCCESS(err);
4152
4153 VkDescriptorSetAllocateInfo alloc_info = {};
4154 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4155 alloc_info.descriptorSetCount = 1;
4156 alloc_info.descriptorPool = ds_pool;
4157 alloc_info.pSetLayouts = &ds_layout;
4158 VkDescriptorSet descriptor_set;
4159 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4160 ASSERT_VK_SUCCESS(err);
4161
4162 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4163 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4164 pipeline_layout_ci.pNext = NULL;
4165 pipeline_layout_ci.setLayoutCount = 1;
4166 pipeline_layout_ci.pSetLayouts = &ds_layout;
4167
4168 VkPipelineLayout pipeline_layout;
4169 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4170 ASSERT_VK_SUCCESS(err);
4171
4172 VkBuffer buffer;
4173 uint32_t queue_family_index = 0;
4174 VkBufferCreateInfo buffer_create_info = {};
4175 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4176 buffer_create_info.size = 1024;
4177 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4178 buffer_create_info.queueFamilyIndexCount = 1;
4179 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4180
4181 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4182 ASSERT_VK_SUCCESS(err);
4183
4184 VkMemoryRequirements memory_reqs;
4185 VkDeviceMemory buffer_memory;
4186
4187 VkMemoryAllocateInfo memory_info = {};
4188 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4189 memory_info.allocationSize = 0;
4190 memory_info.memoryTypeIndex = 0;
4191
4192 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4193 memory_info.allocationSize = memory_reqs.size;
4194 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4195 ASSERT_TRUE(pass);
4196
4197 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4198 ASSERT_VK_SUCCESS(err);
4199 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4200 ASSERT_VK_SUCCESS(err);
4201
4202 VkBufferView view;
4203 VkBufferViewCreateInfo bvci = {};
4204 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4205 bvci.buffer = buffer;
4206 bvci.format = VK_FORMAT_R8_UNORM;
4207 bvci.range = VK_WHOLE_SIZE;
4208
4209 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4210 ASSERT_VK_SUCCESS(err);
4211
4212 VkWriteDescriptorSet descriptor_write = {};
4213 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4214 descriptor_write.dstSet = descriptor_set;
4215 descriptor_write.dstBinding = 0;
4216 descriptor_write.descriptorCount = 1;
4217 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4218 descriptor_write.pTexelBufferView = &view;
4219
4220 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4221
4222 char const *vsSource = "#version 450\n"
4223 "\n"
4224 "out gl_PerVertex { \n"
4225 " vec4 gl_Position;\n"
4226 "};\n"
4227 "void main(){\n"
4228 " gl_Position = vec4(1);\n"
4229 "}\n";
4230 char const *fsSource = "#version 450\n"
4231 "\n"
4232 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4233 "layout(location=0) out vec4 x;\n"
4234 "void main(){\n"
4235 " x = imageLoad(s, 0);\n"
4236 "}\n";
4237 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4238 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4239 VkPipelineObj pipe(m_device);
4240 pipe.AddShader(&vs);
4241 pipe.AddShader(&fs);
4242 pipe.AddColorAttachment();
4243 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4244
4245 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot submit cmd buffer using deleted buffer view ");
4246 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer view ");
4247
Tony Barbour552f6c02016-12-21 14:34:07 -07004248 m_commandBuffer->BeginCommandBuffer();
4249 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4250
Tobin Ehlisea413442016-09-28 10:23:59 -06004251 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4252 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4253 VkRect2D scissor = {{0, 0}, {16, 16}};
4254 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4255 // Bind pipeline to cmd buffer
4256 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4257 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4258 &descriptor_set, 0, nullptr);
4259 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004260 m_commandBuffer->EndRenderPass();
4261 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004262
4263 // Delete BufferView in order to invalidate cmd buffer
4264 vkDestroyBufferView(m_device->device(), view, NULL);
4265 // Now attempt submit of cmd buffer
4266 VkSubmitInfo submit_info = {};
4267 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4268 submit_info.commandBufferCount = 1;
4269 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4270 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4271 m_errorMonitor->VerifyFound();
4272
4273 // Clean-up
4274 vkDestroyBuffer(m_device->device(), buffer, NULL);
4275 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4276 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4277 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4278 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4279}
4280
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004281TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
4282 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4283 "due to an image dependency being destroyed.");
4284 ASSERT_NO_FATAL_FAILURE(InitState());
4285
4286 VkImage image;
4287 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4288 VkImageCreateInfo image_create_info = {};
4289 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4290 image_create_info.pNext = NULL;
4291 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4292 image_create_info.format = tex_format;
4293 image_create_info.extent.width = 32;
4294 image_create_info.extent.height = 32;
4295 image_create_info.extent.depth = 1;
4296 image_create_info.mipLevels = 1;
4297 image_create_info.arrayLayers = 1;
4298 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4299 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004300 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004301 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004302 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004303 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004304 // Have to bind memory to image before recording cmd in cmd buffer using it
4305 VkMemoryRequirements mem_reqs;
4306 VkDeviceMemory image_mem;
4307 bool pass;
4308 VkMemoryAllocateInfo mem_alloc = {};
4309 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4310 mem_alloc.pNext = NULL;
4311 mem_alloc.memoryTypeIndex = 0;
4312 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4313 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004314 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004315 ASSERT_TRUE(pass);
4316 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4317 ASSERT_VK_SUCCESS(err);
4318 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4319 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004320
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004321 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004322 VkClearColorValue ccv;
4323 ccv.float32[0] = 1.0f;
4324 ccv.float32[1] = 1.0f;
4325 ccv.float32[2] = 1.0f;
4326 ccv.float32[3] = 1.0f;
4327 VkImageSubresourceRange isr = {};
4328 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004329 isr.baseArrayLayer = 0;
4330 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004331 isr.layerCount = 1;
4332 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004333 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004334 m_commandBuffer->EndCommandBuffer();
4335
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004336 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004337 // Destroy image dependency prior to submit to cause ERROR
4338 vkDestroyImage(m_device->device(), image, NULL);
4339
4340 VkSubmitInfo submit_info = {};
4341 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4342 submit_info.commandBufferCount = 1;
4343 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4344 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4345
4346 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004347 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004348}
4349
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004350TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
4351 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4352 "due to a framebuffer image dependency being destroyed.");
4353 VkFormatProperties format_properties;
4354 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004355 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4356 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004357 return;
4358 }
4359
4360 ASSERT_NO_FATAL_FAILURE(InitState());
4361 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4362
4363 VkImageCreateInfo image_ci = {};
4364 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4365 image_ci.pNext = NULL;
4366 image_ci.imageType = VK_IMAGE_TYPE_2D;
4367 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4368 image_ci.extent.width = 32;
4369 image_ci.extent.height = 32;
4370 image_ci.extent.depth = 1;
4371 image_ci.mipLevels = 1;
4372 image_ci.arrayLayers = 1;
4373 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4374 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004375 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004376 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4377 image_ci.flags = 0;
4378 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004379 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004380
4381 VkMemoryRequirements memory_reqs;
4382 VkDeviceMemory image_memory;
4383 bool pass;
4384 VkMemoryAllocateInfo memory_info = {};
4385 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4386 memory_info.pNext = NULL;
4387 memory_info.allocationSize = 0;
4388 memory_info.memoryTypeIndex = 0;
4389 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
4390 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004391 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004392 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004393 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004394 ASSERT_VK_SUCCESS(err);
4395 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
4396 ASSERT_VK_SUCCESS(err);
4397
4398 VkImageViewCreateInfo ivci = {
4399 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4400 nullptr,
4401 0,
4402 image,
4403 VK_IMAGE_VIEW_TYPE_2D,
4404 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004405 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004406 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
4407 };
4408 VkImageView view;
4409 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4410 ASSERT_VK_SUCCESS(err);
4411
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004412 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004413 VkFramebuffer fb;
4414 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4415 ASSERT_VK_SUCCESS(err);
4416
4417 // Just use default renderpass with our framebuffer
4418 m_renderPassBeginInfo.framebuffer = fb;
4419 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07004420 m_commandBuffer->BeginCommandBuffer();
4421 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4422 m_commandBuffer->EndRenderPass();
4423 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004424 // Destroy image attached to framebuffer to invalidate cmd buffer
4425 vkDestroyImage(m_device->device(), image, NULL);
4426 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004427 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004428 QueueCommandBuffer(false);
4429 m_errorMonitor->VerifyFound();
4430
4431 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4432 vkDestroyImageView(m_device->device(), view, nullptr);
4433 vkFreeMemory(m_device->device(), image_memory, nullptr);
4434}
4435
Tobin Ehlisb329f992016-10-12 13:20:29 -06004436TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
4437 TEST_DESCRIPTION("Delete in-use framebuffer.");
4438 VkFormatProperties format_properties;
4439 VkResult err = VK_SUCCESS;
4440 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4441
4442 ASSERT_NO_FATAL_FAILURE(InitState());
4443 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4444
4445 VkImageObj image(m_device);
4446 image.init(256, 256, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4447 ASSERT_TRUE(image.initialized());
4448 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
4449
4450 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
4451 VkFramebuffer fb;
4452 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4453 ASSERT_VK_SUCCESS(err);
4454
4455 // Just use default renderpass with our framebuffer
4456 m_renderPassBeginInfo.framebuffer = fb;
4457 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07004458 m_commandBuffer->BeginCommandBuffer();
4459 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4460 m_commandBuffer->EndRenderPass();
4461 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06004462 // Submit cmd buffer to put it in-flight
4463 VkSubmitInfo submit_info = {};
4464 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4465 submit_info.commandBufferCount = 1;
4466 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4467 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4468 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004469 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06004470 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4471 m_errorMonitor->VerifyFound();
4472 // Wait for queue to complete so we can safely destroy everything
4473 vkQueueWaitIdle(m_device->m_queue);
4474 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4475}
4476
Tobin Ehlis88becd72016-09-21 14:33:41 -06004477TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
4478 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
4479 VkFormatProperties format_properties;
4480 VkResult err = VK_SUCCESS;
4481 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06004482
4483 ASSERT_NO_FATAL_FAILURE(InitState());
4484 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4485
4486 VkImageCreateInfo image_ci = {};
4487 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4488 image_ci.pNext = NULL;
4489 image_ci.imageType = VK_IMAGE_TYPE_2D;
4490 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4491 image_ci.extent.width = 256;
4492 image_ci.extent.height = 256;
4493 image_ci.extent.depth = 1;
4494 image_ci.mipLevels = 1;
4495 image_ci.arrayLayers = 1;
4496 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4497 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06004498 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06004499 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4500 image_ci.flags = 0;
4501 VkImage image;
4502 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
4503
4504 VkMemoryRequirements memory_reqs;
4505 VkDeviceMemory image_memory;
4506 bool pass;
4507 VkMemoryAllocateInfo memory_info = {};
4508 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4509 memory_info.pNext = NULL;
4510 memory_info.allocationSize = 0;
4511 memory_info.memoryTypeIndex = 0;
4512 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
4513 memory_info.allocationSize = memory_reqs.size;
4514 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4515 ASSERT_TRUE(pass);
4516 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
4517 ASSERT_VK_SUCCESS(err);
4518 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
4519 ASSERT_VK_SUCCESS(err);
4520
4521 VkImageViewCreateInfo ivci = {
4522 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4523 nullptr,
4524 0,
4525 image,
4526 VK_IMAGE_VIEW_TYPE_2D,
4527 VK_FORMAT_B8G8R8A8_UNORM,
4528 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
4529 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
4530 };
4531 VkImageView view;
4532 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4533 ASSERT_VK_SUCCESS(err);
4534
4535 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
4536 VkFramebuffer fb;
4537 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4538 ASSERT_VK_SUCCESS(err);
4539
4540 // Just use default renderpass with our framebuffer
4541 m_renderPassBeginInfo.framebuffer = fb;
4542 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07004543 m_commandBuffer->BeginCommandBuffer();
4544 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4545 m_commandBuffer->EndRenderPass();
4546 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06004547 // Submit cmd buffer to put it (and attached imageView) in-flight
4548 VkSubmitInfo submit_info = {};
4549 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4550 submit_info.commandBufferCount = 1;
4551 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4552 // Submit cmd buffer to put framebuffer and children in-flight
4553 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4554 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004555 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06004556 vkDestroyImage(m_device->device(), image, NULL);
4557 m_errorMonitor->VerifyFound();
4558 // Wait for queue to complete so we can safely destroy image and other objects
4559 vkQueueWaitIdle(m_device->m_queue);
4560 vkDestroyImage(m_device->device(), image, NULL);
4561 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4562 vkDestroyImageView(m_device->device(), view, nullptr);
4563 vkFreeMemory(m_device->device(), image_memory, nullptr);
4564}
4565
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06004566TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
4567 TEST_DESCRIPTION("Delete in-use renderPass.");
4568
4569 ASSERT_NO_FATAL_FAILURE(InitState());
4570 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4571
4572 // Create simple renderpass
4573 VkAttachmentReference attach = {};
4574 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4575 VkSubpassDescription subpass = {};
4576 subpass.pColorAttachments = &attach;
4577 VkRenderPassCreateInfo rpci = {};
4578 rpci.subpassCount = 1;
4579 rpci.pSubpasses = &subpass;
4580 rpci.attachmentCount = 1;
4581 VkAttachmentDescription attach_desc = {};
4582 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
4583 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4584 rpci.pAttachments = &attach_desc;
4585 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4586 VkRenderPass rp;
4587 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4588 ASSERT_VK_SUCCESS(err);
4589
4590 // Create a pipeline that uses the given renderpass
4591 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4592 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4593
4594 VkPipelineLayout pipeline_layout;
4595 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4596 ASSERT_VK_SUCCESS(err);
4597
4598 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4599 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4600 vp_state_ci.viewportCount = 1;
4601 VkViewport vp = {}; // Just need dummy vp to point to
4602 vp_state_ci.pViewports = &vp;
4603 vp_state_ci.scissorCount = 1;
4604 VkRect2D scissors = {}; // Dummy scissors to point to
4605 vp_state_ci.pScissors = &scissors;
4606
4607 VkPipelineShaderStageCreateInfo shaderStages[2];
4608 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4609
4610 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
4611 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
4612 // but add it to be able to run on more devices
4613 shaderStages[0] = vs.GetStageCreateInfo();
4614 shaderStages[1] = fs.GetStageCreateInfo();
4615
4616 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4617 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4618
4619 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4620 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4621 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4622
4623 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4624 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4625 rs_ci.rasterizerDiscardEnable = true;
4626 rs_ci.lineWidth = 1.0f;
4627
4628 VkPipelineColorBlendAttachmentState att = {};
4629 att.blendEnable = VK_FALSE;
4630 att.colorWriteMask = 0xf;
4631
4632 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4633 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4634 cb_ci.attachmentCount = 1;
4635 cb_ci.pAttachments = &att;
4636
4637 VkGraphicsPipelineCreateInfo gp_ci = {};
4638 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4639 gp_ci.stageCount = 2;
4640 gp_ci.pStages = shaderStages;
4641 gp_ci.pVertexInputState = &vi_ci;
4642 gp_ci.pInputAssemblyState = &ia_ci;
4643 gp_ci.pViewportState = &vp_state_ci;
4644 gp_ci.pRasterizationState = &rs_ci;
4645 gp_ci.pColorBlendState = &cb_ci;
4646 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4647 gp_ci.layout = pipeline_layout;
4648 gp_ci.renderPass = rp;
4649
4650 VkPipelineCacheCreateInfo pc_ci = {};
4651 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4652
4653 VkPipeline pipeline;
4654 VkPipelineCache pipe_cache;
4655 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
4656 ASSERT_VK_SUCCESS(err);
4657
4658 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
4659 ASSERT_VK_SUCCESS(err);
4660 // Bind pipeline to cmd buffer, will also bind renderpass
4661 m_commandBuffer->BeginCommandBuffer();
4662 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4663 m_commandBuffer->EndCommandBuffer();
4664
4665 VkSubmitInfo submit_info = {};
4666 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4667 submit_info.commandBufferCount = 1;
4668 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4669 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4670
4671 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
4672 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4673 m_errorMonitor->VerifyFound();
4674
4675 // Wait for queue to complete so we can safely destroy everything
4676 vkQueueWaitIdle(m_device->m_queue);
4677 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4678 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
4679 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
4680 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
4681}
4682
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004683TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004684 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004685 ASSERT_NO_FATAL_FAILURE(InitState());
4686
4687 VkImage image;
4688 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4689 VkImageCreateInfo image_create_info = {};
4690 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4691 image_create_info.pNext = NULL;
4692 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4693 image_create_info.format = tex_format;
4694 image_create_info.extent.width = 32;
4695 image_create_info.extent.height = 32;
4696 image_create_info.extent.depth = 1;
4697 image_create_info.mipLevels = 1;
4698 image_create_info.arrayLayers = 1;
4699 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4700 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004701 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004702 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004703 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004704 ASSERT_VK_SUCCESS(err);
4705 // Have to bind memory to image before recording cmd in cmd buffer using it
4706 VkMemoryRequirements mem_reqs;
4707 VkDeviceMemory image_mem;
4708 bool pass;
4709 VkMemoryAllocateInfo mem_alloc = {};
4710 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4711 mem_alloc.pNext = NULL;
4712 mem_alloc.memoryTypeIndex = 0;
4713 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4714 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004715 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004716 ASSERT_TRUE(pass);
4717 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4718 ASSERT_VK_SUCCESS(err);
4719
Tobin Ehlisfed999f2016-09-21 15:09:45 -06004720 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
4721 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06004722 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004723
4724 m_commandBuffer->BeginCommandBuffer();
4725 VkClearColorValue ccv;
4726 ccv.float32[0] = 1.0f;
4727 ccv.float32[1] = 1.0f;
4728 ccv.float32[2] = 1.0f;
4729 ccv.float32[3] = 1.0f;
4730 VkImageSubresourceRange isr = {};
4731 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4732 isr.baseArrayLayer = 0;
4733 isr.baseMipLevel = 0;
4734 isr.layerCount = 1;
4735 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004736 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004737 m_commandBuffer->EndCommandBuffer();
4738
4739 m_errorMonitor->VerifyFound();
4740 vkDestroyImage(m_device->device(), image, NULL);
4741 vkFreeMemory(m_device->device(), image_mem, nullptr);
4742}
4743
4744TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004745 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004746 ASSERT_NO_FATAL_FAILURE(InitState());
4747
4748 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004749 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 -06004750 VK_IMAGE_TILING_OPTIMAL, 0);
4751 ASSERT_TRUE(image.initialized());
4752
4753 VkBuffer buffer;
4754 VkDeviceMemory mem;
4755 VkMemoryRequirements mem_reqs;
4756
4757 VkBufferCreateInfo buf_info = {};
4758 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12004759 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004760 buf_info.size = 256;
4761 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4762 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4763 ASSERT_VK_SUCCESS(err);
4764
4765 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4766
4767 VkMemoryAllocateInfo alloc_info = {};
4768 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4769 alloc_info.allocationSize = 256;
4770 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004771 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 -06004772 if (!pass) {
4773 vkDestroyBuffer(m_device->device(), buffer, NULL);
4774 return;
4775 }
4776 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4777 ASSERT_VK_SUCCESS(err);
4778
Tobin Ehlisfed999f2016-09-21 15:09:45 -06004779 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4780 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06004781 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004782 VkBufferImageCopy region = {};
4783 region.bufferRowLength = 128;
4784 region.bufferImageHeight = 128;
4785 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4786
4787 region.imageSubresource.layerCount = 1;
4788 region.imageExtent.height = 4;
4789 region.imageExtent.width = 4;
4790 region.imageExtent.depth = 1;
4791 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004792 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
4793 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004794 m_commandBuffer->EndCommandBuffer();
4795
4796 m_errorMonitor->VerifyFound();
4797
4798 vkDestroyBuffer(m_device->device(), buffer, NULL);
4799 vkFreeMemory(m_device->handle(), mem, NULL);
4800}
4801
Tobin Ehlis85940f52016-07-07 16:57:21 -06004802TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
4803 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4804 "due to an event dependency being destroyed.");
4805 ASSERT_NO_FATAL_FAILURE(InitState());
4806
4807 VkEvent event;
4808 VkEventCreateInfo evci = {};
4809 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4810 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
4811 ASSERT_VK_SUCCESS(result);
4812
4813 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004814 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06004815 m_commandBuffer->EndCommandBuffer();
4816
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004817 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06004818 // Destroy event dependency prior to submit to cause ERROR
4819 vkDestroyEvent(m_device->device(), event, NULL);
4820
4821 VkSubmitInfo submit_info = {};
4822 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4823 submit_info.commandBufferCount = 1;
4824 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4825 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4826
4827 m_errorMonitor->VerifyFound();
4828}
4829
Tobin Ehlisdbea7552016-07-08 14:33:31 -06004830TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
4831 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4832 "due to a query pool dependency being destroyed.");
4833 ASSERT_NO_FATAL_FAILURE(InitState());
4834
4835 VkQueryPool query_pool;
4836 VkQueryPoolCreateInfo qpci{};
4837 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
4838 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
4839 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004840 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06004841 ASSERT_VK_SUCCESS(result);
4842
4843 m_commandBuffer->BeginCommandBuffer();
4844 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
4845 m_commandBuffer->EndCommandBuffer();
4846
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound query pool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06004848 // Destroy query pool dependency prior to submit to cause ERROR
4849 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
4850
4851 VkSubmitInfo submit_info = {};
4852 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4853 submit_info.commandBufferCount = 1;
4854 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4855 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4856
4857 m_errorMonitor->VerifyFound();
4858}
4859
Tobin Ehlis24130d92016-07-08 15:50:53 -06004860TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
4861 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4862 "due to a pipeline dependency being destroyed.");
4863 ASSERT_NO_FATAL_FAILURE(InitState());
4864 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4865
4866 VkResult err;
4867
4868 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4869 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4870
4871 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004872 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06004873 ASSERT_VK_SUCCESS(err);
4874
4875 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4876 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4877 vp_state_ci.viewportCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004878 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06004879 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06004880 vp_state_ci.scissorCount = 1;
4881 VkRect2D scissors = {}; // Dummy scissors to point to
4882 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06004883
4884 VkPipelineShaderStageCreateInfo shaderStages[2];
4885 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4886
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004887 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
4888 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
4889 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06004890 shaderStages[0] = vs.GetStageCreateInfo();
4891 shaderStages[1] = fs.GetStageCreateInfo();
4892
4893 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4894 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4895
4896 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4897 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4898 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4899
4900 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4901 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12004902 rs_ci.rasterizerDiscardEnable = true;
4903 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06004904
4905 VkPipelineColorBlendAttachmentState att = {};
4906 att.blendEnable = VK_FALSE;
4907 att.colorWriteMask = 0xf;
4908
4909 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4910 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4911 cb_ci.attachmentCount = 1;
4912 cb_ci.pAttachments = &att;
4913
4914 VkGraphicsPipelineCreateInfo gp_ci = {};
4915 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4916 gp_ci.stageCount = 2;
4917 gp_ci.pStages = shaderStages;
4918 gp_ci.pVertexInputState = &vi_ci;
4919 gp_ci.pInputAssemblyState = &ia_ci;
4920 gp_ci.pViewportState = &vp_state_ci;
4921 gp_ci.pRasterizationState = &rs_ci;
4922 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06004923 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4924 gp_ci.layout = pipeline_layout;
4925 gp_ci.renderPass = renderPass();
4926
4927 VkPipelineCacheCreateInfo pc_ci = {};
4928 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4929
4930 VkPipeline pipeline;
4931 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004932 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06004933 ASSERT_VK_SUCCESS(err);
4934
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004935 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06004936 ASSERT_VK_SUCCESS(err);
4937
4938 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004939 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06004940 m_commandBuffer->EndCommandBuffer();
4941 // Now destroy pipeline in order to cause error when submitting
4942 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
4943
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06004945
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();
4953 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4954 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4955}
4956
Tobin Ehlis31289162016-08-17 14:57:58 -06004957TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
4958 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4959 "due to a bound descriptor set with a buffer dependency "
4960 "being destroyed.");
4961 ASSERT_NO_FATAL_FAILURE(InitState());
4962 ASSERT_NO_FATAL_FAILURE(InitViewport());
4963 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4964
4965 VkDescriptorPoolSize ds_type_count = {};
4966 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4967 ds_type_count.descriptorCount = 1;
4968
4969 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4970 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4971 ds_pool_ci.pNext = NULL;
4972 ds_pool_ci.maxSets = 1;
4973 ds_pool_ci.poolSizeCount = 1;
4974 ds_pool_ci.pPoolSizes = &ds_type_count;
4975
4976 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004977 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06004978 ASSERT_VK_SUCCESS(err);
4979
4980 VkDescriptorSetLayoutBinding dsl_binding = {};
4981 dsl_binding.binding = 0;
4982 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4983 dsl_binding.descriptorCount = 1;
4984 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4985 dsl_binding.pImmutableSamplers = NULL;
4986
4987 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4988 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4989 ds_layout_ci.pNext = NULL;
4990 ds_layout_ci.bindingCount = 1;
4991 ds_layout_ci.pBindings = &dsl_binding;
4992 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004993 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06004994 ASSERT_VK_SUCCESS(err);
4995
4996 VkDescriptorSet descriptorSet;
4997 VkDescriptorSetAllocateInfo alloc_info = {};
4998 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4999 alloc_info.descriptorSetCount = 1;
5000 alloc_info.descriptorPool = ds_pool;
5001 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005002 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005003 ASSERT_VK_SUCCESS(err);
5004
5005 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5006 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5007 pipeline_layout_ci.pNext = NULL;
5008 pipeline_layout_ci.setLayoutCount = 1;
5009 pipeline_layout_ci.pSetLayouts = &ds_layout;
5010
5011 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005012 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005013 ASSERT_VK_SUCCESS(err);
5014
5015 // Create a buffer to update the descriptor with
5016 uint32_t qfi = 0;
5017 VkBufferCreateInfo buffCI = {};
5018 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5019 buffCI.size = 1024;
5020 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5021 buffCI.queueFamilyIndexCount = 1;
5022 buffCI.pQueueFamilyIndices = &qfi;
5023
5024 VkBuffer buffer;
5025 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5026 ASSERT_VK_SUCCESS(err);
5027 // Allocate memory and bind to buffer so we can make it to the appropriate
5028 // error
5029 VkMemoryAllocateInfo mem_alloc = {};
5030 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5031 mem_alloc.pNext = NULL;
5032 mem_alloc.allocationSize = 1024;
5033 mem_alloc.memoryTypeIndex = 0;
5034
5035 VkMemoryRequirements memReqs;
5036 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005037 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005038 if (!pass) {
5039 vkDestroyBuffer(m_device->device(), buffer, NULL);
5040 return;
5041 }
5042
5043 VkDeviceMemory mem;
5044 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5045 ASSERT_VK_SUCCESS(err);
5046 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5047 ASSERT_VK_SUCCESS(err);
5048 // Correctly update descriptor to avoid "NOT_UPDATED" error
5049 VkDescriptorBufferInfo buffInfo = {};
5050 buffInfo.buffer = buffer;
5051 buffInfo.offset = 0;
5052 buffInfo.range = 1024;
5053
5054 VkWriteDescriptorSet descriptor_write;
5055 memset(&descriptor_write, 0, sizeof(descriptor_write));
5056 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5057 descriptor_write.dstSet = descriptorSet;
5058 descriptor_write.dstBinding = 0;
5059 descriptor_write.descriptorCount = 1;
5060 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5061 descriptor_write.pBufferInfo = &buffInfo;
5062
5063 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5064
5065 // Create PSO to be used for draw-time errors below
5066 char const *vsSource = "#version 450\n"
5067 "\n"
5068 "out gl_PerVertex { \n"
5069 " vec4 gl_Position;\n"
5070 "};\n"
5071 "void main(){\n"
5072 " gl_Position = vec4(1);\n"
5073 "}\n";
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005074 char const *fsSource = "#version 450\n"
5075 "\n"
5076 "layout(location=0) out vec4 x;\n"
5077 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5078 "void main(){\n"
5079 " x = vec4(bar.y);\n"
5080 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005081 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5082 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5083 VkPipelineObj pipe(m_device);
5084 pipe.AddShader(&vs);
5085 pipe.AddShader(&fs);
5086 pipe.AddColorAttachment();
5087 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5088
Tony Barbour552f6c02016-12-21 14:34:07 -07005089 m_commandBuffer->BeginCommandBuffer();
5090 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005091 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5092 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5093 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005094
5095 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5096 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5097
Tobin Ehlis31289162016-08-17 14:57:58 -06005098 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005099 m_commandBuffer->EndRenderPass();
5100 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005102 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5103 vkDestroyBuffer(m_device->device(), buffer, NULL);
5104 // Attempt to submit cmd buffer
5105 VkSubmitInfo submit_info = {};
5106 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5107 submit_info.commandBufferCount = 1;
5108 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5109 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5110 m_errorMonitor->VerifyFound();
5111 // Cleanup
5112 vkFreeMemory(m_device->device(), mem, NULL);
5113
5114 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5115 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5116 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5117}
5118
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005119TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
5120 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
5121 "due to a bound descriptor sets with a combined image "
5122 "sampler having their image, sampler, and descriptor set "
5123 "each respectively destroyed and then attempting to "
Mark Mueller917f6bc2016-08-30 10:57:19 -06005124 "submit associated cmd buffers. Attempt to destroy a "
5125 "DescriptorSet that is in use.");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005126 ASSERT_NO_FATAL_FAILURE(InitState());
5127 ASSERT_NO_FATAL_FAILURE(InitViewport());
5128 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5129
5130 VkDescriptorPoolSize ds_type_count = {};
5131 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5132 ds_type_count.descriptorCount = 1;
5133
5134 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5135 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5136 ds_pool_ci.pNext = NULL;
5137 ds_pool_ci.maxSets = 1;
5138 ds_pool_ci.poolSizeCount = 1;
5139 ds_pool_ci.pPoolSizes = &ds_type_count;
5140
5141 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005142 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005143 ASSERT_VK_SUCCESS(err);
5144
5145 VkDescriptorSetLayoutBinding dsl_binding = {};
5146 dsl_binding.binding = 0;
5147 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5148 dsl_binding.descriptorCount = 1;
5149 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5150 dsl_binding.pImmutableSamplers = NULL;
5151
5152 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5153 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5154 ds_layout_ci.pNext = NULL;
5155 ds_layout_ci.bindingCount = 1;
5156 ds_layout_ci.pBindings = &dsl_binding;
5157 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005158 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005159 ASSERT_VK_SUCCESS(err);
5160
5161 VkDescriptorSet descriptorSet;
5162 VkDescriptorSetAllocateInfo alloc_info = {};
5163 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5164 alloc_info.descriptorSetCount = 1;
5165 alloc_info.descriptorPool = ds_pool;
5166 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005167 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005168 ASSERT_VK_SUCCESS(err);
5169
5170 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5171 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5172 pipeline_layout_ci.pNext = NULL;
5173 pipeline_layout_ci.setLayoutCount = 1;
5174 pipeline_layout_ci.pSetLayouts = &ds_layout;
5175
5176 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005177 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005178 ASSERT_VK_SUCCESS(err);
5179
5180 // Create images to update the descriptor with
5181 VkImage image;
5182 VkImage image2;
5183 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5184 const int32_t tex_width = 32;
5185 const int32_t tex_height = 32;
5186 VkImageCreateInfo image_create_info = {};
5187 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5188 image_create_info.pNext = NULL;
5189 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5190 image_create_info.format = tex_format;
5191 image_create_info.extent.width = tex_width;
5192 image_create_info.extent.height = tex_height;
5193 image_create_info.extent.depth = 1;
5194 image_create_info.mipLevels = 1;
5195 image_create_info.arrayLayers = 1;
5196 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5197 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5198 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5199 image_create_info.flags = 0;
5200 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5201 ASSERT_VK_SUCCESS(err);
5202 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5203 ASSERT_VK_SUCCESS(err);
5204
5205 VkMemoryRequirements memory_reqs;
5206 VkDeviceMemory image_memory;
5207 bool pass;
5208 VkMemoryAllocateInfo memory_info = {};
5209 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5210 memory_info.pNext = NULL;
5211 memory_info.allocationSize = 0;
5212 memory_info.memoryTypeIndex = 0;
5213 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5214 // Allocate enough memory for both images
5215 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005216 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005217 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005218 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005219 ASSERT_VK_SUCCESS(err);
5220 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5221 ASSERT_VK_SUCCESS(err);
5222 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005223 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005224 ASSERT_VK_SUCCESS(err);
5225
5226 VkImageViewCreateInfo image_view_create_info = {};
5227 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5228 image_view_create_info.image = image;
5229 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5230 image_view_create_info.format = tex_format;
5231 image_view_create_info.subresourceRange.layerCount = 1;
5232 image_view_create_info.subresourceRange.baseMipLevel = 0;
5233 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005234 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005235
5236 VkImageView view;
5237 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005238 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005239 ASSERT_VK_SUCCESS(err);
5240 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005241 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005242 ASSERT_VK_SUCCESS(err);
5243 // Create Samplers
5244 VkSamplerCreateInfo sampler_ci = {};
5245 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5246 sampler_ci.pNext = NULL;
5247 sampler_ci.magFilter = VK_FILTER_NEAREST;
5248 sampler_ci.minFilter = VK_FILTER_NEAREST;
5249 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5250 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5251 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5252 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5253 sampler_ci.mipLodBias = 1.0;
5254 sampler_ci.anisotropyEnable = VK_FALSE;
5255 sampler_ci.maxAnisotropy = 1;
5256 sampler_ci.compareEnable = VK_FALSE;
5257 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5258 sampler_ci.minLod = 1.0;
5259 sampler_ci.maxLod = 1.0;
5260 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5261 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5262 VkSampler sampler;
5263 VkSampler sampler2;
5264 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5265 ASSERT_VK_SUCCESS(err);
5266 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5267 ASSERT_VK_SUCCESS(err);
5268 // Update descriptor with image and sampler
5269 VkDescriptorImageInfo img_info = {};
5270 img_info.sampler = sampler;
5271 img_info.imageView = view;
5272 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5273
5274 VkWriteDescriptorSet descriptor_write;
5275 memset(&descriptor_write, 0, sizeof(descriptor_write));
5276 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5277 descriptor_write.dstSet = descriptorSet;
5278 descriptor_write.dstBinding = 0;
5279 descriptor_write.descriptorCount = 1;
5280 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5281 descriptor_write.pImageInfo = &img_info;
5282
5283 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5284
5285 // Create PSO to be used for draw-time errors below
5286 char const *vsSource = "#version 450\n"
5287 "\n"
5288 "out gl_PerVertex { \n"
5289 " vec4 gl_Position;\n"
5290 "};\n"
5291 "void main(){\n"
5292 " gl_Position = vec4(1);\n"
5293 "}\n";
5294 char const *fsSource = "#version 450\n"
5295 "\n"
5296 "layout(set=0, binding=0) uniform sampler2D s;\n"
5297 "layout(location=0) out vec4 x;\n"
5298 "void main(){\n"
5299 " x = texture(s, vec2(1));\n"
5300 "}\n";
5301 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5302 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5303 VkPipelineObj pipe(m_device);
5304 pipe.AddShader(&vs);
5305 pipe.AddShader(&fs);
5306 pipe.AddColorAttachment();
5307 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5308
5309 // First error case is destroying sampler prior to cmd buffer submission
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot submit cmd buffer using deleted sampler ");
Tony Barbour552f6c02016-12-21 14:34:07 -07005311 m_commandBuffer->BeginCommandBuffer();
5312 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005313 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5314 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5315 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005316 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5317 VkRect2D scissor = {{0, 0}, {16, 16}};
5318 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5319 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005320 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005321 m_commandBuffer->EndRenderPass();
5322 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005323 // Destroy sampler invalidates the cmd buffer, causing error on submit
5324 vkDestroySampler(m_device->device(), sampler, NULL);
5325 // Attempt to submit cmd buffer
5326 VkSubmitInfo submit_info = {};
5327 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5328 submit_info.commandBufferCount = 1;
5329 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5330 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5331 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07005332
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005333 // Now re-update descriptor with valid sampler and delete image
5334 img_info.sampler = sampler2;
5335 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005336 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tony Barbour552f6c02016-12-21 14:34:07 -07005337 m_commandBuffer->BeginCommandBuffer();
5338 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005339 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5340 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5341 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005342 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5343 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005344 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005345 m_commandBuffer->EndRenderPass();
5346 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005347 // Destroy image invalidates the cmd buffer, causing error on submit
5348 vkDestroyImage(m_device->device(), image, NULL);
5349 // Attempt to submit cmd buffer
5350 submit_info = {};
5351 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5352 submit_info.commandBufferCount = 1;
5353 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5354 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5355 m_errorMonitor->VerifyFound();
5356 // Now update descriptor to be valid, but then free descriptor
5357 img_info.imageView = view2;
5358 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07005359 m_commandBuffer->BeginCommandBuffer();
5360 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005361 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5362 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5363 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005364 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5365 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005366 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005367 m_commandBuffer->EndRenderPass();
5368 m_commandBuffer->EndCommandBuffer();
Dave Houltonfbf52152017-01-06 12:55:29 -07005369
5370 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005371 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005372 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06005373 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07005374
5375 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07005376 // 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 -07005377 vkQueueWaitIdle(m_device->m_queue);
5378 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
5379
5380 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005381 submit_info = {};
5382 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5383 submit_info.commandBufferCount = 1;
5384 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07005385 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound descriptor set ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005386 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5387 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07005388
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005389 // Cleanup
5390 vkFreeMemory(m_device->device(), image_memory, NULL);
5391 vkDestroySampler(m_device->device(), sampler2, NULL);
5392 vkDestroyImage(m_device->device(), image2, NULL);
5393 vkDestroyImageView(m_device->device(), view, NULL);
5394 vkDestroyImageView(m_device->device(), view2, NULL);
5395 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5396 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5397 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5398}
5399
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005400TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
5401 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
5402 ASSERT_NO_FATAL_FAILURE(InitState());
5403 ASSERT_NO_FATAL_FAILURE(InitViewport());
5404 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5405
5406 VkDescriptorPoolSize ds_type_count = {};
5407 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5408 ds_type_count.descriptorCount = 1;
5409
5410 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5411 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5412 ds_pool_ci.pNext = NULL;
5413 ds_pool_ci.maxSets = 1;
5414 ds_pool_ci.poolSizeCount = 1;
5415 ds_pool_ci.pPoolSizes = &ds_type_count;
5416
5417 VkDescriptorPool ds_pool;
5418 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5419 ASSERT_VK_SUCCESS(err);
5420
5421 VkDescriptorSetLayoutBinding dsl_binding = {};
5422 dsl_binding.binding = 0;
5423 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5424 dsl_binding.descriptorCount = 1;
5425 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5426 dsl_binding.pImmutableSamplers = NULL;
5427
5428 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5429 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5430 ds_layout_ci.pNext = NULL;
5431 ds_layout_ci.bindingCount = 1;
5432 ds_layout_ci.pBindings = &dsl_binding;
5433 VkDescriptorSetLayout ds_layout;
5434 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
5435 ASSERT_VK_SUCCESS(err);
5436
5437 VkDescriptorSet descriptor_set;
5438 VkDescriptorSetAllocateInfo alloc_info = {};
5439 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5440 alloc_info.descriptorSetCount = 1;
5441 alloc_info.descriptorPool = ds_pool;
5442 alloc_info.pSetLayouts = &ds_layout;
5443 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
5444 ASSERT_VK_SUCCESS(err);
5445
5446 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5447 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5448 pipeline_layout_ci.pNext = NULL;
5449 pipeline_layout_ci.setLayoutCount = 1;
5450 pipeline_layout_ci.pSetLayouts = &ds_layout;
5451
5452 VkPipelineLayout pipeline_layout;
5453 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5454 ASSERT_VK_SUCCESS(err);
5455
5456 // Create image to update the descriptor with
5457 VkImageObj image(m_device);
5458 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5459 ASSERT_TRUE(image.initialized());
5460
5461 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5462 // Create Sampler
5463 VkSamplerCreateInfo sampler_ci = {};
5464 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5465 sampler_ci.pNext = NULL;
5466 sampler_ci.magFilter = VK_FILTER_NEAREST;
5467 sampler_ci.minFilter = VK_FILTER_NEAREST;
5468 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5469 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5470 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5471 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5472 sampler_ci.mipLodBias = 1.0;
5473 sampler_ci.anisotropyEnable = VK_FALSE;
5474 sampler_ci.maxAnisotropy = 1;
5475 sampler_ci.compareEnable = VK_FALSE;
5476 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5477 sampler_ci.minLod = 1.0;
5478 sampler_ci.maxLod = 1.0;
5479 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5480 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5481 VkSampler sampler;
5482 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5483 ASSERT_VK_SUCCESS(err);
5484 // Update descriptor with image and sampler
5485 VkDescriptorImageInfo img_info = {};
5486 img_info.sampler = sampler;
5487 img_info.imageView = view;
5488 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5489
5490 VkWriteDescriptorSet descriptor_write;
5491 memset(&descriptor_write, 0, sizeof(descriptor_write));
5492 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5493 descriptor_write.dstSet = descriptor_set;
5494 descriptor_write.dstBinding = 0;
5495 descriptor_write.descriptorCount = 1;
5496 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5497 descriptor_write.pImageInfo = &img_info;
5498
5499 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5500
5501 // Create PSO to be used for draw-time errors below
5502 char const *vsSource = "#version 450\n"
5503 "\n"
5504 "out gl_PerVertex { \n"
5505 " vec4 gl_Position;\n"
5506 "};\n"
5507 "void main(){\n"
5508 " gl_Position = vec4(1);\n"
5509 "}\n";
5510 char const *fsSource = "#version 450\n"
5511 "\n"
5512 "layout(set=0, binding=0) uniform sampler2D s;\n"
5513 "layout(location=0) out vec4 x;\n"
5514 "void main(){\n"
5515 " x = texture(s, vec2(1));\n"
5516 "}\n";
5517 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5518 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5519 VkPipelineObj pipe(m_device);
5520 pipe.AddShader(&vs);
5521 pipe.AddShader(&fs);
5522 pipe.AddColorAttachment();
5523 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5524
Tony Barbour552f6c02016-12-21 14:34:07 -07005525 m_commandBuffer->BeginCommandBuffer();
5526 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005527 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5528 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5529 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07005530
5531 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5532 VkRect2D scissor = {{0, 0}, {16, 16}};
5533 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5534 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
5535
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005536 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005537 m_commandBuffer->EndRenderPass();
5538 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005539 // Submit cmd buffer to put pool in-flight
5540 VkSubmitInfo submit_info = {};
5541 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5542 submit_info.commandBufferCount = 1;
5543 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5544 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5545 // Destroy pool while in-flight, causing error
5546 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete descriptor pool ");
5547 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5548 m_errorMonitor->VerifyFound();
5549 vkQueueWaitIdle(m_device->m_queue);
5550 // Cleanup
5551 vkDestroySampler(m_device->device(), sampler, NULL);
5552 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5553 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5554 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07005555 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005556}
5557
Tobin Ehlis50a095d2016-09-21 17:32:49 -06005558TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
5559 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
5560 ASSERT_NO_FATAL_FAILURE(InitState());
5561 ASSERT_NO_FATAL_FAILURE(InitViewport());
5562 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5563
5564 VkDescriptorPoolSize ds_type_count = {};
5565 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5566 ds_type_count.descriptorCount = 1;
5567
5568 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5569 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5570 ds_pool_ci.pNext = NULL;
5571 ds_pool_ci.maxSets = 1;
5572 ds_pool_ci.poolSizeCount = 1;
5573 ds_pool_ci.pPoolSizes = &ds_type_count;
5574
5575 VkDescriptorPool ds_pool;
5576 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5577 ASSERT_VK_SUCCESS(err);
5578
5579 VkDescriptorSetLayoutBinding dsl_binding = {};
5580 dsl_binding.binding = 0;
5581 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5582 dsl_binding.descriptorCount = 1;
5583 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5584 dsl_binding.pImmutableSamplers = NULL;
5585
5586 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5587 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5588 ds_layout_ci.pNext = NULL;
5589 ds_layout_ci.bindingCount = 1;
5590 ds_layout_ci.pBindings = &dsl_binding;
5591 VkDescriptorSetLayout ds_layout;
5592 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
5593 ASSERT_VK_SUCCESS(err);
5594
5595 VkDescriptorSet descriptorSet;
5596 VkDescriptorSetAllocateInfo alloc_info = {};
5597 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5598 alloc_info.descriptorSetCount = 1;
5599 alloc_info.descriptorPool = ds_pool;
5600 alloc_info.pSetLayouts = &ds_layout;
5601 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
5602 ASSERT_VK_SUCCESS(err);
5603
5604 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5605 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5606 pipeline_layout_ci.pNext = NULL;
5607 pipeline_layout_ci.setLayoutCount = 1;
5608 pipeline_layout_ci.pSetLayouts = &ds_layout;
5609
5610 VkPipelineLayout pipeline_layout;
5611 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5612 ASSERT_VK_SUCCESS(err);
5613
5614 // Create images to update the descriptor with
5615 VkImage image;
5616 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5617 const int32_t tex_width = 32;
5618 const int32_t tex_height = 32;
5619 VkImageCreateInfo image_create_info = {};
5620 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5621 image_create_info.pNext = NULL;
5622 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5623 image_create_info.format = tex_format;
5624 image_create_info.extent.width = tex_width;
5625 image_create_info.extent.height = tex_height;
5626 image_create_info.extent.depth = 1;
5627 image_create_info.mipLevels = 1;
5628 image_create_info.arrayLayers = 1;
5629 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5630 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5631 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5632 image_create_info.flags = 0;
5633 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5634 ASSERT_VK_SUCCESS(err);
5635 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
5636 VkMemoryRequirements memory_reqs;
5637 VkDeviceMemory image_memory;
5638 bool pass;
5639 VkMemoryAllocateInfo memory_info = {};
5640 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5641 memory_info.pNext = NULL;
5642 memory_info.allocationSize = 0;
5643 memory_info.memoryTypeIndex = 0;
5644 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5645 // Allocate enough memory for image
5646 memory_info.allocationSize = memory_reqs.size;
5647 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5648 ASSERT_TRUE(pass);
5649 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5650 ASSERT_VK_SUCCESS(err);
5651 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5652 ASSERT_VK_SUCCESS(err);
5653
5654 VkImageViewCreateInfo image_view_create_info = {};
5655 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5656 image_view_create_info.image = image;
5657 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5658 image_view_create_info.format = tex_format;
5659 image_view_create_info.subresourceRange.layerCount = 1;
5660 image_view_create_info.subresourceRange.baseMipLevel = 0;
5661 image_view_create_info.subresourceRange.levelCount = 1;
5662 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5663
5664 VkImageView view;
5665 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
5666 ASSERT_VK_SUCCESS(err);
5667 // Create Samplers
5668 VkSamplerCreateInfo sampler_ci = {};
5669 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5670 sampler_ci.pNext = NULL;
5671 sampler_ci.magFilter = VK_FILTER_NEAREST;
5672 sampler_ci.minFilter = VK_FILTER_NEAREST;
5673 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5674 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5675 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5676 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5677 sampler_ci.mipLodBias = 1.0;
5678 sampler_ci.anisotropyEnable = VK_FALSE;
5679 sampler_ci.maxAnisotropy = 1;
5680 sampler_ci.compareEnable = VK_FALSE;
5681 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5682 sampler_ci.minLod = 1.0;
5683 sampler_ci.maxLod = 1.0;
5684 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5685 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5686 VkSampler sampler;
5687 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5688 ASSERT_VK_SUCCESS(err);
5689 // Update descriptor with image and sampler
5690 VkDescriptorImageInfo img_info = {};
5691 img_info.sampler = sampler;
5692 img_info.imageView = view;
5693 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5694
5695 VkWriteDescriptorSet descriptor_write;
5696 memset(&descriptor_write, 0, sizeof(descriptor_write));
5697 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5698 descriptor_write.dstSet = descriptorSet;
5699 descriptor_write.dstBinding = 0;
5700 descriptor_write.descriptorCount = 1;
5701 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5702 descriptor_write.pImageInfo = &img_info;
5703 // Break memory binding and attempt update
5704 vkFreeMemory(m_device->device(), image_memory, nullptr);
5705 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005706 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06005707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5708 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
5709 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5710 m_errorMonitor->VerifyFound();
5711 // Cleanup
5712 vkDestroyImage(m_device->device(), image, NULL);
5713 vkDestroySampler(m_device->device(), sampler, NULL);
5714 vkDestroyImageView(m_device->device(), view, NULL);
5715 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5716 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5717 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5718}
5719
Karl Schultz6addd812016-02-02 17:17:23 -07005720TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06005721 // Attempt to bind an invalid Pipeline to a valid Command Buffer
5722 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005723 // Create a valid cmd buffer
5724 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06005725 uint64_t fake_pipeline_handle = 0xbaad6001;
5726 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06005727 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12005728 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5729
Karl Schultzf78bcdd2016-11-30 12:36:01 -07005730 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07005731 m_commandBuffer->BeginCommandBuffer();
5732 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005733 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06005734 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12005735
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06005736 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005737 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 -06005738 Draw(1, 0, 0, 0);
5739 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12005740
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06005741 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Chris Forbes4dbf70f2016-09-16 17:58:00 +12005743 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06005744 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
5745 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005746}
5747
Karl Schultz6addd812016-02-02 17:17:23 -07005748TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06005749 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07005750 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005751
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005753
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005754 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06005755 ASSERT_NO_FATAL_FAILURE(InitViewport());
5756 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005757 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005758 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5759 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005760
5761 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005762 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5763 ds_pool_ci.pNext = NULL;
5764 ds_pool_ci.maxSets = 1;
5765 ds_pool_ci.poolSizeCount = 1;
5766 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06005767
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005768 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005769 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005770 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005771
Tony Barboureb254902015-07-15 12:50:33 -06005772 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005773 dsl_binding.binding = 0;
5774 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5775 dsl_binding.descriptorCount = 1;
5776 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5777 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005778
Tony Barboureb254902015-07-15 12:50:33 -06005779 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005780 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5781 ds_layout_ci.pNext = NULL;
5782 ds_layout_ci.bindingCount = 1;
5783 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005784 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005785 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005786 ASSERT_VK_SUCCESS(err);
5787
5788 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005789 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005790 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005791 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005792 alloc_info.descriptorPool = ds_pool;
5793 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005794 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005795 ASSERT_VK_SUCCESS(err);
5796
Tony Barboureb254902015-07-15 12:50:33 -06005797 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005798 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5799 pipeline_layout_ci.pNext = NULL;
5800 pipeline_layout_ci.setLayoutCount = 1;
5801 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005802
5803 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005804 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005805 ASSERT_VK_SUCCESS(err);
5806
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005807 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06005808 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07005809 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005810 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005811
Tony Barbourc95e4ac2015-08-04 17:05:26 -06005812 VkPipelineObj pipe(m_device);
5813 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005814 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06005815 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06005816 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06005817
Tony Barbour552f6c02016-12-21 14:34:07 -07005818 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005819 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5820 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5821 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005822
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005823 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005824
Chia-I Wuf7458c52015-10-26 21:10:41 +08005825 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5826 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5827 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005828}
5829
Karl Schultz6addd812016-02-02 17:17:23 -07005830TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005831 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07005832 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005833
Karl Schultzf78bcdd2016-11-30 12:36:01 -07005834 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005835
5836 ASSERT_NO_FATAL_FAILURE(InitState());
5837 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005838 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
5839 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005840
5841 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005842 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5843 ds_pool_ci.pNext = NULL;
5844 ds_pool_ci.maxSets = 1;
5845 ds_pool_ci.poolSizeCount = 1;
5846 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005847
5848 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005849 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005850 ASSERT_VK_SUCCESS(err);
5851
5852 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005853 dsl_binding.binding = 0;
5854 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
5855 dsl_binding.descriptorCount = 1;
5856 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5857 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005858
5859 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005860 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5861 ds_layout_ci.pNext = NULL;
5862 ds_layout_ci.bindingCount = 1;
5863 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005864 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005865 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005866 ASSERT_VK_SUCCESS(err);
5867
5868 VkDescriptorSet descriptorSet;
5869 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005870 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005871 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005872 alloc_info.descriptorPool = ds_pool;
5873 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005874 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005875 ASSERT_VK_SUCCESS(err);
5876
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005877 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005878 VkWriteDescriptorSet descriptor_write;
5879 memset(&descriptor_write, 0, sizeof(descriptor_write));
5880 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5881 descriptor_write.dstSet = descriptorSet;
5882 descriptor_write.dstBinding = 0;
5883 descriptor_write.descriptorCount = 1;
5884 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
5885 descriptor_write.pTexelBufferView = &view;
5886
5887 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5888
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005889 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005890
5891 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5892 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5893}
5894
Mark Youngd339ba32016-05-30 13:28:35 -06005895TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005896 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 -06005897
5898 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005899 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005900 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06005901
5902 ASSERT_NO_FATAL_FAILURE(InitState());
5903
5904 // Create a buffer with no bound memory and then attempt to create
5905 // a buffer view.
5906 VkBufferCreateInfo buff_ci = {};
5907 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12005908 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06005909 buff_ci.size = 256;
5910 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5911 VkBuffer buffer;
5912 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
5913 ASSERT_VK_SUCCESS(err);
5914
5915 VkBufferViewCreateInfo buff_view_ci = {};
5916 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
5917 buff_view_ci.buffer = buffer;
5918 buff_view_ci.format = VK_FORMAT_R8_UNORM;
5919 buff_view_ci.range = VK_WHOLE_SIZE;
5920 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005921 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06005922
5923 m_errorMonitor->VerifyFound();
5924 vkDestroyBuffer(m_device->device(), buffer, NULL);
5925 // If last error is success, it still created the view, so delete it.
5926 if (err == VK_SUCCESS) {
5927 vkDestroyBufferView(m_device->device(), buff_view, NULL);
5928 }
5929}
5930
Karl Schultz6addd812016-02-02 17:17:23 -07005931TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
5932 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
5933 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07005934 // 1. No dynamicOffset supplied
5935 // 2. Too many dynamicOffsets supplied
5936 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07005937 VkResult err;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " requires 1 dynamicOffsets, but only "
5939 "0 dynamicOffsets are left in "
5940 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005941
5942 ASSERT_NO_FATAL_FAILURE(InitState());
5943 ASSERT_NO_FATAL_FAILURE(InitViewport());
5944 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5945
5946 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005947 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
5948 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005949
5950 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005951 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5952 ds_pool_ci.pNext = NULL;
5953 ds_pool_ci.maxSets = 1;
5954 ds_pool_ci.poolSizeCount = 1;
5955 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005956
5957 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005958 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005959 ASSERT_VK_SUCCESS(err);
5960
5961 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005962 dsl_binding.binding = 0;
5963 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
5964 dsl_binding.descriptorCount = 1;
5965 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5966 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005967
5968 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005969 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5970 ds_layout_ci.pNext = NULL;
5971 ds_layout_ci.bindingCount = 1;
5972 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005973 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005974 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005975 ASSERT_VK_SUCCESS(err);
5976
5977 VkDescriptorSet descriptorSet;
5978 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005979 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005980 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005981 alloc_info.descriptorPool = ds_pool;
5982 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005983 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005984 ASSERT_VK_SUCCESS(err);
5985
5986 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005987 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5988 pipeline_layout_ci.pNext = NULL;
5989 pipeline_layout_ci.setLayoutCount = 1;
5990 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005991
5992 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005993 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005994 ASSERT_VK_SUCCESS(err);
5995
5996 // Create a buffer to update the descriptor with
5997 uint32_t qfi = 0;
5998 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005999 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6000 buffCI.size = 1024;
6001 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6002 buffCI.queueFamilyIndexCount = 1;
6003 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006004
6005 VkBuffer dyub;
6006 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6007 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006008 // Allocate memory and bind to buffer so we can make it to the appropriate
6009 // error
6010 VkMemoryAllocateInfo mem_alloc = {};
6011 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6012 mem_alloc.pNext = NULL;
6013 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006014 mem_alloc.memoryTypeIndex = 0;
6015
6016 VkMemoryRequirements memReqs;
6017 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006018 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006019 if (!pass) {
6020 vkDestroyBuffer(m_device->device(), dyub, NULL);
6021 return;
6022 }
6023
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006024 VkDeviceMemory mem;
6025 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6026 ASSERT_VK_SUCCESS(err);
6027 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6028 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006029 // Correctly update descriptor to avoid "NOT_UPDATED" error
6030 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006031 buffInfo.buffer = dyub;
6032 buffInfo.offset = 0;
6033 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006034
6035 VkWriteDescriptorSet descriptor_write;
6036 memset(&descriptor_write, 0, sizeof(descriptor_write));
6037 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6038 descriptor_write.dstSet = descriptorSet;
6039 descriptor_write.dstBinding = 0;
6040 descriptor_write.descriptorCount = 1;
6041 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6042 descriptor_write.pBufferInfo = &buffInfo;
6043
6044 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6045
Tony Barbour552f6c02016-12-21 14:34:07 -07006046 m_commandBuffer->BeginCommandBuffer();
6047 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006048 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6049 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006050 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006051 uint32_t pDynOff[2] = {512, 756};
6052 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006053 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6054 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6055 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6056 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006057 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006058 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006059 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " dynamic offset 512 combined with "
6060 "offset 0 and range 1024 that "
6061 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006062 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006063 char const *vsSource = "#version 450\n"
6064 "\n"
6065 "out gl_PerVertex { \n"
6066 " vec4 gl_Position;\n"
6067 "};\n"
6068 "void main(){\n"
6069 " gl_Position = vec4(1);\n"
6070 "}\n";
6071 char const *fsSource = "#version 450\n"
6072 "\n"
6073 "layout(location=0) out vec4 x;\n"
6074 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6075 "void main(){\n"
6076 " x = vec4(bar.y);\n"
6077 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006078 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6079 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6080 VkPipelineObj pipe(m_device);
6081 pipe.AddShader(&vs);
6082 pipe.AddShader(&fs);
6083 pipe.AddColorAttachment();
6084 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6085
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006086 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6087 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6088 VkRect2D scissor = {{0, 0}, {16, 16}};
6089 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6090
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006091 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006092 // This update should succeed, but offset size of 512 will overstep buffer
6093 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006094 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6095 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006096 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006097 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006098
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006099 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006100 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006101
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006102 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006103 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006104 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6105}
6106
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006107TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
6108 TEST_DESCRIPTION("Attempt to update a descriptor with a non-sparse buffer "
6109 "that doesn't have memory bound");
6110 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006111 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006112 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6114 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006115
6116 ASSERT_NO_FATAL_FAILURE(InitState());
6117 ASSERT_NO_FATAL_FAILURE(InitViewport());
6118 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6119
6120 VkDescriptorPoolSize ds_type_count = {};
6121 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6122 ds_type_count.descriptorCount = 1;
6123
6124 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6125 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6126 ds_pool_ci.pNext = NULL;
6127 ds_pool_ci.maxSets = 1;
6128 ds_pool_ci.poolSizeCount = 1;
6129 ds_pool_ci.pPoolSizes = &ds_type_count;
6130
6131 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006132 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006133 ASSERT_VK_SUCCESS(err);
6134
6135 VkDescriptorSetLayoutBinding dsl_binding = {};
6136 dsl_binding.binding = 0;
6137 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6138 dsl_binding.descriptorCount = 1;
6139 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6140 dsl_binding.pImmutableSamplers = NULL;
6141
6142 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6143 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6144 ds_layout_ci.pNext = NULL;
6145 ds_layout_ci.bindingCount = 1;
6146 ds_layout_ci.pBindings = &dsl_binding;
6147 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006148 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006149 ASSERT_VK_SUCCESS(err);
6150
6151 VkDescriptorSet descriptorSet;
6152 VkDescriptorSetAllocateInfo alloc_info = {};
6153 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6154 alloc_info.descriptorSetCount = 1;
6155 alloc_info.descriptorPool = ds_pool;
6156 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006157 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006158 ASSERT_VK_SUCCESS(err);
6159
6160 // Create a buffer to update the descriptor with
6161 uint32_t qfi = 0;
6162 VkBufferCreateInfo buffCI = {};
6163 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6164 buffCI.size = 1024;
6165 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6166 buffCI.queueFamilyIndexCount = 1;
6167 buffCI.pQueueFamilyIndices = &qfi;
6168
6169 VkBuffer dyub;
6170 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6171 ASSERT_VK_SUCCESS(err);
6172
6173 // Attempt to update descriptor without binding memory to it
6174 VkDescriptorBufferInfo buffInfo = {};
6175 buffInfo.buffer = dyub;
6176 buffInfo.offset = 0;
6177 buffInfo.range = 1024;
6178
6179 VkWriteDescriptorSet descriptor_write;
6180 memset(&descriptor_write, 0, sizeof(descriptor_write));
6181 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6182 descriptor_write.dstSet = descriptorSet;
6183 descriptor_write.dstBinding = 0;
6184 descriptor_write.descriptorCount = 1;
6185 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6186 descriptor_write.pBufferInfo = &buffInfo;
6187
6188 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6189 m_errorMonitor->VerifyFound();
6190
6191 vkDestroyBuffer(m_device->device(), dyub, NULL);
6192 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6193 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6194}
6195
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006196TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006197 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006198 ASSERT_NO_FATAL_FAILURE(InitState());
6199 ASSERT_NO_FATAL_FAILURE(InitViewport());
6200 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6201
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006202 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006203 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006204 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6205 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6206 pipeline_layout_ci.pushConstantRangeCount = 1;
6207 pipeline_layout_ci.pPushConstantRanges = &pc_range;
6208
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006209 //
6210 // Check for invalid push constant ranges in pipeline layouts.
6211 //
6212 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006213 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006214 char const *msg;
6215 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006216
Karl Schultzc81037d2016-05-12 08:11:23 -06006217 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
6218 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
6219 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
6220 "vkCreatePipelineLayout() call has push constants index 0 with "
6221 "size 0."},
6222 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
6223 "vkCreatePipelineLayout() call has push constants index 0 with "
6224 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006225 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06006226 "vkCreatePipelineLayout() call has push constants index 0 with "
6227 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006228 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06006229 "vkCreatePipelineLayout() call has push constants index 0 with "
6230 "size 0."},
6231 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6232 "vkCreatePipelineLayout() call has push constants index 0 with "
6233 "offset 1. Offset must"},
6234 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
6235 "vkCreatePipelineLayout() call has push constants index 0 "
6236 "with offset "},
6237 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
6238 "vkCreatePipelineLayout() call has push constants "
6239 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006240 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006241 "vkCreatePipelineLayout() call has push constants index 0 "
6242 "with offset "},
6243 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
6244 "vkCreatePipelineLayout() call has push "
6245 "constants index 0 with offset "},
6246 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
6247 "vkCreatePipelineLayout() call has push "
6248 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006249 }};
6250
6251 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06006252 for (const auto &iter : range_tests) {
6253 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006254 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6255 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006256 m_errorMonitor->VerifyFound();
6257 if (VK_SUCCESS == err) {
6258 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6259 }
6260 }
6261
6262 // Check for invalid stage flag
6263 pc_range.offset = 0;
6264 pc_range.size = 16;
6265 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006266 m_errorMonitor->SetDesiredFailureMsg(
6267 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6268 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006269 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006270 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006271 if (VK_SUCCESS == err) {
6272 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6273 }
6274
6275 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06006276 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006277 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006278 VkPushConstantRange const ranges[ranges_per_test];
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006279 char const *msg;
6280 };
6281
Karl Schultzc81037d2016-05-12 08:11:23 -06006282 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006283 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6284 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6285 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6286 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6287 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006288 "vkCreatePipelineLayout() call has push constants with overlapping ranges:"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006289 {
6290 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6291 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6292 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6293 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
6294 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006295 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 3:[12, 20), 4:[16, 20)",
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006296 },
6297 {
6298 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6299 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
6300 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6301 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6302 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006303 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[16, 20), 1:[12, 20)",
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006304 },
6305 {
6306 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6307 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6308 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6309 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
6310 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006311 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[16, 20), 3:[12, 20)",
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006312 },
6313 {
6314 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6315 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
6316 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
6317 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
6318 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006319 "vkCreatePipelineLayout() call has push constants with overlapping ranges:",
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006320 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006321
Karl Schultzc81037d2016-05-12 08:11:23 -06006322 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006323 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06006324 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006325 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, iter.msg);
6326 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006327 m_errorMonitor->VerifyFound();
6328 if (VK_SUCCESS == err) {
6329 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6330 }
6331 }
6332
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006333 //
6334 // CmdPushConstants tests
6335 //
Karl Schultzc81037d2016-05-12 08:11:23 -06006336 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006337
6338 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006339 const std::array<PipelineLayoutTestCase, 11> cmd_range_tests = {{
6340 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0}, "vkCmdPushConstants: parameter size must be greater than 0"},
Karl Schultzc81037d2016-05-12 08:11:23 -06006341 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
Dave Houlton197211a2016-12-23 15:26:29 -07006342 "vkCmdPushConstants() call has push constants index 0 with size 1. "
6343 "Size must be a multiple of 4."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006344 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Dave Houlton197211a2016-12-23 15:26:29 -07006345 "vkCmdPushConstants() call has push constants index 0 with size 1. "
6346 "Size must be a multiple of 4."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006347 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006348 "vkCmdPushConstants() call has push constants with offset 1. "
6349 "Offset must be a multiple of 4."},
6350 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6351 "vkCmdPushConstants() call has push constants with offset 1. "
6352 "Offset must be a multiple of 4."},
6353 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
6354 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
6355 "0x1 not within flag-matching ranges in pipeline layout"},
6356 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
6357 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
6358 "0x1 not within flag-matching ranges in pipeline layout"},
6359 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
6360 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
6361 "0x1 not within flag-matching ranges in pipeline layout"},
6362 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
6363 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
6364 "0x1 not within flag-matching ranges in pipeline layout"},
6365 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
6366 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
6367 "any of the ranges in pipeline layout"},
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006368 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06006369 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
6370 "any of the ranges in pipeline layout"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006371 }};
6372
Tony Barbour552f6c02016-12-21 14:34:07 -07006373 m_commandBuffer->BeginCommandBuffer();
6374 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006375
6376 // Setup ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06006377 const VkPushConstantRange pc_range2[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006378 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006379 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006380 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006381 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006382 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006383 ASSERT_VK_SUCCESS(err);
Karl Schultzc81037d2016-05-12 08:11:23 -06006384 for (const auto &iter : cmd_range_tests) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006385 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6386 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
Karl Schultzc81037d2016-05-12 08:11:23 -06006387 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006388 m_errorMonitor->VerifyFound();
6389 }
6390
6391 // Check for invalid stage flag
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006392 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006393 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006394 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06006395 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006396
Karl Schultzc81037d2016-05-12 08:11:23 -06006397 // overlapping range tests with cmd
6398 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
6399 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
6400 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
6401 "0x1 not within flag-matching ranges in pipeline layout"},
6402 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6403 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
6404 "0x1 not within flag-matching ranges in pipeline layout"},
6405 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
6406 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
6407 "0x1 not within flag-matching ranges in pipeline layout"},
6408 }};
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006409 // Setup ranges: [0,16), [20,36), [36,44), [44,52), [80,92)
Karl Schultzc81037d2016-05-12 08:11:23 -06006410 const VkPushConstantRange pc_range3[] = {
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006411 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
6412 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12}, {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
Karl Schultzc81037d2016-05-12 08:11:23 -06006413 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006414 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range3) / sizeof(VkPushConstantRange);
Karl Schultzc81037d2016-05-12 08:11:23 -06006415 pipeline_layout_ci.pPushConstantRanges = pc_range3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006416 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzc81037d2016-05-12 08:11:23 -06006417 ASSERT_VK_SUCCESS(err);
Karl Schultzc81037d2016-05-12 08:11:23 -06006418 for (const auto &iter : cmd_overlap_tests) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006419 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6420 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
Karl Schultzc81037d2016-05-12 08:11:23 -06006421 iter.range.size, dummy_values);
6422 m_errorMonitor->VerifyFound();
6423 }
Karl Schultzc81037d2016-05-12 08:11:23 -06006424 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6425
Tony Barbour552f6c02016-12-21 14:34:07 -07006426 m_commandBuffer->EndRenderPass();
6427 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006428}
6429
Karl Schultz6addd812016-02-02 17:17:23 -07006430TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07006431 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07006432 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006433
6434 ASSERT_NO_FATAL_FAILURE(InitState());
6435 ASSERT_NO_FATAL_FAILURE(InitViewport());
6436 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6437
6438 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
6439 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006440 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6441 ds_type_count[0].descriptorCount = 10;
6442 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
6443 ds_type_count[1].descriptorCount = 2;
6444 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
6445 ds_type_count[2].descriptorCount = 2;
6446 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
6447 ds_type_count[3].descriptorCount = 5;
6448 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
6449 // type
6450 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
6451 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
6452 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006453
6454 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006455 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6456 ds_pool_ci.pNext = NULL;
6457 ds_pool_ci.maxSets = 5;
6458 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
6459 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006460
6461 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006462 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006463 ASSERT_VK_SUCCESS(err);
6464
6465 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
6466 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006467 dsl_binding[0].binding = 0;
6468 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6469 dsl_binding[0].descriptorCount = 5;
6470 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6471 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006472
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006473 // Create layout identical to set0 layout but w/ different stageFlags
6474 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006475 dsl_fs_stage_only.binding = 0;
6476 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6477 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006478 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
6479 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07006480 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006481 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006482 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6483 ds_layout_ci.pNext = NULL;
6484 ds_layout_ci.bindingCount = 1;
6485 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006486 static const uint32_t NUM_LAYOUTS = 4;
6487 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006488 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006489 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
6490 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006491 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006492 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006493 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006494 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006495 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006496 dsl_binding[0].binding = 0;
6497 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006498 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07006499 dsl_binding[1].binding = 1;
6500 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
6501 dsl_binding[1].descriptorCount = 2;
6502 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
6503 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006504 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006505 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006506 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006507 ASSERT_VK_SUCCESS(err);
6508 dsl_binding[0].binding = 0;
6509 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006510 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006511 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006512 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006513 ASSERT_VK_SUCCESS(err);
6514 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006515 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006516 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006517 ASSERT_VK_SUCCESS(err);
6518
6519 static const uint32_t NUM_SETS = 4;
6520 VkDescriptorSet descriptorSet[NUM_SETS] = {};
6521 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006522 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006523 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006524 alloc_info.descriptorPool = ds_pool;
6525 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006526 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006527 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006528 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07006529 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006530 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006531 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006532 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006533
6534 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006535 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6536 pipeline_layout_ci.pNext = NULL;
6537 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
6538 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006539
6540 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006541 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006542 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006543 // Create pipelineLayout with only one setLayout
6544 pipeline_layout_ci.setLayoutCount = 1;
6545 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006546 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006547 ASSERT_VK_SUCCESS(err);
6548 // Create pipelineLayout with 2 descriptor setLayout at index 0
6549 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
6550 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006551 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006552 ASSERT_VK_SUCCESS(err);
6553 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
6554 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
6555 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006556 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006557 ASSERT_VK_SUCCESS(err);
6558 // Create pipelineLayout with UB type, but stageFlags for FS only
6559 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
6560 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006561 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006562 ASSERT_VK_SUCCESS(err);
6563 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
6564 VkDescriptorSetLayout pl_bad_s0[2] = {};
6565 pl_bad_s0[0] = ds_layout_fs_only;
6566 pl_bad_s0[1] = ds_layout[1];
6567 pipeline_layout_ci.setLayoutCount = 2;
6568 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
6569 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006570 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006571 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006572
Tobin Ehlis88452832015-12-03 09:40:56 -07006573 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006574 char const *vsSource = "#version 450\n"
6575 "\n"
6576 "out gl_PerVertex {\n"
6577 " vec4 gl_Position;\n"
6578 "};\n"
6579 "void main(){\n"
6580 " gl_Position = vec4(1);\n"
6581 "}\n";
6582 char const *fsSource = "#version 450\n"
6583 "\n"
6584 "layout(location=0) out vec4 x;\n"
6585 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6586 "void main(){\n"
6587 " x = vec4(bar.y);\n"
6588 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07006589 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6590 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006591 VkPipelineObj pipe(m_device);
6592 pipe.AddShader(&vs);
6593 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07006594 pipe.AddColorAttachment();
6595 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07006596
Tony Barbour552f6c02016-12-21 14:34:07 -07006597 m_commandBuffer->BeginCommandBuffer();
6598 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07006599
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006600 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006601 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
6602 // of PSO
6603 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
6604 // cmd_pipeline.c
6605 // due to the fact that cmd_alloc_dset_data() has not been called in
6606 // cmd_bind_graphics_pipeline()
6607 // TODO : Want to cause various binding incompatibility issues here to test
6608 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07006609 // First cause various verify_layout_compatibility() fails
6610 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006611 // verify_set_layout_compatibility fail cases:
6612 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006613 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006614 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
6615 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006616 m_errorMonitor->VerifyFound();
6617
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006618 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
6620 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
6621 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006622 m_errorMonitor->VerifyFound();
6623
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006624 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07006625 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
6626 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006627 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
6628 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
6629 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006630 m_errorMonitor->VerifyFound();
6631
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006632 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
6633 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006634 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
6635 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
6636 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006637 m_errorMonitor->VerifyFound();
6638
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006639 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
6640 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006641 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6642 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
6643 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
6644 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006645 m_errorMonitor->VerifyFound();
6646
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006647 // Cause INFO messages due to disturbing previously bound Sets
6648 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006649 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
6650 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006651 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
6653 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
6654 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006655 m_errorMonitor->VerifyFound();
6656
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006657 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
6658 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006659 // 2. Disturb set after last bound set
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " newly bound as set #0 so set #1 and "
6661 "any subsequent sets were disturbed ");
6662 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
6663 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006664 m_errorMonitor->VerifyFound();
6665
Tobin Ehlis10fad692016-07-07 12:00:36 -06006666 // Now that we're done actively using the pipelineLayout that gfx pipeline
6667 // was created with, we should be able to delete it. Do that now to verify
6668 // that validation obeys pipelineLayout lifetime
6669 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
6670
Tobin Ehlis88452832015-12-03 09:40:56 -07006671 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07006672 // 1. Error due to not binding required set (we actually use same code as
6673 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006674 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
6675 &descriptorSet[0], 0, NULL);
6676 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
6677 &descriptorSet[1], 0, NULL);
6678 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 -07006679
6680 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6681 VkRect2D scissor = {{0, 0}, {16, 16}};
6682 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6683 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6684
Tobin Ehlis88452832015-12-03 09:40:56 -07006685 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006686 m_errorMonitor->VerifyFound();
6687
Tobin Ehlis991d45a2016-01-06 08:48:41 -07006688 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07006689 // 2. Error due to bound set not being compatible with PSO's
6690 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006691 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
6692 &descriptorSet[0], 0, NULL);
6693 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07006694 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006695 m_errorMonitor->VerifyFound();
6696
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006697 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07006698 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006699 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
6700 }
6701 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006702 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6703 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6704}
Tobin Ehlis559c6382015-11-05 09:52:49 -07006705
Karl Schultz6addd812016-02-02 17:17:23 -07006706TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006707
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006708 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6709 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006710
6711 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006712 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006713 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006714 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006715
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006716 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006717}
6718
Karl Schultz6addd812016-02-02 17:17:23 -07006719TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
6720 VkResult err;
6721 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006722
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006724
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006725 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006726
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006727 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006728 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06006729 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006730 cmd.commandPool = m_commandPool;
6731 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006732 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06006733
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006734 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06006735 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006736
6737 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07006738 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07006739 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
6740
6741 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006742 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06006743 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006744 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 -07006745 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006746
6747 // The error should be caught by validation of the BeginCommandBuffer call
6748 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
6749
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006750 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006751 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006752}
6753
Karl Schultz6addd812016-02-02 17:17:23 -07006754TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006755 // Cause error due to Begin while recording CB
6756 // Then cause 2 errors for attempting to reset CB w/o having
6757 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
6758 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06006759 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006760
6761 ASSERT_NO_FATAL_FAILURE(InitState());
6762
6763 // Calls AllocateCommandBuffers
6764 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
6765
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07006766 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07006767 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07006768 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
6769 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006770 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6771 cmd_buf_info.pNext = NULL;
6772 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006773 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006774
6775 // Begin CB to transition to recording state
6776 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
6777 // Can't re-begin. This should trigger error
6778 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006779 m_errorMonitor->VerifyFound();
6780
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07006781 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006782 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
6783 // Reset attempt will trigger error due to incorrect CommandPool state
6784 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006785 m_errorMonitor->VerifyFound();
6786
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07006787 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006788 // Transition CB to RECORDED state
6789 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
6790 // Now attempting to Begin will implicitly reset, which triggers error
6791 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006792 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006793}
6794
Karl Schultz6addd812016-02-02 17:17:23 -07006795TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006796 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07006797 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006798
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07006799 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6800 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006801
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006802 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006803 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006804
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006805 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006806 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6807 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006808
6809 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006810 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6811 ds_pool_ci.pNext = NULL;
6812 ds_pool_ci.maxSets = 1;
6813 ds_pool_ci.poolSizeCount = 1;
6814 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006815
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006816 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006817 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006818 ASSERT_VK_SUCCESS(err);
6819
Tony Barboureb254902015-07-15 12:50:33 -06006820 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006821 dsl_binding.binding = 0;
6822 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6823 dsl_binding.descriptorCount = 1;
6824 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6825 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006826
Tony Barboureb254902015-07-15 12:50:33 -06006827 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006828 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6829 ds_layout_ci.pNext = NULL;
6830 ds_layout_ci.bindingCount = 1;
6831 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006832
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006833 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006834 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006835 ASSERT_VK_SUCCESS(err);
6836
6837 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006838 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006839 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006840 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006841 alloc_info.descriptorPool = ds_pool;
6842 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006843 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006844 ASSERT_VK_SUCCESS(err);
6845
Tony Barboureb254902015-07-15 12:50:33 -06006846 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006847 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6848 pipeline_layout_ci.setLayoutCount = 1;
6849 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006850
6851 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006852 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006853 ASSERT_VK_SUCCESS(err);
6854
Tobin Ehlise68360f2015-10-01 11:15:13 -06006855 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07006856 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06006857
6858 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006859 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
6860 vp_state_ci.scissorCount = 1;
6861 vp_state_ci.pScissors = &sc;
6862 vp_state_ci.viewportCount = 1;
6863 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06006864
Karl Schultzdfdb8d42016-03-08 10:30:21 -07006865 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
6866 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
6867 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
6868 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
6869 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
6870 rs_state_ci.depthClampEnable = VK_FALSE;
6871 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
6872 rs_state_ci.depthBiasEnable = VK_FALSE;
6873
Tony Barboureb254902015-07-15 12:50:33 -06006874 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006875 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
6876 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07006877 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07006878 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
6879 gp_ci.layout = pipeline_layout;
6880 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06006881
6882 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006883 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
6884 pc_ci.initialDataSize = 0;
6885 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006886
6887 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06006888 VkPipelineCache pipelineCache;
6889
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006890 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06006891 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006892 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006893
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006894 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006895
Chia-I Wuf7458c52015-10-26 21:10:41 +08006896 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
6897 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6898 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6899 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006900}
Tobin Ehlis912df022015-09-17 08:46:18 -06006901/*// TODO : This test should be good, but needs Tess support in compiler to run
6902TEST_F(VkLayerTest, InvalidPatchControlPoints)
6903{
6904 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06006905 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006906
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006907 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006908 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
6909primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006910
Tobin Ehlis912df022015-09-17 08:46:18 -06006911 ASSERT_NO_FATAL_FAILURE(InitState());
6912 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06006913
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006914 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06006915 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006916 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06006917
6918 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6919 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6920 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006921 ds_pool_ci.poolSizeCount = 1;
6922 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06006923
6924 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006925 err = vkCreateDescriptorPool(m_device->device(),
6926VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06006927 ASSERT_VK_SUCCESS(err);
6928
6929 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08006930 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06006931 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08006932 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06006933 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6934 dsl_binding.pImmutableSamplers = NULL;
6935
6936 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006937 ds_layout_ci.sType =
6938VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06006939 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006940 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006941 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06006942
6943 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006944 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6945&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06006946 ASSERT_VK_SUCCESS(err);
6947
6948 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07006949 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
6950VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06006951 ASSERT_VK_SUCCESS(err);
6952
6953 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006954 pipeline_layout_ci.sType =
6955VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06006956 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006957 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06006958 pipeline_layout_ci.pSetLayouts = &ds_layout;
6959
6960 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006961 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6962&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06006963 ASSERT_VK_SUCCESS(err);
6964
6965 VkPipelineShaderStageCreateInfo shaderStages[3];
6966 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
6967
Karl Schultz6addd812016-02-02 17:17:23 -07006968 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
6969this);
Tobin Ehlis912df022015-09-17 08:46:18 -06006970 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07006971 VkShaderObj
6972tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
6973this);
6974 VkShaderObj
6975te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
6976this);
Tobin Ehlis912df022015-09-17 08:46:18 -06006977
Karl Schultz6addd812016-02-02 17:17:23 -07006978 shaderStages[0].sType =
6979VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006980 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06006981 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07006982 shaderStages[1].sType =
6983VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006984 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06006985 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07006986 shaderStages[2].sType =
6987VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06006988 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06006989 shaderStages[2].shader = te.handle();
6990
6991 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006992 iaCI.sType =
6993VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08006994 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06006995
6996 VkPipelineTessellationStateCreateInfo tsCI = {};
6997 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
6998 tsCI.patchControlPoints = 0; // This will cause an error
6999
7000 VkGraphicsPipelineCreateInfo gp_ci = {};
7001 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7002 gp_ci.pNext = NULL;
7003 gp_ci.stageCount = 3;
7004 gp_ci.pStages = shaderStages;
7005 gp_ci.pVertexInputState = NULL;
7006 gp_ci.pInputAssemblyState = &iaCI;
7007 gp_ci.pTessellationState = &tsCI;
7008 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007009 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007010 gp_ci.pMultisampleState = NULL;
7011 gp_ci.pDepthStencilState = NULL;
7012 gp_ci.pColorBlendState = NULL;
7013 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7014 gp_ci.layout = pipeline_layout;
7015 gp_ci.renderPass = renderPass();
7016
7017 VkPipelineCacheCreateInfo pc_ci = {};
7018 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7019 pc_ci.pNext = NULL;
7020 pc_ci.initialSize = 0;
7021 pc_ci.initialData = 0;
7022 pc_ci.maxSize = 0;
7023
7024 VkPipeline pipeline;
7025 VkPipelineCache pipelineCache;
7026
Karl Schultz6addd812016-02-02 17:17:23 -07007027 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7028&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007029 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007030 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7031&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007032
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007033 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007034
Chia-I Wuf7458c52015-10-26 21:10:41 +08007035 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7036 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7037 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7038 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007039}
7040*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007041
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007042TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007043 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007044
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007045 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007046
Tobin Ehlise68360f2015-10-01 11:15:13 -06007047 ASSERT_NO_FATAL_FAILURE(InitState());
7048 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007049
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007050 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007051 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7052 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007053
7054 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007055 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7056 ds_pool_ci.maxSets = 1;
7057 ds_pool_ci.poolSizeCount = 1;
7058 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007059
7060 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007061 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007062 ASSERT_VK_SUCCESS(err);
7063
7064 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007065 dsl_binding.binding = 0;
7066 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7067 dsl_binding.descriptorCount = 1;
7068 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007069
7070 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007071 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7072 ds_layout_ci.bindingCount = 1;
7073 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007074
7075 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007076 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007077 ASSERT_VK_SUCCESS(err);
7078
7079 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007080 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007081 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007082 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007083 alloc_info.descriptorPool = ds_pool;
7084 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007085 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007086 ASSERT_VK_SUCCESS(err);
7087
7088 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007089 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7090 pipeline_layout_ci.setLayoutCount = 1;
7091 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007092
7093 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007094 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007095 ASSERT_VK_SUCCESS(err);
7096
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007097 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007098 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007099 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007100 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007101 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007102 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007103
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007104 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7105 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7106 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7107 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7108 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7109 rs_state_ci.depthClampEnable = VK_FALSE;
7110 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7111 rs_state_ci.depthBiasEnable = VK_FALSE;
7112
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007113 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7114 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7115 vi_ci.pNext = nullptr;
7116 vi_ci.vertexBindingDescriptionCount = 0;
7117 vi_ci.pVertexBindingDescriptions = nullptr;
7118 vi_ci.vertexAttributeDescriptionCount = 0;
7119 vi_ci.pVertexAttributeDescriptions = nullptr;
7120
7121 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7122 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7123 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7124
7125 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7126 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7127 pipe_ms_state_ci.pNext = NULL;
7128 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7129 pipe_ms_state_ci.sampleShadingEnable = 0;
7130 pipe_ms_state_ci.minSampleShading = 1.0;
7131 pipe_ms_state_ci.pSampleMask = NULL;
7132
Cody Northropeb3a6c12015-10-05 14:44:45 -06007133 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007134 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007135
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007136 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007137 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007138 shaderStages[0] = vs.GetStageCreateInfo();
7139 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007140
7141 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007142 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7143 gp_ci.stageCount = 2;
7144 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007145 gp_ci.pVertexInputState = &vi_ci;
7146 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007147 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007148 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007149 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007150 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7151 gp_ci.layout = pipeline_layout;
7152 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007153
7154 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007155 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007156
7157 VkPipeline pipeline;
7158 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007159 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007160 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007161
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007162 if (!m_device->phy().features().multiViewport) {
7163 printf("MultiViewport feature is disabled -- skipping enabled-state checks.\n");
7164
7165 // Check case where multiViewport is disabled and viewport count is not 1
7166 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7167 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
7168 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
7169 vp_state_ci.scissorCount = 0;
7170 vp_state_ci.viewportCount = 0;
7171 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7172 m_errorMonitor->VerifyFound();
7173 } else {
7174 if (m_device->props.limits.maxViewports == 1) {
7175 printf("Device limit maxViewports is 1, skipping tests that require higher limits.\n");
7176 } else {
7177 printf("MultiViewport feature is enabled -- skipping disabled-state checks.\n");
7178
7179 // Check is that viewportcount and scissorcount match
7180 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
7181 vp_state_ci.scissorCount = 1;
7182 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
7183 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7184 m_errorMonitor->VerifyFound();
7185
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007186 // Check case where multiViewport is enabled and viewport count is greater than max
7187 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
7189 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
7190 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
7191 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
7192 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7193 m_errorMonitor->VerifyFound();
7194 }
7195 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06007196
Chia-I Wuf7458c52015-10-26 21:10:41 +08007197 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7198 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7199 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7200 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007201}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007202
7203// 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
7204// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07007205TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07007206 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007207
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007208 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
7209
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007210 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007211
Tobin Ehlise68360f2015-10-01 11:15:13 -06007212 ASSERT_NO_FATAL_FAILURE(InitState());
7213 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007214
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007215 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007216 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7217 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007218
7219 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007220 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7221 ds_pool_ci.maxSets = 1;
7222 ds_pool_ci.poolSizeCount = 1;
7223 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007224
7225 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007226 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007227 ASSERT_VK_SUCCESS(err);
7228
7229 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007230 dsl_binding.binding = 0;
7231 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7232 dsl_binding.descriptorCount = 1;
7233 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007234
7235 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007236 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7237 ds_layout_ci.bindingCount = 1;
7238 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007239
7240 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007241 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007242 ASSERT_VK_SUCCESS(err);
7243
7244 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007245 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007246 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007247 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007248 alloc_info.descriptorPool = ds_pool;
7249 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007250 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007251 ASSERT_VK_SUCCESS(err);
7252
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007253 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7254 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7255 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7256
7257 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7258 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7259 vi_ci.pNext = nullptr;
7260 vi_ci.vertexBindingDescriptionCount = 0;
7261 vi_ci.pVertexBindingDescriptions = nullptr;
7262 vi_ci.vertexAttributeDescriptionCount = 0;
7263 vi_ci.pVertexAttributeDescriptions = nullptr;
7264
7265 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7266 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7267 pipe_ms_state_ci.pNext = NULL;
7268 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
7269 pipe_ms_state_ci.sampleShadingEnable = 0;
7270 pipe_ms_state_ci.minSampleShading = 1.0;
7271 pipe_ms_state_ci.pSampleMask = NULL;
7272
Tobin Ehlise68360f2015-10-01 11:15:13 -06007273 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007274 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7275 pipeline_layout_ci.setLayoutCount = 1;
7276 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007277
7278 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007279 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007280 ASSERT_VK_SUCCESS(err);
7281
7282 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7283 // Set scissor as dynamic to avoid second error
7284 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007285 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7286 dyn_state_ci.dynamicStateCount = 1;
7287 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007288
Cody Northropeb3a6c12015-10-05 14:44:45 -06007289 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007290 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007291
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007292 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007293 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7294 // 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 +08007295 shaderStages[0] = vs.GetStageCreateInfo();
7296 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007297
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007298 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7299 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7300 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7301 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7302 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7303 rs_state_ci.depthClampEnable = VK_FALSE;
7304 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7305 rs_state_ci.depthBiasEnable = VK_FALSE;
7306
Tobin Ehlise68360f2015-10-01 11:15:13 -06007307 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007308 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7309 gp_ci.stageCount = 2;
7310 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007311 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007312 // Not setting VP state w/o dynamic vp state should cause validation error
7313 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007314 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007315 gp_ci.pVertexInputState = &vi_ci;
7316 gp_ci.pInputAssemblyState = &ia_ci;
7317 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007318 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7319 gp_ci.layout = pipeline_layout;
7320 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007321
7322 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007323 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007324
7325 VkPipeline pipeline;
7326 VkPipelineCache pipelineCache;
7327
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007328 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007329 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007330 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007331
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007332 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007333
Chia-I Wuf7458c52015-10-26 21:10:41 +08007334 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7335 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7336 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7337 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007338}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007339
7340// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
7341// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07007342TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
7343 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007344
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007346
Tobin Ehlise68360f2015-10-01 11:15:13 -06007347 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007348
7349 if (!m_device->phy().features().multiViewport) {
7350 printf("Device does not support multiple viewports/scissors; skipped.\n");
7351 return;
7352 }
7353
Tobin Ehlise68360f2015-10-01 11:15:13 -06007354 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007355
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007356 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007357 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7358 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007359
7360 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007361 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7362 ds_pool_ci.maxSets = 1;
7363 ds_pool_ci.poolSizeCount = 1;
7364 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007365
7366 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007367 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007368 ASSERT_VK_SUCCESS(err);
7369
7370 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007371 dsl_binding.binding = 0;
7372 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7373 dsl_binding.descriptorCount = 1;
7374 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007375
7376 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007377 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7378 ds_layout_ci.bindingCount = 1;
7379 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007380
7381 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007382 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007383 ASSERT_VK_SUCCESS(err);
7384
7385 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007386 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007387 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007388 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007389 alloc_info.descriptorPool = ds_pool;
7390 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007391 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007392 ASSERT_VK_SUCCESS(err);
7393
7394 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007395 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7396 pipeline_layout_ci.setLayoutCount = 1;
7397 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007398
7399 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007400 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007401 ASSERT_VK_SUCCESS(err);
7402
7403 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007404 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7405 vp_state_ci.viewportCount = 1;
7406 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
7407 vp_state_ci.scissorCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007408 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06007409
7410 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7411 // Set scissor as dynamic to avoid that error
7412 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007413 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7414 dyn_state_ci.dynamicStateCount = 1;
7415 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007416
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007417 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7418 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7419 pipe_ms_state_ci.pNext = NULL;
7420 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7421 pipe_ms_state_ci.sampleShadingEnable = 0;
7422 pipe_ms_state_ci.minSampleShading = 1.0;
7423 pipe_ms_state_ci.pSampleMask = NULL;
7424
Cody Northropeb3a6c12015-10-05 14:44:45 -06007425 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007426 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007427
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007428 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007429 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7430 // 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 +08007431 shaderStages[0] = vs.GetStageCreateInfo();
7432 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007433
Cody Northropf6622dc2015-10-06 10:33:21 -06007434 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7435 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7436 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007437 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06007438 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007439 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06007440 vi_ci.pVertexAttributeDescriptions = nullptr;
7441
7442 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7443 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7444 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7445
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007446 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007447 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007448 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06007449 rs_ci.pNext = nullptr;
7450
Mark Youngc89c6312016-03-31 16:03:20 -06007451 VkPipelineColorBlendAttachmentState att = {};
7452 att.blendEnable = VK_FALSE;
7453 att.colorWriteMask = 0xf;
7454
Cody Northropf6622dc2015-10-06 10:33:21 -06007455 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7456 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7457 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06007458 cb_ci.attachmentCount = 1;
7459 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06007460
Tobin Ehlise68360f2015-10-01 11:15:13 -06007461 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007462 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7463 gp_ci.stageCount = 2;
7464 gp_ci.pStages = shaderStages;
7465 gp_ci.pVertexInputState = &vi_ci;
7466 gp_ci.pInputAssemblyState = &ia_ci;
7467 gp_ci.pViewportState = &vp_state_ci;
7468 gp_ci.pRasterizationState = &rs_ci;
7469 gp_ci.pColorBlendState = &cb_ci;
7470 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007471 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007472 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7473 gp_ci.layout = pipeline_layout;
7474 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007475
7476 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007477 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007478
7479 VkPipeline pipeline;
7480 VkPipelineCache pipelineCache;
7481
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007482 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007483 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007484 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007485
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007486 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007487
Tobin Ehlisd332f282015-10-02 11:00:56 -06007488 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07007489 // First need to successfully create the PSO from above by setting
7490 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06007491 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 -07007492
7493 VkViewport vp = {}; // Just need dummy vp to point to
7494 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007495 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07007496 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07007497 m_commandBuffer->BeginCommandBuffer();
7498 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007499 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007500 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07007501 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007502 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07007503 Draw(1, 0, 0, 0);
7504
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007505 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07007506
7507 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7508 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7509 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7510 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007511 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007512}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07007513
7514// 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 -07007515// viewportCount
7516TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
7517 VkResult err;
7518
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007519 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07007520
7521 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007522
7523 if (!m_device->phy().features().multiViewport) {
7524 printf("Device does not support multiple viewports/scissors; skipped.\n");
7525 return;
7526 }
7527
Karl Schultz6addd812016-02-02 17:17:23 -07007528 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7529
7530 VkDescriptorPoolSize ds_type_count = {};
7531 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7532 ds_type_count.descriptorCount = 1;
7533
7534 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7535 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7536 ds_pool_ci.maxSets = 1;
7537 ds_pool_ci.poolSizeCount = 1;
7538 ds_pool_ci.pPoolSizes = &ds_type_count;
7539
7540 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007541 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07007542 ASSERT_VK_SUCCESS(err);
7543
7544 VkDescriptorSetLayoutBinding dsl_binding = {};
7545 dsl_binding.binding = 0;
7546 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7547 dsl_binding.descriptorCount = 1;
7548 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7549
7550 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7551 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7552 ds_layout_ci.bindingCount = 1;
7553 ds_layout_ci.pBindings = &dsl_binding;
7554
7555 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007556 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07007557 ASSERT_VK_SUCCESS(err);
7558
7559 VkDescriptorSet descriptorSet;
7560 VkDescriptorSetAllocateInfo alloc_info = {};
7561 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7562 alloc_info.descriptorSetCount = 1;
7563 alloc_info.descriptorPool = ds_pool;
7564 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007565 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07007566 ASSERT_VK_SUCCESS(err);
7567
7568 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7569 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7570 pipeline_layout_ci.setLayoutCount = 1;
7571 pipeline_layout_ci.pSetLayouts = &ds_layout;
7572
7573 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007574 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07007575 ASSERT_VK_SUCCESS(err);
7576
7577 VkPipelineViewportStateCreateInfo vp_state_ci = {};
7578 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7579 vp_state_ci.scissorCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007580 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07007581 vp_state_ci.viewportCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007582 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07007583
7584 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
7585 // Set scissor as dynamic to avoid that error
7586 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
7587 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7588 dyn_state_ci.dynamicStateCount = 1;
7589 dyn_state_ci.pDynamicStates = &vp_state;
7590
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07007591 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7592 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7593 pipe_ms_state_ci.pNext = NULL;
7594 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7595 pipe_ms_state_ci.sampleShadingEnable = 0;
7596 pipe_ms_state_ci.minSampleShading = 1.0;
7597 pipe_ms_state_ci.pSampleMask = NULL;
7598
Karl Schultz6addd812016-02-02 17:17:23 -07007599 VkPipelineShaderStageCreateInfo shaderStages[2];
7600 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7601
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007602 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07007603 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7604 // 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 -07007605 shaderStages[0] = vs.GetStageCreateInfo();
7606 shaderStages[1] = fs.GetStageCreateInfo();
7607
7608 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7609 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7610 vi_ci.pNext = nullptr;
7611 vi_ci.vertexBindingDescriptionCount = 0;
7612 vi_ci.pVertexBindingDescriptions = nullptr;
7613 vi_ci.vertexAttributeDescriptionCount = 0;
7614 vi_ci.pVertexAttributeDescriptions = nullptr;
7615
7616 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7617 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7618 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7619
7620 VkPipelineRasterizationStateCreateInfo rs_ci = {};
7621 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07007622 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07007623 rs_ci.pNext = nullptr;
7624
Mark Youngc89c6312016-03-31 16:03:20 -06007625 VkPipelineColorBlendAttachmentState att = {};
7626 att.blendEnable = VK_FALSE;
7627 att.colorWriteMask = 0xf;
7628
Karl Schultz6addd812016-02-02 17:17:23 -07007629 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7630 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7631 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06007632 cb_ci.attachmentCount = 1;
7633 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07007634
7635 VkGraphicsPipelineCreateInfo gp_ci = {};
7636 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7637 gp_ci.stageCount = 2;
7638 gp_ci.pStages = shaderStages;
7639 gp_ci.pVertexInputState = &vi_ci;
7640 gp_ci.pInputAssemblyState = &ia_ci;
7641 gp_ci.pViewportState = &vp_state_ci;
7642 gp_ci.pRasterizationState = &rs_ci;
7643 gp_ci.pColorBlendState = &cb_ci;
7644 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07007645 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007646 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7647 gp_ci.layout = pipeline_layout;
7648 gp_ci.renderPass = renderPass();
7649
7650 VkPipelineCacheCreateInfo pc_ci = {};
7651 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7652
7653 VkPipeline pipeline;
7654 VkPipelineCache pipelineCache;
7655
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007656 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07007657 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007658 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07007659
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007660 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07007661
7662 // Now hit second fail case where we set scissor w/ different count than PSO
7663 // First need to successfully create the PSO from above by setting
7664 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007665 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7666 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007667
Tobin Ehlisd332f282015-10-02 11:00:56 -06007668 VkRect2D sc = {}; // Just need dummy vp to point to
7669 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007670 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06007671 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07007672 m_commandBuffer->BeginCommandBuffer();
7673 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007674 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07007675 VkViewport viewports[1] = {};
7676 viewports[0].width = 8;
7677 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06007678 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007679 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06007680 Draw(1, 0, 0, 0);
7681
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007682 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007683
Chia-I Wuf7458c52015-10-26 21:10:41 +08007684 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7685 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7686 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7687 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007688 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007689}
7690
Mark Young7394fdd2016-03-31 14:56:43 -06007691TEST_F(VkLayerTest, PSOLineWidthInvalid) {
7692 VkResult err;
7693
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007694 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06007695
7696 ASSERT_NO_FATAL_FAILURE(InitState());
7697 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7698
7699 VkDescriptorPoolSize ds_type_count = {};
7700 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7701 ds_type_count.descriptorCount = 1;
7702
7703 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7704 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7705 ds_pool_ci.maxSets = 1;
7706 ds_pool_ci.poolSizeCount = 1;
7707 ds_pool_ci.pPoolSizes = &ds_type_count;
7708
7709 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007710 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06007711 ASSERT_VK_SUCCESS(err);
7712
7713 VkDescriptorSetLayoutBinding dsl_binding = {};
7714 dsl_binding.binding = 0;
7715 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7716 dsl_binding.descriptorCount = 1;
7717 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7718
7719 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7720 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7721 ds_layout_ci.bindingCount = 1;
7722 ds_layout_ci.pBindings = &dsl_binding;
7723
7724 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007725 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06007726 ASSERT_VK_SUCCESS(err);
7727
7728 VkDescriptorSet descriptorSet;
7729 VkDescriptorSetAllocateInfo alloc_info = {};
7730 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7731 alloc_info.descriptorSetCount = 1;
7732 alloc_info.descriptorPool = ds_pool;
7733 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007734 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06007735 ASSERT_VK_SUCCESS(err);
7736
7737 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7738 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7739 pipeline_layout_ci.setLayoutCount = 1;
7740 pipeline_layout_ci.pSetLayouts = &ds_layout;
7741
7742 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007743 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06007744 ASSERT_VK_SUCCESS(err);
7745
7746 VkPipelineViewportStateCreateInfo vp_state_ci = {};
7747 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7748 vp_state_ci.scissorCount = 1;
7749 vp_state_ci.pScissors = NULL;
7750 vp_state_ci.viewportCount = 1;
7751 vp_state_ci.pViewports = NULL;
7752
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007753 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06007754 // Set scissor as dynamic to avoid that error
7755 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
7756 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7757 dyn_state_ci.dynamicStateCount = 2;
7758 dyn_state_ci.pDynamicStates = dynamic_states;
7759
7760 VkPipelineShaderStageCreateInfo shaderStages[2];
7761 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7762
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007763 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7764 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Young7394fdd2016-03-31 14:56:43 -06007765 this); // TODO - We shouldn't need a fragment shader
7766 // but add it to be able to run on more devices
7767 shaderStages[0] = vs.GetStageCreateInfo();
7768 shaderStages[1] = fs.GetStageCreateInfo();
7769
7770 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7771 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7772 vi_ci.pNext = nullptr;
7773 vi_ci.vertexBindingDescriptionCount = 0;
7774 vi_ci.pVertexBindingDescriptions = nullptr;
7775 vi_ci.vertexAttributeDescriptionCount = 0;
7776 vi_ci.pVertexAttributeDescriptions = nullptr;
7777
7778 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7779 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7780 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7781
7782 VkPipelineRasterizationStateCreateInfo rs_ci = {};
7783 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7784 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07007785 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06007786
Mark Young47107952016-05-02 15:59:55 -06007787 // Check too low (line width of -1.0f).
7788 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06007789
7790 VkPipelineColorBlendAttachmentState att = {};
7791 att.blendEnable = VK_FALSE;
7792 att.colorWriteMask = 0xf;
7793
7794 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7795 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7796 cb_ci.pNext = nullptr;
7797 cb_ci.attachmentCount = 1;
7798 cb_ci.pAttachments = &att;
7799
7800 VkGraphicsPipelineCreateInfo gp_ci = {};
7801 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7802 gp_ci.stageCount = 2;
7803 gp_ci.pStages = shaderStages;
7804 gp_ci.pVertexInputState = &vi_ci;
7805 gp_ci.pInputAssemblyState = &ia_ci;
7806 gp_ci.pViewportState = &vp_state_ci;
7807 gp_ci.pRasterizationState = &rs_ci;
7808 gp_ci.pColorBlendState = &cb_ci;
7809 gp_ci.pDynamicState = &dyn_state_ci;
7810 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7811 gp_ci.layout = pipeline_layout;
7812 gp_ci.renderPass = renderPass();
7813
7814 VkPipelineCacheCreateInfo pc_ci = {};
7815 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7816
7817 VkPipeline pipeline;
7818 VkPipelineCache pipelineCache;
7819
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007820 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06007821 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007822 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06007823
7824 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06007825 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06007826
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007827 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06007828
7829 // Check too high (line width of 65536.0f).
7830 rs_ci.lineWidth = 65536.0f;
7831
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007832 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06007833 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007834 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06007835
7836 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06007837 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06007838
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007839 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06007840
7841 dyn_state_ci.dynamicStateCount = 3;
7842
7843 rs_ci.lineWidth = 1.0f;
7844
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007845 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06007846 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007847 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07007848 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007849 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06007850
7851 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06007852 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06007853 m_errorMonitor->VerifyFound();
7854
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007855 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06007856
7857 // Check too high with dynamic setting.
7858 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
7859 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07007860 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06007861
7862 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7863 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7864 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7865 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007866 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06007867}
7868
Karl Schultz6addd812016-02-02 17:17:23 -07007869TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007870 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007871 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07007872 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007873
7874 ASSERT_NO_FATAL_FAILURE(InitState());
7875 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007876
Tony Barbour552f6c02016-12-21 14:34:07 -07007877 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007878 // Don't care about RenderPass handle b/c error should be flagged before
7879 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007880 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007881
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007882 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007883}
7884
Karl Schultz6addd812016-02-02 17:17:23 -07007885TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007886 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007887 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7888 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007889
7890 ASSERT_NO_FATAL_FAILURE(InitState());
7891 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007892
Tony Barbour552f6c02016-12-21 14:34:07 -07007893 m_commandBuffer->BeginCommandBuffer();
7894 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07007895 // Just create a dummy Renderpass that's non-NULL so we can get to the
7896 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007897 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007898
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007899 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06007900}
7901
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06007902TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
7903 TEST_DESCRIPTION("Begin a renderPass where clearValueCount is less than"
7904 "the number of renderPass attachments that use loadOp"
7905 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
7906
7907 ASSERT_NO_FATAL_FAILURE(InitState());
7908 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7909
7910 // Create a renderPass with a single attachment that uses loadOp CLEAR
7911 VkAttachmentReference attach = {};
7912 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7913 VkSubpassDescription subpass = {};
7914 subpass.inputAttachmentCount = 1;
7915 subpass.pInputAttachments = &attach;
7916 VkRenderPassCreateInfo rpci = {};
7917 rpci.subpassCount = 1;
7918 rpci.pSubpasses = &subpass;
7919 rpci.attachmentCount = 1;
7920 VkAttachmentDescription attach_desc = {};
7921 attach_desc.format = VK_FORMAT_UNDEFINED;
7922 // Set loadOp to CLEAR
7923 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
7924 rpci.pAttachments = &attach_desc;
7925 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
7926 VkRenderPass rp;
7927 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7928
7929 VkCommandBufferInheritanceInfo hinfo = {};
7930 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7931 hinfo.renderPass = VK_NULL_HANDLE;
7932 hinfo.subpass = 0;
7933 hinfo.framebuffer = VK_NULL_HANDLE;
7934 hinfo.occlusionQueryEnable = VK_FALSE;
7935 hinfo.queryFlags = 0;
7936 hinfo.pipelineStatistics = 0;
7937 VkCommandBufferBeginInfo info = {};
7938 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
7939 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7940 info.pInheritanceInfo = &hinfo;
7941
7942 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
7943 VkRenderPassBeginInfo rp_begin = {};
7944 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
7945 rp_begin.pNext = NULL;
7946 rp_begin.renderPass = renderPass();
7947 rp_begin.framebuffer = framebuffer();
7948 rp_begin.clearValueCount = 0; // Should be 1
7949
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007950 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06007951
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007952 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06007953
7954 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06007955
7956 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06007957}
7958
Slawomir Cygan0808f392016-11-28 17:53:23 +01007959TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
7960 TEST_DESCRIPTION("Begin a renderPass where clearValueCount is greater than"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007961 "the number of renderPass attachments that use loadOp"
7962 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01007963
7964 ASSERT_NO_FATAL_FAILURE(InitState());
7965 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7966
7967 // Create a renderPass with a single attachment that uses loadOp CLEAR
7968 VkAttachmentReference attach = {};
7969 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7970 VkSubpassDescription subpass = {};
7971 subpass.inputAttachmentCount = 1;
7972 subpass.pInputAttachments = &attach;
7973 VkRenderPassCreateInfo rpci = {};
7974 rpci.subpassCount = 1;
7975 rpci.pSubpasses = &subpass;
7976 rpci.attachmentCount = 1;
7977 VkAttachmentDescription attach_desc = {};
7978 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
7979 // Set loadOp to CLEAR
7980 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
7981 rpci.pAttachments = &attach_desc;
7982 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
7983 VkRenderPass rp;
7984 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7985
7986 VkCommandBufferBeginInfo info = {};
7987 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
7988 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7989
7990 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
7991 VkRenderPassBeginInfo rp_begin = {};
7992 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
7993 rp_begin.pNext = NULL;
7994 rp_begin.renderPass = renderPass();
7995 rp_begin.framebuffer = framebuffer();
7996 rp_begin.clearValueCount = 2; // Should be 1
7997
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007998 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
7999 " has a clearValueCount of"
8000 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008001
8002 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
8003
8004 m_errorMonitor->VerifyFound();
8005
8006 vkDestroyRenderPass(m_device->device(), rp, NULL);
8007}
8008
Cody Northrop3bb4d962016-05-09 16:15:57 -06008009TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
8010
8011 TEST_DESCRIPTION("End a command buffer with an active render pass");
8012
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008013 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8014 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008015
8016 ASSERT_NO_FATAL_FAILURE(InitState());
8017 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8018
Tony Barbour552f6c02016-12-21 14:34:07 -07008019 m_commandBuffer->BeginCommandBuffer();
8020 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8021 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008022
8023 m_errorMonitor->VerifyFound();
8024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008025 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8026 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008027}
8028
Karl Schultz6addd812016-02-02 17:17:23 -07008029TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008030 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008031 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8032 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008033
8034 ASSERT_NO_FATAL_FAILURE(InitState());
8035 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008036
Tony Barbour552f6c02016-12-21 14:34:07 -07008037 m_commandBuffer->BeginCommandBuffer();
8038 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008039
8040 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008041 vk_testing::Buffer dstBuffer;
8042 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008043
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008044 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008045
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008046 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008047}
8048
Karl Schultz6addd812016-02-02 17:17:23 -07008049TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008050 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008051 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8052 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008053
8054 ASSERT_NO_FATAL_FAILURE(InitState());
8055 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008056
Tony Barbour552f6c02016-12-21 14:34:07 -07008057 m_commandBuffer->BeginCommandBuffer();
8058 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008059
8060 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008061 vk_testing::Buffer dstBuffer;
8062 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008063
Karl Schultz6addd812016-02-02 17:17:23 -07008064 VkDeviceSize dstOffset = 0;
8065 VkDeviceSize dataSize = 1024;
Karl Schultzee344492016-07-11 15:09:57 -06008066 const void *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008067
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008068 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008069
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008070 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008071}
8072
Karl Schultz6addd812016-02-02 17:17:23 -07008073TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008074 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008075 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8076 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008077
8078 ASSERT_NO_FATAL_FAILURE(InitState());
8079 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008080
Tony Barbour552f6c02016-12-21 14:34:07 -07008081 m_commandBuffer->BeginCommandBuffer();
8082 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008083
Michael Lentine0a369f62016-02-03 16:51:46 -06008084 VkClearColorValue clear_color;
8085 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008086 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8087 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8088 const int32_t tex_width = 32;
8089 const int32_t tex_height = 32;
8090 VkImageCreateInfo image_create_info = {};
8091 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8092 image_create_info.pNext = NULL;
8093 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8094 image_create_info.format = tex_format;
8095 image_create_info.extent.width = tex_width;
8096 image_create_info.extent.height = tex_height;
8097 image_create_info.extent.depth = 1;
8098 image_create_info.mipLevels = 1;
8099 image_create_info.arrayLayers = 1;
8100 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8101 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8102 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008103
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008104 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008105 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008106
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008107 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008108
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008109 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008110
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008111 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008112}
8113
Karl Schultz6addd812016-02-02 17:17:23 -07008114TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008115 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008116 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8117 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008118
8119 ASSERT_NO_FATAL_FAILURE(InitState());
8120 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008121
Tony Barbour552f6c02016-12-21 14:34:07 -07008122 m_commandBuffer->BeginCommandBuffer();
8123 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008124
8125 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008126 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008127 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8128 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8129 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
8130 image_create_info.extent.width = 64;
8131 image_create_info.extent.height = 64;
8132 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8133 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008134
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008135 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008136 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008137
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008138 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008139
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008140 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
8141 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008142
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008143 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008144}
8145
Karl Schultz6addd812016-02-02 17:17:23 -07008146TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008147 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008148 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008149
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008150 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearAttachments(): This call "
8151 "must be issued inside an active "
8152 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008153
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008154 ASSERT_NO_FATAL_FAILURE(InitState());
8155 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008156
8157 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008158 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008159 ASSERT_VK_SUCCESS(err);
8160
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008161 VkClearAttachment color_attachment;
8162 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8163 color_attachment.clearValue.color.float32[0] = 0;
8164 color_attachment.clearValue.color.float32[1] = 0;
8165 color_attachment.clearValue.color.float32[2] = 0;
8166 color_attachment.clearValue.color.float32[3] = 0;
8167 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008168 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008169 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008170
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008171 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008172}
8173
Chris Forbes3b97e932016-09-07 11:29:24 +12008174TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
8175 TEST_DESCRIPTION("Test that an error is produced when CmdNextSubpass is "
8176 "called too many times in a renderpass instance");
8177
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008178 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdNextSubpass(): Attempted to advance "
8179 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12008180
8181 ASSERT_NO_FATAL_FAILURE(InitState());
8182 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8183
Tony Barbour552f6c02016-12-21 14:34:07 -07008184 m_commandBuffer->BeginCommandBuffer();
8185 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12008186
8187 // error here.
8188 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
8189 m_errorMonitor->VerifyFound();
8190
Tony Barbour552f6c02016-12-21 14:34:07 -07008191 m_commandBuffer->EndRenderPass();
8192 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12008193}
8194
Chris Forbes6d624702016-09-07 13:57:05 +12008195TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
8196 TEST_DESCRIPTION("Test that an error is produced when CmdEndRenderPass is "
8197 "called before the final subpass has been reached");
8198
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008199 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdEndRenderPass(): Called before reaching "
8200 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12008201
8202 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008203 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
8204 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12008205
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008206 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12008207
8208 VkRenderPass rp;
8209 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
8210 ASSERT_VK_SUCCESS(err);
8211
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008212 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12008213
8214 VkFramebuffer fb;
8215 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
8216 ASSERT_VK_SUCCESS(err);
8217
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008218 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12008219
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008220 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 +12008221
8222 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
8223
8224 // Error here.
8225 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8226 m_errorMonitor->VerifyFound();
8227
8228 // Clean up.
8229 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
8230 vkDestroyRenderPass(m_device->device(), rp, nullptr);
8231}
8232
Karl Schultz9e66a292016-04-21 15:57:51 -06008233TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
8234 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008235 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8236 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06008237
8238 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbour552f6c02016-12-21 14:34:07 -07008239 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06008240
8241 VkBufferMemoryBarrier buf_barrier = {};
8242 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8243 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8244 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8245 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8246 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8247 buf_barrier.buffer = VK_NULL_HANDLE;
8248 buf_barrier.offset = 0;
8249 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008250 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8251 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06008252
8253 m_errorMonitor->VerifyFound();
8254}
8255
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008256TEST_F(VkLayerTest, InvalidBarriers) {
8257 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
8258
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008259 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008260
8261 ASSERT_NO_FATAL_FAILURE(InitState());
8262 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8263
8264 VkMemoryBarrier mem_barrier = {};
8265 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
8266 mem_barrier.pNext = NULL;
8267 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8268 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07008269 m_commandBuffer->BeginCommandBuffer();
8270 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008271 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008272 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008273 &mem_barrier, 0, nullptr, 0, nullptr);
8274 m_errorMonitor->VerifyFound();
8275
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008276 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008277 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008278 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 -06008279 ASSERT_TRUE(image.initialized());
8280 VkImageMemoryBarrier img_barrier = {};
8281 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8282 img_barrier.pNext = NULL;
8283 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8284 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8285 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8286 // New layout can't be UNDEFINED
8287 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8288 img_barrier.image = image.handle();
8289 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8290 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8291 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8292 img_barrier.subresourceRange.baseArrayLayer = 0;
8293 img_barrier.subresourceRange.baseMipLevel = 0;
8294 img_barrier.subresourceRange.layerCount = 1;
8295 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008296 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8297 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008298 m_errorMonitor->VerifyFound();
8299 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8300
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008301 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the "
8302 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008303 // baseArrayLayer + layerCount must be <= image's arrayLayers
8304 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008305 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8306 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008307 m_errorMonitor->VerifyFound();
8308 img_barrier.subresourceRange.baseArrayLayer = 0;
8309
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008311 // baseMipLevel + levelCount must be <= image's mipLevels
8312 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008313 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8314 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008315 m_errorMonitor->VerifyFound();
8316 img_barrier.subresourceRange.baseMipLevel = 0;
8317
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008318 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 -06008319 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07008320 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8321 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008322 VkBufferMemoryBarrier buf_barrier = {};
8323 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8324 buf_barrier.pNext = NULL;
8325 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8326 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8327 buf_barrier.buffer = buffer.handle();
8328 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8329 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8330 buf_barrier.offset = 0;
8331 buf_barrier.size = VK_WHOLE_SIZE;
8332 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008333 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8334 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008335 m_errorMonitor->VerifyFound();
8336 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8337
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008338 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008339 buf_barrier.offset = 257;
8340 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008341 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8342 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008343 m_errorMonitor->VerifyFound();
8344 buf_barrier.offset = 0;
8345
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008346 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008347 buf_barrier.size = 257;
8348 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008349 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8350 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008351 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008352
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008353 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008354 m_errorMonitor->SetDesiredFailureMsg(
8355 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008356 "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 -06008357 VkDepthStencilObj ds_image(m_device);
8358 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
8359 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06008360 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
8361 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008362 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07008363
8364 // Not having DEPTH or STENCIL set is an error
8365 img_barrier.subresourceRange.aspectMask = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008366 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8367 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008368 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07008369
8370 // Having anything other than DEPTH or STENCIL is an error
8371 m_errorMonitor->SetDesiredFailureMsg(
8372 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8373 "Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
8374 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
8375 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8376 nullptr, 0, nullptr, 1, &img_barrier);
8377 m_errorMonitor->VerifyFound();
8378
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008379 // Now test depth-only
8380 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008381 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
8382 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008383 VkDepthStencilObj d_image(m_device);
8384 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
8385 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008386 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06008387 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008388 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07008389
8390 // DEPTH bit must be set
8391 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8392 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
8393 img_barrier.subresourceRange.aspectMask = 0;
8394 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
8395 0, nullptr, 0, nullptr, 1, &img_barrier);
8396 m_errorMonitor->VerifyFound();
8397
8398 // No bits other than DEPTH may be set
8399 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8400 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
8401 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008402 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
8403 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008404 m_errorMonitor->VerifyFound();
8405 }
Dave Houltonfbf52152017-01-06 12:55:29 -07008406
8407 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008408 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
8409 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008410 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8411 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008412 VkDepthStencilObj s_image(m_device);
8413 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
8414 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008415 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06008416 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008417 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06008418 // Use of COLOR aspect on depth image is error
8419 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008420 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
8421 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008422 m_errorMonitor->VerifyFound();
8423 }
Dave Houltonfbf52152017-01-06 12:55:29 -07008424
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008425 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008426 VkImageObj c_image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008427 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 -06008428 ASSERT_TRUE(c_image.initialized());
8429 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8430 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
8431 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07008432
8433 // COLOR bit must be set
8434 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8435 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
8436 img_barrier.subresourceRange.aspectMask = 0;
8437 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8438 nullptr, 0, nullptr, 1, &img_barrier);
8439 m_errorMonitor->VerifyFound();
8440
8441 // No bits other than COLOR may be set
8442 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8443 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
8444 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008445 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8446 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008447 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07008448
8449 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
8450
8451 // Create command pool with incompatible queueflags
8452 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
8453 uint32_t queue_family_index = UINT32_MAX;
8454 for (uint32_t i = 0; i < queue_props.size(); i++) {
8455 if ((queue_props[i].queueFlags & VK_QUEUE_COMPUTE_BIT) == 0) {
8456 queue_family_index = i;
8457 break;
8458 }
8459 }
8460 if (queue_family_index == UINT32_MAX) {
8461 printf("No non-compute queue found; skipped.\n");
8462 return;
8463 }
8464 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
8465
8466 VkCommandPool command_pool;
8467 VkCommandPoolCreateInfo pool_create_info{};
8468 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
8469 pool_create_info.queueFamilyIndex = queue_family_index;
8470 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
8471 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
8472
8473 // Allocate a command buffer
8474 VkCommandBuffer bad_command_buffer;
8475 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
8476 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
8477 command_buffer_allocate_info.commandPool = command_pool;
8478 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
8479 command_buffer_allocate_info.commandBufferCount = 1;
8480 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
8481
8482 VkCommandBufferBeginInfo cbbi = {};
8483 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8484 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
8485 buf_barrier.offset = 0;
8486 buf_barrier.size = VK_WHOLE_SIZE;
8487 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
8488 &buf_barrier, 0, nullptr);
8489 m_errorMonitor->VerifyFound();
8490
8491 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
8492 vkEndCommandBuffer(bad_command_buffer);
8493 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
8494 printf("The non-compute queue does not support graphics; skipped.\n");
8495 return;
8496 }
8497 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
8498 VkEvent event;
8499 VkEventCreateInfo event_create_info{};
8500 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
8501 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
8502 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
8503 nullptr, 0, nullptr);
8504 m_errorMonitor->VerifyFound();
8505
8506 vkEndCommandBuffer(bad_command_buffer);
8507 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008508}
8509
Tony Barbour18ba25c2016-09-29 13:42:40 -06008510TEST_F(VkLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
8511 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ in srcAccessMask
8512
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008513 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "must have required access bit");
Tony Barbour18ba25c2016-09-29 13:42:40 -06008514 ASSERT_NO_FATAL_FAILURE(InitState());
8515 VkImageObj image(m_device);
Tony Barbour256c80a2016-10-05 13:23:46 -06008516 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 -06008517 ASSERT_TRUE(image.initialized());
8518
8519 VkImageMemoryBarrier barrier = {};
8520 VkImageSubresourceRange range;
8521 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8522 barrier.srcAccessMask = 0;
8523 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
8524 barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
8525 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8526 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
8527 barrier.image = image.handle();
8528 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8529 range.baseMipLevel = 0;
8530 range.levelCount = 1;
8531 range.baseArrayLayer = 0;
8532 range.layerCount = 1;
8533 barrier.subresourceRange = range;
8534 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
8535 cmdbuf.BeginCommandBuffer();
8536 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
8537 &barrier);
8538 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
8539 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
8540 barrier.srcAccessMask = 0;
8541 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
8542 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
8543 &barrier);
8544
8545 m_errorMonitor->VerifyFound();
8546}
8547
Karl Schultz6addd812016-02-02 17:17:23 -07008548TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008549 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008550 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008551
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008552 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008553
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008554 ASSERT_NO_FATAL_FAILURE(InitState());
8555 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008556 uint32_t qfi = 0;
8557 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008558 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8559 buffCI.size = 1024;
8560 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
8561 buffCI.queueFamilyIndexCount = 1;
8562 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008563
8564 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08008565 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008566 ASSERT_VK_SUCCESS(err);
8567
Tony Barbour552f6c02016-12-21 14:34:07 -07008568 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008569 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008570 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8571 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008572 // Should error before calling to driver so don't care about actual data
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008573 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7, VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008574
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008575 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008576
Chia-I Wuf7458c52015-10-26 21:10:41 +08008577 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008578}
8579
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008580TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
8581 // Create an out-of-range queueFamilyIndex
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008582 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8583 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
8584 "of the indices specified when the device was created, via the "
8585 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008586
8587 ASSERT_NO_FATAL_FAILURE(InitState());
8588 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8589 VkBufferCreateInfo buffCI = {};
8590 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8591 buffCI.size = 1024;
8592 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
8593 buffCI.queueFamilyIndexCount = 1;
8594 // Introduce failure by specifying invalid queue_family_index
8595 uint32_t qfi = 777;
8596 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06008597 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008598
8599 VkBuffer ib;
8600 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
8601
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008602 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008603 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008604}
8605
Karl Schultz6addd812016-02-02 17:17:23 -07008606TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008607 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a primary command buffer"
Tobin Ehlis0c94db02016-07-19 10:49:32 -06008608 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008609
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008610 ASSERT_NO_FATAL_FAILURE(InitState());
8611 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008612
Chris Forbesf29a84f2016-10-06 18:39:28 +13008613 // An empty primary command buffer
8614 VkCommandBufferObj cb(m_device, m_commandPool);
8615 cb.BeginCommandBuffer();
8616 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -06008617
Chris Forbesf29a84f2016-10-06 18:39:28 +13008618 m_commandBuffer->BeginCommandBuffer();
8619 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
8620 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008621
Chris Forbesf29a84f2016-10-06 18:39:28 +13008622 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
8623 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008624 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008625}
8626
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008627TEST_F(VkLayerTest, DSUsageBitsErrors) {
8628 TEST_DESCRIPTION("Attempt to update descriptor sets for images and buffers "
8629 "that do not have correct usage bits sets.");
8630 VkResult err;
8631
8632 ASSERT_NO_FATAL_FAILURE(InitState());
8633 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
8634 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8635 ds_type_count[i].type = VkDescriptorType(i);
8636 ds_type_count[i].descriptorCount = 1;
8637 }
8638 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8639 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8640 ds_pool_ci.pNext = NULL;
8641 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
8642 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
8643 ds_pool_ci.pPoolSizes = ds_type_count;
8644
8645 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008646 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008647 ASSERT_VK_SUCCESS(err);
8648
8649 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008650 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008651 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8652 dsl_binding[i].binding = 0;
8653 dsl_binding[i].descriptorType = VkDescriptorType(i);
8654 dsl_binding[i].descriptorCount = 1;
8655 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
8656 dsl_binding[i].pImmutableSamplers = NULL;
8657 }
8658
8659 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8660 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8661 ds_layout_ci.pNext = NULL;
8662 ds_layout_ci.bindingCount = 1;
8663 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
8664 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8665 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008666 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008667 ASSERT_VK_SUCCESS(err);
8668 }
8669 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
8670 VkDescriptorSetAllocateInfo alloc_info = {};
8671 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8672 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
8673 alloc_info.descriptorPool = ds_pool;
8674 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008675 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008676 ASSERT_VK_SUCCESS(err);
8677
8678 // Create a buffer & bufferView to be used for invalid updates
8679 VkBufferCreateInfo buff_ci = {};
8680 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -07008681 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008682 buff_ci.size = 256;
8683 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -07008684 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008685 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
8686 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -07008687
8688 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
8689 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
8690 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
8691 ASSERT_VK_SUCCESS(err);
8692
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07008693 VkMemoryRequirements mem_reqs;
8694 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
8695 VkMemoryAllocateInfo mem_alloc_info = {};
8696 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8697 mem_alloc_info.pNext = NULL;
8698 mem_alloc_info.memoryTypeIndex = 0;
8699 mem_alloc_info.allocationSize = mem_reqs.size;
8700 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
8701 if (!pass) {
8702 vkDestroyBuffer(m_device->device(), buffer, NULL);
8703 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
8704 return;
8705 }
8706 VkDeviceMemory mem;
8707 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
8708 ASSERT_VK_SUCCESS(err);
8709 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
8710 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008711
8712 VkBufferViewCreateInfo buff_view_ci = {};
8713 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
8714 buff_view_ci.buffer = buffer;
8715 buff_view_ci.format = VK_FORMAT_R8_UNORM;
8716 buff_view_ci.range = VK_WHOLE_SIZE;
8717 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008718 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008719 ASSERT_VK_SUCCESS(err);
8720
Tony Barbour415497c2017-01-24 10:06:09 -07008721 // Now get resources / view for storage_texel_buffer
8722 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
8723 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
8724 if (!pass) {
8725 vkDestroyBuffer(m_device->device(), buffer, NULL);
8726 vkDestroyBufferView(m_device->device(), buff_view, NULL);
8727 vkFreeMemory(m_device->device(), mem, NULL);
8728 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
8729 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
8730 return;
8731 }
8732 VkDeviceMemory storage_texel_buffer_mem;
8733 VkBufferView storage_texel_buffer_view;
8734 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
8735 ASSERT_VK_SUCCESS(err);
8736 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
8737 ASSERT_VK_SUCCESS(err);
8738 buff_view_ci.buffer = storage_texel_buffer;
8739 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
8740 ASSERT_VK_SUCCESS(err);
8741
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008742 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -07008743 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008744 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -07008745 image_ci.format = VK_FORMAT_UNDEFINED;
8746 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
8747 VkFormat format = static_cast<VkFormat>(f);
8748 VkFormatProperties fProps = m_device->format_properties(format);
8749 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
8750 image_ci.format = format;
8751 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
8752 break;
8753 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
8754 image_ci.format = format;
8755 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
8756 break;
8757 }
8758 }
8759 if (image_ci.format == VK_FORMAT_UNDEFINED) {
8760 return;
8761 }
8762
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008763 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8764 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008765 image_ci.extent.width = 64;
8766 image_ci.extent.height = 64;
8767 image_ci.extent.depth = 1;
8768 image_ci.mipLevels = 1;
8769 image_ci.arrayLayers = 1;
8770 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008771 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -07008772 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008773 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
8774 VkImage image;
8775 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
8776 ASSERT_VK_SUCCESS(err);
8777 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008778 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07008779
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008780 VkMemoryAllocateInfo mem_alloc = {};
8781 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8782 mem_alloc.pNext = NULL;
8783 mem_alloc.allocationSize = 0;
8784 mem_alloc.memoryTypeIndex = 0;
8785 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
8786 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008787 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008788 ASSERT_TRUE(pass);
8789 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
8790 ASSERT_VK_SUCCESS(err);
8791 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
8792 ASSERT_VK_SUCCESS(err);
8793 // Now create view for image
8794 VkImageViewCreateInfo image_view_ci = {};
8795 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
8796 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -07008797 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008798 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
8799 image_view_ci.subresourceRange.layerCount = 1;
8800 image_view_ci.subresourceRange.baseArrayLayer = 0;
8801 image_view_ci.subresourceRange.levelCount = 1;
8802 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8803 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008804 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008805 ASSERT_VK_SUCCESS(err);
8806
8807 VkDescriptorBufferInfo buff_info = {};
8808 buff_info.buffer = buffer;
8809 VkDescriptorImageInfo img_info = {};
8810 img_info.imageView = image_view;
8811 VkWriteDescriptorSet descriptor_write = {};
8812 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8813 descriptor_write.dstBinding = 0;
8814 descriptor_write.descriptorCount = 1;
8815 descriptor_write.pTexelBufferView = &buff_view;
8816 descriptor_write.pBufferInfo = &buff_info;
8817 descriptor_write.pImageInfo = &img_info;
8818
8819 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07008820 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
8821 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
8822 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
8823 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
8824 VALIDATION_ERROR_00943, // STORAGE_IMAGE
8825 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
8826 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
8827 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
8828 VALIDATION_ERROR_00947, // STORAGE_BUFFER
8829 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
8830 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
8831 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
8832 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008833 // Start loop at 1 as SAMPLER desc type has no usage bit error
8834 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -07008835 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
8836 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
8837 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
8838 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008839 descriptor_write.descriptorType = VkDescriptorType(i);
8840 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07008841 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008842
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008843 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008844
8845 m_errorMonitor->VerifyFound();
8846 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07008847 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
8848 descriptor_write.pTexelBufferView = &buff_view;
8849 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008850 }
Tony Barbour415497c2017-01-24 10:06:09 -07008851
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008852 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
8853 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008854 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008855 vkDestroyImageView(m_device->device(), image_view, NULL);
8856 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07008857 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008858 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07008859 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07008860 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07008861 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008862 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
8863}
8864
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008865TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008866 TEST_DESCRIPTION("Attempt to update buffer descriptor set that has incorrect "
8867 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
8868 "1. offset value greater than buffer size\n"
8869 "2. range value of 0\n"
8870 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008871 VkResult err;
8872
8873 ASSERT_NO_FATAL_FAILURE(InitState());
8874 VkDescriptorPoolSize ds_type_count = {};
8875 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8876 ds_type_count.descriptorCount = 1;
8877
8878 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8879 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8880 ds_pool_ci.pNext = NULL;
8881 ds_pool_ci.maxSets = 1;
8882 ds_pool_ci.poolSizeCount = 1;
8883 ds_pool_ci.pPoolSizes = &ds_type_count;
8884
8885 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008886 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008887 ASSERT_VK_SUCCESS(err);
8888
8889 // Create layout with single uniform buffer descriptor
8890 VkDescriptorSetLayoutBinding dsl_binding = {};
8891 dsl_binding.binding = 0;
8892 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8893 dsl_binding.descriptorCount = 1;
8894 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8895 dsl_binding.pImmutableSamplers = NULL;
8896
8897 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8898 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8899 ds_layout_ci.pNext = NULL;
8900 ds_layout_ci.bindingCount = 1;
8901 ds_layout_ci.pBindings = &dsl_binding;
8902 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008903 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008904 ASSERT_VK_SUCCESS(err);
8905
8906 VkDescriptorSet descriptor_set = {};
8907 VkDescriptorSetAllocateInfo alloc_info = {};
8908 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8909 alloc_info.descriptorSetCount = 1;
8910 alloc_info.descriptorPool = ds_pool;
8911 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008912 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008913 ASSERT_VK_SUCCESS(err);
8914
8915 // Create a buffer to be used for invalid updates
8916 VkBufferCreateInfo buff_ci = {};
8917 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8918 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
8919 buff_ci.size = 256;
8920 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
8921 VkBuffer buffer;
8922 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
8923 ASSERT_VK_SUCCESS(err);
8924 // Have to bind memory to buffer before descriptor update
8925 VkMemoryAllocateInfo mem_alloc = {};
8926 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8927 mem_alloc.pNext = NULL;
8928 mem_alloc.allocationSize = 256;
8929 mem_alloc.memoryTypeIndex = 0;
8930
8931 VkMemoryRequirements mem_reqs;
8932 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008933 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008934 if (!pass) {
8935 vkDestroyBuffer(m_device->device(), buffer, NULL);
8936 return;
8937 }
8938
8939 VkDeviceMemory mem;
8940 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
8941 ASSERT_VK_SUCCESS(err);
8942 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
8943 ASSERT_VK_SUCCESS(err);
8944
8945 VkDescriptorBufferInfo buff_info = {};
8946 buff_info.buffer = buffer;
8947 // First make offset 1 larger than buffer size
8948 buff_info.offset = 257;
8949 buff_info.range = VK_WHOLE_SIZE;
8950 VkWriteDescriptorSet descriptor_write = {};
8951 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8952 descriptor_write.dstBinding = 0;
8953 descriptor_write.descriptorCount = 1;
8954 descriptor_write.pTexelBufferView = nullptr;
8955 descriptor_write.pBufferInfo = &buff_info;
8956 descriptor_write.pImageInfo = nullptr;
8957
8958 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8959 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07008960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008961
8962 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8963
8964 m_errorMonitor->VerifyFound();
8965 // Now cause error due to range of 0
8966 buff_info.offset = 0;
8967 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07008968 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008969
8970 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8971
8972 m_errorMonitor->VerifyFound();
8973 // Now cause error due to range exceeding buffer size - offset
8974 buff_info.offset = 128;
8975 buff_info.range = 200;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07008976 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008977
8978 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8979
8980 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -06008981 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008982 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8983 vkDestroyBuffer(m_device->device(), buffer, NULL);
8984 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
8985 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
8986}
8987
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008988TEST_F(VkLayerTest, DSAspectBitsErrors) {
8989 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
8990 // are set, but could expand this test to hit more cases.
8991 TEST_DESCRIPTION("Attempt to update descriptor sets for images "
8992 "that do not have correct aspect bits sets.");
8993 VkResult err;
8994
8995 ASSERT_NO_FATAL_FAILURE(InitState());
8996 VkDescriptorPoolSize ds_type_count = {};
8997 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
8998 ds_type_count.descriptorCount = 1;
8999
9000 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9001 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9002 ds_pool_ci.pNext = NULL;
9003 ds_pool_ci.maxSets = 5;
9004 ds_pool_ci.poolSizeCount = 1;
9005 ds_pool_ci.pPoolSizes = &ds_type_count;
9006
9007 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009008 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009009 ASSERT_VK_SUCCESS(err);
9010
9011 VkDescriptorSetLayoutBinding dsl_binding = {};
9012 dsl_binding.binding = 0;
9013 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9014 dsl_binding.descriptorCount = 1;
9015 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9016 dsl_binding.pImmutableSamplers = NULL;
9017
9018 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9019 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9020 ds_layout_ci.pNext = NULL;
9021 ds_layout_ci.bindingCount = 1;
9022 ds_layout_ci.pBindings = &dsl_binding;
9023 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009024 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009025 ASSERT_VK_SUCCESS(err);
9026
9027 VkDescriptorSet descriptor_set = {};
9028 VkDescriptorSetAllocateInfo alloc_info = {};
9029 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9030 alloc_info.descriptorSetCount = 1;
9031 alloc_info.descriptorPool = ds_pool;
9032 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009033 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009034 ASSERT_VK_SUCCESS(err);
9035
9036 // Create an image to be used for invalid updates
9037 VkImageCreateInfo image_ci = {};
9038 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9039 image_ci.imageType = VK_IMAGE_TYPE_2D;
9040 image_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
9041 image_ci.extent.width = 64;
9042 image_ci.extent.height = 64;
9043 image_ci.extent.depth = 1;
9044 image_ci.mipLevels = 1;
9045 image_ci.arrayLayers = 1;
9046 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
9047 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9048 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
9049 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
9050 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9051 VkImage image;
9052 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9053 ASSERT_VK_SUCCESS(err);
9054 // Bind memory to image
9055 VkMemoryRequirements mem_reqs;
9056 VkDeviceMemory image_mem;
9057 bool pass;
9058 VkMemoryAllocateInfo mem_alloc = {};
9059 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9060 mem_alloc.pNext = NULL;
9061 mem_alloc.allocationSize = 0;
9062 mem_alloc.memoryTypeIndex = 0;
9063 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9064 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009065 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009066 ASSERT_TRUE(pass);
9067 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9068 ASSERT_VK_SUCCESS(err);
9069 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9070 ASSERT_VK_SUCCESS(err);
9071 // Now create view for image
9072 VkImageViewCreateInfo image_view_ci = {};
9073 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9074 image_view_ci.image = image;
9075 image_view_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
9076 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9077 image_view_ci.subresourceRange.layerCount = 1;
9078 image_view_ci.subresourceRange.baseArrayLayer = 0;
9079 image_view_ci.subresourceRange.levelCount = 1;
9080 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009081 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009082
9083 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009084 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009085 ASSERT_VK_SUCCESS(err);
9086
9087 VkDescriptorImageInfo img_info = {};
9088 img_info.imageView = image_view;
9089 VkWriteDescriptorSet descriptor_write = {};
9090 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9091 descriptor_write.dstBinding = 0;
9092 descriptor_write.descriptorCount = 1;
9093 descriptor_write.pTexelBufferView = NULL;
9094 descriptor_write.pBufferInfo = NULL;
9095 descriptor_write.pImageInfo = &img_info;
9096 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9097 descriptor_write.dstSet = descriptor_set;
9098 const char *error_msg = " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
9099 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009100 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009101
9102 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9103
9104 m_errorMonitor->VerifyFound();
9105 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9106 vkDestroyImage(m_device->device(), image, NULL);
9107 vkFreeMemory(m_device->device(), image_mem, NULL);
9108 vkDestroyImageView(m_device->device(), image_view, NULL);
9109 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9110 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9111}
9112
Karl Schultz6addd812016-02-02 17:17:23 -07009113TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009114 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07009115 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009116
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009117 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9118 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
9119 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009120
Tobin Ehlis3b780662015-05-28 12:11:26 -06009121 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009122 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009123 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009124 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9125 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009126
9127 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009128 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9129 ds_pool_ci.pNext = NULL;
9130 ds_pool_ci.maxSets = 1;
9131 ds_pool_ci.poolSizeCount = 1;
9132 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06009133
Tobin Ehlis3b780662015-05-28 12:11:26 -06009134 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009135 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009136 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06009137 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009138 dsl_binding.binding = 0;
9139 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9140 dsl_binding.descriptorCount = 1;
9141 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9142 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009143
Tony Barboureb254902015-07-15 12:50:33 -06009144 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009145 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9146 ds_layout_ci.pNext = NULL;
9147 ds_layout_ci.bindingCount = 1;
9148 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009149
Tobin Ehlis3b780662015-05-28 12:11:26 -06009150 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009151 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009152 ASSERT_VK_SUCCESS(err);
9153
9154 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009155 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009156 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009157 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009158 alloc_info.descriptorPool = ds_pool;
9159 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009160 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009161 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009162
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009163 VkSamplerCreateInfo sampler_ci = {};
9164 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9165 sampler_ci.pNext = NULL;
9166 sampler_ci.magFilter = VK_FILTER_NEAREST;
9167 sampler_ci.minFilter = VK_FILTER_NEAREST;
9168 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9169 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9170 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9171 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9172 sampler_ci.mipLodBias = 1.0;
9173 sampler_ci.anisotropyEnable = VK_FALSE;
9174 sampler_ci.maxAnisotropy = 1;
9175 sampler_ci.compareEnable = VK_FALSE;
9176 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9177 sampler_ci.minLod = 1.0;
9178 sampler_ci.maxLod = 1.0;
9179 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9180 sampler_ci.unnormalizedCoordinates = VK_FALSE;
9181 VkSampler sampler;
9182 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
9183 ASSERT_VK_SUCCESS(err);
9184
9185 VkDescriptorImageInfo info = {};
9186 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009187
9188 VkWriteDescriptorSet descriptor_write;
9189 memset(&descriptor_write, 0, sizeof(descriptor_write));
9190 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009191 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009192 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009193 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009194 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009195 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009196
9197 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9198
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009199 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009200
Chia-I Wuf7458c52015-10-26 21:10:41 +08009201 vkDestroySampler(m_device->device(), sampler, NULL);
9202 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9203 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009204}
9205
Karl Schultz6addd812016-02-02 17:17:23 -07009206TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009207 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07009208 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009209
Tobin Ehlisf922ef82016-11-30 10:19:14 -07009210 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009211
Tobin Ehlis3b780662015-05-28 12:11:26 -06009212 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009213 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009214 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009215 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9216 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009217
9218 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009219 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9220 ds_pool_ci.pNext = NULL;
9221 ds_pool_ci.maxSets = 1;
9222 ds_pool_ci.poolSizeCount = 1;
9223 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06009224
Tobin Ehlis3b780662015-05-28 12:11:26 -06009225 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009226 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009227 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009228
Tony Barboureb254902015-07-15 12:50:33 -06009229 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009230 dsl_binding.binding = 0;
9231 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9232 dsl_binding.descriptorCount = 1;
9233 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9234 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06009235
9236 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009237 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9238 ds_layout_ci.pNext = NULL;
9239 ds_layout_ci.bindingCount = 1;
9240 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009241
Tobin Ehlis3b780662015-05-28 12:11:26 -06009242 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009243 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009244 ASSERT_VK_SUCCESS(err);
9245
9246 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009247 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009248 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009249 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009250 alloc_info.descriptorPool = ds_pool;
9251 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009252 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009253 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009254
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009255 // Correctly update descriptor to avoid "NOT_UPDATED" error
9256 VkDescriptorBufferInfo buff_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009257 buff_info.buffer = VkBuffer(0); // Don't care about buffer handle for this test
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009258 buff_info.offset = 0;
9259 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009260
9261 VkWriteDescriptorSet descriptor_write;
9262 memset(&descriptor_write, 0, sizeof(descriptor_write));
9263 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009264 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009265 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08009266 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06009267 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9268 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009269
9270 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9271
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009272 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009273
Chia-I Wuf7458c52015-10-26 21:10:41 +08009274 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9275 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009276}
9277
Karl Schultz6addd812016-02-02 17:17:23 -07009278TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -07009279 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -07009280 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009281
Tobin Ehlisc8d352d2016-11-21 10:33:40 -07009282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009283
Tobin Ehlis3b780662015-05-28 12:11:26 -06009284 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009285 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009286 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009287 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9288 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009289
9290 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009291 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9292 ds_pool_ci.pNext = NULL;
9293 ds_pool_ci.maxSets = 1;
9294 ds_pool_ci.poolSizeCount = 1;
9295 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06009296
Tobin Ehlis3b780662015-05-28 12:11:26 -06009297 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009298 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009299 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009300
Tony Barboureb254902015-07-15 12:50:33 -06009301 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009302 dsl_binding.binding = 0;
9303 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9304 dsl_binding.descriptorCount = 1;
9305 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9306 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06009307
9308 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009309 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9310 ds_layout_ci.pNext = NULL;
9311 ds_layout_ci.bindingCount = 1;
9312 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009313 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009314 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009315 ASSERT_VK_SUCCESS(err);
9316
9317 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009318 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009319 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009320 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009321 alloc_info.descriptorPool = ds_pool;
9322 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009323 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009324 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009325
Tony Barboureb254902015-07-15 12:50:33 -06009326 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009327 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9328 sampler_ci.pNext = NULL;
9329 sampler_ci.magFilter = VK_FILTER_NEAREST;
9330 sampler_ci.minFilter = VK_FILTER_NEAREST;
9331 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9332 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9333 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9334 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9335 sampler_ci.mipLodBias = 1.0;
9336 sampler_ci.anisotropyEnable = VK_FALSE;
9337 sampler_ci.maxAnisotropy = 1;
9338 sampler_ci.compareEnable = VK_FALSE;
9339 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9340 sampler_ci.minLod = 1.0;
9341 sampler_ci.maxLod = 1.0;
9342 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9343 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06009344
Tobin Ehlis3b780662015-05-28 12:11:26 -06009345 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009346 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009347 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009348
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009349 VkDescriptorImageInfo info = {};
9350 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009351
9352 VkWriteDescriptorSet descriptor_write;
9353 memset(&descriptor_write, 0, sizeof(descriptor_write));
9354 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009355 descriptor_write.dstSet = descriptorSet;
9356 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009357 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009358 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009359 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009360 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009361
9362 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9363
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009364 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009365
Chia-I Wuf7458c52015-10-26 21:10:41 +08009366 vkDestroySampler(m_device->device(), sampler, NULL);
9367 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9368 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009369}
9370
Tobin Ehlise202b2d2016-11-21 10:36:16 -07009371TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
9372 // Create layout w/ empty binding and attempt to update it
9373 VkResult err;
9374
9375 ASSERT_NO_FATAL_FAILURE(InitState());
9376
9377 VkDescriptorPoolSize ds_type_count = {};
9378 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
9379 ds_type_count.descriptorCount = 1;
9380
9381 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9382 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9383 ds_pool_ci.pNext = NULL;
9384 ds_pool_ci.maxSets = 1;
9385 ds_pool_ci.poolSizeCount = 1;
9386 ds_pool_ci.pPoolSizes = &ds_type_count;
9387
9388 VkDescriptorPool ds_pool;
9389 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9390 ASSERT_VK_SUCCESS(err);
9391
9392 VkDescriptorSetLayoutBinding dsl_binding = {};
9393 dsl_binding.binding = 0;
9394 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9395 dsl_binding.descriptorCount = 0;
9396 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9397 dsl_binding.pImmutableSamplers = NULL;
9398
9399 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9400 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9401 ds_layout_ci.pNext = NULL;
9402 ds_layout_ci.bindingCount = 1;
9403 ds_layout_ci.pBindings = &dsl_binding;
9404 VkDescriptorSetLayout ds_layout;
9405 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
9406 ASSERT_VK_SUCCESS(err);
9407
9408 VkDescriptorSet descriptor_set;
9409 VkDescriptorSetAllocateInfo alloc_info = {};
9410 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9411 alloc_info.descriptorSetCount = 1;
9412 alloc_info.descriptorPool = ds_pool;
9413 alloc_info.pSetLayouts = &ds_layout;
9414 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
9415 ASSERT_VK_SUCCESS(err);
9416
9417 VkSamplerCreateInfo sampler_ci = {};
9418 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9419 sampler_ci.magFilter = VK_FILTER_NEAREST;
9420 sampler_ci.minFilter = VK_FILTER_NEAREST;
9421 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9422 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9423 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9424 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9425 sampler_ci.mipLodBias = 1.0;
9426 sampler_ci.maxAnisotropy = 1;
9427 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9428 sampler_ci.minLod = 1.0;
9429 sampler_ci.maxLod = 1.0;
9430 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9431
9432 VkSampler sampler;
9433 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
9434 ASSERT_VK_SUCCESS(err);
9435
9436 VkDescriptorImageInfo info = {};
9437 info.sampler = sampler;
9438
9439 VkWriteDescriptorSet descriptor_write;
9440 memset(&descriptor_write, 0, sizeof(descriptor_write));
9441 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9442 descriptor_write.dstSet = descriptor_set;
9443 descriptor_write.dstBinding = 0;
9444 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
9445 // This is the wrong type, but empty binding error will be flagged first
9446 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9447 descriptor_write.pImageInfo = &info;
9448
9449 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
9450 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9451 m_errorMonitor->VerifyFound();
9452
9453 vkDestroySampler(m_device->device(), sampler, NULL);
9454 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9455 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9456}
9457
Karl Schultz6addd812016-02-02 17:17:23 -07009458TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
9459 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
9460 // types
9461 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009462
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009463 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 -06009464
Tobin Ehlis3b780662015-05-28 12:11:26 -06009465 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06009466
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009467 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009468 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9469 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009470
9471 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009472 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9473 ds_pool_ci.pNext = NULL;
9474 ds_pool_ci.maxSets = 1;
9475 ds_pool_ci.poolSizeCount = 1;
9476 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06009477
Tobin Ehlis3b780662015-05-28 12:11:26 -06009478 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009479 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009480 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06009481 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009482 dsl_binding.binding = 0;
9483 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9484 dsl_binding.descriptorCount = 1;
9485 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9486 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009487
Tony Barboureb254902015-07-15 12:50:33 -06009488 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009489 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9490 ds_layout_ci.pNext = NULL;
9491 ds_layout_ci.bindingCount = 1;
9492 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009493
Tobin Ehlis3b780662015-05-28 12:11:26 -06009494 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009495 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009496 ASSERT_VK_SUCCESS(err);
9497
9498 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009499 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009500 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009501 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009502 alloc_info.descriptorPool = ds_pool;
9503 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009504 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009505 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009506
Tony Barboureb254902015-07-15 12:50:33 -06009507 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009508 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9509 sampler_ci.pNext = NULL;
9510 sampler_ci.magFilter = VK_FILTER_NEAREST;
9511 sampler_ci.minFilter = VK_FILTER_NEAREST;
9512 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9513 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9514 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9515 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9516 sampler_ci.mipLodBias = 1.0;
9517 sampler_ci.anisotropyEnable = VK_FALSE;
9518 sampler_ci.maxAnisotropy = 1;
9519 sampler_ci.compareEnable = VK_FALSE;
9520 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9521 sampler_ci.minLod = 1.0;
9522 sampler_ci.maxLod = 1.0;
9523 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9524 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009525 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009526 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009527 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009528
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009529 VkDescriptorImageInfo info = {};
9530 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009531
9532 VkWriteDescriptorSet descriptor_write;
9533 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009534 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009535 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009536 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009537 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009538 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009539 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009540
9541 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9542
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009543 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009544
Chia-I Wuf7458c52015-10-26 21:10:41 +08009545 vkDestroySampler(m_device->device(), sampler, NULL);
9546 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9547 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009548}
9549
Karl Schultz6addd812016-02-02 17:17:23 -07009550TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009551 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07009552 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009553
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009554 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009555
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009556 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009557 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
9558 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009559 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009560 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
9561 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009562
9563 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009564 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9565 ds_pool_ci.pNext = NULL;
9566 ds_pool_ci.maxSets = 1;
9567 ds_pool_ci.poolSizeCount = 1;
9568 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009569
9570 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009571 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009572 ASSERT_VK_SUCCESS(err);
9573
9574 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009575 dsl_binding.binding = 0;
9576 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9577 dsl_binding.descriptorCount = 1;
9578 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9579 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009580
9581 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009582 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9583 ds_layout_ci.pNext = NULL;
9584 ds_layout_ci.bindingCount = 1;
9585 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009586 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009587 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009588 ASSERT_VK_SUCCESS(err);
9589
9590 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009591 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009592 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009593 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009594 alloc_info.descriptorPool = ds_pool;
9595 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009596 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009597 ASSERT_VK_SUCCESS(err);
9598
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009599 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009600
9601 VkDescriptorImageInfo descriptor_info;
9602 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
9603 descriptor_info.sampler = sampler;
9604
9605 VkWriteDescriptorSet descriptor_write;
9606 memset(&descriptor_write, 0, sizeof(descriptor_write));
9607 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009608 descriptor_write.dstSet = descriptorSet;
9609 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009610 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009611 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9612 descriptor_write.pImageInfo = &descriptor_info;
9613
9614 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9615
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009616 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009617
Chia-I Wuf7458c52015-10-26 21:10:41 +08009618 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9619 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009620}
9621
Karl Schultz6addd812016-02-02 17:17:23 -07009622TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
9623 // Create a single combined Image/Sampler descriptor and send it an invalid
9624 // imageView
9625 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009626
Karl Schultzf78bcdd2016-11-30 12:36:01 -07009627 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009628
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009629 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009630 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009631 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
9632 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009633
9634 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009635 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9636 ds_pool_ci.pNext = NULL;
9637 ds_pool_ci.maxSets = 1;
9638 ds_pool_ci.poolSizeCount = 1;
9639 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009640
9641 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009642 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009643 ASSERT_VK_SUCCESS(err);
9644
9645 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009646 dsl_binding.binding = 0;
9647 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
9648 dsl_binding.descriptorCount = 1;
9649 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9650 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009651
9652 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009653 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9654 ds_layout_ci.pNext = NULL;
9655 ds_layout_ci.bindingCount = 1;
9656 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009657 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009658 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009659 ASSERT_VK_SUCCESS(err);
9660
9661 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009662 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009663 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009664 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009665 alloc_info.descriptorPool = ds_pool;
9666 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009667 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009668 ASSERT_VK_SUCCESS(err);
9669
9670 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009671 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9672 sampler_ci.pNext = NULL;
9673 sampler_ci.magFilter = VK_FILTER_NEAREST;
9674 sampler_ci.minFilter = VK_FILTER_NEAREST;
9675 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9676 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9677 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9678 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9679 sampler_ci.mipLodBias = 1.0;
9680 sampler_ci.anisotropyEnable = VK_FALSE;
9681 sampler_ci.maxAnisotropy = 1;
9682 sampler_ci.compareEnable = VK_FALSE;
9683 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9684 sampler_ci.minLod = 1.0;
9685 sampler_ci.maxLod = 1.0;
9686 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9687 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009688
9689 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009690 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009691 ASSERT_VK_SUCCESS(err);
9692
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009693 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009694
9695 VkDescriptorImageInfo descriptor_info;
9696 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
9697 descriptor_info.sampler = sampler;
9698 descriptor_info.imageView = view;
9699
9700 VkWriteDescriptorSet descriptor_write;
9701 memset(&descriptor_write, 0, sizeof(descriptor_write));
9702 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009703 descriptor_write.dstSet = descriptorSet;
9704 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009705 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009706 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
9707 descriptor_write.pImageInfo = &descriptor_info;
9708
9709 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9710
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009711 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009712
Chia-I Wuf7458c52015-10-26 21:10:41 +08009713 vkDestroySampler(m_device->device(), sampler, NULL);
9714 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9715 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009716}
9717
Karl Schultz6addd812016-02-02 17:17:23 -07009718TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
9719 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
9720 // into the other
9721 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009722
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding #1 with type "
9724 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
9725 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009726
Tobin Ehlis04356f92015-10-27 16:35:27 -06009727 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009728 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009729 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009730 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9731 ds_type_count[0].descriptorCount = 1;
9732 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
9733 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009734
9735 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009736 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9737 ds_pool_ci.pNext = NULL;
9738 ds_pool_ci.maxSets = 1;
9739 ds_pool_ci.poolSizeCount = 2;
9740 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009741
9742 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009743 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009744 ASSERT_VK_SUCCESS(err);
9745 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009746 dsl_binding[0].binding = 0;
9747 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9748 dsl_binding[0].descriptorCount = 1;
9749 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
9750 dsl_binding[0].pImmutableSamplers = NULL;
9751 dsl_binding[1].binding = 1;
9752 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9753 dsl_binding[1].descriptorCount = 1;
9754 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
9755 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009756
9757 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009758 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9759 ds_layout_ci.pNext = NULL;
9760 ds_layout_ci.bindingCount = 2;
9761 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009762
9763 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009764 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009765 ASSERT_VK_SUCCESS(err);
9766
9767 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009768 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009769 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009770 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009771 alloc_info.descriptorPool = ds_pool;
9772 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009773 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009774 ASSERT_VK_SUCCESS(err);
9775
9776 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009777 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9778 sampler_ci.pNext = NULL;
9779 sampler_ci.magFilter = VK_FILTER_NEAREST;
9780 sampler_ci.minFilter = VK_FILTER_NEAREST;
9781 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9782 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9783 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9784 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9785 sampler_ci.mipLodBias = 1.0;
9786 sampler_ci.anisotropyEnable = VK_FALSE;
9787 sampler_ci.maxAnisotropy = 1;
9788 sampler_ci.compareEnable = VK_FALSE;
9789 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9790 sampler_ci.minLod = 1.0;
9791 sampler_ci.maxLod = 1.0;
9792 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9793 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009794
9795 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009796 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009797 ASSERT_VK_SUCCESS(err);
9798
9799 VkDescriptorImageInfo info = {};
9800 info.sampler = sampler;
9801
9802 VkWriteDescriptorSet descriptor_write;
9803 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
9804 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009805 descriptor_write.dstSet = descriptorSet;
9806 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08009807 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009808 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9809 descriptor_write.pImageInfo = &info;
9810 // This write update should succeed
9811 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9812 // Now perform a copy update that fails due to type mismatch
9813 VkCopyDescriptorSet copy_ds_update;
9814 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
9815 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
9816 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -06009817 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009818 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07009819 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08009820 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06009821 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
9822
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009823 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06009824 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009825 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 -06009826 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
9827 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
9828 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009829 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009830 copy_ds_update.dstSet = descriptorSet;
9831 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -06009832 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06009833 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
9834
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009835 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009836
Tobin Ehlis04356f92015-10-27 16:35:27 -06009837 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009838 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
9839 "update array offset of 0 and update of "
9840 "5 descriptors oversteps total number "
9841 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009842
Tobin Ehlis04356f92015-10-27 16:35:27 -06009843 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
9844 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
9845 copy_ds_update.srcSet = descriptorSet;
9846 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009847 copy_ds_update.dstSet = descriptorSet;
9848 copy_ds_update.dstBinding = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009849 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06009850 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
9851
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009852 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06009853
Chia-I Wuf7458c52015-10-26 21:10:41 +08009854 vkDestroySampler(m_device->device(), sampler, NULL);
9855 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9856 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009857}
9858
Karl Schultz6addd812016-02-02 17:17:23 -07009859TEST_F(VkLayerTest, NumSamplesMismatch) {
9860 // Create CommandBuffer where MSAA samples doesn't match RenderPass
9861 // sampleCount
9862 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009863
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009864 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009865
Tobin Ehlis3b780662015-05-28 12:11:26 -06009866 ASSERT_NO_FATAL_FAILURE(InitState());
9867 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009868 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06009869 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009870 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009871
9872 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009873 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9874 ds_pool_ci.pNext = NULL;
9875 ds_pool_ci.maxSets = 1;
9876 ds_pool_ci.poolSizeCount = 1;
9877 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06009878
Tobin Ehlis3b780662015-05-28 12:11:26 -06009879 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009880 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009881 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009882
Tony Barboureb254902015-07-15 12:50:33 -06009883 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08009884 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06009885 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08009886 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009887 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9888 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009889
Tony Barboureb254902015-07-15 12:50:33 -06009890 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9891 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9892 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009893 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07009894 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009895
Tobin Ehlis3b780662015-05-28 12:11:26 -06009896 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009897 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009898 ASSERT_VK_SUCCESS(err);
9899
9900 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009901 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009902 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009903 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009904 alloc_info.descriptorPool = ds_pool;
9905 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009906 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009907 ASSERT_VK_SUCCESS(err);
9908
Tony Barboureb254902015-07-15 12:50:33 -06009909 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009910 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07009911 pipe_ms_state_ci.pNext = NULL;
9912 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
9913 pipe_ms_state_ci.sampleShadingEnable = 0;
9914 pipe_ms_state_ci.minSampleShading = 1.0;
9915 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009916
Tony Barboureb254902015-07-15 12:50:33 -06009917 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009918 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9919 pipeline_layout_ci.pNext = NULL;
9920 pipeline_layout_ci.setLayoutCount = 1;
9921 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009922
9923 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009924 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009925 ASSERT_VK_SUCCESS(err);
9926
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009927 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
9928 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
9929 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06009930 VkPipelineObj pipe(m_device);
9931 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06009932 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06009933 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06009934 pipe.SetMSAA(&pipe_ms_state_ci);
9935 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06009936
Tony Barbour552f6c02016-12-21 14:34:07 -07009937 m_commandBuffer->BeginCommandBuffer();
9938 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009939 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06009940
Rene Lindsay3bdc7a42017-01-06 13:20:15 -07009941 VkViewport viewport = {0, 0, 16, 16, 0, 1};
9942 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
9943 VkRect2D scissor = {{0, 0}, {16, 16}};
9944 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
9945
Mark Young29927482016-05-04 14:38:51 -06009946 // Render triangle (the error should trigger on the attempt to draw).
9947 Draw(3, 1, 0, 0);
9948
9949 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -07009950 m_commandBuffer->EndRenderPass();
9951 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -06009952
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009953 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009954
Chia-I Wuf7458c52015-10-26 21:10:41 +08009955 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9956 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9957 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009958}
Mark Young29927482016-05-04 14:38:51 -06009959
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009960TEST_F(VkLayerTest, RenderPassIncompatible) {
9961 TEST_DESCRIPTION("Hit RenderPass incompatible cases. "
9962 "Initial case is drawing with an active renderpass that's "
Mike Weiblencce7ec72016-10-17 19:33:05 -06009963 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009964 VkResult err;
9965
9966 ASSERT_NO_FATAL_FAILURE(InitState());
9967 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9968
9969 VkDescriptorSetLayoutBinding dsl_binding = {};
9970 dsl_binding.binding = 0;
9971 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9972 dsl_binding.descriptorCount = 1;
9973 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9974 dsl_binding.pImmutableSamplers = NULL;
9975
9976 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9977 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9978 ds_layout_ci.pNext = NULL;
9979 ds_layout_ci.bindingCount = 1;
9980 ds_layout_ci.pBindings = &dsl_binding;
9981
9982 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009983 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009984 ASSERT_VK_SUCCESS(err);
9985
9986 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
9987 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9988 pipeline_layout_ci.pNext = NULL;
9989 pipeline_layout_ci.setLayoutCount = 1;
9990 pipeline_layout_ci.pSetLayouts = &ds_layout;
9991
9992 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009993 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009994 ASSERT_VK_SUCCESS(err);
9995
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009996 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
9997 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
9998 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009999 // Create a renderpass that will be incompatible with default renderpass
10000 VkAttachmentReference attach = {};
10001 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
10002 VkAttachmentReference color_att = {};
10003 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10004 VkSubpassDescription subpass = {};
10005 subpass.inputAttachmentCount = 1;
10006 subpass.pInputAttachments = &attach;
10007 subpass.colorAttachmentCount = 1;
10008 subpass.pColorAttachments = &color_att;
10009 VkRenderPassCreateInfo rpci = {};
10010 rpci.subpassCount = 1;
10011 rpci.pSubpasses = &subpass;
10012 rpci.attachmentCount = 1;
10013 VkAttachmentDescription attach_desc = {};
10014 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060010015 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
10016 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010017 rpci.pAttachments = &attach_desc;
10018 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
10019 VkRenderPass rp;
10020 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10021 VkPipelineObj pipe(m_device);
10022 pipe.AddShader(&vs);
10023 pipe.AddShader(&fs);
10024 pipe.AddColorAttachment();
10025 VkViewport view_port = {};
10026 m_viewports.push_back(view_port);
10027 pipe.SetViewport(m_viewports);
10028 VkRect2D rect = {};
10029 m_scissors.push_back(rect);
10030 pipe.SetScissor(m_scissors);
10031 pipe.CreateVKPipeline(pipeline_layout, renderPass());
10032
10033 VkCommandBufferInheritanceInfo cbii = {};
10034 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
10035 cbii.renderPass = rp;
10036 cbii.subpass = 0;
10037 VkCommandBufferBeginInfo cbbi = {};
10038 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
10039 cbbi.pInheritanceInfo = &cbii;
10040 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
10041 VkRenderPassBeginInfo rpbi = {};
10042 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
10043 rpbi.framebuffer = m_framebuffer;
10044 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010045 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
10046 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010047
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010048 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010049 // Render triangle (the error should trigger on the attempt to draw).
10050 Draw(3, 1, 0, 0);
10051
10052 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070010053 m_commandBuffer->EndRenderPass();
10054 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010055
10056 m_errorMonitor->VerifyFound();
10057
10058 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10059 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10060 vkDestroyRenderPass(m_device->device(), rp, NULL);
10061}
10062
Mark Youngc89c6312016-03-31 16:03:20 -060010063TEST_F(VkLayerTest, NumBlendAttachMismatch) {
10064 // Create Pipeline where the number of blend attachments doesn't match the
10065 // number of color attachments. In this case, we don't add any color
10066 // blend attachments even though we have a color attachment.
10067 VkResult err;
10068
10069 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010070 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -060010071
10072 ASSERT_NO_FATAL_FAILURE(InitState());
10073 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10074 VkDescriptorPoolSize ds_type_count = {};
10075 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10076 ds_type_count.descriptorCount = 1;
10077
10078 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10079 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10080 ds_pool_ci.pNext = NULL;
10081 ds_pool_ci.maxSets = 1;
10082 ds_pool_ci.poolSizeCount = 1;
10083 ds_pool_ci.pPoolSizes = &ds_type_count;
10084
10085 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010086 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060010087 ASSERT_VK_SUCCESS(err);
10088
10089 VkDescriptorSetLayoutBinding dsl_binding = {};
10090 dsl_binding.binding = 0;
10091 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10092 dsl_binding.descriptorCount = 1;
10093 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10094 dsl_binding.pImmutableSamplers = NULL;
10095
10096 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10097 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10098 ds_layout_ci.pNext = NULL;
10099 ds_layout_ci.bindingCount = 1;
10100 ds_layout_ci.pBindings = &dsl_binding;
10101
10102 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010103 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060010104 ASSERT_VK_SUCCESS(err);
10105
10106 VkDescriptorSet descriptorSet;
10107 VkDescriptorSetAllocateInfo alloc_info = {};
10108 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10109 alloc_info.descriptorSetCount = 1;
10110 alloc_info.descriptorPool = ds_pool;
10111 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010112 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060010113 ASSERT_VK_SUCCESS(err);
10114
10115 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010116 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060010117 pipe_ms_state_ci.pNext = NULL;
10118 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10119 pipe_ms_state_ci.sampleShadingEnable = 0;
10120 pipe_ms_state_ci.minSampleShading = 1.0;
10121 pipe_ms_state_ci.pSampleMask = NULL;
10122
10123 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10124 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10125 pipeline_layout_ci.pNext = NULL;
10126 pipeline_layout_ci.setLayoutCount = 1;
10127 pipeline_layout_ci.pSetLayouts = &ds_layout;
10128
10129 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010130 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060010131 ASSERT_VK_SUCCESS(err);
10132
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010133 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
10134 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
10135 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060010136 VkPipelineObj pipe(m_device);
10137 pipe.AddShader(&vs);
10138 pipe.AddShader(&fs);
10139 pipe.SetMSAA(&pipe_ms_state_ci);
10140 pipe.CreateVKPipeline(pipeline_layout, renderPass());
10141
Tony Barbour552f6c02016-12-21 14:34:07 -070010142 m_commandBuffer->BeginCommandBuffer();
10143 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010144 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Youngc89c6312016-03-31 16:03:20 -060010145
Rene Lindsay6d5c4fe2017-01-13 09:41:19 -070010146 VkViewport viewport = {0, 0, 16, 16, 0, 1};
10147 VkRect2D scissor = {{0, 0}, {16, 16}};
10148 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
10149 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
10150
Mark Young29927482016-05-04 14:38:51 -060010151 // Render triangle (the error should trigger on the attempt to draw).
10152 Draw(3, 1, 0, 0);
10153
10154 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070010155 m_commandBuffer->EndRenderPass();
10156 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060010157
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010158 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060010159
10160 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10161 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10162 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10163}
Mark Young29927482016-05-04 14:38:51 -060010164
Mark Muellerd4914412016-06-13 17:52:06 -060010165TEST_F(VkLayerTest, MissingClearAttachment) {
10166 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment "
10167 "structure passed to vkCmdClearAttachments");
Cody Northropc31a84f2016-08-22 10:41:47 -060010168 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010169 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060010170
10171 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
10172 m_errorMonitor->VerifyFound();
10173}
10174
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070010175TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010176
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070010177 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
10178 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010179
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010180 ASSERT_NO_FATAL_FAILURE(InitState());
10181 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060010182
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010183 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010184 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10185 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010186
10187 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010188 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10189 ds_pool_ci.pNext = NULL;
10190 ds_pool_ci.maxSets = 1;
10191 ds_pool_ci.poolSizeCount = 1;
10192 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010193
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010194 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010195 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010196 ASSERT_VK_SUCCESS(err);
10197
Tony Barboureb254902015-07-15 12:50:33 -060010198 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010199 dsl_binding.binding = 0;
10200 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10201 dsl_binding.descriptorCount = 1;
10202 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10203 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010204
Tony Barboureb254902015-07-15 12:50:33 -060010205 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010206 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10207 ds_layout_ci.pNext = NULL;
10208 ds_layout_ci.bindingCount = 1;
10209 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010210
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010211 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010212 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010213 ASSERT_VK_SUCCESS(err);
10214
10215 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010216 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010217 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010218 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010219 alloc_info.descriptorPool = ds_pool;
10220 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010221 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010222 ASSERT_VK_SUCCESS(err);
10223
Tony Barboureb254902015-07-15 12:50:33 -060010224 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010225 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010226 pipe_ms_state_ci.pNext = NULL;
10227 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10228 pipe_ms_state_ci.sampleShadingEnable = 0;
10229 pipe_ms_state_ci.minSampleShading = 1.0;
10230 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010231
Tony Barboureb254902015-07-15 12:50:33 -060010232 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010233 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10234 pipeline_layout_ci.pNext = NULL;
10235 pipeline_layout_ci.setLayoutCount = 1;
10236 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010237
10238 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010239 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010240 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010241
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010242 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060010243 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070010244 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010245 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010246
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010247 VkPipelineObj pipe(m_device);
10248 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010249 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010250 pipe.SetMSAA(&pipe_ms_state_ci);
10251 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060010252
Tony Barbour552f6c02016-12-21 14:34:07 -070010253 m_commandBuffer->BeginCommandBuffer();
10254 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010255
Karl Schultz6addd812016-02-02 17:17:23 -070010256 // Main thing we care about for this test is that the VkImage obj we're
10257 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010258 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060010259 VkClearAttachment color_attachment;
10260 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10261 color_attachment.clearValue.color.float32[0] = 1.0;
10262 color_attachment.clearValue.color.float32[1] = 1.0;
10263 color_attachment.clearValue.color.float32[2] = 1.0;
10264 color_attachment.clearValue.color.float32[3] = 1.0;
10265 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010266 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010267
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070010268 // Call for full-sized FB Color attachment prior to issuing a Draw
10269 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070010270 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010271 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070010272 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010273
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070010274 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
10275 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
10276 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
10277 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
10278 m_errorMonitor->VerifyFound();
10279
10280 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
10281 clear_rect.layerCount = 2;
10282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
10283 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010284 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010285
Chia-I Wuf7458c52015-10-26 21:10:41 +080010286 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10287 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10288 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010289}
10290
Karl Schultz6addd812016-02-02 17:17:23 -070010291TEST_F(VkLayerTest, VtxBufferBadIndex) {
10292 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010293
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010294 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10295 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010296
Tobin Ehlis502480b2015-06-24 15:53:07 -060010297 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -060010298 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060010299 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060010300
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010301 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010302 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10303 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010304
10305 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010306 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10307 ds_pool_ci.pNext = NULL;
10308 ds_pool_ci.maxSets = 1;
10309 ds_pool_ci.poolSizeCount = 1;
10310 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010311
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010312 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010313 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010314 ASSERT_VK_SUCCESS(err);
10315
Tony Barboureb254902015-07-15 12:50:33 -060010316 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010317 dsl_binding.binding = 0;
10318 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10319 dsl_binding.descriptorCount = 1;
10320 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10321 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010322
Tony Barboureb254902015-07-15 12:50:33 -060010323 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010324 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10325 ds_layout_ci.pNext = NULL;
10326 ds_layout_ci.bindingCount = 1;
10327 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010328
Tobin Ehlis502480b2015-06-24 15:53:07 -060010329 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010330 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010331 ASSERT_VK_SUCCESS(err);
10332
10333 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010334 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010335 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010336 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010337 alloc_info.descriptorPool = ds_pool;
10338 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010339 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010340 ASSERT_VK_SUCCESS(err);
10341
Tony Barboureb254902015-07-15 12:50:33 -060010342 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010343 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010344 pipe_ms_state_ci.pNext = NULL;
10345 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10346 pipe_ms_state_ci.sampleShadingEnable = 0;
10347 pipe_ms_state_ci.minSampleShading = 1.0;
10348 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010349
Tony Barboureb254902015-07-15 12:50:33 -060010350 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010351 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10352 pipeline_layout_ci.pNext = NULL;
10353 pipeline_layout_ci.setLayoutCount = 1;
10354 pipeline_layout_ci.pSetLayouts = &ds_layout;
10355 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010356
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010357 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010358 ASSERT_VK_SUCCESS(err);
10359
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010360 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
10361 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
10362 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010363 VkPipelineObj pipe(m_device);
10364 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010365 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010366 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010367 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060010368 pipe.SetViewport(m_viewports);
10369 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010370 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060010371
Tony Barbour552f6c02016-12-21 14:34:07 -070010372 m_commandBuffer->BeginCommandBuffer();
10373 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010374 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060010375 // Don't care about actual data, just need to get to draw to flag error
10376 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010377 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060010378 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060010379 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010380
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010381 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010382
Chia-I Wuf7458c52015-10-26 21:10:41 +080010383 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10384 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10385 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010386}
Mark Muellerdfe37552016-07-07 14:47:42 -060010387
Mark Mueller2ee294f2016-08-04 12:59:48 -060010388TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
10389 TEST_DESCRIPTION("Use an invalid count in a vkEnumeratePhysicalDevices call."
10390 "Use invalid Queue Family Index in vkCreateDevice");
Cody Northropc31a84f2016-08-22 10:41:47 -060010391 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Mueller2ee294f2016-08-04 12:59:48 -060010392
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010393 const char *invalid_queueFamilyIndex_message = "Invalid queue create request in vkCreateDevice(). Invalid "
10394 "queueFamilyIndex ";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010395
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010396 const char *unavailable_feature_message = "While calling vkCreateDevice(), requesting feature #";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010397
Mark Mueller880fce52016-08-17 15:23:23 -060010398 // The following test fails with recent NVidia drivers.
10399 // By the time core_validation is reached, the NVidia
10400 // driver has sanitized the invalid condition and core_validation
10401 // is not introduced to the failure condition. This is not the case
10402 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010403 // uint32_t count = static_cast<uint32_t>(~0);
10404 // VkPhysicalDevice physical_device;
10405 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
10406 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060010407
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queueFamilyIndex_message);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010409 float queue_priority = 0.0;
10410
10411 VkDeviceQueueCreateInfo queue_create_info = {};
10412 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
10413 queue_create_info.queueCount = 1;
10414 queue_create_info.pQueuePriorities = &queue_priority;
10415 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
10416
10417 VkPhysicalDeviceFeatures features = m_device->phy().features();
10418 VkDevice testDevice;
10419 VkDeviceCreateInfo device_create_info = {};
10420 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
10421 device_create_info.queueCreateInfoCount = 1;
10422 device_create_info.pQueueCreateInfos = &queue_create_info;
10423 device_create_info.pEnabledFeatures = &features;
10424 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
10425 m_errorMonitor->VerifyFound();
10426
10427 queue_create_info.queueFamilyIndex = 1;
10428
10429 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
10430 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
10431 for (unsigned i = 0; i < feature_count; i++) {
10432 if (VK_FALSE == feature_array[i]) {
10433 feature_array[i] = VK_TRUE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010434 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, unavailable_feature_message);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010435 device_create_info.pEnabledFeatures = &features;
10436 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
10437 m_errorMonitor->VerifyFound();
10438 break;
10439 }
10440 }
10441}
10442
Tobin Ehlis16edf082016-11-21 12:33:49 -070010443TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
10444 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
10445
10446 ASSERT_NO_FATAL_FAILURE(InitState());
10447
10448 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
10449 std::vector<VkDeviceQueueCreateInfo> queue_info;
10450 queue_info.reserve(queue_props.size());
10451 std::vector<std::vector<float>> queue_priorities;
10452 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
10453 VkDeviceQueueCreateInfo qi{};
10454 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
10455 qi.queueFamilyIndex = i;
10456 qi.queueCount = queue_props[i].queueCount;
10457 queue_priorities.emplace_back(qi.queueCount, 0.0f);
10458 qi.pQueuePriorities = queue_priorities[i].data();
10459 queue_info.push_back(qi);
10460 }
10461
10462 std::vector<const char *> device_extension_names;
10463
10464 VkDevice local_device;
10465 VkDeviceCreateInfo device_create_info = {};
10466 auto features = m_device->phy().features();
10467 // Intentionally disable pipeline stats
10468 features.pipelineStatisticsQuery = VK_FALSE;
10469 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
10470 device_create_info.pNext = NULL;
10471 device_create_info.queueCreateInfoCount = queue_info.size();
10472 device_create_info.pQueueCreateInfos = queue_info.data();
10473 device_create_info.enabledLayerCount = 0;
10474 device_create_info.ppEnabledLayerNames = NULL;
10475 device_create_info.pEnabledFeatures = &features;
10476 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
10477 ASSERT_VK_SUCCESS(err);
10478
10479 VkQueryPoolCreateInfo qpci{};
10480 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
10481 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
10482 qpci.queryCount = 1;
10483 VkQueryPool query_pool;
10484
10485 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
10486 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
10487 m_errorMonitor->VerifyFound();
10488
10489 vkDestroyDevice(local_device, nullptr);
10490}
10491
Mark Mueller2ee294f2016-08-04 12:59:48 -060010492TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
10493 TEST_DESCRIPTION("Use an invalid queue index in a vkCmdWaitEvents call."
10494 "End a command buffer with a query still in progress.");
10495
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010496 const char *invalid_queue_index = "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
10497 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
10498 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010499
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010500 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010501
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010502 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010503
10504 ASSERT_NO_FATAL_FAILURE(InitState());
10505
10506 VkEvent event;
10507 VkEventCreateInfo event_create_info{};
10508 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
10509 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
10510
Mark Mueller2ee294f2016-08-04 12:59:48 -060010511 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010512 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010513
Tony Barbour552f6c02016-12-21 14:34:07 -070010514 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060010515
10516 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010517 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 -060010518 ASSERT_TRUE(image.initialized());
10519 VkImageMemoryBarrier img_barrier = {};
10520 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
10521 img_barrier.pNext = NULL;
10522 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10523 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10524 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10525 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10526 img_barrier.image = image.handle();
10527 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060010528
10529 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
10530 // that layer validation catches the case when it is not.
10531 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060010532 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10533 img_barrier.subresourceRange.baseArrayLayer = 0;
10534 img_barrier.subresourceRange.baseMipLevel = 0;
10535 img_barrier.subresourceRange.layerCount = 1;
10536 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010537 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
10538 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010539 m_errorMonitor->VerifyFound();
10540
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010541 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010542
10543 VkQueryPool query_pool;
10544 VkQueryPoolCreateInfo query_pool_create_info = {};
10545 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
10546 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
10547 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010548 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010549
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010550 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010551 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
10552
10553 vkEndCommandBuffer(m_commandBuffer->handle());
10554 m_errorMonitor->VerifyFound();
10555
10556 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
10557 vkDestroyEvent(m_device->device(), event, nullptr);
10558}
10559
Mark Muellerdfe37552016-07-07 14:47:42 -060010560TEST_F(VkLayerTest, VertexBufferInvalid) {
10561 TEST_DESCRIPTION("Submit a command buffer using deleted vertex buffer, "
10562 "delete a buffer twice, use an invalid offset for each "
10563 "buffer type, and attempt to bind a null buffer");
10564
10565 const char *deleted_buffer_in_command_buffer = "Cannot submit cmd buffer "
10566 "using deleted buffer ";
Mark Muellerdfe37552016-07-07 14:47:42 -060010567 const char *invalid_offset_message = "vkBindBufferMemory(): "
10568 "memoryOffset is 0x";
10569 const char *invalid_storage_buffer_offset_message = "vkBindBufferMemory(): "
10570 "storage memoryOffset "
10571 "is 0x";
10572 const char *invalid_texel_buffer_offset_message = "vkBindBufferMemory(): "
10573 "texel memoryOffset "
10574 "is 0x";
10575 const char *invalid_uniform_buffer_offset_message = "vkBindBufferMemory(): "
10576 "uniform memoryOffset "
10577 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060010578
10579 ASSERT_NO_FATAL_FAILURE(InitState());
10580 ASSERT_NO_FATAL_FAILURE(InitViewport());
10581 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10582
10583 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010584 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060010585 pipe_ms_state_ci.pNext = NULL;
10586 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10587 pipe_ms_state_ci.sampleShadingEnable = 0;
10588 pipe_ms_state_ci.minSampleShading = 1.0;
10589 pipe_ms_state_ci.pSampleMask = nullptr;
10590
10591 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10592 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10593 VkPipelineLayout pipeline_layout;
10594
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010595 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060010596 ASSERT_VK_SUCCESS(err);
10597
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010598 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
10599 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060010600 VkPipelineObj pipe(m_device);
10601 pipe.AddShader(&vs);
10602 pipe.AddShader(&fs);
10603 pipe.AddColorAttachment();
10604 pipe.SetMSAA(&pipe_ms_state_ci);
10605 pipe.SetViewport(m_viewports);
10606 pipe.SetScissor(m_scissors);
10607 pipe.CreateVKPipeline(pipeline_layout, renderPass());
10608
Tony Barbour552f6c02016-12-21 14:34:07 -070010609 m_commandBuffer->BeginCommandBuffer();
10610 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010611 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060010612
10613 {
10614 // Create and bind a vertex buffer in a reduced scope, which will cause
10615 // it to be deleted upon leaving this scope
10616 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010617 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060010618 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
10619 draw_verticies.AddVertexInputToPipe(pipe);
10620 }
10621
10622 Draw(1, 0, 0, 0);
10623
Tony Barbour552f6c02016-12-21 14:34:07 -070010624 m_commandBuffer->EndRenderPass();
10625 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060010626
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010627 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060010628 QueueCommandBuffer(false);
10629 m_errorMonitor->VerifyFound();
10630
10631 {
10632 // Create and bind a vertex buffer in a reduced scope, and delete it
10633 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010634 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010635 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060010636 buffer_test.TestDoubleDestroy();
10637 }
10638 m_errorMonitor->VerifyFound();
10639
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010640 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060010641 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010642 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
10643 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
10644 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010645 m_errorMonitor->VerifyFound();
10646 }
10647
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010648 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
10649 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060010650 // Create and bind a memory buffer with an invalid offset again,
10651 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
10653 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
10654 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010655 m_errorMonitor->VerifyFound();
10656 }
10657
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010658 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060010659 // Create and bind a memory buffer with an invalid offset again, but
10660 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
10662 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
10663 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010664 m_errorMonitor->VerifyFound();
10665 }
10666
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010667 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060010668 // Create and bind a memory buffer with an invalid offset again, but
10669 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010670 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
10671 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
10672 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010673 m_errorMonitor->VerifyFound();
10674 }
10675
10676 {
10677 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010679 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
10680 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010681 m_errorMonitor->VerifyFound();
10682 }
10683
10684 {
10685 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010686 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010687 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
10688 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010689 }
10690 m_errorMonitor->VerifyFound();
10691
10692 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10693}
10694
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010695// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
10696TEST_F(VkLayerTest, InvalidImageLayout) {
10697 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010698 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
10699 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010700 // 3 in ValidateCmdBufImageLayouts
10701 // * -1 Attempt to submit cmd buf w/ deleted image
10702 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
10703 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010704
10705 ASSERT_NO_FATAL_FAILURE(InitState());
10706 // Create src & dst images to use for copy operations
10707 VkImage src_image;
10708 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080010709 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010710
10711 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
10712 const int32_t tex_width = 32;
10713 const int32_t tex_height = 32;
10714
10715 VkImageCreateInfo image_create_info = {};
10716 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10717 image_create_info.pNext = NULL;
10718 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10719 image_create_info.format = tex_format;
10720 image_create_info.extent.width = tex_width;
10721 image_create_info.extent.height = tex_height;
10722 image_create_info.extent.depth = 1;
10723 image_create_info.mipLevels = 1;
10724 image_create_info.arrayLayers = 4;
10725 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10726 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10727 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080010728 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010729 image_create_info.flags = 0;
10730
10731 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
10732 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080010733 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010734 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
10735 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080010736 image_create_info.format = VK_FORMAT_D32_SFLOAT;
10737 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
10738 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
10739 ASSERT_VK_SUCCESS(err);
10740
10741 // Allocate memory
10742 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080010743 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080010744 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080010745 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10746 mem_alloc.pNext = NULL;
10747 mem_alloc.allocationSize = 0;
10748 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080010749
10750 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080010751 mem_alloc.allocationSize = img_mem_reqs.size;
10752 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080010753 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080010754 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080010755 ASSERT_VK_SUCCESS(err);
10756
10757 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080010758 mem_alloc.allocationSize = img_mem_reqs.size;
10759 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080010760 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080010761 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080010762 ASSERT_VK_SUCCESS(err);
10763
10764 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080010765 mem_alloc.allocationSize = img_mem_reqs.size;
10766 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080010767 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080010768 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080010769 ASSERT_VK_SUCCESS(err);
10770
10771 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
10772 ASSERT_VK_SUCCESS(err);
10773 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
10774 ASSERT_VK_SUCCESS(err);
10775 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
10776 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010777
Tony Barbour552f6c02016-12-21 14:34:07 -070010778 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080010779 VkImageCopy copy_region;
10780 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10781 copy_region.srcSubresource.mipLevel = 0;
10782 copy_region.srcSubresource.baseArrayLayer = 0;
10783 copy_region.srcSubresource.layerCount = 1;
10784 copy_region.srcOffset.x = 0;
10785 copy_region.srcOffset.y = 0;
10786 copy_region.srcOffset.z = 0;
10787 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10788 copy_region.dstSubresource.mipLevel = 0;
10789 copy_region.dstSubresource.baseArrayLayer = 0;
10790 copy_region.dstSubresource.layerCount = 1;
10791 copy_region.dstOffset.x = 0;
10792 copy_region.dstOffset.y = 0;
10793 copy_region.dstOffset.z = 0;
10794 copy_region.extent.width = 1;
10795 copy_region.extent.height = 1;
10796 copy_region.extent.depth = 1;
10797
10798 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10799 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
10800 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 -060010801 m_errorMonitor->VerifyFound();
10802 // Now cause error due to src image layout changing
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010803 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot copy from an image whose source layout is "
10804 "VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current "
10805 "layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080010806 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 -060010807 m_errorMonitor->VerifyFound();
10808 // Final src error is due to bad layout type
10809 m_errorMonitor->SetDesiredFailureMsg(
10810 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10811 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
Cort530cf382016-12-08 09:59:47 -080010812 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 -060010813 m_errorMonitor->VerifyFound();
10814 // Now verify same checks for dst
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010815 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10816 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080010817 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 -060010818 m_errorMonitor->VerifyFound();
10819 // Now cause error due to src image layout changing
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010820 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot copy from an image whose dest layout is "
10821 "VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current "
10822 "layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080010823 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 -060010824 m_errorMonitor->VerifyFound();
10825 m_errorMonitor->SetDesiredFailureMsg(
10826 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10827 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
Cort530cf382016-12-08 09:59:47 -080010828 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 -060010829 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010010830
Cort3b021012016-12-07 12:00:57 -080010831 // Convert dst and depth images to TRANSFER_DST for subsequent tests
10832 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
10833 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
10834 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
10835 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
10836 transfer_dst_image_barrier[0].srcAccessMask = 0;
10837 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
10838 transfer_dst_image_barrier[0].image = dst_image;
10839 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
10840 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
10841 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10842 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
10843 NULL, 0, NULL, 1, transfer_dst_image_barrier);
10844 transfer_dst_image_barrier[0].image = depth_image;
10845 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
10846 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
10847 NULL, 0, NULL, 1, transfer_dst_image_barrier);
10848
10849 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080010850 VkClearColorValue color_clear_value = {};
10851 VkImageSubresourceRange clear_range;
10852 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10853 clear_range.baseMipLevel = 0;
10854 clear_range.baseArrayLayer = 0;
10855 clear_range.layerCount = 1;
10856 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010010857
Cort3b021012016-12-07 12:00:57 -080010858 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
10859 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
10860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
10861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080010862 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010010863 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080010864 // Fail due to provided layout not matching actual current layout for color clear.
10865 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080010866 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010010867 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080010868
Cort530cf382016-12-08 09:59:47 -080010869 VkClearDepthStencilValue depth_clear_value = {};
10870 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080010871
10872 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
10873 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
10874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
10875 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080010876 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080010877 m_errorMonitor->VerifyFound();
10878 // Fail due to provided layout not matching actual current layout for depth clear.
10879 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080010880 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080010881 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010010882
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010883 // Now cause error due to bad image layout transition in PipelineBarrier
10884 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080010885 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010886 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080010887 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010888 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080010889 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
10890 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010891 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Alex Smithc4659e42017-01-10 09:51:22 +000010892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "You cannot transition the layout of aspect 1 from "
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010893 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when "
10894 "current layout is VK_IMAGE_LAYOUT_GENERAL.");
10895 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
10896 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010897 m_errorMonitor->VerifyFound();
10898
10899 // Finally some layout errors at RenderPass create time
10900 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
10901 VkAttachmentReference attach = {};
10902 // perf warning for GENERAL layout w/ non-DS input attachment
10903 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
10904 VkSubpassDescription subpass = {};
10905 subpass.inputAttachmentCount = 1;
10906 subpass.pInputAttachments = &attach;
10907 VkRenderPassCreateInfo rpci = {};
10908 rpci.subpassCount = 1;
10909 rpci.pSubpasses = &subpass;
10910 rpci.attachmentCount = 1;
10911 VkAttachmentDescription attach_desc = {};
10912 attach_desc.format = VK_FORMAT_UNDEFINED;
10913 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060010914 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010915 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010916 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10917 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010918 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10919 m_errorMonitor->VerifyFound();
10920 // error w/ non-general layout
10921 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
10922
10923 m_errorMonitor->SetDesiredFailureMsg(
10924 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10925 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
10926 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10927 m_errorMonitor->VerifyFound();
10928 subpass.inputAttachmentCount = 0;
10929 subpass.colorAttachmentCount = 1;
10930 subpass.pColorAttachments = &attach;
10931 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
10932 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010933 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10934 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010935 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10936 m_errorMonitor->VerifyFound();
10937 // error w/ non-color opt or GENERAL layout for color attachment
10938 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
10939 m_errorMonitor->SetDesiredFailureMsg(
10940 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10941 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
10942 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10943 m_errorMonitor->VerifyFound();
10944 subpass.colorAttachmentCount = 0;
10945 subpass.pDepthStencilAttachment = &attach;
10946 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
10947 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010948 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10949 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010950 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10951 m_errorMonitor->VerifyFound();
10952 // error w/ non-ds opt or GENERAL layout for color attachment
10953 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10955 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
10956 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010957 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10958 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060010959 // For this error we need a valid renderpass so create default one
10960 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
10961 attach.attachment = 0;
10962 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
10963 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
10964 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
10965 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
10966 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
10967 // Can't do a CLEAR load on READ_ONLY initialLayout
10968 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
10969 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
10970 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010971 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " with invalid first layout "
10972 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
10973 "ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060010974 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10975 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010976
Cort3b021012016-12-07 12:00:57 -080010977 vkFreeMemory(m_device->device(), src_image_mem, NULL);
10978 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
10979 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010980 vkDestroyImage(m_device->device(), src_image, NULL);
10981 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080010982 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010983}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060010984
Tobin Ehlise0936662016-10-11 08:10:51 -060010985TEST_F(VkLayerTest, InvalidStorageImageLayout) {
10986 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
10987 VkResult err;
10988
10989 ASSERT_NO_FATAL_FAILURE(InitState());
10990
10991 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
10992 VkImageTiling tiling;
10993 VkFormatProperties format_properties;
10994 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
10995 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
10996 tiling = VK_IMAGE_TILING_LINEAR;
10997 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
10998 tiling = VK_IMAGE_TILING_OPTIMAL;
10999 } else {
11000 printf("Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
11001 "skipped.\n");
11002 return;
11003 }
11004
11005 VkDescriptorPoolSize ds_type = {};
11006 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
11007 ds_type.descriptorCount = 1;
11008
11009 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11010 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11011 ds_pool_ci.maxSets = 1;
11012 ds_pool_ci.poolSizeCount = 1;
11013 ds_pool_ci.pPoolSizes = &ds_type;
11014 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
11015
11016 VkDescriptorPool ds_pool;
11017 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11018 ASSERT_VK_SUCCESS(err);
11019
11020 VkDescriptorSetLayoutBinding dsl_binding = {};
11021 dsl_binding.binding = 0;
11022 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
11023 dsl_binding.descriptorCount = 1;
11024 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
11025 dsl_binding.pImmutableSamplers = NULL;
11026
11027 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11028 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11029 ds_layout_ci.pNext = NULL;
11030 ds_layout_ci.bindingCount = 1;
11031 ds_layout_ci.pBindings = &dsl_binding;
11032
11033 VkDescriptorSetLayout ds_layout;
11034 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
11035 ASSERT_VK_SUCCESS(err);
11036
11037 VkDescriptorSetAllocateInfo alloc_info = {};
11038 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11039 alloc_info.descriptorSetCount = 1;
11040 alloc_info.descriptorPool = ds_pool;
11041 alloc_info.pSetLayouts = &ds_layout;
11042 VkDescriptorSet descriptor_set;
11043 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
11044 ASSERT_VK_SUCCESS(err);
11045
11046 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11047 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11048 pipeline_layout_ci.pNext = NULL;
11049 pipeline_layout_ci.setLayoutCount = 1;
11050 pipeline_layout_ci.pSetLayouts = &ds_layout;
11051 VkPipelineLayout pipeline_layout;
11052 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
11053 ASSERT_VK_SUCCESS(err);
11054
11055 VkImageObj image(m_device);
11056 image.init(32, 32, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
11057 ASSERT_TRUE(image.initialized());
11058 VkImageView view = image.targetView(tex_format);
11059
11060 VkDescriptorImageInfo image_info = {};
11061 image_info.imageView = view;
11062 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11063
11064 VkWriteDescriptorSet descriptor_write = {};
11065 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11066 descriptor_write.dstSet = descriptor_set;
11067 descriptor_write.dstBinding = 0;
11068 descriptor_write.descriptorCount = 1;
11069 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
11070 descriptor_write.pImageInfo = &image_info;
11071
11072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11073 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
11074 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
11075 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11076 m_errorMonitor->VerifyFound();
11077
11078 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11079 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11080 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
11081 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11082}
11083
Mark Mueller93b938f2016-08-18 10:27:40 -060011084TEST_F(VkLayerTest, SimultaneousUse) {
11085 TEST_DESCRIPTION("Use vkCmdExecuteCommands with invalid state "
11086 "in primary and secondary command buffers.");
11087
11088 ASSERT_NO_FATAL_FAILURE(InitState());
11089 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11090
Mike Weiblen95dd0f92016-10-19 12:28:27 -060011091 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011092 const char *simultaneous_use_message2 = "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
11093 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060011094
11095 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011096 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060011097 command_buffer_allocate_info.commandPool = m_commandPool;
11098 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
11099 command_buffer_allocate_info.commandBufferCount = 1;
11100
11101 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011102 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060011103 VkCommandBufferBeginInfo command_buffer_begin_info = {};
11104 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011105 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060011106 command_buffer_inheritance_info.renderPass = m_renderPass;
11107 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070011108
Mark Mueller93b938f2016-08-18 10:27:40 -060011109 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011110 command_buffer_begin_info.flags =
11111 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060011112 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
11113
11114 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
11115 vkEndCommandBuffer(secondary_command_buffer);
11116
Mark Mueller93b938f2016-08-18 10:27:40 -060011117 VkSubmitInfo submit_info = {};
11118 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11119 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011120 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060011121
Mark Mueller4042b652016-09-05 22:52:21 -060011122 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011123 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
11124 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
11125 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070011126 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060011127 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060011128 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
11129 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060011130
Dave Houltonfbf52152017-01-06 12:55:29 -070011131 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060011132 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070011133 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060011134
Mark Mueller4042b652016-09-05 22:52:21 -060011135 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060011136 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011137 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060011138
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011139 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
11140 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060011141 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060011142 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
11143 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070011144
11145 vkQueueWaitIdle(m_device->m_queue);
Mark Mueller93b938f2016-08-18 10:27:40 -060011146}
11147
Tobin Ehlisb093da82017-01-19 12:05:27 -070011148TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
11149 TEST_DESCRIPTION("Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
11150 "disabled on the device.");
11151
11152 ASSERT_NO_FATAL_FAILURE(InitState());
11153 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11154
11155 std::vector<const char *> device_extension_names;
11156 auto features = m_device->phy().features();
11157 // Make sure gs & ts are disabled
11158 features.geometryShader = false;
11159 features.tessellationShader = false;
11160 // The sacrificial device object
11161 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
11162
11163 VkCommandPoolCreateInfo pool_create_info{};
11164 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
11165 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
11166
11167 VkCommandPool command_pool;
11168 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
11169
11170 VkCommandBufferAllocateInfo cmd = {};
11171 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
11172 cmd.pNext = NULL;
11173 cmd.commandPool = command_pool;
11174 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
11175 cmd.commandBufferCount = 1;
11176
11177 VkCommandBuffer cmd_buffer;
11178 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
11179 ASSERT_VK_SUCCESS(err);
11180
11181 VkEvent event;
11182 VkEventCreateInfo evci = {};
11183 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11184 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
11185 ASSERT_VK_SUCCESS(result);
11186
11187 VkCommandBufferBeginInfo cbbi = {};
11188 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11189 vkBeginCommandBuffer(cmd_buffer, &cbbi);
11190 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
11191 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
11192 m_errorMonitor->VerifyFound();
11193
11194 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
11195 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
11196 m_errorMonitor->VerifyFound();
11197
11198 vkDestroyEvent(test_device.handle(), event, NULL);
11199 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
11200}
11201
Mark Mueller917f6bc2016-08-30 10:57:19 -060011202TEST_F(VkLayerTest, InUseDestroyedSignaled) {
11203 TEST_DESCRIPTION("Use vkCmdExecuteCommands with invalid state "
11204 "in primary and secondary command buffers. "
Mark Muellerc8d441e2016-08-23 17:36:00 -060011205 "Delete objects that are inuse. Call VkQueueSubmit "
11206 "with an event that has been deleted.");
Mark Mueller917f6bc2016-08-30 10:57:19 -060011207
11208 ASSERT_NO_FATAL_FAILURE(InitState());
11209 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11210
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011211 const char *submit_with_deleted_event_message = "Cannot submit cmd buffer using deleted event 0x";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011212 const char *cannot_destroy_fence_message = "Fence 0x";
Mark Mueller917f6bc2016-08-30 10:57:19 -060011213
Tony Barbour552f6c02016-12-21 14:34:07 -070011214 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060011215
11216 VkEvent event;
11217 VkEventCreateInfo event_create_info = {};
11218 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11219 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011220 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011221
Tony Barbour552f6c02016-12-21 14:34:07 -070011222 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060011223 vkDestroyEvent(m_device->device(), event, nullptr);
11224
11225 VkSubmitInfo submit_info = {};
11226 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11227 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011228 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11229 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, submit_with_deleted_event_message);
Mark Muellerc8d441e2016-08-23 17:36:00 -060011230 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11231 m_errorMonitor->VerifyFound();
11232
Dave Houltonfbf52152017-01-06 12:55:29 -070011233 m_errorMonitor->ExpectSuccess(0); // disable all log message processing with flags==0
Mark Muellerc8d441e2016-08-23 17:36:00 -060011234 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
11235
11236 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11237
Mark Mueller917f6bc2016-08-30 10:57:19 -060011238 VkSemaphoreCreateInfo semaphore_create_info = {};
11239 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
11240 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011241 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011242 VkFenceCreateInfo fence_create_info = {};
11243 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
11244 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011245 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011246
11247 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060011248 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011249 descriptor_pool_type_count.descriptorCount = 1;
11250
11251 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
11252 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11253 descriptor_pool_create_info.maxSets = 1;
11254 descriptor_pool_create_info.poolSizeCount = 1;
11255 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011256 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011257
11258 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011259 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011260
11261 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060011262 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011263 descriptorset_layout_binding.descriptorCount = 1;
11264 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
11265
11266 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011267 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011268 descriptorset_layout_create_info.bindingCount = 1;
11269 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
11270
11271 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011272 ASSERT_VK_SUCCESS(
11273 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011274
11275 VkDescriptorSet descriptorset;
11276 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011277 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011278 descriptorset_allocate_info.descriptorSetCount = 1;
11279 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
11280 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011281 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011282
Mark Mueller4042b652016-09-05 22:52:21 -060011283 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
11284
11285 VkDescriptorBufferInfo buffer_info = {};
11286 buffer_info.buffer = buffer_test.GetBuffer();
11287 buffer_info.offset = 0;
11288 buffer_info.range = 1024;
11289
11290 VkWriteDescriptorSet write_descriptor_set = {};
11291 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11292 write_descriptor_set.dstSet = descriptorset;
11293 write_descriptor_set.descriptorCount = 1;
11294 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11295 write_descriptor_set.pBufferInfo = &buffer_info;
11296
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011297 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060011298
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011299 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11300 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011301
11302 VkPipelineObj pipe(m_device);
11303 pipe.AddColorAttachment();
11304 pipe.AddShader(&vs);
11305 pipe.AddShader(&fs);
11306
11307 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011308 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011309 pipeline_layout_create_info.setLayoutCount = 1;
11310 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
11311
11312 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011313 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011314
11315 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
11316
Tony Barbour552f6c02016-12-21 14:34:07 -070011317 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011318 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060011319
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011320 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11321 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
11322 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011323
Tony Barbour552f6c02016-12-21 14:34:07 -070011324 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060011325
Mark Mueller917f6bc2016-08-30 10:57:19 -060011326 submit_info.signalSemaphoreCount = 1;
11327 submit_info.pSignalSemaphores = &semaphore;
11328 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Dave Houltonfbf52152017-01-06 12:55:29 -070011329 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060011330
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011331 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011332 vkDestroyEvent(m_device->device(), event, nullptr);
11333 m_errorMonitor->VerifyFound();
11334
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011336 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
11337 m_errorMonitor->VerifyFound();
11338
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011339 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, cannot_destroy_fence_message);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011340 vkDestroyFence(m_device->device(), fence, nullptr);
11341 m_errorMonitor->VerifyFound();
11342
Tobin Ehlis122207b2016-09-01 08:50:06 -070011343 vkQueueWaitIdle(m_device->m_queue);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011344 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
11345 vkDestroyFence(m_device->device(), fence, nullptr);
11346 vkDestroyEvent(m_device->device(), event, nullptr);
11347 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011348 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011349 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
11350}
11351
Tobin Ehlis2adda372016-09-01 08:51:06 -070011352TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
11353 TEST_DESCRIPTION("Delete in-use query pool.");
11354
11355 ASSERT_NO_FATAL_FAILURE(InitState());
11356 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11357
11358 VkQueryPool query_pool;
11359 VkQueryPoolCreateInfo query_pool_ci{};
11360 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11361 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
11362 query_pool_ci.queryCount = 1;
11363 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070011364 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070011365 // Reset query pool to create binding with cmd buffer
11366 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
11367
Tony Barbour552f6c02016-12-21 14:34:07 -070011368 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070011369
11370 VkSubmitInfo submit_info = {};
11371 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11372 submit_info.commandBufferCount = 1;
11373 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11374 // Submit cmd buffer and then destroy query pool while in-flight
11375 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11376
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011377 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070011378 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
11379 m_errorMonitor->VerifyFound();
11380
11381 vkQueueWaitIdle(m_device->m_queue);
11382 // Now that cmd buffer done we can safely destroy query_pool
11383 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
11384}
11385
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011386TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
11387 TEST_DESCRIPTION("Delete in-use pipeline.");
11388
11389 ASSERT_NO_FATAL_FAILURE(InitState());
11390 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11391
11392 // Empty pipeline layout used for binding PSO
11393 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11394 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11395 pipeline_layout_ci.setLayoutCount = 0;
11396 pipeline_layout_ci.pSetLayouts = NULL;
11397
11398 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011399 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011400 ASSERT_VK_SUCCESS(err);
11401
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011402 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011403 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011404 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11405 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011406 // Store pipeline handle so we can actually delete it before test finishes
11407 VkPipeline delete_this_pipeline;
11408 { // Scope pipeline so it will be auto-deleted
11409 VkPipelineObj pipe(m_device);
11410 pipe.AddShader(&vs);
11411 pipe.AddShader(&fs);
11412 pipe.AddColorAttachment();
11413 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11414 delete_this_pipeline = pipe.handle();
11415
Tony Barbour552f6c02016-12-21 14:34:07 -070011416 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011417 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011418 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011419
Tony Barbour552f6c02016-12-21 14:34:07 -070011420 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011421
11422 VkSubmitInfo submit_info = {};
11423 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11424 submit_info.commandBufferCount = 1;
11425 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11426 // Submit cmd buffer and then pipeline destroyed while in-flight
11427 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11428 } // Pipeline deletion triggered here
11429 m_errorMonitor->VerifyFound();
11430 // Make sure queue finished and then actually delete pipeline
11431 vkQueueWaitIdle(m_device->m_queue);
11432 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
11433 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
11434}
11435
Tobin Ehlis7d965da2016-09-19 16:15:45 -060011436TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
11437 TEST_DESCRIPTION("Delete in-use imageView.");
11438
11439 ASSERT_NO_FATAL_FAILURE(InitState());
11440 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11441
11442 VkDescriptorPoolSize ds_type_count;
11443 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11444 ds_type_count.descriptorCount = 1;
11445
11446 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11447 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11448 ds_pool_ci.maxSets = 1;
11449 ds_pool_ci.poolSizeCount = 1;
11450 ds_pool_ci.pPoolSizes = &ds_type_count;
11451
11452 VkDescriptorPool ds_pool;
11453 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11454 ASSERT_VK_SUCCESS(err);
11455
11456 VkSamplerCreateInfo sampler_ci = {};
11457 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11458 sampler_ci.pNext = NULL;
11459 sampler_ci.magFilter = VK_FILTER_NEAREST;
11460 sampler_ci.minFilter = VK_FILTER_NEAREST;
11461 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11462 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11463 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11464 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11465 sampler_ci.mipLodBias = 1.0;
11466 sampler_ci.anisotropyEnable = VK_FALSE;
11467 sampler_ci.maxAnisotropy = 1;
11468 sampler_ci.compareEnable = VK_FALSE;
11469 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11470 sampler_ci.minLod = 1.0;
11471 sampler_ci.maxLod = 1.0;
11472 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11473 sampler_ci.unnormalizedCoordinates = VK_FALSE;
11474 VkSampler sampler;
11475
11476 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
11477 ASSERT_VK_SUCCESS(err);
11478
11479 VkDescriptorSetLayoutBinding layout_binding;
11480 layout_binding.binding = 0;
11481 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11482 layout_binding.descriptorCount = 1;
11483 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
11484 layout_binding.pImmutableSamplers = NULL;
11485
11486 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11487 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11488 ds_layout_ci.bindingCount = 1;
11489 ds_layout_ci.pBindings = &layout_binding;
11490 VkDescriptorSetLayout ds_layout;
11491 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
11492 ASSERT_VK_SUCCESS(err);
11493
11494 VkDescriptorSetAllocateInfo alloc_info = {};
11495 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11496 alloc_info.descriptorSetCount = 1;
11497 alloc_info.descriptorPool = ds_pool;
11498 alloc_info.pSetLayouts = &ds_layout;
11499 VkDescriptorSet descriptor_set;
11500 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
11501 ASSERT_VK_SUCCESS(err);
11502
11503 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11504 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11505 pipeline_layout_ci.pNext = NULL;
11506 pipeline_layout_ci.setLayoutCount = 1;
11507 pipeline_layout_ci.pSetLayouts = &ds_layout;
11508
11509 VkPipelineLayout pipeline_layout;
11510 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
11511 ASSERT_VK_SUCCESS(err);
11512
11513 VkImageObj image(m_device);
11514 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
11515 ASSERT_TRUE(image.initialized());
11516
11517 VkImageView view;
11518 VkImageViewCreateInfo ivci = {};
11519 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
11520 ivci.image = image.handle();
11521 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
11522 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
11523 ivci.subresourceRange.layerCount = 1;
11524 ivci.subresourceRange.baseMipLevel = 0;
11525 ivci.subresourceRange.levelCount = 1;
11526 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11527
11528 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
11529 ASSERT_VK_SUCCESS(err);
11530
11531 VkDescriptorImageInfo image_info{};
11532 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11533 image_info.imageView = view;
11534 image_info.sampler = sampler;
11535
11536 VkWriteDescriptorSet descriptor_write = {};
11537 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11538 descriptor_write.dstSet = descriptor_set;
11539 descriptor_write.dstBinding = 0;
11540 descriptor_write.descriptorCount = 1;
11541 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11542 descriptor_write.pImageInfo = &image_info;
11543
11544 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11545
11546 // Create PSO to use the sampler
11547 char const *vsSource = "#version 450\n"
11548 "\n"
11549 "out gl_PerVertex { \n"
11550 " vec4 gl_Position;\n"
11551 "};\n"
11552 "void main(){\n"
11553 " gl_Position = vec4(1);\n"
11554 "}\n";
11555 char const *fsSource = "#version 450\n"
11556 "\n"
11557 "layout(set=0, binding=0) uniform sampler2D s;\n"
11558 "layout(location=0) out vec4 x;\n"
11559 "void main(){\n"
11560 " x = texture(s, vec2(1));\n"
11561 "}\n";
11562 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11563 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11564 VkPipelineObj pipe(m_device);
11565 pipe.AddShader(&vs);
11566 pipe.AddShader(&fs);
11567 pipe.AddColorAttachment();
11568 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11569
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011570 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060011571
Tony Barbour552f6c02016-12-21 14:34:07 -070011572 m_commandBuffer->BeginCommandBuffer();
11573 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060011574 // Bind pipeline to cmd buffer
11575 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11576 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
11577 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070011578
11579 VkViewport viewport = {0, 0, 16, 16, 0, 1};
11580 VkRect2D scissor = {{0, 0}, {16, 16}};
11581 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
11582 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
11583
Tobin Ehlis7d965da2016-09-19 16:15:45 -060011584 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070011585 m_commandBuffer->EndRenderPass();
11586 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060011587 // Submit cmd buffer then destroy sampler
11588 VkSubmitInfo submit_info = {};
11589 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11590 submit_info.commandBufferCount = 1;
11591 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11592 // Submit cmd buffer and then destroy imageView while in-flight
11593 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11594
11595 vkDestroyImageView(m_device->device(), view, nullptr);
11596 m_errorMonitor->VerifyFound();
11597 vkQueueWaitIdle(m_device->m_queue);
11598 // Now we can actually destroy imageView
11599 vkDestroyImageView(m_device->device(), view, NULL);
11600 vkDestroySampler(m_device->device(), sampler, nullptr);
11601 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11602 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11603 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11604}
11605
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060011606TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
11607 TEST_DESCRIPTION("Delete in-use bufferView.");
11608
11609 ASSERT_NO_FATAL_FAILURE(InitState());
11610 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11611
11612 VkDescriptorPoolSize ds_type_count;
11613 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
11614 ds_type_count.descriptorCount = 1;
11615
11616 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11617 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11618 ds_pool_ci.maxSets = 1;
11619 ds_pool_ci.poolSizeCount = 1;
11620 ds_pool_ci.pPoolSizes = &ds_type_count;
11621
11622 VkDescriptorPool ds_pool;
11623 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11624 ASSERT_VK_SUCCESS(err);
11625
11626 VkDescriptorSetLayoutBinding layout_binding;
11627 layout_binding.binding = 0;
11628 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
11629 layout_binding.descriptorCount = 1;
11630 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
11631 layout_binding.pImmutableSamplers = NULL;
11632
11633 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11634 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11635 ds_layout_ci.bindingCount = 1;
11636 ds_layout_ci.pBindings = &layout_binding;
11637 VkDescriptorSetLayout ds_layout;
11638 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
11639 ASSERT_VK_SUCCESS(err);
11640
11641 VkDescriptorSetAllocateInfo alloc_info = {};
11642 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11643 alloc_info.descriptorSetCount = 1;
11644 alloc_info.descriptorPool = ds_pool;
11645 alloc_info.pSetLayouts = &ds_layout;
11646 VkDescriptorSet descriptor_set;
11647 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
11648 ASSERT_VK_SUCCESS(err);
11649
11650 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11651 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11652 pipeline_layout_ci.pNext = NULL;
11653 pipeline_layout_ci.setLayoutCount = 1;
11654 pipeline_layout_ci.pSetLayouts = &ds_layout;
11655
11656 VkPipelineLayout pipeline_layout;
11657 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
11658 ASSERT_VK_SUCCESS(err);
11659
11660 VkBuffer buffer;
11661 uint32_t queue_family_index = 0;
11662 VkBufferCreateInfo buffer_create_info = {};
11663 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
11664 buffer_create_info.size = 1024;
11665 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
11666 buffer_create_info.queueFamilyIndexCount = 1;
11667 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
11668
11669 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
11670 ASSERT_VK_SUCCESS(err);
11671
11672 VkMemoryRequirements memory_reqs;
11673 VkDeviceMemory buffer_memory;
11674
11675 VkMemoryAllocateInfo memory_info = {};
11676 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11677 memory_info.allocationSize = 0;
11678 memory_info.memoryTypeIndex = 0;
11679
11680 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
11681 memory_info.allocationSize = memory_reqs.size;
11682 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
11683 ASSERT_TRUE(pass);
11684
11685 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
11686 ASSERT_VK_SUCCESS(err);
11687 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
11688 ASSERT_VK_SUCCESS(err);
11689
11690 VkBufferView view;
11691 VkBufferViewCreateInfo bvci = {};
11692 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
11693 bvci.buffer = buffer;
11694 bvci.format = VK_FORMAT_R8_UNORM;
11695 bvci.range = VK_WHOLE_SIZE;
11696
11697 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
11698 ASSERT_VK_SUCCESS(err);
11699
11700 VkWriteDescriptorSet descriptor_write = {};
11701 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11702 descriptor_write.dstSet = descriptor_set;
11703 descriptor_write.dstBinding = 0;
11704 descriptor_write.descriptorCount = 1;
11705 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
11706 descriptor_write.pTexelBufferView = &view;
11707
11708 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11709
11710 char const *vsSource = "#version 450\n"
11711 "\n"
11712 "out gl_PerVertex { \n"
11713 " vec4 gl_Position;\n"
11714 "};\n"
11715 "void main(){\n"
11716 " gl_Position = vec4(1);\n"
11717 "}\n";
11718 char const *fsSource = "#version 450\n"
11719 "\n"
11720 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
11721 "layout(location=0) out vec4 x;\n"
11722 "void main(){\n"
11723 " x = imageLoad(s, 0);\n"
11724 "}\n";
11725 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11726 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11727 VkPipelineObj pipe(m_device);
11728 pipe.AddShader(&vs);
11729 pipe.AddShader(&fs);
11730 pipe.AddColorAttachment();
11731 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11732
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011733 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060011734
Tony Barbour552f6c02016-12-21 14:34:07 -070011735 m_commandBuffer->BeginCommandBuffer();
11736 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060011737 VkViewport viewport = {0, 0, 16, 16, 0, 1};
11738 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
11739 VkRect2D scissor = {{0, 0}, {16, 16}};
11740 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
11741 // Bind pipeline to cmd buffer
11742 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11743 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
11744 &descriptor_set, 0, nullptr);
11745 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070011746 m_commandBuffer->EndRenderPass();
11747 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060011748
11749 VkSubmitInfo submit_info = {};
11750 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11751 submit_info.commandBufferCount = 1;
11752 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11753 // Submit cmd buffer and then destroy bufferView while in-flight
11754 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11755
11756 vkDestroyBufferView(m_device->device(), view, nullptr);
11757 m_errorMonitor->VerifyFound();
11758 vkQueueWaitIdle(m_device->m_queue);
11759 // Now we can actually destroy bufferView
11760 vkDestroyBufferView(m_device->device(), view, NULL);
11761 vkDestroyBuffer(m_device->device(), buffer, NULL);
11762 vkFreeMemory(m_device->device(), buffer_memory, NULL);
11763 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11764 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11765 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11766}
11767
Tobin Ehlis209532e2016-09-07 13:52:18 -060011768TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
11769 TEST_DESCRIPTION("Delete in-use sampler.");
11770
11771 ASSERT_NO_FATAL_FAILURE(InitState());
11772 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11773
11774 VkDescriptorPoolSize ds_type_count;
11775 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11776 ds_type_count.descriptorCount = 1;
11777
11778 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11779 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11780 ds_pool_ci.maxSets = 1;
11781 ds_pool_ci.poolSizeCount = 1;
11782 ds_pool_ci.pPoolSizes = &ds_type_count;
11783
11784 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011785 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060011786 ASSERT_VK_SUCCESS(err);
11787
11788 VkSamplerCreateInfo sampler_ci = {};
11789 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11790 sampler_ci.pNext = NULL;
11791 sampler_ci.magFilter = VK_FILTER_NEAREST;
11792 sampler_ci.minFilter = VK_FILTER_NEAREST;
11793 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11794 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11795 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11796 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11797 sampler_ci.mipLodBias = 1.0;
11798 sampler_ci.anisotropyEnable = VK_FALSE;
11799 sampler_ci.maxAnisotropy = 1;
11800 sampler_ci.compareEnable = VK_FALSE;
11801 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11802 sampler_ci.minLod = 1.0;
11803 sampler_ci.maxLod = 1.0;
11804 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11805 sampler_ci.unnormalizedCoordinates = VK_FALSE;
11806 VkSampler sampler;
11807
11808 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
11809 ASSERT_VK_SUCCESS(err);
11810
11811 VkDescriptorSetLayoutBinding layout_binding;
11812 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060011813 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060011814 layout_binding.descriptorCount = 1;
11815 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
11816 layout_binding.pImmutableSamplers = NULL;
11817
11818 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11819 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11820 ds_layout_ci.bindingCount = 1;
11821 ds_layout_ci.pBindings = &layout_binding;
11822 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011823 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060011824 ASSERT_VK_SUCCESS(err);
11825
11826 VkDescriptorSetAllocateInfo alloc_info = {};
11827 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11828 alloc_info.descriptorSetCount = 1;
11829 alloc_info.descriptorPool = ds_pool;
11830 alloc_info.pSetLayouts = &ds_layout;
11831 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011832 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060011833 ASSERT_VK_SUCCESS(err);
11834
11835 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11836 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11837 pipeline_layout_ci.pNext = NULL;
11838 pipeline_layout_ci.setLayoutCount = 1;
11839 pipeline_layout_ci.pSetLayouts = &ds_layout;
11840
11841 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011842 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060011843 ASSERT_VK_SUCCESS(err);
11844
11845 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011846 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 -060011847 ASSERT_TRUE(image.initialized());
11848
11849 VkImageView view;
11850 VkImageViewCreateInfo ivci = {};
11851 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
11852 ivci.image = image.handle();
11853 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
11854 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
11855 ivci.subresourceRange.layerCount = 1;
11856 ivci.subresourceRange.baseMipLevel = 0;
11857 ivci.subresourceRange.levelCount = 1;
11858 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11859
11860 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
11861 ASSERT_VK_SUCCESS(err);
11862
11863 VkDescriptorImageInfo image_info{};
11864 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11865 image_info.imageView = view;
11866 image_info.sampler = sampler;
11867
11868 VkWriteDescriptorSet descriptor_write = {};
11869 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11870 descriptor_write.dstSet = descriptor_set;
11871 descriptor_write.dstBinding = 0;
11872 descriptor_write.descriptorCount = 1;
11873 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11874 descriptor_write.pImageInfo = &image_info;
11875
11876 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11877
11878 // Create PSO to use the sampler
11879 char const *vsSource = "#version 450\n"
11880 "\n"
11881 "out gl_PerVertex { \n"
11882 " vec4 gl_Position;\n"
11883 "};\n"
11884 "void main(){\n"
11885 " gl_Position = vec4(1);\n"
11886 "}\n";
11887 char const *fsSource = "#version 450\n"
11888 "\n"
11889 "layout(set=0, binding=0) uniform sampler2D s;\n"
11890 "layout(location=0) out vec4 x;\n"
11891 "void main(){\n"
11892 " x = texture(s, vec2(1));\n"
11893 "}\n";
11894 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11895 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11896 VkPipelineObj pipe(m_device);
11897 pipe.AddShader(&vs);
11898 pipe.AddShader(&fs);
11899 pipe.AddColorAttachment();
11900 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11901
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011902 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060011903
Tony Barbour552f6c02016-12-21 14:34:07 -070011904 m_commandBuffer->BeginCommandBuffer();
11905 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060011906 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011907 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11908 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
11909 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070011910
11911 VkViewport viewport = {0, 0, 16, 16, 0, 1};
11912 VkRect2D scissor = {{0, 0}, {16, 16}};
11913 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
11914 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
11915
Tobin Ehlis209532e2016-09-07 13:52:18 -060011916 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070011917 m_commandBuffer->EndRenderPass();
11918 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060011919 // Submit cmd buffer then destroy sampler
11920 VkSubmitInfo submit_info = {};
11921 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11922 submit_info.commandBufferCount = 1;
11923 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11924 // Submit cmd buffer and then destroy sampler while in-flight
11925 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11926
Rene Lindsay4da11732017-01-13 14:42:10 -070011927 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060011928 m_errorMonitor->VerifyFound();
11929 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070011930
Tobin Ehlis209532e2016-09-07 13:52:18 -060011931 // Now we can actually destroy sampler
Rene Lindsay4da11732017-01-13 14:42:10 -070011932 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060011933 vkDestroyImageView(m_device->device(), view, NULL);
11934 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11935 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11936 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11937}
11938
Mark Mueller1cd9f412016-08-25 13:23:52 -060011939TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Mueller96a56d52016-08-24 10:28:05 -060011940 TEST_DESCRIPTION("Call VkQueueSubmit with a semaphore that is already "
Mark Mueller1cd9f412016-08-25 13:23:52 -060011941 "signaled but not waited on by the queue. Wait on a "
11942 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060011943
11944 ASSERT_NO_FATAL_FAILURE(InitState());
11945 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11946
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011947 const char *queue_forward_progress_message = " that has already been signaled but not waited on by queue 0x";
11948 const char *invalid_fence_wait_message = " which has not been submitted on a Queue or during "
11949 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060011950
Tony Barbour552f6c02016-12-21 14:34:07 -070011951 m_commandBuffer->BeginCommandBuffer();
11952 m_commandBuffer->EndCommandBuffer();
Mark Mueller96a56d52016-08-24 10:28:05 -060011953
11954 VkSemaphoreCreateInfo semaphore_create_info = {};
11955 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
11956 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011957 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060011958 VkSubmitInfo submit_info = {};
11959 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11960 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011961 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060011962 submit_info.signalSemaphoreCount = 1;
11963 submit_info.pSignalSemaphores = &semaphore;
11964 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070011965 m_errorMonitor->ExpectSuccess(0);
Mark Mueller96a56d52016-08-24 10:28:05 -060011966 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Dave Houltonfbf52152017-01-06 12:55:29 -070011967 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070011968 m_commandBuffer->BeginCommandBuffer();
11969 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060011971 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11972 m_errorMonitor->VerifyFound();
11973
Mark Mueller1cd9f412016-08-25 13:23:52 -060011974 VkFenceCreateInfo fence_create_info = {};
11975 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
11976 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011977 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060011978
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011979 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060011980 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
11981 m_errorMonitor->VerifyFound();
11982
Mark Mueller4042b652016-09-05 22:52:21 -060011983 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060011984 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060011985 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
11986}
11987
Tobin Ehlis4af23302016-07-19 10:50:30 -060011988TEST_F(VkLayerTest, FramebufferIncompatible) {
11989 TEST_DESCRIPTION("Bind a secondary command buffer with with a framebuffer "
11990 "that does not match the framebuffer for the active "
11991 "renderpass.");
11992 ASSERT_NO_FATAL_FAILURE(InitState());
11993 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11994
11995 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011996 VkAttachmentDescription attachment = {0,
11997 VK_FORMAT_B8G8R8A8_UNORM,
11998 VK_SAMPLE_COUNT_1_BIT,
11999 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
12000 VK_ATTACHMENT_STORE_OP_STORE,
12001 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
12002 VK_ATTACHMENT_STORE_OP_DONT_CARE,
12003 VK_IMAGE_LAYOUT_UNDEFINED,
12004 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060012005
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012006 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060012007
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012008 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060012009
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012010 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060012011
12012 VkRenderPass rp;
12013 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
12014 ASSERT_VK_SUCCESS(err);
12015
12016 // A compatible framebuffer.
12017 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012018 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 -060012019 ASSERT_TRUE(image.initialized());
12020
12021 VkImageViewCreateInfo ivci = {
12022 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
12023 nullptr,
12024 0,
12025 image.handle(),
12026 VK_IMAGE_VIEW_TYPE_2D,
12027 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012028 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
12029 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060012030 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
12031 };
12032 VkImageView view;
12033 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
12034 ASSERT_VK_SUCCESS(err);
12035
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012036 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060012037 VkFramebuffer fb;
12038 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
12039 ASSERT_VK_SUCCESS(err);
12040
12041 VkCommandBufferAllocateInfo cbai = {};
12042 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12043 cbai.commandPool = m_commandPool;
12044 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12045 cbai.commandBufferCount = 1;
12046
12047 VkCommandBuffer sec_cb;
12048 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
12049 ASSERT_VK_SUCCESS(err);
12050 VkCommandBufferBeginInfo cbbi = {};
12051 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130012052 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060012053 cbii.renderPass = renderPass();
12054 cbii.framebuffer = fb;
12055 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12056 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012057 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 -060012058 cbbi.pInheritanceInfo = &cbii;
12059 vkBeginCommandBuffer(sec_cb, &cbbi);
12060 vkEndCommandBuffer(sec_cb);
12061
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070012062 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120012063 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
12064 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060012065
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012066 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060012067 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060012068 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
12069 m_errorMonitor->VerifyFound();
12070 // Cleanup
12071 vkDestroyImageView(m_device->device(), view, NULL);
12072 vkDestroyRenderPass(m_device->device(), rp, NULL);
12073 vkDestroyFramebuffer(m_device->device(), fb, NULL);
12074}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012075
12076TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
12077 TEST_DESCRIPTION("If logicOp is available on the device, set it to an "
12078 "invalid value. If logicOp is not available, attempt to "
12079 "use it and verify that we see the correct error.");
12080 ASSERT_NO_FATAL_FAILURE(InitState());
12081 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12082
12083 auto features = m_device->phy().features();
12084 // Set the expected error depending on whether or not logicOp available
12085 if (VK_FALSE == features.logicOp) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012086 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "If logic operations feature not "
12087 "enabled, logicOpEnable must be "
12088 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012089 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130012090 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012091 }
12092 // Create a pipeline using logicOp
12093 VkResult err;
12094
12095 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12096 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12097
12098 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012099 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012100 ASSERT_VK_SUCCESS(err);
12101
12102 VkPipelineViewportStateCreateInfo vp_state_ci = {};
12103 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
12104 vp_state_ci.viewportCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012105 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012106 vp_state_ci.pViewports = &vp;
12107 vp_state_ci.scissorCount = 1;
12108 VkRect2D scissors = {}; // Dummy scissors to point to
12109 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012110
12111 VkPipelineShaderStageCreateInfo shaderStages[2];
12112 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
12113
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012114 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12115 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012116 shaderStages[0] = vs.GetStageCreateInfo();
12117 shaderStages[1] = fs.GetStageCreateInfo();
12118
12119 VkPipelineVertexInputStateCreateInfo vi_ci = {};
12120 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
12121
12122 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
12123 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
12124 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
12125
12126 VkPipelineRasterizationStateCreateInfo rs_ci = {};
12127 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130012128 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012129
12130 VkPipelineColorBlendAttachmentState att = {};
12131 att.blendEnable = VK_FALSE;
12132 att.colorWriteMask = 0xf;
12133
12134 VkPipelineColorBlendStateCreateInfo cb_ci = {};
12135 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
12136 // Enable logicOp & set logicOp to value 1 beyond allowed entries
12137 cb_ci.logicOpEnable = VK_TRUE;
12138 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
12139 cb_ci.attachmentCount = 1;
12140 cb_ci.pAttachments = &att;
12141
Chris Forbes8aeacbf2016-10-03 14:25:08 +130012142 VkPipelineMultisampleStateCreateInfo ms_ci = {};
12143 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
12144 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12145
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012146 VkGraphicsPipelineCreateInfo gp_ci = {};
12147 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
12148 gp_ci.stageCount = 2;
12149 gp_ci.pStages = shaderStages;
12150 gp_ci.pVertexInputState = &vi_ci;
12151 gp_ci.pInputAssemblyState = &ia_ci;
12152 gp_ci.pViewportState = &vp_state_ci;
12153 gp_ci.pRasterizationState = &rs_ci;
12154 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130012155 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012156 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
12157 gp_ci.layout = pipeline_layout;
12158 gp_ci.renderPass = renderPass();
12159
12160 VkPipelineCacheCreateInfo pc_ci = {};
12161 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
12162
12163 VkPipeline pipeline;
12164 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012165 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012166 ASSERT_VK_SUCCESS(err);
12167
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012168 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012169 m_errorMonitor->VerifyFound();
12170 if (VK_SUCCESS == err) {
12171 vkDestroyPipeline(m_device->device(), pipeline, NULL);
12172 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060012173 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
12174 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12175}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012176#endif // DRAW_STATE_TESTS
12177
Tobin Ehlis0788f522015-05-26 16:11:58 -060012178#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -060012179#if GTEST_IS_THREADSAFE
12180struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012181 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012182 VkEvent event;
12183 bool bailout;
12184};
12185
Karl Schultz6addd812016-02-02 17:17:23 -070012186extern "C" void *AddToCommandBuffer(void *arg) {
12187 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012188
Mike Stroyana6d14942016-07-13 15:10:05 -060012189 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012190 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012191 if (data->bailout) {
12192 break;
12193 }
12194 }
12195 return NULL;
12196}
12197
Karl Schultz6addd812016-02-02 17:17:23 -070012198TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012199 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012200
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012202
Mike Stroyanaccf7692015-05-12 16:00:45 -060012203 ASSERT_NO_FATAL_FAILURE(InitState());
12204 ASSERT_NO_FATAL_FAILURE(InitViewport());
12205 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12206
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012207 // Calls AllocateCommandBuffers
12208 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060012209
12210 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012211 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012212
12213 VkEventCreateInfo event_info;
12214 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012215 VkResult err;
12216
12217 memset(&event_info, 0, sizeof(event_info));
12218 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12219
Chia-I Wuf7458c52015-10-26 21:10:41 +080012220 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012221 ASSERT_VK_SUCCESS(err);
12222
Mike Stroyanaccf7692015-05-12 16:00:45 -060012223 err = vkResetEvent(device(), event);
12224 ASSERT_VK_SUCCESS(err);
12225
12226 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012227 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012228 data.event = event;
12229 data.bailout = false;
12230 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060012231
12232 // First do some correct operations using multiple threads.
12233 // Add many entries to command buffer from another thread.
12234 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
12235 // Make non-conflicting calls from this thread at the same time.
12236 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060012237 uint32_t count;
12238 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060012239 }
12240 test_platform_thread_join(thread, NULL);
12241
12242 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060012243 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012244 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012245 // Add many entries to command buffer from this thread at the same time.
12246 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060012247
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012248 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012249 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012250
Mike Stroyan10b8cb72016-01-22 15:22:03 -070012251 m_errorMonitor->SetBailout(NULL);
12252
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012253 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012254
Chia-I Wuf7458c52015-10-26 21:10:41 +080012255 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012256}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012257#endif // GTEST_IS_THREADSAFE
12258#endif // THREADING_TESTS
12259
Chris Forbes9f7ff632015-05-25 11:13:08 +120012260#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070012261TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012262 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
12263 "with an impossible code size");
12264
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012265 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012266
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012267 ASSERT_NO_FATAL_FAILURE(InitState());
12268 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12269
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012270 VkShaderModule module;
12271 VkShaderModuleCreateInfo moduleCreateInfo;
12272 struct icd_spv_header spv;
12273
12274 spv.magic = ICD_SPV_MAGIC;
12275 spv.version = ICD_SPV_VERSION;
12276 spv.gen_magic = 0;
12277
12278 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12279 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070012280 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012281 moduleCreateInfo.codeSize = 4;
12282 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012283 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012284
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012285 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012286}
12287
Karl Schultz6addd812016-02-02 17:17:23 -070012288TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012289 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
12290 "with a bad magic number");
12291
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012292 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012293
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012294 ASSERT_NO_FATAL_FAILURE(InitState());
12295 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12296
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012297 VkShaderModule module;
12298 VkShaderModuleCreateInfo moduleCreateInfo;
12299 struct icd_spv_header spv;
12300
12301 spv.magic = ~ICD_SPV_MAGIC;
12302 spv.version = ICD_SPV_VERSION;
12303 spv.gen_magic = 0;
12304
12305 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12306 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070012307 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012308 moduleCreateInfo.codeSize = sizeof(spv) + 10;
12309 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012310 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012311
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012312 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012313}
12314
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012315#if 0
12316// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070012317TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012318 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012319 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012320
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012321 ASSERT_NO_FATAL_FAILURE(InitState());
12322 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12323
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012324 VkShaderModule module;
12325 VkShaderModuleCreateInfo moduleCreateInfo;
12326 struct icd_spv_header spv;
12327
12328 spv.magic = ICD_SPV_MAGIC;
12329 spv.version = ~ICD_SPV_VERSION;
12330 spv.gen_magic = 0;
12331
12332 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12333 moduleCreateInfo.pNext = NULL;
12334
Karl Schultz6addd812016-02-02 17:17:23 -070012335 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012336 moduleCreateInfo.codeSize = sizeof(spv) + 10;
12337 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012338 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012339
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012340 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012341}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012342#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012343
Karl Schultz6addd812016-02-02 17:17:23 -070012344TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012345 TEST_DESCRIPTION("Test that a warning is produced for a vertex output that "
12346 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012347 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012348
Chris Forbes9f7ff632015-05-25 11:13:08 +120012349 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012350 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120012351
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012352 char const *vsSource = "#version 450\n"
12353 "\n"
12354 "layout(location=0) out float x;\n"
12355 "out gl_PerVertex {\n"
12356 " vec4 gl_Position;\n"
12357 "};\n"
12358 "void main(){\n"
12359 " gl_Position = vec4(1);\n"
12360 " x = 0;\n"
12361 "}\n";
12362 char const *fsSource = "#version 450\n"
12363 "\n"
12364 "layout(location=0) out vec4 color;\n"
12365 "void main(){\n"
12366 " color = vec4(1);\n"
12367 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120012368
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012369 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12370 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120012371
12372 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012373 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120012374 pipe.AddShader(&vs);
12375 pipe.AddShader(&fs);
12376
Chris Forbes9f7ff632015-05-25 11:13:08 +120012377 VkDescriptorSetObj descriptorSet(m_device);
12378 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012379 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120012380
Tony Barbour5781e8f2015-08-04 16:23:11 -060012381 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120012382
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012383 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120012384}
Chris Forbes9f7ff632015-05-25 11:13:08 +120012385
Mark Mueller098c9cb2016-09-08 09:01:57 -060012386TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
12387 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
12388
12389 ASSERT_NO_FATAL_FAILURE(InitState());
12390 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12391
12392 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070012393 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060012394
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070012395 char const *vsSource = "#version 450\n"
12396 "\n"
12397 "out gl_PerVertex {\n"
12398 " vec4 gl_Position;\n"
12399 "};\n"
12400 "void main(){\n"
12401 " gl_Position = vec4(1);\n"
12402 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060012403
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070012404 char const *fsSource = "#version 450\n"
12405 "\n"
12406 "layout (constant_id = 0) const float r = 0.0f;\n"
12407 "layout(location = 0) out vec4 uFragColor;\n"
12408 "void main(){\n"
12409 " uFragColor = vec4(r,1,0,1);\n"
12410 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060012411
12412 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12413 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12414
12415 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12416 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12417
12418 VkPipelineLayout pipeline_layout;
12419 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12420
12421 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
12422 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
12423 vp_state_create_info.viewportCount = 1;
12424 VkViewport viewport = {};
12425 vp_state_create_info.pViewports = &viewport;
12426 vp_state_create_info.scissorCount = 1;
12427 VkRect2D scissors = {};
12428 vp_state_create_info.pScissors = &scissors;
12429
12430 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
12431
12432 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
12433 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
12434 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
12435 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
12436
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070012437 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060012438
12439 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
12440 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
12441
12442 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
12443 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
12444 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
12445
12446 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
12447 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
12448 rasterization_state_create_info.pNext = nullptr;
12449 rasterization_state_create_info.lineWidth = 1.0f;
12450 rasterization_state_create_info.rasterizerDiscardEnable = true;
12451
12452 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
12453 color_blend_attachment_state.blendEnable = VK_FALSE;
12454 color_blend_attachment_state.colorWriteMask = 0xf;
12455
12456 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
12457 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
12458 color_blend_state_create_info.attachmentCount = 1;
12459 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
12460
12461 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
12462 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
12463 graphicspipe_create_info.stageCount = 2;
12464 graphicspipe_create_info.pStages = shader_stage_create_info;
12465 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
12466 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
12467 graphicspipe_create_info.pViewportState = &vp_state_create_info;
12468 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
12469 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
12470 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
12471 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
12472 graphicspipe_create_info.layout = pipeline_layout;
12473 graphicspipe_create_info.renderPass = renderPass();
12474
12475 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
12476 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
12477
12478 VkPipelineCache pipelineCache;
12479 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
12480
12481 // This structure maps constant ids to data locations.
12482 const VkSpecializationMapEntry entry =
12483 // id, offset, size
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070012484 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060012485
12486 uint32_t data = 1;
12487
12488 // Set up the info describing spec map and data
12489 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070012490 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060012491 };
12492 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
12493
12494 VkPipeline pipeline;
12495 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
12496 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
12497 m_errorMonitor->VerifyFound();
12498
12499 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
12500 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12501}
12502
12503TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
12504 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
12505
12506 ASSERT_NO_FATAL_FAILURE(InitState());
12507 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12508
12509 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
12510
12511 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
12512 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12513 descriptor_pool_type_count[0].descriptorCount = 1;
12514 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
12515 descriptor_pool_type_count[1].descriptorCount = 1;
12516
12517 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12518 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12519 descriptor_pool_create_info.maxSets = 1;
12520 descriptor_pool_create_info.poolSizeCount = 2;
12521 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
12522 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12523
12524 VkDescriptorPool descriptorset_pool;
12525 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
12526
12527 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
12528 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
12529 descriptorset_layout_binding.descriptorCount = 1;
12530 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
12531
12532 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
12533 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12534 descriptorset_layout_create_info.bindingCount = 1;
12535 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12536
12537 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070012538 ASSERT_VK_SUCCESS(
12539 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060012540
12541 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
12542 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12543 descriptorset_allocate_info.descriptorSetCount = 1;
12544 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12545 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
12546 VkDescriptorSet descriptorset;
12547 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
12548
12549 // Challenge core_validation with a non uniform buffer type.
12550 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
12551
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070012552 char const *vsSource = "#version 450\n"
12553 "\n"
12554 "layout (std140, set = 0, binding = 0) uniform buf {\n"
12555 " mat4 mvp;\n"
12556 "} ubuf;\n"
12557 "out gl_PerVertex {\n"
12558 " vec4 gl_Position;\n"
12559 "};\n"
12560 "void main(){\n"
12561 " gl_Position = ubuf.mvp * vec4(1);\n"
12562 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060012563
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070012564 char const *fsSource = "#version 450\n"
12565 "\n"
12566 "layout(location = 0) out vec4 uFragColor;\n"
12567 "void main(){\n"
12568 " uFragColor = vec4(0,1,0,1);\n"
12569 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060012570
12571 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12572 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12573
12574 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12575 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12576 pipeline_layout_create_info.setLayoutCount = 1;
12577 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12578
12579 VkPipelineLayout pipeline_layout;
12580 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12581
12582 VkPipelineObj pipe(m_device);
12583 pipe.AddColorAttachment();
12584 pipe.AddShader(&vs);
12585 pipe.AddShader(&fs);
12586
12587 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
12588 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12589 m_errorMonitor->VerifyFound();
12590
12591 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12592 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
12593 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
12594}
12595
12596TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
12597 TEST_DESCRIPTION(
12598 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
12599
12600 ASSERT_NO_FATAL_FAILURE(InitState());
12601 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12602
12603 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
12604
12605 VkDescriptorPoolSize descriptor_pool_type_count = {};
12606 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12607 descriptor_pool_type_count.descriptorCount = 1;
12608
12609 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12610 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12611 descriptor_pool_create_info.maxSets = 1;
12612 descriptor_pool_create_info.poolSizeCount = 1;
12613 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
12614 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12615
12616 VkDescriptorPool descriptorset_pool;
12617 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
12618
12619 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
12620 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12621 descriptorset_layout_binding.descriptorCount = 1;
12622 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
12623 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12624
12625 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
12626 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12627 descriptorset_layout_create_info.bindingCount = 1;
12628 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12629
12630 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070012631 ASSERT_VK_SUCCESS(
12632 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060012633
12634 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
12635 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12636 descriptorset_allocate_info.descriptorSetCount = 1;
12637 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12638 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
12639 VkDescriptorSet descriptorset;
12640 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
12641
12642 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
12643
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070012644 char const *vsSource = "#version 450\n"
12645 "\n"
12646 "layout (std140, set = 0, binding = 0) uniform buf {\n"
12647 " mat4 mvp;\n"
12648 "} ubuf;\n"
12649 "out gl_PerVertex {\n"
12650 " vec4 gl_Position;\n"
12651 "};\n"
12652 "void main(){\n"
12653 " gl_Position = ubuf.mvp * vec4(1);\n"
12654 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060012655
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070012656 char const *fsSource = "#version 450\n"
12657 "\n"
12658 "layout(location = 0) out vec4 uFragColor;\n"
12659 "void main(){\n"
12660 " uFragColor = vec4(0,1,0,1);\n"
12661 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060012662
12663 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12664 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12665
12666 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12667 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12668 pipeline_layout_create_info.setLayoutCount = 1;
12669 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12670
12671 VkPipelineLayout pipeline_layout;
12672 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12673
12674 VkPipelineObj pipe(m_device);
12675 pipe.AddColorAttachment();
12676 pipe.AddShader(&vs);
12677 pipe.AddShader(&fs);
12678
12679 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
12680 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12681 m_errorMonitor->VerifyFound();
12682
12683 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12684 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
12685 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
12686}
12687
12688TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
12689 TEST_DESCRIPTION("Create a graphics pipleine in which a push constant range containing a push constant block member is not "
12690 "accessible from the current shader stage.");
12691
12692 ASSERT_NO_FATAL_FAILURE(InitState());
12693 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12694
12695 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070012696 "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 -060012697
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070012698 char const *vsSource = "#version 450\n"
12699 "\n"
12700 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
12701 "out gl_PerVertex {\n"
12702 " vec4 gl_Position;\n"
12703 "};\n"
12704 "void main(){\n"
12705 " gl_Position = vec4(consts.x);\n"
12706 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060012707
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070012708 char const *fsSource = "#version 450\n"
12709 "\n"
12710 "layout(location = 0) out vec4 uFragColor;\n"
12711 "void main(){\n"
12712 " uFragColor = vec4(0,1,0,1);\n"
12713 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060012714
12715 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12716 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12717
12718 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12719 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12720
12721 // Set up a push constant range
12722 VkPushConstantRange push_constant_ranges = {};
12723 // Set to the wrong stage to challenge core_validation
12724 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12725 push_constant_ranges.size = 4;
12726
12727 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
12728 pipeline_layout_create_info.pushConstantRangeCount = 1;
12729
12730 VkPipelineLayout pipeline_layout;
12731 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12732
12733 VkPipelineObj pipe(m_device);
12734 pipe.AddColorAttachment();
12735 pipe.AddShader(&vs);
12736 pipe.AddShader(&fs);
12737
12738 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
12739 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12740 m_errorMonitor->VerifyFound();
12741
12742 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12743}
12744
12745TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
12746 TEST_DESCRIPTION(
12747 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
12748
12749 ASSERT_NO_FATAL_FAILURE(InitState());
12750 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12751
12752 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070012753 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060012754
12755 // Some awkward steps are required to test with custom device features.
12756 std::vector<const char *> device_extension_names;
12757 auto features = m_device->phy().features();
12758 // Disable support for 64 bit floats
12759 features.shaderFloat64 = false;
12760 // The sacrificial device object
12761 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12762
12763 char const *vsSource = "#version 450\n"
12764 "\n"
12765 "out gl_PerVertex {\n"
12766 " vec4 gl_Position;\n"
12767 "};\n"
12768 "void main(){\n"
12769 " gl_Position = vec4(1);\n"
12770 "}\n";
12771 char const *fsSource = "#version 450\n"
12772 "\n"
12773 "layout(location=0) out vec4 color;\n"
12774 "void main(){\n"
12775 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
12776 " color = vec4(green);\n"
12777 "}\n";
12778
12779 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12780 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12781
12782 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060012783
12784 VkPipelineObj pipe(&test_device);
12785 pipe.AddColorAttachment();
12786 pipe.AddShader(&vs);
12787 pipe.AddShader(&fs);
12788
12789 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12790 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12791 VkPipelineLayout pipeline_layout;
12792 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12793
12794 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
12795 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
12796 m_errorMonitor->VerifyFound();
12797
12798 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
12799}
12800
12801TEST_F(VkLayerTest, CreatePipelineCheckShaderBadCapability) {
12802 TEST_DESCRIPTION("Create a graphics pipeline in which a capability declared by the shader is not supported by Vulkan shaders.");
12803
12804 ASSERT_NO_FATAL_FAILURE(InitState());
12805 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12806
12807 const char *bad_capability_message = "Shader declares capability 53, not supported in Vulkan.";
12808
12809 char const *vsSource = "#version 450\n"
12810 "\n"
12811 "out gl_PerVertex {\n"
12812 " vec4 gl_Position;\n"
12813 "};\n"
12814 "layout(xfb_buffer = 1) out;"
12815 "void main(){\n"
12816 " gl_Position = vec4(1);\n"
12817 "}\n";
12818 char const *fsSource = "#version 450\n"
12819 "\n"
12820 "layout(location=0) out vec4 color;\n"
12821 "void main(){\n"
12822 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
12823 " color = vec4(green);\n"
12824 "}\n";
12825
12826 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12827 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12828
12829 VkPipelineObj pipe(m_device);
12830 pipe.AddColorAttachment();
12831 pipe.AddShader(&vs);
12832 pipe.AddShader(&fs);
12833
12834 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12835 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12836 VkPipelineLayout pipeline_layout;
12837 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12838
12839 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_capability_message);
12840 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12841 m_errorMonitor->VerifyFound();
12842
12843 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12844}
12845
Karl Schultz6addd812016-02-02 17:17:23 -070012846TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012847 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
12848 "which is not present in the outputs of the previous stage");
12849
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012850 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012851
Chris Forbes59cb88d2015-05-25 11:13:13 +120012852 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012853 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120012854
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012855 char const *vsSource = "#version 450\n"
12856 "\n"
12857 "out gl_PerVertex {\n"
12858 " vec4 gl_Position;\n"
12859 "};\n"
12860 "void main(){\n"
12861 " gl_Position = vec4(1);\n"
12862 "}\n";
12863 char const *fsSource = "#version 450\n"
12864 "\n"
12865 "layout(location=0) in float x;\n"
12866 "layout(location=0) out vec4 color;\n"
12867 "void main(){\n"
12868 " color = vec4(x);\n"
12869 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120012870
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012871 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12872 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120012873
12874 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012875 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120012876 pipe.AddShader(&vs);
12877 pipe.AddShader(&fs);
12878
Chris Forbes59cb88d2015-05-25 11:13:13 +120012879 VkDescriptorSetObj descriptorSet(m_device);
12880 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012881 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120012882
Tony Barbour5781e8f2015-08-04 16:23:11 -060012883 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120012884
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012885 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120012886}
12887
Karl Schultz6addd812016-02-02 17:17:23 -070012888TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012889 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
12890 "within an interace block, which is not present in the outputs "
12891 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012893
12894 ASSERT_NO_FATAL_FAILURE(InitState());
12895 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12896
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012897 char const *vsSource = "#version 450\n"
12898 "\n"
12899 "out gl_PerVertex {\n"
12900 " vec4 gl_Position;\n"
12901 "};\n"
12902 "void main(){\n"
12903 " gl_Position = vec4(1);\n"
12904 "}\n";
12905 char const *fsSource = "#version 450\n"
12906 "\n"
12907 "in block { layout(location=0) float x; } ins;\n"
12908 "layout(location=0) out vec4 color;\n"
12909 "void main(){\n"
12910 " color = vec4(ins.x);\n"
12911 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130012912
12913 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12914 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12915
12916 VkPipelineObj pipe(m_device);
12917 pipe.AddColorAttachment();
12918 pipe.AddShader(&vs);
12919 pipe.AddShader(&fs);
12920
12921 VkDescriptorSetObj descriptorSet(m_device);
12922 descriptorSet.AppendDummy();
12923 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12924
12925 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12926
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012927 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130012928}
12929
Karl Schultz6addd812016-02-02 17:17:23 -070012930TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012931 TEST_DESCRIPTION("Test that an error is produced for mismatched array sizes "
Mike Weiblencce7ec72016-10-17 19:33:05 -060012932 "across the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012933 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0.0: 'ptr to "
12934 "output arr[2] of float32' vs 'ptr to "
Rene Lindsay479c2fa2017-01-10 11:43:26 -070012935 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130012936
12937 ASSERT_NO_FATAL_FAILURE(InitState());
12938 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12939
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012940 char const *vsSource = "#version 450\n"
12941 "\n"
12942 "layout(location=0) out float x[2];\n"
12943 "out gl_PerVertex {\n"
12944 " vec4 gl_Position;\n"
12945 "};\n"
12946 "void main(){\n"
12947 " x[0] = 0; x[1] = 0;\n"
12948 " gl_Position = vec4(1);\n"
12949 "}\n";
12950 char const *fsSource = "#version 450\n"
12951 "\n"
Rene Lindsay479c2fa2017-01-10 11:43:26 -070012952 "layout(location=0) in float x[1];\n"
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012953 "layout(location=0) out vec4 color;\n"
12954 "void main(){\n"
Rene Lindsay479c2fa2017-01-10 11:43:26 -070012955 " color = vec4(x[0]);\n"
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012956 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130012957
12958 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12959 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12960
12961 VkPipelineObj pipe(m_device);
12962 pipe.AddColorAttachment();
12963 pipe.AddShader(&vs);
12964 pipe.AddShader(&fs);
12965
12966 VkDescriptorSetObj descriptorSet(m_device);
12967 descriptorSet.AppendDummy();
12968 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12969
12970 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12971
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012972 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130012973}
12974
Karl Schultz6addd812016-02-02 17:17:23 -070012975TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012976 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
Mike Weiblencce7ec72016-10-17 19:33:05 -060012977 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012978 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012979
Chris Forbesb56af562015-05-25 11:13:17 +120012980 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012981 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120012982
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012983 char const *vsSource = "#version 450\n"
12984 "\n"
12985 "layout(location=0) out int x;\n"
12986 "out gl_PerVertex {\n"
12987 " vec4 gl_Position;\n"
12988 "};\n"
12989 "void main(){\n"
12990 " x = 0;\n"
12991 " gl_Position = vec4(1);\n"
12992 "}\n";
12993 char const *fsSource = "#version 450\n"
12994 "\n"
12995 "layout(location=0) in float x;\n" /* VS writes int */
12996 "layout(location=0) out vec4 color;\n"
12997 "void main(){\n"
12998 " color = vec4(x);\n"
12999 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120013000
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013001 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13002 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120013003
13004 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013005 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120013006 pipe.AddShader(&vs);
13007 pipe.AddShader(&fs);
13008
Chris Forbesb56af562015-05-25 11:13:17 +120013009 VkDescriptorSetObj descriptorSet(m_device);
13010 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013011 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120013012
Tony Barbour5781e8f2015-08-04 16:23:11 -060013013 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120013014
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013015 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120013016}
13017
Karl Schultz6addd812016-02-02 17:17:23 -070013018TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013019 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
Mike Weiblencce7ec72016-10-17 19:33:05 -060013020 "the vertex->fragment shader interface, when the variable is contained within "
Chris Forbes1cc79542016-07-20 11:13:44 +120013021 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013022 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013023
13024 ASSERT_NO_FATAL_FAILURE(InitState());
13025 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13026
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013027 char const *vsSource = "#version 450\n"
13028 "\n"
13029 "out block { layout(location=0) int x; } outs;\n"
13030 "out gl_PerVertex {\n"
13031 " vec4 gl_Position;\n"
13032 "};\n"
13033 "void main(){\n"
13034 " outs.x = 0;\n"
13035 " gl_Position = vec4(1);\n"
13036 "}\n";
13037 char const *fsSource = "#version 450\n"
13038 "\n"
13039 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
13040 "layout(location=0) out vec4 color;\n"
13041 "void main(){\n"
13042 " color = vec4(ins.x);\n"
13043 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130013044
13045 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13046 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13047
13048 VkPipelineObj pipe(m_device);
13049 pipe.AddColorAttachment();
13050 pipe.AddShader(&vs);
13051 pipe.AddShader(&fs);
13052
13053 VkDescriptorSetObj descriptorSet(m_device);
13054 descriptorSet.AppendDummy();
13055 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13056
13057 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13058
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013059 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130013060}
13061
13062TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013063 TEST_DESCRIPTION("Test that an error is produced for location mismatches across "
Mike Weiblencce7ec72016-10-17 19:33:05 -060013064 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
Chris Forbes1cc79542016-07-20 11:13:44 +120013065 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013066 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 +130013067
13068 ASSERT_NO_FATAL_FAILURE(InitState());
13069 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13070
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013071 char const *vsSource = "#version 450\n"
13072 "\n"
13073 "out block { layout(location=1) float x; } outs;\n"
13074 "out gl_PerVertex {\n"
13075 " vec4 gl_Position;\n"
13076 "};\n"
13077 "void main(){\n"
13078 " outs.x = 0;\n"
13079 " gl_Position = vec4(1);\n"
13080 "}\n";
13081 char const *fsSource = "#version 450\n"
13082 "\n"
13083 "in block { layout(location=0) float x; } ins;\n"
13084 "layout(location=0) out vec4 color;\n"
13085 "void main(){\n"
13086 " color = vec4(ins.x);\n"
13087 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130013088
13089 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13090 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13091
13092 VkPipelineObj pipe(m_device);
13093 pipe.AddColorAttachment();
13094 pipe.AddShader(&vs);
13095 pipe.AddShader(&fs);
13096
13097 VkDescriptorSetObj descriptorSet(m_device);
13098 descriptorSet.AppendDummy();
13099 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13100
13101 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13102
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013103 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130013104}
13105
13106TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013107 TEST_DESCRIPTION("Test that an error is produced for component mismatches across the "
Mike Weiblencce7ec72016-10-17 19:33:05 -060013108 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
Chris Forbes1cc79542016-07-20 11:13:44 +120013109 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013110 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 +130013111
13112 ASSERT_NO_FATAL_FAILURE(InitState());
13113 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13114
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013115 char const *vsSource = "#version 450\n"
13116 "\n"
13117 "out block { layout(location=0, component=0) float x; } outs;\n"
13118 "out gl_PerVertex {\n"
13119 " vec4 gl_Position;\n"
13120 "};\n"
13121 "void main(){\n"
13122 " outs.x = 0;\n"
13123 " gl_Position = vec4(1);\n"
13124 "}\n";
13125 char const *fsSource = "#version 450\n"
13126 "\n"
13127 "in block { layout(location=0, component=1) float x; } ins;\n"
13128 "layout(location=0) out vec4 color;\n"
13129 "void main(){\n"
13130 " color = vec4(ins.x);\n"
13131 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130013132
13133 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13134 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13135
13136 VkPipelineObj pipe(m_device);
13137 pipe.AddColorAttachment();
13138 pipe.AddShader(&vs);
13139 pipe.AddShader(&fs);
13140
13141 VkDescriptorSetObj descriptorSet(m_device);
13142 descriptorSet.AppendDummy();
13143 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13144
13145 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13146
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013147 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130013148}
13149
Chris Forbes1f3b0152016-11-30 12:48:40 +130013150TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
13151 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
13152
13153 ASSERT_NO_FATAL_FAILURE(InitState());
13154 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13155
13156 char const *vsSource = "#version 450\n"
13157 "layout(location=0) out mediump float x;\n"
13158 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
13159 char const *fsSource = "#version 450\n"
13160 "layout(location=0) in highp float x;\n"
13161 "layout(location=0) out vec4 color;\n"
13162 "void main() { color = vec4(x); }\n";
13163
13164 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13165 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13166
13167 VkPipelineObj pipe(m_device);
13168 pipe.AddColorAttachment();
13169 pipe.AddShader(&vs);
13170 pipe.AddShader(&fs);
13171
13172 VkDescriptorSetObj descriptorSet(m_device);
13173 descriptorSet.AppendDummy();
13174 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13175
13176 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
13177
13178 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13179
13180 m_errorMonitor->VerifyFound();
13181}
13182
Chris Forbes870a39e2016-11-30 12:55:56 +130013183TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
13184 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
13185
13186 ASSERT_NO_FATAL_FAILURE(InitState());
13187 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13188
13189 char const *vsSource = "#version 450\n"
13190 "out block { layout(location=0) mediump float x; };\n"
13191 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
13192 char const *fsSource = "#version 450\n"
13193 "in block { layout(location=0) highp float x; };\n"
13194 "layout(location=0) out vec4 color;\n"
13195 "void main() { color = vec4(x); }\n";
13196
13197 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13198 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13199
13200 VkPipelineObj pipe(m_device);
13201 pipe.AddColorAttachment();
13202 pipe.AddShader(&vs);
13203 pipe.AddShader(&fs);
13204
13205 VkDescriptorSetObj descriptorSet(m_device);
13206 descriptorSet.AppendDummy();
13207 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13208
13209 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
13210
13211 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13212
13213 m_errorMonitor->VerifyFound();
13214}
13215
Karl Schultz6addd812016-02-02 17:17:23 -070013216TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013217 TEST_DESCRIPTION("Test that a warning is produced for a vertex attribute which is "
13218 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060013219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013220
Chris Forbesde136e02015-05-25 11:13:28 +120013221 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013222 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120013223
13224 VkVertexInputBindingDescription input_binding;
13225 memset(&input_binding, 0, sizeof(input_binding));
13226
13227 VkVertexInputAttributeDescription input_attrib;
13228 memset(&input_attrib, 0, sizeof(input_attrib));
13229 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13230
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013231 char const *vsSource = "#version 450\n"
13232 "\n"
13233 "out gl_PerVertex {\n"
13234 " vec4 gl_Position;\n"
13235 "};\n"
13236 "void main(){\n"
13237 " gl_Position = vec4(1);\n"
13238 "}\n";
13239 char const *fsSource = "#version 450\n"
13240 "\n"
13241 "layout(location=0) out vec4 color;\n"
13242 "void main(){\n"
13243 " color = vec4(1);\n"
13244 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120013245
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013246 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13247 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120013248
13249 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013250 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120013251 pipe.AddShader(&vs);
13252 pipe.AddShader(&fs);
13253
13254 pipe.AddVertexInputBindings(&input_binding, 1);
13255 pipe.AddVertexInputAttribs(&input_attrib, 1);
13256
Chris Forbesde136e02015-05-25 11:13:28 +120013257 VkDescriptorSetObj descriptorSet(m_device);
13258 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013259 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120013260
Tony Barbour5781e8f2015-08-04 16:23:11 -060013261 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120013262
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013263 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120013264}
13265
Karl Schultz6addd812016-02-02 17:17:23 -070013266TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013267 TEST_DESCRIPTION("Test that a warning is produced for a location mismatch on "
13268 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060013269 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130013270
13271 ASSERT_NO_FATAL_FAILURE(InitState());
13272 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13273
13274 VkVertexInputBindingDescription input_binding;
13275 memset(&input_binding, 0, sizeof(input_binding));
13276
13277 VkVertexInputAttributeDescription input_attrib;
13278 memset(&input_attrib, 0, sizeof(input_attrib));
13279 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13280
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013281 char const *vsSource = "#version 450\n"
13282 "\n"
13283 "layout(location=1) in float x;\n"
13284 "out gl_PerVertex {\n"
13285 " vec4 gl_Position;\n"
13286 "};\n"
13287 "void main(){\n"
13288 " gl_Position = vec4(x);\n"
13289 "}\n";
13290 char const *fsSource = "#version 450\n"
13291 "\n"
13292 "layout(location=0) out vec4 color;\n"
13293 "void main(){\n"
13294 " color = vec4(1);\n"
13295 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130013296
13297 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13298 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13299
13300 VkPipelineObj pipe(m_device);
13301 pipe.AddColorAttachment();
13302 pipe.AddShader(&vs);
13303 pipe.AddShader(&fs);
13304
13305 pipe.AddVertexInputBindings(&input_binding, 1);
13306 pipe.AddVertexInputAttribs(&input_attrib, 1);
13307
13308 VkDescriptorSetObj descriptorSet(m_device);
13309 descriptorSet.AppendDummy();
13310 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13311
13312 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13313
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013314 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130013315}
13316
Karl Schultz6addd812016-02-02 17:17:23 -070013317TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mike Weiblen15bd38e2016-10-03 19:19:41 -060013318 TEST_DESCRIPTION("Test that an error is produced for a vertex shader input which is not "
Chris Forbes1cc79542016-07-20 11:13:44 +120013319 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13321 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013322
Chris Forbes62e8e502015-05-25 11:13:29 +120013323 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013324 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120013325
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013326 char const *vsSource = "#version 450\n"
13327 "\n"
13328 "layout(location=0) in vec4 x;\n" /* not provided */
13329 "out gl_PerVertex {\n"
13330 " vec4 gl_Position;\n"
13331 "};\n"
13332 "void main(){\n"
13333 " gl_Position = x;\n"
13334 "}\n";
13335 char const *fsSource = "#version 450\n"
13336 "\n"
13337 "layout(location=0) out vec4 color;\n"
13338 "void main(){\n"
13339 " color = vec4(1);\n"
13340 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120013341
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013342 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13343 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120013344
13345 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013346 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120013347 pipe.AddShader(&vs);
13348 pipe.AddShader(&fs);
13349
Chris Forbes62e8e502015-05-25 11:13:29 +120013350 VkDescriptorSetObj descriptorSet(m_device);
13351 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013352 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120013353
Tony Barbour5781e8f2015-08-04 16:23:11 -060013354 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120013355
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013356 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120013357}
13358
Karl Schultz6addd812016-02-02 17:17:23 -070013359TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013360 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the "
13361 "fundamental type (float/int/uint) of an attribute and the "
Mike Weiblen15bd38e2016-10-03 19:19:41 -060013362 "vertex shader input that consumes it");
13363 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 -060013364
Chris Forbesc97d98e2015-05-25 11:13:31 +120013365 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013366 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120013367
13368 VkVertexInputBindingDescription input_binding;
13369 memset(&input_binding, 0, sizeof(input_binding));
13370
13371 VkVertexInputAttributeDescription input_attrib;
13372 memset(&input_attrib, 0, sizeof(input_attrib));
13373 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13374
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013375 char const *vsSource = "#version 450\n"
13376 "\n"
13377 "layout(location=0) in int x;\n" /* attrib provided float */
13378 "out gl_PerVertex {\n"
13379 " vec4 gl_Position;\n"
13380 "};\n"
13381 "void main(){\n"
13382 " gl_Position = vec4(x);\n"
13383 "}\n";
13384 char const *fsSource = "#version 450\n"
13385 "\n"
13386 "layout(location=0) out vec4 color;\n"
13387 "void main(){\n"
13388 " color = vec4(1);\n"
13389 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120013390
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013391 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13392 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120013393
13394 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013395 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120013396 pipe.AddShader(&vs);
13397 pipe.AddShader(&fs);
13398
13399 pipe.AddVertexInputBindings(&input_binding, 1);
13400 pipe.AddVertexInputAttribs(&input_attrib, 1);
13401
Chris Forbesc97d98e2015-05-25 11:13:31 +120013402 VkDescriptorSetObj descriptorSet(m_device);
13403 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013404 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120013405
Tony Barbour5781e8f2015-08-04 16:23:11 -060013406 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120013407
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013408 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120013409}
13410
Chris Forbesc68b43c2016-04-06 11:18:47 +120013411TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013412 TEST_DESCRIPTION("Test that an error is produced for a pipeline containing multiple "
13413 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013414 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13415 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120013416
13417 ASSERT_NO_FATAL_FAILURE(InitState());
13418 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13419
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013420 char const *vsSource = "#version 450\n"
13421 "\n"
13422 "out gl_PerVertex {\n"
13423 " vec4 gl_Position;\n"
13424 "};\n"
13425 "void main(){\n"
13426 " gl_Position = vec4(1);\n"
13427 "}\n";
13428 char const *fsSource = "#version 450\n"
13429 "\n"
13430 "layout(location=0) out vec4 color;\n"
13431 "void main(){\n"
13432 " color = vec4(1);\n"
13433 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120013434
13435 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13436 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13437
13438 VkPipelineObj pipe(m_device);
13439 pipe.AddColorAttachment();
13440 pipe.AddShader(&vs);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013441 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120013442 pipe.AddShader(&fs);
13443
13444 VkDescriptorSetObj descriptorSet(m_device);
13445 descriptorSet.AppendDummy();
13446 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13447
13448 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13449
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013450 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120013451}
13452
Chris Forbes82ff92a2016-09-09 10:50:24 +120013453TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013454 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120013455
13456 ASSERT_NO_FATAL_FAILURE(InitState());
13457 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13458
13459 char const *vsSource = "#version 450\n"
13460 "out gl_PerVertex {\n"
13461 " vec4 gl_Position;\n"
13462 "};\n"
13463 "void main(){\n"
13464 " gl_Position = vec4(0);\n"
13465 "}\n";
13466 char const *fsSource = "#version 450\n"
13467 "\n"
13468 "layout(location=0) out vec4 color;\n"
13469 "void main(){\n"
13470 " color = vec4(1);\n"
13471 "}\n";
13472
13473 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13474 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
13475
13476 VkPipelineObj pipe(m_device);
13477 pipe.AddColorAttachment();
13478 pipe.AddShader(&vs);
13479 pipe.AddShader(&fs);
13480
13481 VkDescriptorSetObj descriptorSet(m_device);
13482 descriptorSet.AppendDummy();
13483 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13484
13485 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13486
13487 m_errorMonitor->VerifyFound();
13488}
13489
Chris Forbesae9d8cd2016-09-13 16:32:57 +120013490TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013491 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13492 "pDepthStencilState is NULL when rasterization is enabled and subpass "
13493 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120013494
13495 ASSERT_NO_FATAL_FAILURE(InitState());
13496 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13497
13498 char const *vsSource = "#version 450\n"
13499 "void main(){ gl_Position = vec4(0); }\n";
13500 char const *fsSource = "#version 450\n"
13501 "\n"
13502 "layout(location=0) out vec4 color;\n"
13503 "void main(){\n"
13504 " color = vec4(1);\n"
13505 "}\n";
13506
13507 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13508 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13509
13510 VkPipelineObj pipe(m_device);
13511 pipe.AddColorAttachment();
13512 pipe.AddShader(&vs);
13513 pipe.AddShader(&fs);
13514
13515 VkDescriptorSetObj descriptorSet(m_device);
13516 descriptorSet.AppendDummy();
13517 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13518
13519 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013520 {
13521 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
13522 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
13523 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120013524 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013525 {
13526 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
13527 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
13528 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120013529 },
13530 };
13531 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013532 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120013533 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013534 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
13535 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120013536 VkRenderPass rp;
13537 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13538 ASSERT_VK_SUCCESS(err);
13539
13540 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
13541
13542 m_errorMonitor->VerifyFound();
13543
13544 vkDestroyRenderPass(m_device->device(), rp, nullptr);
13545}
13546
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013547TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013548 TEST_DESCRIPTION("Test that an error is produced for a variable output from "
13549 "the TCS without the patch decoration, but consumed in the TES "
13550 "with the decoration.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is per-vertex in tessellation control shader stage "
13552 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120013553
13554 ASSERT_NO_FATAL_FAILURE(InitState());
13555 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13556
Chris Forbesc1e852d2016-04-04 19:26:42 +120013557 if (!m_device->phy().features().tessellationShader) {
13558 printf("Device does not support tessellation shaders; skipped.\n");
13559 return;
13560 }
13561
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013562 char const *vsSource = "#version 450\n"
13563 "void main(){}\n";
13564 char const *tcsSource = "#version 450\n"
13565 "layout(location=0) out int x[];\n"
13566 "layout(vertices=3) out;\n"
13567 "void main(){\n"
13568 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
13569 " gl_TessLevelInner[0] = 1;\n"
13570 " x[gl_InvocationID] = gl_InvocationID;\n"
13571 "}\n";
13572 char const *tesSource = "#version 450\n"
13573 "layout(triangles, equal_spacing, cw) in;\n"
13574 "layout(location=0) patch in int x;\n"
13575 "out gl_PerVertex { vec4 gl_Position; };\n"
13576 "void main(){\n"
13577 " gl_Position.xyz = gl_TessCoord;\n"
13578 " gl_Position.w = x;\n"
13579 "}\n";
13580 char const *fsSource = "#version 450\n"
13581 "layout(location=0) out vec4 color;\n"
13582 "void main(){\n"
13583 " color = vec4(1);\n"
13584 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120013585
13586 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13587 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
13588 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
13589 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13590
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013591 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
13592 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120013593
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013594 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120013595
13596 VkPipelineObj pipe(m_device);
13597 pipe.SetInputAssembly(&iasci);
13598 pipe.SetTessellation(&tsci);
13599 pipe.AddColorAttachment();
13600 pipe.AddShader(&vs);
13601 pipe.AddShader(&tcs);
13602 pipe.AddShader(&tes);
13603 pipe.AddShader(&fs);
13604
13605 VkDescriptorSetObj descriptorSet(m_device);
13606 descriptorSet.AppendDummy();
13607 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13608
13609 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13610
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013611 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120013612}
13613
Karl Schultz6addd812016-02-02 17:17:23 -070013614TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013615 TEST_DESCRIPTION("Test that an error is produced for a vertex attribute setup where multiple "
13616 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013617 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13618 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013619
Chris Forbes280ba2c2015-06-12 11:16:41 +120013620 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013621 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120013622
13623 /* Two binding descriptions for binding 0 */
13624 VkVertexInputBindingDescription input_bindings[2];
13625 memset(input_bindings, 0, sizeof(input_bindings));
13626
13627 VkVertexInputAttributeDescription input_attrib;
13628 memset(&input_attrib, 0, sizeof(input_attrib));
13629 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13630
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013631 char const *vsSource = "#version 450\n"
13632 "\n"
13633 "layout(location=0) in float x;\n" /* attrib provided float */
13634 "out gl_PerVertex {\n"
13635 " vec4 gl_Position;\n"
13636 "};\n"
13637 "void main(){\n"
13638 " gl_Position = vec4(x);\n"
13639 "}\n";
13640 char const *fsSource = "#version 450\n"
13641 "\n"
13642 "layout(location=0) out vec4 color;\n"
13643 "void main(){\n"
13644 " color = vec4(1);\n"
13645 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120013646
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013647 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13648 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120013649
13650 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013651 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120013652 pipe.AddShader(&vs);
13653 pipe.AddShader(&fs);
13654
13655 pipe.AddVertexInputBindings(input_bindings, 2);
13656 pipe.AddVertexInputAttribs(&input_attrib, 1);
13657
Chris Forbes280ba2c2015-06-12 11:16:41 +120013658 VkDescriptorSetObj descriptorSet(m_device);
13659 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013660 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120013661
Tony Barbour5781e8f2015-08-04 16:23:11 -060013662 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120013663
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013664 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120013665}
Chris Forbes8f68b562015-05-25 11:13:32 +120013666
Karl Schultz6addd812016-02-02 17:17:23 -070013667TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mike Weiblencce7ec72016-10-17 19:33:05 -060013668 TEST_DESCRIPTION("Test that an error is produced for a fragment shader which does not "
Chris Forbes1cc79542016-07-20 11:13:44 +120013669 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060013670 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013671
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013672 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013673
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013674 char const *vsSource = "#version 450\n"
13675 "\n"
13676 "out gl_PerVertex {\n"
13677 " vec4 gl_Position;\n"
13678 "};\n"
13679 "void main(){\n"
13680 " gl_Position = vec4(1);\n"
13681 "}\n";
13682 char const *fsSource = "#version 450\n"
13683 "\n"
13684 "void main(){\n"
13685 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013686
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013687 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13688 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013689
13690 VkPipelineObj pipe(m_device);
13691 pipe.AddShader(&vs);
13692 pipe.AddShader(&fs);
13693
Chia-I Wu08accc62015-07-07 11:50:03 +080013694 /* set up CB 0, not written */
13695 pipe.AddColorAttachment();
13696 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013697
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013698 VkDescriptorSetObj descriptorSet(m_device);
13699 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013700 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013701
Tony Barbour5781e8f2015-08-04 16:23:11 -060013702 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013703
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013704 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013705}
13706
Karl Schultz6addd812016-02-02 17:17:23 -070013707TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mike Weiblencce7ec72016-10-17 19:33:05 -060013708 TEST_DESCRIPTION("Test that a warning is produced for a fragment shader which provides a spurious "
Chris Forbes1cc79542016-07-20 11:13:44 +120013709 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013710 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013711 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013712
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013713 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013714
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013715 char const *vsSource = "#version 450\n"
13716 "\n"
13717 "out gl_PerVertex {\n"
13718 " vec4 gl_Position;\n"
13719 "};\n"
13720 "void main(){\n"
13721 " gl_Position = vec4(1);\n"
13722 "}\n";
13723 char const *fsSource = "#version 450\n"
13724 "\n"
13725 "layout(location=0) out vec4 x;\n"
13726 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
13727 "void main(){\n"
13728 " x = vec4(1);\n"
13729 " y = vec4(1);\n"
13730 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013731
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013732 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13733 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013734
13735 VkPipelineObj pipe(m_device);
13736 pipe.AddShader(&vs);
13737 pipe.AddShader(&fs);
13738
Chia-I Wu08accc62015-07-07 11:50:03 +080013739 /* set up CB 0, not written */
13740 pipe.AddColorAttachment();
13741 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013742 /* FS writes CB 1, but we don't configure it */
13743
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013744 VkDescriptorSetObj descriptorSet(m_device);
13745 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013746 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013747
Tony Barbour5781e8f2015-08-04 16:23:11 -060013748 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013749
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013750 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013751}
13752
Karl Schultz6addd812016-02-02 17:17:23 -070013753TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013754 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the fundamental "
Mike Weiblencce7ec72016-10-17 19:33:05 -060013755 "type of an fragment shader output variable, and the format of the corresponding attachment");
13756 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013757
Chris Forbesa36d69e2015-05-25 11:13:44 +120013758 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013759
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013760 char const *vsSource = "#version 450\n"
13761 "\n"
13762 "out gl_PerVertex {\n"
13763 " vec4 gl_Position;\n"
13764 "};\n"
13765 "void main(){\n"
13766 " gl_Position = vec4(1);\n"
13767 "}\n";
13768 char const *fsSource = "#version 450\n"
13769 "\n"
13770 "layout(location=0) out ivec4 x;\n" /* not UNORM */
13771 "void main(){\n"
13772 " x = ivec4(1);\n"
13773 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120013774
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013775 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13776 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120013777
13778 VkPipelineObj pipe(m_device);
13779 pipe.AddShader(&vs);
13780 pipe.AddShader(&fs);
13781
Chia-I Wu08accc62015-07-07 11:50:03 +080013782 /* set up CB 0; type is UNORM by default */
13783 pipe.AddColorAttachment();
13784 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013785
Chris Forbesa36d69e2015-05-25 11:13:44 +120013786 VkDescriptorSetObj descriptorSet(m_device);
13787 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013788 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120013789
Tony Barbour5781e8f2015-08-04 16:23:11 -060013790 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013791
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013792 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120013793}
Chris Forbes7b1b8932015-06-05 14:43:36 +120013794
Karl Schultz6addd812016-02-02 17:17:23 -070013795TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013796 TEST_DESCRIPTION("Test that an error is produced for a shader consuming a uniform "
13797 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013798 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013799
Chris Forbes556c76c2015-08-14 12:04:59 +120013800 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120013801
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013802 char const *vsSource = "#version 450\n"
13803 "\n"
13804 "out gl_PerVertex {\n"
13805 " vec4 gl_Position;\n"
13806 "};\n"
13807 "void main(){\n"
13808 " gl_Position = vec4(1);\n"
13809 "}\n";
13810 char const *fsSource = "#version 450\n"
13811 "\n"
13812 "layout(location=0) out vec4 x;\n"
13813 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
13814 "void main(){\n"
13815 " x = vec4(bar.y);\n"
13816 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120013817
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013818 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13819 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120013820
Chris Forbes556c76c2015-08-14 12:04:59 +120013821 VkPipelineObj pipe(m_device);
13822 pipe.AddShader(&vs);
13823 pipe.AddShader(&fs);
13824
13825 /* set up CB 0; type is UNORM by default */
13826 pipe.AddColorAttachment();
13827 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13828
13829 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013830 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120013831
13832 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13833
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013834 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120013835}
13836
Chris Forbes5c59e902016-02-26 16:56:09 +130013837TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013838 TEST_DESCRIPTION("Test that an error is produced for a shader consuming push constants "
13839 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013840 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130013841
13842 ASSERT_NO_FATAL_FAILURE(InitState());
13843
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013844 char const *vsSource = "#version 450\n"
13845 "\n"
13846 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13847 "out gl_PerVertex {\n"
13848 " vec4 gl_Position;\n"
13849 "};\n"
13850 "void main(){\n"
13851 " gl_Position = vec4(consts.x);\n"
13852 "}\n";
13853 char const *fsSource = "#version 450\n"
13854 "\n"
13855 "layout(location=0) out vec4 x;\n"
13856 "void main(){\n"
13857 " x = vec4(1);\n"
13858 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130013859
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.AddShader(&vs);
13865 pipe.AddShader(&fs);
13866
13867 /* set up CB 0; type is UNORM by default */
13868 pipe.AddColorAttachment();
13869 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13870
13871 VkDescriptorSetObj descriptorSet(m_device);
13872 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13873
13874 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13875
13876 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013877 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130013878}
13879
Chris Forbes3fb17902016-08-22 14:57:55 +120013880TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
13881 TEST_DESCRIPTION("Test that an error is produced for a shader consuming an input attachment "
13882 "which is not included in the subpass description");
13883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13884 "consumes input attachment index 0 but not provided in subpass");
13885
13886 ASSERT_NO_FATAL_FAILURE(InitState());
13887
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013888 char const *vsSource = "#version 450\n"
13889 "\n"
13890 "out gl_PerVertex {\n"
13891 " vec4 gl_Position;\n"
13892 "};\n"
13893 "void main(){\n"
13894 " gl_Position = vec4(1);\n"
13895 "}\n";
13896 char const *fsSource = "#version 450\n"
13897 "\n"
13898 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
13899 "layout(location=0) out vec4 color;\n"
13900 "void main() {\n"
13901 " color = subpassLoad(x);\n"
13902 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120013903
13904 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13905 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13906
13907 VkPipelineObj pipe(m_device);
13908 pipe.AddShader(&vs);
13909 pipe.AddShader(&fs);
13910 pipe.AddColorAttachment();
13911 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13912
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013913 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
13914 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120013915 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013916 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120013917 ASSERT_VK_SUCCESS(err);
13918
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013919 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120013920 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013921 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120013922 ASSERT_VK_SUCCESS(err);
13923
13924 // error here.
13925 pipe.CreateVKPipeline(pl, renderPass());
13926
13927 m_errorMonitor->VerifyFound();
13928
13929 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
13930 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
13931}
13932
Chris Forbes5a9a0472016-08-22 16:02:09 +120013933TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
13934 TEST_DESCRIPTION("Test that an error is produced for a shader consuming an input attachment "
13935 "with a format having a different fundamental type");
13936 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13937 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
13938
13939 ASSERT_NO_FATAL_FAILURE(InitState());
13940
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013941 char const *vsSource = "#version 450\n"
13942 "\n"
13943 "out gl_PerVertex {\n"
13944 " vec4 gl_Position;\n"
13945 "};\n"
13946 "void main(){\n"
13947 " gl_Position = vec4(1);\n"
13948 "}\n";
13949 char const *fsSource = "#version 450\n"
13950 "\n"
13951 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
13952 "layout(location=0) out vec4 color;\n"
13953 "void main() {\n"
13954 " color = subpassLoad(x);\n"
13955 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120013956
13957 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13958 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13959
13960 VkPipelineObj pipe(m_device);
13961 pipe.AddShader(&vs);
13962 pipe.AddShader(&fs);
13963 pipe.AddColorAttachment();
13964 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13965
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013966 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
13967 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120013968 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013969 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120013970 ASSERT_VK_SUCCESS(err);
13971
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013972 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120013973 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013974 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120013975 ASSERT_VK_SUCCESS(err);
13976
13977 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013978 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
13979 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
13980 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
13981 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
13982 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 +120013983 };
13984 VkAttachmentReference color = {
13985 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
13986 };
13987 VkAttachmentReference input = {
13988 1, VK_IMAGE_LAYOUT_GENERAL,
13989 };
13990
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013991 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120013992
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013993 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120013994 VkRenderPass rp;
13995 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13996 ASSERT_VK_SUCCESS(err);
13997
13998 // error here.
13999 pipe.CreateVKPipeline(pl, rp);
14000
14001 m_errorMonitor->VerifyFound();
14002
14003 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14004 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14005 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14006}
14007
Chris Forbes541f7b02016-08-22 15:30:27 +120014008TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
14009 TEST_DESCRIPTION("Test that an error is produced for a shader consuming an input attachment "
14010 "which is not included in the subpass description -- array case");
14011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070014012 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120014013
14014 ASSERT_NO_FATAL_FAILURE(InitState());
14015
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014016 char const *vsSource = "#version 450\n"
14017 "\n"
14018 "out gl_PerVertex {\n"
14019 " vec4 gl_Position;\n"
14020 "};\n"
14021 "void main(){\n"
14022 " gl_Position = vec4(1);\n"
14023 "}\n";
14024 char const *fsSource = "#version 450\n"
14025 "\n"
Rene Lindsay07b60af2017-01-10 15:57:55 -070014026 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014027 "layout(location=0) out vec4 color;\n"
14028 "void main() {\n"
Rene Lindsay07b60af2017-01-10 15:57:55 -070014029 " color = subpassLoad(xs[0]);\n"
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014030 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120014031
14032 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14033 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14034
14035 VkPipelineObj pipe(m_device);
14036 pipe.AddShader(&vs);
14037 pipe.AddShader(&fs);
14038 pipe.AddColorAttachment();
14039 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14040
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014041 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
14042 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120014043 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014044 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120014045 ASSERT_VK_SUCCESS(err);
14046
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014047 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120014048 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014049 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120014050 ASSERT_VK_SUCCESS(err);
14051
14052 // error here.
14053 pipe.CreateVKPipeline(pl, renderPass());
14054
14055 m_errorMonitor->VerifyFound();
14056
14057 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14058 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14059}
14060
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014061TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014062 TEST_DESCRIPTION("Test that an error is produced for a compute pipeline consuming a "
14063 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014064 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014065
14066 ASSERT_NO_FATAL_FAILURE(InitState());
14067
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014068 char const *csSource = "#version 450\n"
14069 "\n"
14070 "layout(local_size_x=1) in;\n"
14071 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14072 "void main(){\n"
14073 " x = vec4(1);\n"
14074 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014075
14076 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14077
14078 VkDescriptorSetObj descriptorSet(m_device);
14079 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14080
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014081 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
14082 nullptr,
14083 0,
14084 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
14085 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
14086 descriptorSet.GetPipelineLayout(),
14087 VK_NULL_HANDLE,
14088 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014089
14090 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014091 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120014092
14093 m_errorMonitor->VerifyFound();
14094
14095 if (err == VK_SUCCESS) {
14096 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14097 }
14098}
14099
Chris Forbes22a9b092016-07-19 14:34:05 +120014100TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014101 TEST_DESCRIPTION("Test that an error is produced for a pipeline consuming a "
14102 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014103 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14104 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120014105
14106 ASSERT_NO_FATAL_FAILURE(InitState());
14107
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014108 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
14109 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120014110 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014111 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120014112 ASSERT_VK_SUCCESS(err);
14113
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014114 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120014115 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014116 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120014117 ASSERT_VK_SUCCESS(err);
14118
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014119 char const *csSource = "#version 450\n"
14120 "\n"
14121 "layout(local_size_x=1) in;\n"
14122 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
14123 "void main() {\n"
14124 " x.x = 1.0f;\n"
14125 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120014126 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14127
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014128 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
14129 nullptr,
14130 0,
14131 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
14132 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
14133 pl,
14134 VK_NULL_HANDLE,
14135 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120014136
14137 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014138 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120014139
14140 m_errorMonitor->VerifyFound();
14141
14142 if (err == VK_SUCCESS) {
14143 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14144 }
14145
14146 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14147 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14148}
14149
Chris Forbes50020592016-07-27 13:52:41 +120014150TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
14151 TEST_DESCRIPTION("Test that an error is produced when an image view type "
14152 "does not match the dimensionality declared in the shader");
14153
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014154 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 +120014155
14156 ASSERT_NO_FATAL_FAILURE(InitState());
14157 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14158
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014159 char const *vsSource = "#version 450\n"
14160 "\n"
14161 "out gl_PerVertex { vec4 gl_Position; };\n"
14162 "void main() { gl_Position = vec4(0); }\n";
14163 char const *fsSource = "#version 450\n"
14164 "\n"
14165 "layout(set=0, binding=0) uniform sampler3D s;\n"
14166 "layout(location=0) out vec4 color;\n"
14167 "void main() {\n"
14168 " color = texture(s, vec3(0));\n"
14169 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120014170 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14171 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14172
14173 VkPipelineObj pipe(m_device);
14174 pipe.AddShader(&vs);
14175 pipe.AddShader(&fs);
14176 pipe.AddColorAttachment();
14177
14178 VkTextureObj texture(m_device, nullptr);
14179 VkSamplerObj sampler(m_device);
14180
14181 VkDescriptorSetObj descriptorSet(m_device);
14182 descriptorSet.AppendSamplerTexture(&sampler, &texture);
14183 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14184
14185 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14186 ASSERT_VK_SUCCESS(err);
14187
Tony Barbour552f6c02016-12-21 14:34:07 -070014188 m_commandBuffer->BeginCommandBuffer();
14189 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120014190
14191 m_commandBuffer->BindPipeline(pipe);
14192 m_commandBuffer->BindDescriptorSet(descriptorSet);
14193
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014194 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120014195 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014196 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120014197 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
14198
14199 // error produced here.
14200 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
14201
14202 m_errorMonitor->VerifyFound();
14203
Tony Barbour552f6c02016-12-21 14:34:07 -070014204 m_commandBuffer->EndRenderPass();
14205 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120014206}
14207
Chris Forbes5533bfc2016-07-27 14:12:34 +120014208TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
14209 TEST_DESCRIPTION("Test that an error is produced when a multisampled images "
14210 "are consumed via singlesample images types in the shader, or vice versa.");
14211
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014212 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120014213
14214 ASSERT_NO_FATAL_FAILURE(InitState());
14215 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14216
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014217 char const *vsSource = "#version 450\n"
14218 "\n"
14219 "out gl_PerVertex { vec4 gl_Position; };\n"
14220 "void main() { gl_Position = vec4(0); }\n";
14221 char const *fsSource = "#version 450\n"
14222 "\n"
14223 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
14224 "layout(location=0) out vec4 color;\n"
14225 "void main() {\n"
14226 " color = texelFetch(s, ivec2(0), 0);\n"
14227 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120014228 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14229 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14230
14231 VkPipelineObj pipe(m_device);
14232 pipe.AddShader(&vs);
14233 pipe.AddShader(&fs);
14234 pipe.AddColorAttachment();
14235
14236 VkTextureObj texture(m_device, nullptr);
14237 VkSamplerObj sampler(m_device);
14238
14239 VkDescriptorSetObj descriptorSet(m_device);
14240 descriptorSet.AppendSamplerTexture(&sampler, &texture);
14241 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14242
14243 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14244 ASSERT_VK_SUCCESS(err);
14245
Tony Barbour552f6c02016-12-21 14:34:07 -070014246 m_commandBuffer->BeginCommandBuffer();
14247 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120014248
14249 m_commandBuffer->BindPipeline(pipe);
14250 m_commandBuffer->BindDescriptorSet(descriptorSet);
14251
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014252 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120014253 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014254 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120014255 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
14256
14257 // error produced here.
14258 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
14259
14260 m_errorMonitor->VerifyFound();
14261
Tony Barbour552f6c02016-12-21 14:34:07 -070014262 m_commandBuffer->EndRenderPass();
14263 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120014264}
14265
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014266#endif // SHADER_CHECKER_TESTS
14267
14268#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -060014269TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014271
14272 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014273
14274 // Create an image
14275 VkImage image;
14276
Karl Schultz6addd812016-02-02 17:17:23 -070014277 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14278 const int32_t tex_width = 32;
14279 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014280
14281 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014282 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14283 image_create_info.pNext = NULL;
14284 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14285 image_create_info.format = tex_format;
14286 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014287 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070014288 image_create_info.extent.depth = 1;
14289 image_create_info.mipLevels = 1;
14290 image_create_info.arrayLayers = 1;
14291 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14292 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14293 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14294 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014295
14296 // Introduce error by sending down a bogus width extent
14297 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014298 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014299
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014300 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014301}
14302
Mark Youngc48c4c12016-04-11 14:26:49 -060014303TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014304 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14305 "CreateImage extents is 0 for at least one required dimension");
Mark Youngc48c4c12016-04-11 14:26:49 -060014306
14307 ASSERT_NO_FATAL_FAILURE(InitState());
14308
14309 // Create an image
14310 VkImage image;
14311
14312 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14313 const int32_t tex_width = 32;
14314 const int32_t tex_height = 32;
14315
14316 VkImageCreateInfo image_create_info = {};
14317 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14318 image_create_info.pNext = NULL;
14319 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14320 image_create_info.format = tex_format;
14321 image_create_info.extent.width = tex_width;
14322 image_create_info.extent.height = tex_height;
14323 image_create_info.extent.depth = 1;
14324 image_create_info.mipLevels = 1;
14325 image_create_info.arrayLayers = 1;
14326 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14327 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14328 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14329 image_create_info.flags = 0;
14330
14331 // Introduce error by sending down a bogus width extent
14332 image_create_info.extent.width = 0;
14333 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
14334
14335 m_errorMonitor->VerifyFound();
14336}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014337#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +120014338
Tobin Ehliscde08892015-09-22 10:11:37 -060014339#if IMAGE_TESTS
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070014340
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060014341TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
14342 TEST_DESCRIPTION("Create a render pass with an attachment description "
14343 "format set to VK_FORMAT_UNDEFINED");
14344
14345 ASSERT_NO_FATAL_FAILURE(InitState());
14346 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14347
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014348 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060014349
14350 VkAttachmentReference color_attach = {};
14351 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
14352 color_attach.attachment = 0;
14353 VkSubpassDescription subpass = {};
14354 subpass.colorAttachmentCount = 1;
14355 subpass.pColorAttachments = &color_attach;
14356
14357 VkRenderPassCreateInfo rpci = {};
14358 rpci.subpassCount = 1;
14359 rpci.pSubpasses = &subpass;
14360 rpci.attachmentCount = 1;
14361 VkAttachmentDescription attach_desc = {};
14362 attach_desc.format = VK_FORMAT_UNDEFINED;
14363 rpci.pAttachments = &attach_desc;
14364 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
14365 VkRenderPass rp;
14366 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
14367
14368 m_errorMonitor->VerifyFound();
14369
14370 if (result == VK_SUCCESS) {
14371 vkDestroyRenderPass(m_device->device(), rp, NULL);
14372 }
14373}
14374
Karl Schultz6addd812016-02-02 17:17:23 -070014375TEST_F(VkLayerTest, InvalidImageView) {
14376 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060014377
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070014378 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014379
Tobin Ehliscde08892015-09-22 10:11:37 -060014380 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060014381
Mike Stroyana3082432015-09-25 13:39:21 -060014382 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070014383 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060014384
Karl Schultz6addd812016-02-02 17:17:23 -070014385 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14386 const int32_t tex_width = 32;
14387 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060014388
14389 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014390 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14391 image_create_info.pNext = NULL;
14392 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14393 image_create_info.format = tex_format;
14394 image_create_info.extent.width = tex_width;
14395 image_create_info.extent.height = tex_height;
14396 image_create_info.extent.depth = 1;
14397 image_create_info.mipLevels = 1;
14398 image_create_info.arrayLayers = 1;
14399 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14400 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14401 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14402 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060014403
Chia-I Wuf7458c52015-10-26 21:10:41 +080014404 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060014405 ASSERT_VK_SUCCESS(err);
14406
14407 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130014408 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070014409 image_view_create_info.image = image;
14410 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14411 image_view_create_info.format = tex_format;
14412 image_view_create_info.subresourceRange.layerCount = 1;
14413 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
14414 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014415 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060014416
14417 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014418 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060014419
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014420 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060014421 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060014422}
Mike Stroyana3082432015-09-25 13:39:21 -060014423
Mark Youngd339ba32016-05-30 13:28:35 -060014424TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
14425 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060014426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060014427 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060014428
14429 ASSERT_NO_FATAL_FAILURE(InitState());
14430
14431 // Create an image and try to create a view with no memory backing the image
14432 VkImage image;
14433
14434 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14435 const int32_t tex_width = 32;
14436 const int32_t tex_height = 32;
14437
14438 VkImageCreateInfo image_create_info = {};
14439 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14440 image_create_info.pNext = NULL;
14441 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14442 image_create_info.format = tex_format;
14443 image_create_info.extent.width = tex_width;
14444 image_create_info.extent.height = tex_height;
14445 image_create_info.extent.depth = 1;
14446 image_create_info.mipLevels = 1;
14447 image_create_info.arrayLayers = 1;
14448 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14449 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14450 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14451 image_create_info.flags = 0;
14452
14453 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
14454 ASSERT_VK_SUCCESS(err);
14455
14456 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130014457 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060014458 image_view_create_info.image = image;
14459 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14460 image_view_create_info.format = tex_format;
14461 image_view_create_info.subresourceRange.layerCount = 1;
14462 image_view_create_info.subresourceRange.baseMipLevel = 0;
14463 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014464 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060014465
14466 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014467 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060014468
14469 m_errorMonitor->VerifyFound();
14470 vkDestroyImage(m_device->device(), image, NULL);
14471 // If last error is success, it still created the view, so delete it.
14472 if (err == VK_SUCCESS) {
14473 vkDestroyImageView(m_device->device(), view, NULL);
14474 }
Mark Youngd339ba32016-05-30 13:28:35 -060014475}
14476
Karl Schultz6addd812016-02-02 17:17:23 -070014477TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014478 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070014479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014480
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014481 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014482
Karl Schultz6addd812016-02-02 17:17:23 -070014483 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014484 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014485 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014486 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014487
14488 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014489 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014490 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070014491 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14492 image_view_create_info.format = tex_format;
14493 image_view_create_info.subresourceRange.baseMipLevel = 0;
14494 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014495 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014496 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014497 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014498
14499 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014500 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014501
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014502 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014503}
14504
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014505TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070014506 VkResult err;
14507 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014508
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070014509 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014510
Mike Stroyana3082432015-09-25 13:39:21 -060014511 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014512
14513 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014514 VkImage srcImage;
14515 VkImage dstImage;
14516 VkDeviceMemory srcMem;
14517 VkDeviceMemory destMem;
14518 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014519
14520 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014521 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14522 image_create_info.pNext = NULL;
14523 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14524 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14525 image_create_info.extent.width = 32;
14526 image_create_info.extent.height = 32;
14527 image_create_info.extent.depth = 1;
14528 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014529 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070014530 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14531 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14532 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14533 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014534
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014535 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014536 ASSERT_VK_SUCCESS(err);
14537
Mark Lobodzinski867787a2016-10-14 11:49:55 -060014538 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014539 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014540 ASSERT_VK_SUCCESS(err);
14541
14542 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014543 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014544 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14545 memAlloc.pNext = NULL;
14546 memAlloc.allocationSize = 0;
14547 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014548
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014549 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014550 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014551 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014552 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014553 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014554 ASSERT_VK_SUCCESS(err);
14555
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014556 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014557 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014558 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014559 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014560 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014561 ASSERT_VK_SUCCESS(err);
14562
14563 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14564 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014565 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014566 ASSERT_VK_SUCCESS(err);
14567
Tony Barbour552f6c02016-12-21 14:34:07 -070014568 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060014569 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014570 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014571 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014572 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014573 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060014574 copyRegion.srcOffset.x = 0;
14575 copyRegion.srcOffset.y = 0;
14576 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014577 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014578 copyRegion.dstSubresource.mipLevel = 0;
14579 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014580 // Introduce failure by forcing the dst layerCount to differ from src
14581 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014582 copyRegion.dstOffset.x = 0;
14583 copyRegion.dstOffset.y = 0;
14584 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014585 copyRegion.extent.width = 1;
14586 copyRegion.extent.height = 1;
14587 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014588 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070014589 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060014590
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014591 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014592
Chia-I Wuf7458c52015-10-26 21:10:41 +080014593 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014594 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014595 vkFreeMemory(m_device->device(), srcMem, NULL);
14596 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014597}
14598
Tony Barbourd6673642016-05-05 14:46:39 -060014599TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
14600
14601 TEST_DESCRIPTION("Creating images with unsuported formats ");
14602
14603 ASSERT_NO_FATAL_FAILURE(InitState());
14604 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14605 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014606 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 -060014607 VK_IMAGE_TILING_OPTIMAL, 0);
14608 ASSERT_TRUE(image.initialized());
14609
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014610 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130014611 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014612 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014613 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14614 image_create_info.format = VK_FORMAT_UNDEFINED;
14615 image_create_info.extent.width = 32;
14616 image_create_info.extent.height = 32;
14617 image_create_info.extent.depth = 1;
14618 image_create_info.mipLevels = 1;
14619 image_create_info.arrayLayers = 1;
14620 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14621 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14622 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014623
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014624 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14625 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014626
14627 VkImage localImage;
14628 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
14629 m_errorMonitor->VerifyFound();
14630
Tony Barbourd6673642016-05-05 14:46:39 -060014631 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014632 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060014633 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
14634 VkFormat format = static_cast<VkFormat>(f);
14635 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014636 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060014637 unsupported = format;
14638 break;
14639 }
14640 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014641
Tony Barbourd6673642016-05-05 14:46:39 -060014642 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060014643 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014644 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060014645
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014646 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060014647 m_errorMonitor->VerifyFound();
14648 }
14649}
14650
14651TEST_F(VkLayerTest, ImageLayerViewTests) {
14652 VkResult ret;
14653 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
14654
14655 ASSERT_NO_FATAL_FAILURE(InitState());
14656
14657 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014658 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 -060014659 VK_IMAGE_TILING_OPTIMAL, 0);
14660 ASSERT_TRUE(image.initialized());
14661
14662 VkImageView imgView;
14663 VkImageViewCreateInfo imgViewInfo = {};
14664 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
14665 imgViewInfo.image = image.handle();
14666 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
14667 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
14668 imgViewInfo.subresourceRange.layerCount = 1;
14669 imgViewInfo.subresourceRange.baseMipLevel = 0;
14670 imgViewInfo.subresourceRange.levelCount = 1;
14671 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14672
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070014673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060014674 // View can't have baseMipLevel >= image's mipLevels - Expect
14675 // VIEW_CREATE_ERROR
14676 imgViewInfo.subresourceRange.baseMipLevel = 1;
14677 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14678 m_errorMonitor->VerifyFound();
14679 imgViewInfo.subresourceRange.baseMipLevel = 0;
14680
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070014681 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060014682 // View can't have baseArrayLayer >= image's arraySize - Expect
14683 // VIEW_CREATE_ERROR
14684 imgViewInfo.subresourceRange.baseArrayLayer = 1;
14685 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14686 m_errorMonitor->VerifyFound();
14687 imgViewInfo.subresourceRange.baseArrayLayer = 0;
14688
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with 0 in "
14690 "pCreateInfo->subresourceRange."
14691 "levelCount");
Tony Barbourd6673642016-05-05 14:46:39 -060014692 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
14693 imgViewInfo.subresourceRange.levelCount = 0;
14694 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14695 m_errorMonitor->VerifyFound();
14696 imgViewInfo.subresourceRange.levelCount = 1;
14697
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014698 m_errorMonitor->SetDesiredFailureMsg(
14699 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14700 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060014701 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
14702 imgViewInfo.subresourceRange.layerCount = 0;
14703 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14704 m_errorMonitor->VerifyFound();
14705 imgViewInfo.subresourceRange.layerCount = 1;
14706
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Formats MUST be IDENTICAL unless "
14708 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
14709 "was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060014710 // Can't use depth format for view into color image - Expect INVALID_FORMAT
14711 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
14712 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14713 m_errorMonitor->VerifyFound();
14714 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
14715
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070014716 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060014717 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
14718 // VIEW_CREATE_ERROR
14719 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
14720 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14721 m_errorMonitor->VerifyFound();
14722 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
14723
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070014724 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014725 // TODO: Update framework to easily passing mutable flag into ImageObj init
14726 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070014727 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
14728 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14729 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060014730 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
14731 // VIEW_CREATE_ERROR
14732 VkImageCreateInfo mutImgInfo = image.create_info();
14733 VkImage mutImage;
14734 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014735 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060014736 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
14737 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14738 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
14739 ASSERT_VK_SUCCESS(ret);
14740 imgViewInfo.image = mutImage;
14741 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14742 m_errorMonitor->VerifyFound();
14743 imgViewInfo.image = image.handle();
14744 vkDestroyImage(m_device->handle(), mutImage, NULL);
14745}
14746
14747TEST_F(VkLayerTest, MiscImageLayerTests) {
14748
14749 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
14750
14751 ASSERT_NO_FATAL_FAILURE(InitState());
14752
Rene Lindsay135204f2016-12-22 17:11:09 -070014753 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060014754 VkImageObj image(m_device);
Rene Lindsay135204f2016-12-22 17:11:09 -070014755 image.init(128, 128, VK_FORMAT_R16G16B16A16_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
14756 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060014757 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060014758 vk_testing::Buffer buffer;
14759 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070014760 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060014761 VkBufferImageCopy region = {};
14762 region.bufferRowLength = 128;
14763 region.bufferImageHeight = 128;
14764 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14765 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070014766 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060014767 region.imageExtent.height = 4;
14768 region.imageExtent.width = 4;
14769 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070014770
14771 VkImageObj image2(m_device);
14772 image2.init(128, 128, VK_FORMAT_R8G8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014773 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070014774 ASSERT_TRUE(image2.initialized());
14775 vk_testing::Buffer buffer2;
14776 VkMemoryPropertyFlags reqs2 = 0;
14777 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
14778 VkBufferImageCopy region2 = {};
14779 region2.bufferRowLength = 128;
14780 region2.bufferImageHeight = 128;
14781 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14782 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
14783 region2.imageSubresource.layerCount = 1;
14784 region2.imageExtent.height = 4;
14785 region2.imageExtent.width = 4;
14786 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060014787 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060014788
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070014789 // Image must have offset.z of 0 and extent.depth of 1
14790 // Introduce failure by setting imageExtent.depth to 0
14791 region.imageExtent.depth = 0;
14792 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01269);
14793 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014794 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070014795 m_errorMonitor->VerifyFound();
14796
14797 region.imageExtent.depth = 1;
14798
14799 // Image must have offset.z of 0 and extent.depth of 1
14800 // Introduce failure by setting imageOffset.z to 4
14801 region.imageOffset.z = 4;
14802 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01269);
14803 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014804 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070014805 m_errorMonitor->VerifyFound();
14806
14807 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060014808 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
14809 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070014810 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070014811 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014812 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
14813 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060014814 m_errorMonitor->VerifyFound();
14815
14816 // BufferOffset must be a multiple of 4
14817 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070014818 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070014819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070014820 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
14821 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060014822 m_errorMonitor->VerifyFound();
14823
14824 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
14825 region.bufferOffset = 0;
14826 region.imageExtent.height = 128;
14827 region.imageExtent.width = 128;
14828 // Introduce failure by setting bufferRowLength > 0 but less than width
14829 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070014830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014831 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
14832 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060014833 m_errorMonitor->VerifyFound();
14834
14835 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
14836 region.bufferRowLength = 128;
14837 // Introduce failure by setting bufferRowHeight > 0 but less than height
14838 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070014839 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014840 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
14841 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060014842 m_errorMonitor->VerifyFound();
14843
14844 region.bufferImageHeight = 128;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014845 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14846 "If the format of srcImage is an "
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014847 "integer-based format then filter must be VK_FILTER_NEAREST");
Tony Barbourd6673642016-05-05 14:46:39 -060014848 // Expect INVALID_FILTER
14849 VkImageObj intImage1(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070014850 intImage1.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
14851 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060014852 VkImageObj intImage2(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070014853 intImage2.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
14854 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060014855 VkImageBlit blitRegion = {};
14856 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14857 blitRegion.srcSubresource.baseArrayLayer = 0;
14858 blitRegion.srcSubresource.layerCount = 1;
14859 blitRegion.srcSubresource.mipLevel = 0;
14860 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14861 blitRegion.dstSubresource.baseArrayLayer = 0;
14862 blitRegion.dstSubresource.layerCount = 1;
14863 blitRegion.dstSubresource.mipLevel = 0;
14864
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014865 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070014866 intImage2.layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Tony Barbourd6673642016-05-05 14:46:39 -060014867 m_errorMonitor->VerifyFound();
14868
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060014869 // Look for NULL-blit warning
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014870 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "Offsets specify a zero-volume area.");
14871 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
14872 intImage2.layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060014873 m_errorMonitor->VerifyFound();
14874
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014875 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with 0 in ppMemoryBarriers");
Tony Barbourd6673642016-05-05 14:46:39 -060014876 VkImageMemoryBarrier img_barrier;
14877 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
14878 img_barrier.pNext = NULL;
14879 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
14880 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
14881 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14882 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14883 img_barrier.image = image.handle();
14884 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
14885 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
14886 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14887 img_barrier.subresourceRange.baseArrayLayer = 0;
14888 img_barrier.subresourceRange.baseMipLevel = 0;
14889 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
14890 img_barrier.subresourceRange.layerCount = 0;
14891 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014892 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
14893 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060014894 m_errorMonitor->VerifyFound();
14895 img_barrier.subresourceRange.layerCount = 1;
14896}
14897
14898TEST_F(VkLayerTest, ImageFormatLimits) {
14899
14900 TEST_DESCRIPTION("Exceed the limits of image format ");
14901
Cody Northropc31a84f2016-08-22 10:41:47 -060014902 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060014904 VkImageCreateInfo image_create_info = {};
14905 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14906 image_create_info.pNext = NULL;
14907 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14908 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14909 image_create_info.extent.width = 32;
14910 image_create_info.extent.height = 32;
14911 image_create_info.extent.depth = 1;
14912 image_create_info.mipLevels = 1;
14913 image_create_info.arrayLayers = 1;
14914 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14915 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14916 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14917 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
14918 image_create_info.flags = 0;
14919
14920 VkImage nullImg;
14921 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014922 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
14923 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070014924 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060014925 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14926 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14927 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070014928 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060014929
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014930 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060014931 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
14932 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14933 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14934 m_errorMonitor->VerifyFound();
14935 image_create_info.mipLevels = 1;
14936
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014937 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060014938 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
14939 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14940 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14941 m_errorMonitor->VerifyFound();
14942 image_create_info.arrayLayers = 1;
14943
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060014945 int samples = imgFmtProps.sampleCounts >> 1;
14946 image_create_info.samples = (VkSampleCountFlagBits)samples;
14947 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14948 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14949 m_errorMonitor->VerifyFound();
14950 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14951
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pCreateInfo->initialLayout, must be "
14953 "VK_IMAGE_LAYOUT_UNDEFINED or "
14954 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060014955 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14956 // Expect INVALID_LAYOUT
14957 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14958 m_errorMonitor->VerifyFound();
14959 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
14960}
14961
Mark Lobodzinskicea14992016-10-14 10:59:42 -060014962TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
14963
14964 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060014965 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060014966
14967 ASSERT_NO_FATAL_FAILURE(InitState());
14968
14969 VkImageObj src_image(m_device);
14970 src_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
14971 VkImageObj dst_image(m_device);
14972 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
14973
Tony Barbour552f6c02016-12-21 14:34:07 -070014974 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060014975 VkImageCopy copy_region;
14976 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14977 copy_region.srcSubresource.mipLevel = 0;
14978 copy_region.srcSubresource.baseArrayLayer = 0;
14979 copy_region.srcSubresource.layerCount = 0;
14980 copy_region.srcOffset.x = 0;
14981 copy_region.srcOffset.y = 0;
14982 copy_region.srcOffset.z = 0;
14983 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14984 copy_region.dstSubresource.mipLevel = 0;
14985 copy_region.dstSubresource.baseArrayLayer = 0;
14986 copy_region.dstSubresource.layerCount = 0;
14987 copy_region.dstOffset.x = 0;
14988 copy_region.dstOffset.y = 0;
14989 copy_region.dstOffset.z = 0;
14990 copy_region.extent.width = 64;
14991 copy_region.extent.height = 64;
14992 copy_region.extent.depth = 1;
14993 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
14994 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070014995 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060014996
14997 m_errorMonitor->VerifyFound();
14998}
14999
15000TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
15001
15002 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060015003 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015004
15005 ASSERT_NO_FATAL_FAILURE(InitState());
15006
15007 VkImageObj src_image(m_device);
15008 src_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
15009 VkImageObj dst_image(m_device);
15010 dst_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
15011
Tony Barbour552f6c02016-12-21 14:34:07 -070015012 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015013 VkImageCopy copy_region;
15014 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15015 copy_region.srcSubresource.mipLevel = 0;
15016 copy_region.srcSubresource.baseArrayLayer = 0;
15017 copy_region.srcSubresource.layerCount = 0;
15018 copy_region.srcOffset.x = 0;
15019 copy_region.srcOffset.y = 0;
15020 copy_region.srcOffset.z = 0;
15021 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15022 copy_region.dstSubresource.mipLevel = 0;
15023 copy_region.dstSubresource.baseArrayLayer = 0;
15024 copy_region.dstSubresource.layerCount = 0;
15025 copy_region.dstOffset.x = 0;
15026 copy_region.dstOffset.y = 0;
15027 copy_region.dstOffset.z = 0;
15028 copy_region.extent.width = 64;
15029 copy_region.extent.height = 64;
15030 copy_region.extent.depth = 1;
15031 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
15032 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070015033 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060015034
15035 m_errorMonitor->VerifyFound();
15036}
15037
Karl Schultz6addd812016-02-02 17:17:23 -070015038TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060015039 VkResult err;
15040 bool pass;
15041
15042 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015043 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060015044
15045 ASSERT_NO_FATAL_FAILURE(InitState());
15046
15047 // Create two images of different types and try to copy between them
15048 VkImage srcImage;
15049 VkImage dstImage;
15050 VkDeviceMemory srcMem;
15051 VkDeviceMemory destMem;
15052 VkMemoryRequirements memReqs;
15053
15054 VkImageCreateInfo image_create_info = {};
15055 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15056 image_create_info.pNext = NULL;
15057 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15058 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15059 image_create_info.extent.width = 32;
15060 image_create_info.extent.height = 32;
15061 image_create_info.extent.depth = 1;
15062 image_create_info.mipLevels = 1;
15063 image_create_info.arrayLayers = 1;
15064 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15065 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15066 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15067 image_create_info.flags = 0;
15068
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015069 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060015070 ASSERT_VK_SUCCESS(err);
15071
15072 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
15073 // Introduce failure by creating second image with a different-sized format.
15074 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
15075
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015076 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060015077 ASSERT_VK_SUCCESS(err);
15078
15079 // Allocate memory
15080 VkMemoryAllocateInfo memAlloc = {};
15081 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15082 memAlloc.pNext = NULL;
15083 memAlloc.allocationSize = 0;
15084 memAlloc.memoryTypeIndex = 0;
15085
15086 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
15087 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015088 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060015089 ASSERT_TRUE(pass);
15090 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
15091 ASSERT_VK_SUCCESS(err);
15092
15093 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
15094 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015095 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060015096 ASSERT_TRUE(pass);
15097 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
15098 ASSERT_VK_SUCCESS(err);
15099
15100 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15101 ASSERT_VK_SUCCESS(err);
15102 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
15103 ASSERT_VK_SUCCESS(err);
15104
Tony Barbour552f6c02016-12-21 14:34:07 -070015105 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060015106 VkImageCopy copyRegion;
15107 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15108 copyRegion.srcSubresource.mipLevel = 0;
15109 copyRegion.srcSubresource.baseArrayLayer = 0;
15110 copyRegion.srcSubresource.layerCount = 0;
15111 copyRegion.srcOffset.x = 0;
15112 copyRegion.srcOffset.y = 0;
15113 copyRegion.srcOffset.z = 0;
15114 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15115 copyRegion.dstSubresource.mipLevel = 0;
15116 copyRegion.dstSubresource.baseArrayLayer = 0;
15117 copyRegion.dstSubresource.layerCount = 0;
15118 copyRegion.dstOffset.x = 0;
15119 copyRegion.dstOffset.y = 0;
15120 copyRegion.dstOffset.z = 0;
15121 copyRegion.extent.width = 1;
15122 copyRegion.extent.height = 1;
15123 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015124 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015125 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060015126
15127 m_errorMonitor->VerifyFound();
15128
15129 vkDestroyImage(m_device->device(), srcImage, NULL);
15130 vkDestroyImage(m_device->device(), dstImage, NULL);
15131 vkFreeMemory(m_device->device(), srcMem, NULL);
15132 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015133}
15134
Karl Schultz6addd812016-02-02 17:17:23 -070015135TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
15136 VkResult err;
15137 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015138
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015139 // Create a color image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015140 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15141 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015142
Mike Stroyana3082432015-09-25 13:39:21 -060015143 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015144
15145 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015146 VkImage srcImage;
15147 VkImage dstImage;
15148 VkDeviceMemory srcMem;
15149 VkDeviceMemory destMem;
15150 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015151
15152 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015153 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15154 image_create_info.pNext = NULL;
15155 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15156 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15157 image_create_info.extent.width = 32;
15158 image_create_info.extent.height = 32;
15159 image_create_info.extent.depth = 1;
15160 image_create_info.mipLevels = 1;
15161 image_create_info.arrayLayers = 1;
15162 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15163 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15164 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15165 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015166
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015167 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015168 ASSERT_VK_SUCCESS(err);
15169
Karl Schultzbdb75952016-04-19 11:36:49 -060015170 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
15171
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015172 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070015173 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015174 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060015175 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015176
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015177 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015178 ASSERT_VK_SUCCESS(err);
15179
15180 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015181 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015182 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15183 memAlloc.pNext = NULL;
15184 memAlloc.allocationSize = 0;
15185 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015186
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015187 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015188 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015189 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015190 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015191 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015192 ASSERT_VK_SUCCESS(err);
15193
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015194 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015195 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015196 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015197 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015198 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015199 ASSERT_VK_SUCCESS(err);
15200
15201 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15202 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015203 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015204 ASSERT_VK_SUCCESS(err);
15205
Tony Barbour552f6c02016-12-21 14:34:07 -070015206 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015207 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015208 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015209 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015210 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015211 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015212 copyRegion.srcOffset.x = 0;
15213 copyRegion.srcOffset.y = 0;
15214 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015215 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015216 copyRegion.dstSubresource.mipLevel = 0;
15217 copyRegion.dstSubresource.baseArrayLayer = 0;
15218 copyRegion.dstSubresource.layerCount = 0;
15219 copyRegion.dstOffset.x = 0;
15220 copyRegion.dstOffset.y = 0;
15221 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015222 copyRegion.extent.width = 1;
15223 copyRegion.extent.height = 1;
15224 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015225 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015226 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015227
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015228 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015229
Chia-I Wuf7458c52015-10-26 21:10:41 +080015230 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015231 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015232 vkFreeMemory(m_device->device(), srcMem, NULL);
15233 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015234}
15235
Karl Schultz6addd812016-02-02 17:17:23 -070015236TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
15237 VkResult err;
15238 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015239
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015240 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15241 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015242
Mike Stroyana3082432015-09-25 13:39:21 -060015243 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015244
15245 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070015246 VkImage srcImage;
15247 VkImage dstImage;
15248 VkDeviceMemory srcMem;
15249 VkDeviceMemory destMem;
15250 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015251
15252 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015253 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15254 image_create_info.pNext = NULL;
15255 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15256 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15257 image_create_info.extent.width = 32;
15258 image_create_info.extent.height = 1;
15259 image_create_info.extent.depth = 1;
15260 image_create_info.mipLevels = 1;
15261 image_create_info.arrayLayers = 1;
15262 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15263 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15264 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15265 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015266
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015267 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015268 ASSERT_VK_SUCCESS(err);
15269
Karl Schultz6addd812016-02-02 17:17:23 -070015270 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015271
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015272 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015273 ASSERT_VK_SUCCESS(err);
15274
15275 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015276 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015277 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15278 memAlloc.pNext = NULL;
15279 memAlloc.allocationSize = 0;
15280 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015281
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015282 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015283 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015284 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015285 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015286 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015287 ASSERT_VK_SUCCESS(err);
15288
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015289 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015290 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015291 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015292 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015293 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015294 ASSERT_VK_SUCCESS(err);
15295
15296 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15297 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015298 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015299 ASSERT_VK_SUCCESS(err);
15300
Tony Barbour552f6c02016-12-21 14:34:07 -070015301 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015302 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015303 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15304 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015305 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015306 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015307 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015308 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015309 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015310 resolveRegion.srcOffset.x = 0;
15311 resolveRegion.srcOffset.y = 0;
15312 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015313 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015314 resolveRegion.dstSubresource.mipLevel = 0;
15315 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015316 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015317 resolveRegion.dstOffset.x = 0;
15318 resolveRegion.dstOffset.y = 0;
15319 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015320 resolveRegion.extent.width = 1;
15321 resolveRegion.extent.height = 1;
15322 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015323 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015324 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015325
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015326 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015327
Chia-I Wuf7458c52015-10-26 21:10:41 +080015328 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015329 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015330 vkFreeMemory(m_device->device(), srcMem, NULL);
15331 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015332}
15333
Karl Schultz6addd812016-02-02 17:17:23 -070015334TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
15335 VkResult err;
15336 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015337
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015338 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15339 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015340
Mike Stroyana3082432015-09-25 13:39:21 -060015341 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015342
Chris Forbesa7530692016-05-08 12:35:39 +120015343 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070015344 VkImage srcImage;
15345 VkImage dstImage;
15346 VkDeviceMemory srcMem;
15347 VkDeviceMemory destMem;
15348 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015349
15350 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015351 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15352 image_create_info.pNext = NULL;
15353 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15354 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15355 image_create_info.extent.width = 32;
15356 image_create_info.extent.height = 1;
15357 image_create_info.extent.depth = 1;
15358 image_create_info.mipLevels = 1;
15359 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120015360 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015361 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15362 // Note: Some implementations expect color attachment usage for any
15363 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015364 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015365 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015366
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015367 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015368 ASSERT_VK_SUCCESS(err);
15369
Karl Schultz6addd812016-02-02 17:17:23 -070015370 // Note: Some implementations expect color attachment usage for any
15371 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015372 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015373
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015374 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015375 ASSERT_VK_SUCCESS(err);
15376
15377 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015378 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015379 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15380 memAlloc.pNext = NULL;
15381 memAlloc.allocationSize = 0;
15382 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015383
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015384 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015385 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015386 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015387 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015388 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015389 ASSERT_VK_SUCCESS(err);
15390
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015391 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015392 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015393 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015394 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015395 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015396 ASSERT_VK_SUCCESS(err);
15397
15398 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15399 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015400 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015401 ASSERT_VK_SUCCESS(err);
15402
Tony Barbour552f6c02016-12-21 14:34:07 -070015403 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015404 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015405 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15406 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015407 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015408 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015409 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015410 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015411 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015412 resolveRegion.srcOffset.x = 0;
15413 resolveRegion.srcOffset.y = 0;
15414 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015415 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015416 resolveRegion.dstSubresource.mipLevel = 0;
15417 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015418 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015419 resolveRegion.dstOffset.x = 0;
15420 resolveRegion.dstOffset.y = 0;
15421 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015422 resolveRegion.extent.width = 1;
15423 resolveRegion.extent.height = 1;
15424 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015425 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015426 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015427
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015428 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015429
Chia-I Wuf7458c52015-10-26 21:10:41 +080015430 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015431 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015432 vkFreeMemory(m_device->device(), srcMem, NULL);
15433 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015434}
15435
Karl Schultz6addd812016-02-02 17:17:23 -070015436TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
15437 VkResult err;
15438 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015439
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015440 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15441 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015442
Mike Stroyana3082432015-09-25 13:39:21 -060015443 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015444
15445 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015446 VkImage srcImage;
15447 VkImage dstImage;
15448 VkDeviceMemory srcMem;
15449 VkDeviceMemory destMem;
15450 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015451
15452 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015453 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15454 image_create_info.pNext = NULL;
15455 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15456 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15457 image_create_info.extent.width = 32;
15458 image_create_info.extent.height = 1;
15459 image_create_info.extent.depth = 1;
15460 image_create_info.mipLevels = 1;
15461 image_create_info.arrayLayers = 1;
15462 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
15463 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15464 // Note: Some implementations expect color attachment usage for any
15465 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015466 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015467 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015468
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015469 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015470 ASSERT_VK_SUCCESS(err);
15471
Karl Schultz6addd812016-02-02 17:17:23 -070015472 // Set format to something other than source image
15473 image_create_info.format = VK_FORMAT_R32_SFLOAT;
15474 // Note: Some implementations expect color attachment usage for any
15475 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015476 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015477 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015478
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015479 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015480 ASSERT_VK_SUCCESS(err);
15481
15482 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015483 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015484 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15485 memAlloc.pNext = NULL;
15486 memAlloc.allocationSize = 0;
15487 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015488
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015489 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015490 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015491 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015492 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015493 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015494 ASSERT_VK_SUCCESS(err);
15495
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015496 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015497 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015498 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015499 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015500 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015501 ASSERT_VK_SUCCESS(err);
15502
15503 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15504 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015505 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015506 ASSERT_VK_SUCCESS(err);
15507
Tony Barbour552f6c02016-12-21 14:34:07 -070015508 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015509 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015510 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15511 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015512 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015513 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015514 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015515 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015516 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015517 resolveRegion.srcOffset.x = 0;
15518 resolveRegion.srcOffset.y = 0;
15519 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015520 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015521 resolveRegion.dstSubresource.mipLevel = 0;
15522 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015523 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015524 resolveRegion.dstOffset.x = 0;
15525 resolveRegion.dstOffset.y = 0;
15526 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015527 resolveRegion.extent.width = 1;
15528 resolveRegion.extent.height = 1;
15529 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015530 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015531 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015532
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015533 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015534
Chia-I Wuf7458c52015-10-26 21:10:41 +080015535 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015536 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015537 vkFreeMemory(m_device->device(), srcMem, NULL);
15538 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015539}
15540
Karl Schultz6addd812016-02-02 17:17:23 -070015541TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
15542 VkResult err;
15543 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015544
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015545 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15546 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015547
Mike Stroyana3082432015-09-25 13:39:21 -060015548 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015549
15550 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015551 VkImage srcImage;
15552 VkImage dstImage;
15553 VkDeviceMemory srcMem;
15554 VkDeviceMemory destMem;
15555 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015556
15557 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015558 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15559 image_create_info.pNext = NULL;
15560 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15561 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15562 image_create_info.extent.width = 32;
15563 image_create_info.extent.height = 1;
15564 image_create_info.extent.depth = 1;
15565 image_create_info.mipLevels = 1;
15566 image_create_info.arrayLayers = 1;
15567 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
15568 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15569 // Note: Some implementations expect color attachment usage for any
15570 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015571 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015572 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015573
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015574 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015575 ASSERT_VK_SUCCESS(err);
15576
Karl Schultz6addd812016-02-02 17:17:23 -070015577 image_create_info.imageType = VK_IMAGE_TYPE_1D;
15578 // Note: Some implementations expect color attachment usage for any
15579 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015580 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015581 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015582
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015583 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015584 ASSERT_VK_SUCCESS(err);
15585
15586 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015587 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015588 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15589 memAlloc.pNext = NULL;
15590 memAlloc.allocationSize = 0;
15591 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015592
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015593 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015594 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015595 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015596 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015597 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015598 ASSERT_VK_SUCCESS(err);
15599
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015600 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015601 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015602 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015603 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015604 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015605 ASSERT_VK_SUCCESS(err);
15606
15607 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15608 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015609 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015610 ASSERT_VK_SUCCESS(err);
15611
Tony Barbour552f6c02016-12-21 14:34:07 -070015612 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015613 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015614 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15615 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015616 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015617 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015618 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015619 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015620 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015621 resolveRegion.srcOffset.x = 0;
15622 resolveRegion.srcOffset.y = 0;
15623 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015624 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015625 resolveRegion.dstSubresource.mipLevel = 0;
15626 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015627 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015628 resolveRegion.dstOffset.x = 0;
15629 resolveRegion.dstOffset.y = 0;
15630 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015631 resolveRegion.extent.width = 1;
15632 resolveRegion.extent.height = 1;
15633 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015634 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015635 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015636
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015637 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015638
Chia-I Wuf7458c52015-10-26 21:10:41 +080015639 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015640 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015641 vkFreeMemory(m_device->device(), srcMem, NULL);
15642 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015643}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015644
Karl Schultz6addd812016-02-02 17:17:23 -070015645TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015646 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070015647 // to using a DS format, then cause it to hit error due to COLOR_BIT not
15648 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015649 // The image format check comes 2nd in validation so we trigger it first,
15650 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070015651 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015652
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15654 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015655
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015656 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015657
Chia-I Wu1b99bb22015-10-27 19:25:11 +080015658 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015659 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
15660 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015661
15662 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015663 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
15664 ds_pool_ci.pNext = NULL;
15665 ds_pool_ci.maxSets = 1;
15666 ds_pool_ci.poolSizeCount = 1;
15667 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015668
15669 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015670 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015671 ASSERT_VK_SUCCESS(err);
15672
15673 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015674 dsl_binding.binding = 0;
15675 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
15676 dsl_binding.descriptorCount = 1;
15677 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
15678 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015679
15680 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015681 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
15682 ds_layout_ci.pNext = NULL;
15683 ds_layout_ci.bindingCount = 1;
15684 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015685 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015686 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015687 ASSERT_VK_SUCCESS(err);
15688
15689 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015690 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080015691 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070015692 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015693 alloc_info.descriptorPool = ds_pool;
15694 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015695 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015696 ASSERT_VK_SUCCESS(err);
15697
Karl Schultz6addd812016-02-02 17:17:23 -070015698 VkImage image_bad;
15699 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015700 // One bad format and one good format for Color attachment
Tobin Ehlis269f0322016-05-25 16:24:21 -060015701 const VkFormat tex_format_bad = VK_FORMAT_D24_UNORM_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015702 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070015703 const int32_t tex_width = 32;
15704 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015705
15706 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015707 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15708 image_create_info.pNext = NULL;
15709 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15710 image_create_info.format = tex_format_bad;
15711 image_create_info.extent.width = tex_width;
15712 image_create_info.extent.height = tex_height;
15713 image_create_info.extent.depth = 1;
15714 image_create_info.mipLevels = 1;
15715 image_create_info.arrayLayers = 1;
15716 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15717 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015718 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015719 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015720
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015721 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015722 ASSERT_VK_SUCCESS(err);
15723 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015724 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15725 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015726 ASSERT_VK_SUCCESS(err);
15727
Rene Lindsayf1e89c82016-12-28 13:18:31 -070015728 // ---Bind image memory---
15729 VkMemoryRequirements img_mem_reqs;
15730 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
15731 VkMemoryAllocateInfo image_alloc_info = {};
15732 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15733 image_alloc_info.pNext = NULL;
15734 image_alloc_info.memoryTypeIndex = 0;
15735 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015736 bool pass =
15737 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 -070015738 ASSERT_TRUE(pass);
15739 VkDeviceMemory mem;
15740 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
15741 ASSERT_VK_SUCCESS(err);
15742 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
15743 ASSERT_VK_SUCCESS(err);
15744 // -----------------------
15745
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015746 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015747 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015748 image_view_create_info.image = image_bad;
15749 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15750 image_view_create_info.format = tex_format_bad;
15751 image_view_create_info.subresourceRange.baseArrayLayer = 0;
15752 image_view_create_info.subresourceRange.baseMipLevel = 0;
15753 image_view_create_info.subresourceRange.layerCount = 1;
15754 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070015755 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015756
15757 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015758 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015759
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015760 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015761
Chia-I Wuf7458c52015-10-26 21:10:41 +080015762 vkDestroyImage(m_device->device(), image_bad, NULL);
15763 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015764 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
15765 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070015766
15767 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015768}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015769
15770TEST_F(VkLayerTest, ClearImageErrors) {
15771 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and "
15772 "ClearDepthStencilImage with a color image.");
15773
15774 ASSERT_NO_FATAL_FAILURE(InitState());
15775 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15776
Tony Barbour552f6c02016-12-21 14:34:07 -070015777 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015778
15779 // Color image
15780 VkClearColorValue clear_color;
15781 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
15782 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
15783 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
15784 const int32_t img_width = 32;
15785 const int32_t img_height = 32;
15786 VkImageCreateInfo image_create_info = {};
15787 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15788 image_create_info.pNext = NULL;
15789 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15790 image_create_info.format = color_format;
15791 image_create_info.extent.width = img_width;
15792 image_create_info.extent.height = img_height;
15793 image_create_info.extent.depth = 1;
15794 image_create_info.mipLevels = 1;
15795 image_create_info.arrayLayers = 1;
15796 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15797 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15798 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15799
15800 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015801 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015802
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015803 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015804
15805 // Depth/Stencil image
15806 VkClearDepthStencilValue clear_value = {0};
15807 reqs = 0; // don't need HOST_VISIBLE DS image
15808 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
15809 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
15810 ds_image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
15811 ds_image_create_info.extent.width = 64;
15812 ds_image_create_info.extent.height = 64;
15813 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070015814 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 -060015815
15816 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015817 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015818
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015819 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 -060015820
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015821 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015822
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015823 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015824 &color_range);
15825
15826 m_errorMonitor->VerifyFound();
15827
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015828 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with "
15829 "image created without "
15830 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060015831
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070015832 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060015833 &color_range);
15834
15835 m_errorMonitor->VerifyFound();
15836
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015837 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015838 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15839 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015840
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015841 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
15842 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015843
15844 m_errorMonitor->VerifyFound();
15845}
Tobin Ehliscde08892015-09-22 10:11:37 -060015846#endif // IMAGE_TESTS
15847
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060015848// WSI Enabled Tests
15849//
Chris Forbes09368e42016-10-13 11:59:22 +130015850#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060015851TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
15852
15853#if defined(VK_USE_PLATFORM_XCB_KHR)
15854 VkSurfaceKHR surface = VK_NULL_HANDLE;
15855
15856 VkResult err;
15857 bool pass;
15858 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
15859 VkSwapchainCreateInfoKHR swapchain_create_info = {};
15860 // uint32_t swapchain_image_count = 0;
15861 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
15862 // uint32_t image_index = 0;
15863 // VkPresentInfoKHR present_info = {};
15864
15865 ASSERT_NO_FATAL_FAILURE(InitState());
15866
15867 // Use the create function from one of the VK_KHR_*_surface extension in
15868 // order to create a surface, testing all known errors in the process,
15869 // before successfully creating a surface:
15870 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
15871 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
15872 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
15873 pass = (err != VK_SUCCESS);
15874 ASSERT_TRUE(pass);
15875 m_errorMonitor->VerifyFound();
15876
15877 // Next, try to create a surface with the wrong
15878 // VkXcbSurfaceCreateInfoKHR::sType:
15879 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
15880 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
15881 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
15882 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
15883 pass = (err != VK_SUCCESS);
15884 ASSERT_TRUE(pass);
15885 m_errorMonitor->VerifyFound();
15886
15887 // Create a native window, and then correctly create a surface:
15888 xcb_connection_t *connection;
15889 xcb_screen_t *screen;
15890 xcb_window_t xcb_window;
15891 xcb_intern_atom_reply_t *atom_wm_delete_window;
15892
15893 const xcb_setup_t *setup;
15894 xcb_screen_iterator_t iter;
15895 int scr;
15896 uint32_t value_mask, value_list[32];
15897 int width = 1;
15898 int height = 1;
15899
15900 connection = xcb_connect(NULL, &scr);
15901 ASSERT_TRUE(connection != NULL);
15902 setup = xcb_get_setup(connection);
15903 iter = xcb_setup_roots_iterator(setup);
15904 while (scr-- > 0)
15905 xcb_screen_next(&iter);
15906 screen = iter.data;
15907
15908 xcb_window = xcb_generate_id(connection);
15909
15910 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
15911 value_list[0] = screen->black_pixel;
15912 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
15913
15914 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
15915 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
15916
15917 /* Magic code that will send notification when window is destroyed */
15918 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
15919 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
15920
15921 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
15922 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
15923 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
15924 free(reply);
15925
15926 xcb_map_window(connection, xcb_window);
15927
15928 // Force the x/y coordinates to 100,100 results are identical in consecutive
15929 // runs
15930 const uint32_t coords[] = { 100, 100 };
15931 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
15932
15933 // Finally, try to correctly create a surface:
15934 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
15935 xcb_create_info.pNext = NULL;
15936 xcb_create_info.flags = 0;
15937 xcb_create_info.connection = connection;
15938 xcb_create_info.window = xcb_window;
15939 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
15940 pass = (err == VK_SUCCESS);
15941 ASSERT_TRUE(pass);
15942
15943 // Check if surface supports presentation:
15944
15945 // 1st, do so without having queried the queue families:
15946 VkBool32 supported = false;
15947 // TODO: Get the following error to come out:
15948 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15949 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
15950 "function");
15951 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
15952 pass = (err != VK_SUCCESS);
15953 // ASSERT_TRUE(pass);
15954 // m_errorMonitor->VerifyFound();
15955
15956 // Next, query a queue family index that's too large:
15957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
15958 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
15959 pass = (err != VK_SUCCESS);
15960 ASSERT_TRUE(pass);
15961 m_errorMonitor->VerifyFound();
15962
15963 // Finally, do so correctly:
15964 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
15965 // SUPPORTED
15966 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
15967 pass = (err == VK_SUCCESS);
15968 ASSERT_TRUE(pass);
15969
15970 // Before proceeding, try to create a swapchain without having called
15971 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
15972 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
15973 swapchain_create_info.pNext = NULL;
15974 swapchain_create_info.flags = 0;
15975 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15976 swapchain_create_info.surface = surface;
15977 swapchain_create_info.imageArrayLayers = 1;
15978 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
15979 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
15980 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15981 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
15982 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
15983 pass = (err != VK_SUCCESS);
15984 ASSERT_TRUE(pass);
15985 m_errorMonitor->VerifyFound();
15986
15987 // Get the surface capabilities:
15988 VkSurfaceCapabilitiesKHR surface_capabilities;
15989
15990 // Do so correctly (only error logged by this entrypoint is if the
15991 // extension isn't enabled):
15992 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
15993 pass = (err == VK_SUCCESS);
15994 ASSERT_TRUE(pass);
15995
15996 // Get the surface formats:
15997 uint32_t surface_format_count;
15998
15999 // First, try without a pointer to surface_format_count:
16000 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
16001 "specified as NULL");
16002 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
16003 pass = (err == VK_SUCCESS);
16004 ASSERT_TRUE(pass);
16005 m_errorMonitor->VerifyFound();
16006
16007 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
16008 // correctly done a 1st try (to get the count):
16009 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
16010 surface_format_count = 0;
16011 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
16012 pass = (err == VK_SUCCESS);
16013 ASSERT_TRUE(pass);
16014 m_errorMonitor->VerifyFound();
16015
16016 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
16017 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
16018 pass = (err == VK_SUCCESS);
16019 ASSERT_TRUE(pass);
16020
16021 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
16022 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
16023
16024 // Next, do a 2nd try with surface_format_count being set too high:
16025 surface_format_count += 5;
16026 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
16027 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
16028 pass = (err == VK_SUCCESS);
16029 ASSERT_TRUE(pass);
16030 m_errorMonitor->VerifyFound();
16031
16032 // Finally, do a correct 1st and 2nd try:
16033 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
16034 pass = (err == VK_SUCCESS);
16035 ASSERT_TRUE(pass);
16036 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
16037 pass = (err == VK_SUCCESS);
16038 ASSERT_TRUE(pass);
16039
16040 // Get the surface present modes:
16041 uint32_t surface_present_mode_count;
16042
16043 // First, try without a pointer to surface_format_count:
16044 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
16045 "specified as NULL");
16046
16047 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
16048 pass = (err == VK_SUCCESS);
16049 ASSERT_TRUE(pass);
16050 m_errorMonitor->VerifyFound();
16051
16052 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
16053 // correctly done a 1st try (to get the count):
16054 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
16055 surface_present_mode_count = 0;
16056 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
16057 (VkPresentModeKHR *)&surface_present_mode_count);
16058 pass = (err == VK_SUCCESS);
16059 ASSERT_TRUE(pass);
16060 m_errorMonitor->VerifyFound();
16061
16062 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
16063 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
16064 pass = (err == VK_SUCCESS);
16065 ASSERT_TRUE(pass);
16066
16067 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
16068 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
16069
16070 // Next, do a 2nd try with surface_format_count being set too high:
16071 surface_present_mode_count += 5;
16072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
16073 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
16074 pass = (err == VK_SUCCESS);
16075 ASSERT_TRUE(pass);
16076 m_errorMonitor->VerifyFound();
16077
16078 // Finally, do a correct 1st and 2nd try:
16079 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
16080 pass = (err == VK_SUCCESS);
16081 ASSERT_TRUE(pass);
16082 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
16083 pass = (err == VK_SUCCESS);
16084 ASSERT_TRUE(pass);
16085
16086 // Create a swapchain:
16087
16088 // First, try without a pointer to swapchain_create_info:
16089 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
16090 "specified as NULL");
16091
16092 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
16093 pass = (err != VK_SUCCESS);
16094 ASSERT_TRUE(pass);
16095 m_errorMonitor->VerifyFound();
16096
16097 // Next, call with a non-NULL swapchain_create_info, that has the wrong
16098 // sType:
16099 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
16100 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
16101
16102 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
16103 pass = (err != VK_SUCCESS);
16104 ASSERT_TRUE(pass);
16105 m_errorMonitor->VerifyFound();
16106
16107 // Next, call with a NULL swapchain pointer:
16108 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
16109 swapchain_create_info.pNext = NULL;
16110 swapchain_create_info.flags = 0;
16111 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
16112 "specified as NULL");
16113
16114 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
16115 pass = (err != VK_SUCCESS);
16116 ASSERT_TRUE(pass);
16117 m_errorMonitor->VerifyFound();
16118
16119 // TODO: Enhance swapchain layer so that
16120 // swapchain_create_info.queueFamilyIndexCount is checked against something?
16121
16122 // Next, call with a queue family index that's too large:
16123 uint32_t queueFamilyIndex[2] = { 100000, 0 };
16124 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
16125 swapchain_create_info.queueFamilyIndexCount = 2;
16126 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
16127 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
16128 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
16129 pass = (err != VK_SUCCESS);
16130 ASSERT_TRUE(pass);
16131 m_errorMonitor->VerifyFound();
16132
16133 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
16134 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
16135 swapchain_create_info.queueFamilyIndexCount = 1;
16136 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16137 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
16138 "pCreateInfo->pQueueFamilyIndices).");
16139 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
16140 pass = (err != VK_SUCCESS);
16141 ASSERT_TRUE(pass);
16142 m_errorMonitor->VerifyFound();
16143
16144 // Next, call with an invalid imageSharingMode:
16145 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
16146 swapchain_create_info.queueFamilyIndexCount = 1;
16147 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16148 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
16149 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
16150 pass = (err != VK_SUCCESS);
16151 ASSERT_TRUE(pass);
16152 m_errorMonitor->VerifyFound();
16153 // Fix for the future:
16154 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
16155 // SUPPORTED
16156 swapchain_create_info.queueFamilyIndexCount = 0;
16157 queueFamilyIndex[0] = 0;
16158 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
16159
16160 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
16161 // Get the images from a swapchain:
16162 // Acquire an image from a swapchain:
16163 // Present an image to a swapchain:
16164 // Destroy the swapchain:
16165
16166 // TODOs:
16167 //
16168 // - Try destroying the device without first destroying the swapchain
16169 //
16170 // - Try destroying the device without first destroying the surface
16171 //
16172 // - Try destroying the surface without first destroying the swapchain
16173
16174 // Destroy the surface:
16175 vkDestroySurfaceKHR(instance(), surface, NULL);
16176
16177 // Tear down the window:
16178 xcb_destroy_window(connection, xcb_window);
16179 xcb_disconnect(connection);
16180
16181#else // VK_USE_PLATFORM_XCB_KHR
16182 return;
16183#endif // VK_USE_PLATFORM_XCB_KHR
16184}
Chris Forbes09368e42016-10-13 11:59:22 +130016185#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016186
16187//
16188// POSITIVE VALIDATION TESTS
16189//
16190// These tests do not expect to encounter ANY validation errors pass only if this is true
16191
Tobin Ehlise0006882016-11-03 10:14:28 -060016192TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
16193 TEST_DESCRIPTION("Perform an image layout transition in a secondary command buffer followed "
16194 "by a transition in the primary.");
16195 VkResult err;
16196 m_errorMonitor->ExpectSuccess();
16197 ASSERT_NO_FATAL_FAILURE(InitState());
16198 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16199 // Allocate a secondary and primary cmd buffer
16200 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
16201 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
16202 command_buffer_allocate_info.commandPool = m_commandPool;
16203 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
16204 command_buffer_allocate_info.commandBufferCount = 1;
16205
16206 VkCommandBuffer secondary_command_buffer;
16207 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
16208 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
16209 VkCommandBuffer primary_command_buffer;
16210 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
16211 VkCommandBufferBeginInfo command_buffer_begin_info = {};
16212 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
16213 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
16214 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
16215 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
16216 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
16217
16218 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
16219 ASSERT_VK_SUCCESS(err);
16220 VkImageObj image(m_device);
16221 image.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
16222 ASSERT_TRUE(image.initialized());
16223 VkImageMemoryBarrier img_barrier = {};
16224 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16225 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16226 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16227 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16228 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
16229 img_barrier.image = image.handle();
16230 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16231 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16232 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16233 img_barrier.subresourceRange.baseArrayLayer = 0;
16234 img_barrier.subresourceRange.baseMipLevel = 0;
16235 img_barrier.subresourceRange.layerCount = 1;
16236 img_barrier.subresourceRange.levelCount = 1;
16237 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
16238 0, nullptr, 1, &img_barrier);
16239 err = vkEndCommandBuffer(secondary_command_buffer);
16240 ASSERT_VK_SUCCESS(err);
16241
16242 // Now update primary cmd buffer to execute secondary and transitions image
16243 command_buffer_begin_info.pInheritanceInfo = nullptr;
16244 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
16245 ASSERT_VK_SUCCESS(err);
16246 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
16247 VkImageMemoryBarrier img_barrier2 = {};
16248 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16249 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16250 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16251 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
16252 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
16253 img_barrier2.image = image.handle();
16254 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16255 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16256 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16257 img_barrier2.subresourceRange.baseArrayLayer = 0;
16258 img_barrier2.subresourceRange.baseMipLevel = 0;
16259 img_barrier2.subresourceRange.layerCount = 1;
16260 img_barrier2.subresourceRange.levelCount = 1;
16261 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
16262 nullptr, 1, &img_barrier2);
16263 err = vkEndCommandBuffer(primary_command_buffer);
16264 ASSERT_VK_SUCCESS(err);
16265 VkSubmitInfo submit_info = {};
16266 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
16267 submit_info.commandBufferCount = 1;
16268 submit_info.pCommandBuffers = &primary_command_buffer;
16269 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
16270 ASSERT_VK_SUCCESS(err);
16271 m_errorMonitor->VerifyNotFound();
16272 err = vkDeviceWaitIdle(m_device->device());
16273 ASSERT_VK_SUCCESS(err);
16274 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &secondary_command_buffer);
16275 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &primary_command_buffer);
16276}
16277
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016278// This is a positive test. No failures are expected.
16279TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
16280 TEST_DESCRIPTION("Ensure that the vkUpdateDescriptorSets validation code "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016281 "is ignoring VkWriteDescriptorSet members that are not "
16282 "related to the descriptor type specified by "
16283 "VkWriteDescriptorSet::descriptorType. Correct "
16284 "validation behavior will result in the test running to "
16285 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016286
16287 const uintptr_t invalid_ptr = 0xcdcdcdcd;
16288
16289 ASSERT_NO_FATAL_FAILURE(InitState());
16290
16291 // Image Case
16292 {
16293 m_errorMonitor->ExpectSuccess();
16294
16295 VkImage image;
16296 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
16297 const int32_t tex_width = 32;
16298 const int32_t tex_height = 32;
16299 VkImageCreateInfo image_create_info = {};
16300 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16301 image_create_info.pNext = NULL;
16302 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16303 image_create_info.format = tex_format;
16304 image_create_info.extent.width = tex_width;
16305 image_create_info.extent.height = tex_height;
16306 image_create_info.extent.depth = 1;
16307 image_create_info.mipLevels = 1;
16308 image_create_info.arrayLayers = 1;
16309 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16310 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16311 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16312 image_create_info.flags = 0;
16313 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
16314 ASSERT_VK_SUCCESS(err);
16315
16316 VkMemoryRequirements memory_reqs;
16317 VkDeviceMemory image_memory;
16318 bool pass;
16319 VkMemoryAllocateInfo memory_info = {};
16320 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16321 memory_info.pNext = NULL;
16322 memory_info.allocationSize = 0;
16323 memory_info.memoryTypeIndex = 0;
16324 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
16325 memory_info.allocationSize = memory_reqs.size;
16326 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
16327 ASSERT_TRUE(pass);
16328 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
16329 ASSERT_VK_SUCCESS(err);
16330 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
16331 ASSERT_VK_SUCCESS(err);
16332
16333 VkImageViewCreateInfo image_view_create_info = {};
16334 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
16335 image_view_create_info.image = image;
16336 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16337 image_view_create_info.format = tex_format;
16338 image_view_create_info.subresourceRange.layerCount = 1;
16339 image_view_create_info.subresourceRange.baseMipLevel = 0;
16340 image_view_create_info.subresourceRange.levelCount = 1;
16341 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16342
16343 VkImageView view;
16344 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
16345 ASSERT_VK_SUCCESS(err);
16346
16347 VkDescriptorPoolSize ds_type_count = {};
16348 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16349 ds_type_count.descriptorCount = 1;
16350
16351 VkDescriptorPoolCreateInfo ds_pool_ci = {};
16352 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16353 ds_pool_ci.pNext = NULL;
16354 ds_pool_ci.maxSets = 1;
16355 ds_pool_ci.poolSizeCount = 1;
16356 ds_pool_ci.pPoolSizes = &ds_type_count;
16357
16358 VkDescriptorPool ds_pool;
16359 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
16360 ASSERT_VK_SUCCESS(err);
16361
16362 VkDescriptorSetLayoutBinding dsl_binding = {};
16363 dsl_binding.binding = 0;
16364 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16365 dsl_binding.descriptorCount = 1;
16366 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
16367 dsl_binding.pImmutableSamplers = NULL;
16368
16369 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16370 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16371 ds_layout_ci.pNext = NULL;
16372 ds_layout_ci.bindingCount = 1;
16373 ds_layout_ci.pBindings = &dsl_binding;
16374 VkDescriptorSetLayout ds_layout;
16375 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16376 ASSERT_VK_SUCCESS(err);
16377
16378 VkDescriptorSet descriptor_set;
16379 VkDescriptorSetAllocateInfo alloc_info = {};
16380 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
16381 alloc_info.descriptorSetCount = 1;
16382 alloc_info.descriptorPool = ds_pool;
16383 alloc_info.pSetLayouts = &ds_layout;
16384 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
16385 ASSERT_VK_SUCCESS(err);
16386
16387 VkDescriptorImageInfo image_info = {};
16388 image_info.imageView = view;
16389 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
16390
16391 VkWriteDescriptorSet descriptor_write;
16392 memset(&descriptor_write, 0, sizeof(descriptor_write));
16393 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
16394 descriptor_write.dstSet = descriptor_set;
16395 descriptor_write.dstBinding = 0;
16396 descriptor_write.descriptorCount = 1;
16397 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16398 descriptor_write.pImageInfo = &image_info;
16399
16400 // Set pBufferInfo and pTexelBufferView to invalid values, which should
16401 // be
16402 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
16403 // This will most likely produce a crash if the parameter_validation
16404 // layer
16405 // does not correctly ignore pBufferInfo.
16406 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
16407 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
16408
16409 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
16410
16411 m_errorMonitor->VerifyNotFound();
16412
16413 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16414 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
16415 vkDestroyImageView(m_device->device(), view, NULL);
16416 vkDestroyImage(m_device->device(), image, NULL);
16417 vkFreeMemory(m_device->device(), image_memory, NULL);
16418 }
16419
16420 // Buffer Case
16421 {
16422 m_errorMonitor->ExpectSuccess();
16423
16424 VkBuffer buffer;
16425 uint32_t queue_family_index = 0;
16426 VkBufferCreateInfo buffer_create_info = {};
16427 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
16428 buffer_create_info.size = 1024;
16429 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
16430 buffer_create_info.queueFamilyIndexCount = 1;
16431 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
16432
16433 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
16434 ASSERT_VK_SUCCESS(err);
16435
16436 VkMemoryRequirements memory_reqs;
16437 VkDeviceMemory buffer_memory;
16438 bool pass;
16439 VkMemoryAllocateInfo memory_info = {};
16440 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16441 memory_info.pNext = NULL;
16442 memory_info.allocationSize = 0;
16443 memory_info.memoryTypeIndex = 0;
16444
16445 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
16446 memory_info.allocationSize = memory_reqs.size;
16447 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
16448 ASSERT_TRUE(pass);
16449
16450 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
16451 ASSERT_VK_SUCCESS(err);
16452 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
16453 ASSERT_VK_SUCCESS(err);
16454
16455 VkDescriptorPoolSize ds_type_count = {};
16456 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16457 ds_type_count.descriptorCount = 1;
16458
16459 VkDescriptorPoolCreateInfo ds_pool_ci = {};
16460 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16461 ds_pool_ci.pNext = NULL;
16462 ds_pool_ci.maxSets = 1;
16463 ds_pool_ci.poolSizeCount = 1;
16464 ds_pool_ci.pPoolSizes = &ds_type_count;
16465
16466 VkDescriptorPool ds_pool;
16467 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
16468 ASSERT_VK_SUCCESS(err);
16469
16470 VkDescriptorSetLayoutBinding dsl_binding = {};
16471 dsl_binding.binding = 0;
16472 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16473 dsl_binding.descriptorCount = 1;
16474 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
16475 dsl_binding.pImmutableSamplers = NULL;
16476
16477 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16478 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16479 ds_layout_ci.pNext = NULL;
16480 ds_layout_ci.bindingCount = 1;
16481 ds_layout_ci.pBindings = &dsl_binding;
16482 VkDescriptorSetLayout ds_layout;
16483 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16484 ASSERT_VK_SUCCESS(err);
16485
16486 VkDescriptorSet descriptor_set;
16487 VkDescriptorSetAllocateInfo alloc_info = {};
16488 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
16489 alloc_info.descriptorSetCount = 1;
16490 alloc_info.descriptorPool = ds_pool;
16491 alloc_info.pSetLayouts = &ds_layout;
16492 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
16493 ASSERT_VK_SUCCESS(err);
16494
16495 VkDescriptorBufferInfo buffer_info = {};
16496 buffer_info.buffer = buffer;
16497 buffer_info.offset = 0;
16498 buffer_info.range = 1024;
16499
16500 VkWriteDescriptorSet descriptor_write;
16501 memset(&descriptor_write, 0, sizeof(descriptor_write));
16502 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
16503 descriptor_write.dstSet = descriptor_set;
16504 descriptor_write.dstBinding = 0;
16505 descriptor_write.descriptorCount = 1;
16506 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16507 descriptor_write.pBufferInfo = &buffer_info;
16508
16509 // Set pImageInfo and pTexelBufferView to invalid values, which should
16510 // be
16511 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
16512 // This will most likely produce a crash if the parameter_validation
16513 // layer
16514 // does not correctly ignore pImageInfo.
16515 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
16516 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
16517
16518 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
16519
16520 m_errorMonitor->VerifyNotFound();
16521
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016522 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16523 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
16524 vkDestroyBuffer(m_device->device(), buffer, NULL);
16525 vkFreeMemory(m_device->device(), buffer_memory, NULL);
16526 }
16527
16528 // Texel Buffer Case
16529 {
16530 m_errorMonitor->ExpectSuccess();
16531
16532 VkBuffer buffer;
16533 uint32_t queue_family_index = 0;
16534 VkBufferCreateInfo buffer_create_info = {};
16535 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
16536 buffer_create_info.size = 1024;
16537 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
16538 buffer_create_info.queueFamilyIndexCount = 1;
16539 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
16540
16541 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
16542 ASSERT_VK_SUCCESS(err);
16543
16544 VkMemoryRequirements memory_reqs;
16545 VkDeviceMemory buffer_memory;
16546 bool pass;
16547 VkMemoryAllocateInfo memory_info = {};
16548 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16549 memory_info.pNext = NULL;
16550 memory_info.allocationSize = 0;
16551 memory_info.memoryTypeIndex = 0;
16552
16553 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
16554 memory_info.allocationSize = memory_reqs.size;
16555 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
16556 ASSERT_TRUE(pass);
16557
16558 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
16559 ASSERT_VK_SUCCESS(err);
16560 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
16561 ASSERT_VK_SUCCESS(err);
16562
16563 VkBufferViewCreateInfo buff_view_ci = {};
16564 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
16565 buff_view_ci.buffer = buffer;
16566 buff_view_ci.format = VK_FORMAT_R8_UNORM;
16567 buff_view_ci.range = VK_WHOLE_SIZE;
16568 VkBufferView buffer_view;
16569 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
16570
16571 VkDescriptorPoolSize ds_type_count = {};
16572 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
16573 ds_type_count.descriptorCount = 1;
16574
16575 VkDescriptorPoolCreateInfo ds_pool_ci = {};
16576 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16577 ds_pool_ci.pNext = NULL;
16578 ds_pool_ci.maxSets = 1;
16579 ds_pool_ci.poolSizeCount = 1;
16580 ds_pool_ci.pPoolSizes = &ds_type_count;
16581
16582 VkDescriptorPool ds_pool;
16583 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
16584 ASSERT_VK_SUCCESS(err);
16585
16586 VkDescriptorSetLayoutBinding dsl_binding = {};
16587 dsl_binding.binding = 0;
16588 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
16589 dsl_binding.descriptorCount = 1;
16590 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
16591 dsl_binding.pImmutableSamplers = NULL;
16592
16593 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16594 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16595 ds_layout_ci.pNext = NULL;
16596 ds_layout_ci.bindingCount = 1;
16597 ds_layout_ci.pBindings = &dsl_binding;
16598 VkDescriptorSetLayout ds_layout;
16599 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16600 ASSERT_VK_SUCCESS(err);
16601
16602 VkDescriptorSet descriptor_set;
16603 VkDescriptorSetAllocateInfo alloc_info = {};
16604 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
16605 alloc_info.descriptorSetCount = 1;
16606 alloc_info.descriptorPool = ds_pool;
16607 alloc_info.pSetLayouts = &ds_layout;
16608 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
16609 ASSERT_VK_SUCCESS(err);
16610
16611 VkWriteDescriptorSet descriptor_write;
16612 memset(&descriptor_write, 0, sizeof(descriptor_write));
16613 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
16614 descriptor_write.dstSet = descriptor_set;
16615 descriptor_write.dstBinding = 0;
16616 descriptor_write.descriptorCount = 1;
16617 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
16618 descriptor_write.pTexelBufferView = &buffer_view;
16619
16620 // Set pImageInfo and pBufferInfo to invalid values, which should be
16621 // ignored for descriptorType ==
16622 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
16623 // This will most likely produce a crash if the parameter_validation
16624 // layer
16625 // does not correctly ignore pImageInfo and pBufferInfo.
16626 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
16627 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
16628
16629 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
16630
16631 m_errorMonitor->VerifyNotFound();
16632
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016633 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16634 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
16635 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
16636 vkDestroyBuffer(m_device->device(), buffer, NULL);
16637 vkFreeMemory(m_device->device(), buffer_memory, NULL);
16638 }
16639}
16640
Tobin Ehlisf7428442016-10-25 07:58:24 -060016641TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
16642 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
16643
16644 ASSERT_NO_FATAL_FAILURE(InitState());
16645 // Create layout where two binding #s are "1"
16646 static const uint32_t NUM_BINDINGS = 3;
16647 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
16648 dsl_binding[0].binding = 1;
16649 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16650 dsl_binding[0].descriptorCount = 1;
16651 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
16652 dsl_binding[0].pImmutableSamplers = NULL;
16653 dsl_binding[1].binding = 0;
16654 dsl_binding[1].descriptorCount = 1;
16655 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16656 dsl_binding[1].descriptorCount = 1;
16657 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
16658 dsl_binding[1].pImmutableSamplers = NULL;
16659 dsl_binding[2].binding = 1; // Duplicate binding should cause error
16660 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16661 dsl_binding[2].descriptorCount = 1;
16662 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
16663 dsl_binding[2].pImmutableSamplers = NULL;
16664
16665 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16666 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16667 ds_layout_ci.pNext = NULL;
16668 ds_layout_ci.bindingCount = NUM_BINDINGS;
16669 ds_layout_ci.pBindings = dsl_binding;
16670 VkDescriptorSetLayout ds_layout;
16671 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
16672 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16673 m_errorMonitor->VerifyFound();
16674}
16675
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060016676TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060016677 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
16678
16679 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060016680
Tony Barbour552f6c02016-12-21 14:34:07 -070016681 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060016682
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060016683 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
16684
16685 {
16686 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
16687 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
16688 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16689 m_errorMonitor->VerifyFound();
16690 }
16691
16692 {
16693 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
16694 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
16695 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16696 m_errorMonitor->VerifyFound();
16697 }
16698
16699 {
16700 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
16701 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
16702 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16703 m_errorMonitor->VerifyFound();
16704 }
16705
16706 {
16707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
16708 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
16709 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16710 m_errorMonitor->VerifyFound();
16711 }
16712
16713 {
16714 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
16715 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
16716 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16717 m_errorMonitor->VerifyFound();
16718 }
16719
16720 {
16721 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
16722 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
16723 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16724 m_errorMonitor->VerifyFound();
16725 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060016726
16727 {
16728 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
16729 VkRect2D scissor = {{-1, 0}, {16, 16}};
16730 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16731 m_errorMonitor->VerifyFound();
16732 }
16733
16734 {
16735 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
16736 VkRect2D scissor = {{0, -2}, {16, 16}};
16737 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16738 m_errorMonitor->VerifyFound();
16739 }
16740
16741 {
16742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
16743 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
16744 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16745 m_errorMonitor->VerifyFound();
16746 }
16747
16748 {
16749 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
16750 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
16751 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16752 m_errorMonitor->VerifyFound();
16753 }
16754
Tony Barbour552f6c02016-12-21 14:34:07 -070016755 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060016756}
16757
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016758// This is a positive test. No failures are expected.
16759TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
16760 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
16761 VkResult err;
16762
16763 ASSERT_NO_FATAL_FAILURE(InitState());
16764 m_errorMonitor->ExpectSuccess();
16765 VkDescriptorPoolSize ds_type_count = {};
16766 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16767 ds_type_count.descriptorCount = 2;
16768
16769 VkDescriptorPoolCreateInfo ds_pool_ci = {};
16770 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16771 ds_pool_ci.pNext = NULL;
16772 ds_pool_ci.maxSets = 1;
16773 ds_pool_ci.poolSizeCount = 1;
16774 ds_pool_ci.pPoolSizes = &ds_type_count;
16775
16776 VkDescriptorPool ds_pool;
16777 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
16778 ASSERT_VK_SUCCESS(err);
16779
16780 // Create layout with two uniform buffer descriptors w/ empty binding between them
16781 static const uint32_t NUM_BINDINGS = 3;
16782 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
16783 dsl_binding[0].binding = 0;
16784 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16785 dsl_binding[0].descriptorCount = 1;
16786 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
16787 dsl_binding[0].pImmutableSamplers = NULL;
16788 dsl_binding[1].binding = 1;
16789 dsl_binding[1].descriptorCount = 0; // empty binding
16790 dsl_binding[2].binding = 2;
16791 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16792 dsl_binding[2].descriptorCount = 1;
16793 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
16794 dsl_binding[2].pImmutableSamplers = NULL;
16795
16796 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16797 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16798 ds_layout_ci.pNext = NULL;
16799 ds_layout_ci.bindingCount = NUM_BINDINGS;
16800 ds_layout_ci.pBindings = dsl_binding;
16801 VkDescriptorSetLayout ds_layout;
16802 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16803 ASSERT_VK_SUCCESS(err);
16804
16805 VkDescriptorSet descriptor_set = {};
16806 VkDescriptorSetAllocateInfo alloc_info = {};
16807 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
16808 alloc_info.descriptorSetCount = 1;
16809 alloc_info.descriptorPool = ds_pool;
16810 alloc_info.pSetLayouts = &ds_layout;
16811 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
16812 ASSERT_VK_SUCCESS(err);
16813
16814 // Create a buffer to be used for update
16815 VkBufferCreateInfo buff_ci = {};
16816 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
16817 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
16818 buff_ci.size = 256;
16819 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16820 VkBuffer buffer;
16821 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
16822 ASSERT_VK_SUCCESS(err);
16823 // Have to bind memory to buffer before descriptor update
16824 VkMemoryAllocateInfo mem_alloc = {};
16825 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16826 mem_alloc.pNext = NULL;
16827 mem_alloc.allocationSize = 512; // one allocation for both buffers
16828 mem_alloc.memoryTypeIndex = 0;
16829
16830 VkMemoryRequirements mem_reqs;
16831 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
16832 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
16833 if (!pass) {
16834 vkDestroyBuffer(m_device->device(), buffer, NULL);
16835 return;
16836 }
16837
16838 VkDeviceMemory mem;
16839 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
16840 ASSERT_VK_SUCCESS(err);
16841 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
16842 ASSERT_VK_SUCCESS(err);
16843
16844 // Only update the descriptor at binding 2
16845 VkDescriptorBufferInfo buff_info = {};
16846 buff_info.buffer = buffer;
16847 buff_info.offset = 0;
16848 buff_info.range = VK_WHOLE_SIZE;
16849 VkWriteDescriptorSet descriptor_write = {};
16850 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
16851 descriptor_write.dstBinding = 2;
16852 descriptor_write.descriptorCount = 1;
16853 descriptor_write.pTexelBufferView = nullptr;
16854 descriptor_write.pBufferInfo = &buff_info;
16855 descriptor_write.pImageInfo = nullptr;
16856 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16857 descriptor_write.dstSet = descriptor_set;
16858
16859 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
16860
16861 m_errorMonitor->VerifyNotFound();
16862 // Cleanup
16863 vkFreeMemory(m_device->device(), mem, NULL);
16864 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16865 vkDestroyBuffer(m_device->device(), buffer, NULL);
16866 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
16867}
16868
16869// This is a positive test. No failures are expected.
16870TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
16871 VkResult err;
16872 bool pass;
16873
16874 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016875 "the buffer, create an image, and bind the same memory to "
16876 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016877
16878 m_errorMonitor->ExpectSuccess();
16879
16880 ASSERT_NO_FATAL_FAILURE(InitState());
16881
16882 VkBuffer buffer;
16883 VkImage image;
16884 VkDeviceMemory mem;
16885 VkMemoryRequirements mem_reqs;
16886
16887 VkBufferCreateInfo buf_info = {};
16888 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
16889 buf_info.pNext = NULL;
16890 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
16891 buf_info.size = 256;
16892 buf_info.queueFamilyIndexCount = 0;
16893 buf_info.pQueueFamilyIndices = NULL;
16894 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16895 buf_info.flags = 0;
16896 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
16897 ASSERT_VK_SUCCESS(err);
16898
16899 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
16900
16901 VkMemoryAllocateInfo alloc_info = {};
16902 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16903 alloc_info.pNext = NULL;
16904 alloc_info.memoryTypeIndex = 0;
16905
16906 // Ensure memory is big enough for both bindings
16907 alloc_info.allocationSize = 0x10000;
16908
16909 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
16910 if (!pass) {
16911 vkDestroyBuffer(m_device->device(), buffer, NULL);
16912 return;
16913 }
16914
16915 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
16916 ASSERT_VK_SUCCESS(err);
16917
16918 uint8_t *pData;
16919 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
16920 ASSERT_VK_SUCCESS(err);
16921
16922 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
16923
16924 vkUnmapMemory(m_device->device(), mem);
16925
16926 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
16927 ASSERT_VK_SUCCESS(err);
16928
16929 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
16930 // memory. In fact, it was never used by the GPU.
16931 // Just be be sure, wait for idle.
16932 vkDestroyBuffer(m_device->device(), buffer, NULL);
16933 vkDeviceWaitIdle(m_device->device());
16934
Tobin Ehlis6a005702016-12-28 15:25:56 -070016935 // Use optimal as some platforms report linear support but then fail image creation
16936 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
16937 VkImageFormatProperties image_format_properties;
16938 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
16939 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
16940 if (image_format_properties.maxExtent.width == 0) {
16941 printf("Image format not supported; skipped.\n");
16942 vkFreeMemory(m_device->device(), mem, NULL);
16943 return;
16944 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016945 VkImageCreateInfo image_create_info = {};
16946 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_R8G8B8A8_UNORM;
16950 image_create_info.extent.width = 64;
16951 image_create_info.extent.height = 64;
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;
Tobin Ehlis6a005702016-12-28 15:25:56 -070016956 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016957 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
16958 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16959 image_create_info.queueFamilyIndexCount = 0;
16960 image_create_info.pQueueFamilyIndices = NULL;
16961 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16962 image_create_info.flags = 0;
16963
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016964 /* Create a mappable image. It will be the texture if linear images are ok
16965 * to be textures or it will be the staging image if they are not.
16966 */
16967 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
16968 ASSERT_VK_SUCCESS(err);
16969
16970 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
16971
Tobin Ehlis6a005702016-12-28 15:25:56 -070016972 VkMemoryAllocateInfo mem_alloc = {};
16973 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16974 mem_alloc.pNext = NULL;
16975 mem_alloc.allocationSize = 0;
16976 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016977 mem_alloc.allocationSize = mem_reqs.size;
16978
16979 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
16980 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070016981 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016982 vkDestroyImage(m_device->device(), image, NULL);
16983 return;
16984 }
16985
16986 // VALIDATION FAILURE:
16987 err = vkBindImageMemory(m_device->device(), image, mem, 0);
16988 ASSERT_VK_SUCCESS(err);
16989
16990 m_errorMonitor->VerifyNotFound();
16991
16992 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016993 vkDestroyImage(m_device->device(), image, NULL);
16994}
16995
Tobin Ehlis953e8392016-11-17 10:54:13 -070016996TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
16997 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
16998 // We previously had a bug where dynamic offset of inactive bindings was still being used
16999 VkResult err;
17000 m_errorMonitor->ExpectSuccess();
17001
17002 ASSERT_NO_FATAL_FAILURE(InitState());
17003 ASSERT_NO_FATAL_FAILURE(InitViewport());
17004 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
17005
17006 VkDescriptorPoolSize ds_type_count = {};
17007 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
17008 ds_type_count.descriptorCount = 3;
17009
17010 VkDescriptorPoolCreateInfo ds_pool_ci = {};
17011 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17012 ds_pool_ci.pNext = NULL;
17013 ds_pool_ci.maxSets = 1;
17014 ds_pool_ci.poolSizeCount = 1;
17015 ds_pool_ci.pPoolSizes = &ds_type_count;
17016
17017 VkDescriptorPool ds_pool;
17018 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
17019 ASSERT_VK_SUCCESS(err);
17020
17021 const uint32_t BINDING_COUNT = 3;
17022 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070017023 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070017024 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
17025 dsl_binding[0].descriptorCount = 1;
17026 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
17027 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070017028 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070017029 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
17030 dsl_binding[1].descriptorCount = 1;
17031 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
17032 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070017033 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070017034 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
17035 dsl_binding[2].descriptorCount = 1;
17036 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
17037 dsl_binding[2].pImmutableSamplers = NULL;
17038
17039 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
17040 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17041 ds_layout_ci.pNext = NULL;
17042 ds_layout_ci.bindingCount = BINDING_COUNT;
17043 ds_layout_ci.pBindings = dsl_binding;
17044 VkDescriptorSetLayout ds_layout;
17045 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
17046 ASSERT_VK_SUCCESS(err);
17047
17048 VkDescriptorSet descriptor_set;
17049 VkDescriptorSetAllocateInfo alloc_info = {};
17050 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
17051 alloc_info.descriptorSetCount = 1;
17052 alloc_info.descriptorPool = ds_pool;
17053 alloc_info.pSetLayouts = &ds_layout;
17054 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
17055 ASSERT_VK_SUCCESS(err);
17056
17057 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
17058 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
17059 pipeline_layout_ci.pNext = NULL;
17060 pipeline_layout_ci.setLayoutCount = 1;
17061 pipeline_layout_ci.pSetLayouts = &ds_layout;
17062
17063 VkPipelineLayout pipeline_layout;
17064 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
17065 ASSERT_VK_SUCCESS(err);
17066
17067 // Create two buffers to update the descriptors with
17068 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
17069 uint32_t qfi = 0;
17070 VkBufferCreateInfo buffCI = {};
17071 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
17072 buffCI.size = 2048;
17073 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
17074 buffCI.queueFamilyIndexCount = 1;
17075 buffCI.pQueueFamilyIndices = &qfi;
17076
17077 VkBuffer dyub1;
17078 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
17079 ASSERT_VK_SUCCESS(err);
17080 // buffer2
17081 buffCI.size = 1024;
17082 VkBuffer dyub2;
17083 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
17084 ASSERT_VK_SUCCESS(err);
17085 // Allocate memory and bind to buffers
17086 VkMemoryAllocateInfo mem_alloc[2] = {};
17087 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17088 mem_alloc[0].pNext = NULL;
17089 mem_alloc[0].memoryTypeIndex = 0;
17090 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17091 mem_alloc[1].pNext = NULL;
17092 mem_alloc[1].memoryTypeIndex = 0;
17093
17094 VkMemoryRequirements mem_reqs1;
17095 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
17096 VkMemoryRequirements mem_reqs2;
17097 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
17098 mem_alloc[0].allocationSize = mem_reqs1.size;
17099 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
17100 mem_alloc[1].allocationSize = mem_reqs2.size;
17101 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
17102 if (!pass) {
17103 vkDestroyBuffer(m_device->device(), dyub1, NULL);
17104 vkDestroyBuffer(m_device->device(), dyub2, NULL);
17105 return;
17106 }
17107
17108 VkDeviceMemory mem1;
17109 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
17110 ASSERT_VK_SUCCESS(err);
17111 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
17112 ASSERT_VK_SUCCESS(err);
17113 VkDeviceMemory mem2;
17114 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
17115 ASSERT_VK_SUCCESS(err);
17116 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
17117 ASSERT_VK_SUCCESS(err);
17118 // Update descriptors
17119 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
17120 buff_info[0].buffer = dyub1;
17121 buff_info[0].offset = 0;
17122 buff_info[0].range = 256;
17123 buff_info[1].buffer = dyub1;
17124 buff_info[1].offset = 256;
17125 buff_info[1].range = 512;
17126 buff_info[2].buffer = dyub2;
17127 buff_info[2].offset = 0;
17128 buff_info[2].range = 512;
17129
17130 VkWriteDescriptorSet descriptor_write;
17131 memset(&descriptor_write, 0, sizeof(descriptor_write));
17132 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
17133 descriptor_write.dstSet = descriptor_set;
17134 descriptor_write.dstBinding = 0;
17135 descriptor_write.descriptorCount = BINDING_COUNT;
17136 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
17137 descriptor_write.pBufferInfo = buff_info;
17138
17139 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
17140
Tony Barbour552f6c02016-12-21 14:34:07 -070017141 m_commandBuffer->BeginCommandBuffer();
17142 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070017143
17144 // Create PSO to be used for draw-time errors below
17145 char const *vsSource = "#version 450\n"
17146 "\n"
17147 "out gl_PerVertex { \n"
17148 " vec4 gl_Position;\n"
17149 "};\n"
17150 "void main(){\n"
17151 " gl_Position = vec4(1);\n"
17152 "}\n";
17153 char const *fsSource = "#version 450\n"
17154 "\n"
17155 "layout(location=0) out vec4 x;\n"
17156 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
17157 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
17158 "void main(){\n"
17159 " x = vec4(bar1.y) + vec4(bar2.y);\n"
17160 "}\n";
17161 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
17162 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
17163 VkPipelineObj pipe(m_device);
17164 pipe.SetViewport(m_viewports);
17165 pipe.SetScissor(m_scissors);
17166 pipe.AddShader(&vs);
17167 pipe.AddShader(&fs);
17168 pipe.AddColorAttachment();
17169 pipe.CreateVKPipeline(pipeline_layout, renderPass());
17170
17171 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
17172 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
17173 // we used to have a bug in this case.
17174 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
17175 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
17176 &descriptor_set, BINDING_COUNT, dyn_off);
17177 Draw(1, 0, 0, 0);
17178 m_errorMonitor->VerifyNotFound();
17179
17180 vkDestroyBuffer(m_device->device(), dyub1, NULL);
17181 vkDestroyBuffer(m_device->device(), dyub2, NULL);
17182 vkFreeMemory(m_device->device(), mem1, NULL);
17183 vkFreeMemory(m_device->device(), mem2, NULL);
17184
17185 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
17186 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17187 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
17188}
17189
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017190TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
17191
17192 TEST_DESCRIPTION("Ensure that validations handling of non-coherent memory "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017193 "mapping while using VK_WHOLE_SIZE does not cause access "
17194 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017195 VkResult err;
17196 uint8_t *pData;
17197 ASSERT_NO_FATAL_FAILURE(InitState());
17198
17199 VkDeviceMemory mem;
17200 VkMemoryRequirements mem_reqs;
17201 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017202 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017203 VkMemoryAllocateInfo alloc_info = {};
17204 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17205 alloc_info.pNext = NULL;
17206 alloc_info.memoryTypeIndex = 0;
17207
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017208 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017209 alloc_info.allocationSize = allocation_size;
17210
17211 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
17212 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 -070017213 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017214 if (!pass) {
17215 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017216 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
17217 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017218 if (!pass) {
17219 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017220 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
17221 VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
17222 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017223 if (!pass) {
17224 return;
17225 }
17226 }
17227 }
17228
17229 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
17230 ASSERT_VK_SUCCESS(err);
17231
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017232 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017233 m_errorMonitor->ExpectSuccess();
17234 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
17235 ASSERT_VK_SUCCESS(err);
17236 VkMappedMemoryRange mmr = {};
17237 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
17238 mmr.memory = mem;
17239 mmr.offset = 0;
17240 mmr.size = VK_WHOLE_SIZE;
17241 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
17242 ASSERT_VK_SUCCESS(err);
17243 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
17244 ASSERT_VK_SUCCESS(err);
17245 m_errorMonitor->VerifyNotFound();
17246 vkUnmapMemory(m_device->device(), mem);
17247
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017248 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017249 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017250 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017251 ASSERT_VK_SUCCESS(err);
17252 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
17253 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017254 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017255 mmr.size = VK_WHOLE_SIZE;
17256 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
17257 ASSERT_VK_SUCCESS(err);
17258 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
17259 ASSERT_VK_SUCCESS(err);
17260 m_errorMonitor->VerifyNotFound();
17261 vkUnmapMemory(m_device->device(), mem);
17262
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017263 // Map with offset and size
17264 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017265 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017266 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017267 ASSERT_VK_SUCCESS(err);
17268 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
17269 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017270 mmr.offset = 4 * atom_size;
17271 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017272 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
17273 ASSERT_VK_SUCCESS(err);
17274 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
17275 ASSERT_VK_SUCCESS(err);
17276 m_errorMonitor->VerifyNotFound();
17277 vkUnmapMemory(m_device->device(), mem);
17278
17279 // Map without offset and flush WHOLE_SIZE with two separate offsets
17280 m_errorMonitor->ExpectSuccess();
17281 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
17282 ASSERT_VK_SUCCESS(err);
17283 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
17284 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017285 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017286 mmr.size = VK_WHOLE_SIZE;
17287 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
17288 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017289 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017290 mmr.size = VK_WHOLE_SIZE;
17291 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
17292 ASSERT_VK_SUCCESS(err);
17293 m_errorMonitor->VerifyNotFound();
17294 vkUnmapMemory(m_device->device(), mem);
17295
17296 vkFreeMemory(m_device->device(), mem, NULL);
17297}
17298
17299// This is a positive test. We used to expect error in this case but spec now allows it
17300TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
17301 m_errorMonitor->ExpectSuccess();
17302 vk_testing::Fence testFence;
17303 VkFenceCreateInfo fenceInfo = {};
17304 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
17305 fenceInfo.pNext = NULL;
17306
17307 ASSERT_NO_FATAL_FAILURE(InitState());
17308 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017309 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017310 VkResult result = vkResetFences(m_device->device(), 1, fences);
17311 ASSERT_VK_SUCCESS(result);
17312
17313 m_errorMonitor->VerifyNotFound();
17314}
17315
17316TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
17317 m_errorMonitor->ExpectSuccess();
17318
17319 ASSERT_NO_FATAL_FAILURE(InitState());
17320 VkResult err;
17321
17322 // Record (empty!) command buffer that can be submitted multiple times
17323 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017324 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
17325 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017326 m_commandBuffer->BeginCommandBuffer(&cbbi);
17327 m_commandBuffer->EndCommandBuffer();
17328
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017329 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017330 VkFence fence;
17331 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
17332 ASSERT_VK_SUCCESS(err);
17333
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017334 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017335 VkSemaphore s1, s2;
17336 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
17337 ASSERT_VK_SUCCESS(err);
17338 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
17339 ASSERT_VK_SUCCESS(err);
17340
17341 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017342 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017343 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
17344 ASSERT_VK_SUCCESS(err);
17345
17346 // Submit CB again, signaling s2.
17347 si.pSignalSemaphores = &s2;
17348 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
17349 ASSERT_VK_SUCCESS(err);
17350
17351 // Wait for fence.
17352 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
17353 ASSERT_VK_SUCCESS(err);
17354
17355 // CB is still in flight from second submission, but semaphore s1 is no
17356 // longer in flight. delete it.
17357 vkDestroySemaphore(m_device->device(), s1, nullptr);
17358
17359 m_errorMonitor->VerifyNotFound();
17360
17361 // Force device idle and clean up remaining objects
17362 vkDeviceWaitIdle(m_device->device());
17363 vkDestroySemaphore(m_device->device(), s2, nullptr);
17364 vkDestroyFence(m_device->device(), fence, nullptr);
17365}
17366
17367TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
17368 m_errorMonitor->ExpectSuccess();
17369
17370 ASSERT_NO_FATAL_FAILURE(InitState());
17371 VkResult err;
17372
17373 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017374 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017375 VkFence f1;
17376 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
17377 ASSERT_VK_SUCCESS(err);
17378
17379 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017380 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017381 VkFence f2;
17382 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
17383 ASSERT_VK_SUCCESS(err);
17384
17385 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017386 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017387 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
17388
17389 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017390 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017391 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
17392
17393 // Should have both retired!
17394 vkDestroyFence(m_device->device(), f1, nullptr);
17395 vkDestroyFence(m_device->device(), f2, nullptr);
17396
17397 m_errorMonitor->VerifyNotFound();
17398}
17399
17400TEST_F(VkPositiveLayerTest, ValidUsage) {
17401 TEST_DESCRIPTION("Verify that creating an image view from an image with valid usage "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017402 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017403
17404 ASSERT_NO_FATAL_FAILURE(InitState());
17405
17406 m_errorMonitor->ExpectSuccess();
17407 // Verify that we can create a view with usage INPUT_ATTACHMENT
17408 VkImageObj image(m_device);
17409 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
17410 ASSERT_TRUE(image.initialized());
17411 VkImageView imageView;
17412 VkImageViewCreateInfo ivci = {};
17413 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
17414 ivci.image = image.handle();
17415 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
17416 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
17417 ivci.subresourceRange.layerCount = 1;
17418 ivci.subresourceRange.baseMipLevel = 0;
17419 ivci.subresourceRange.levelCount = 1;
17420 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17421
17422 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
17423 m_errorMonitor->VerifyNotFound();
17424 vkDestroyImageView(m_device->device(), imageView, NULL);
17425}
17426
17427// This is a positive test. No failures are expected.
17428TEST_F(VkPositiveLayerTest, BindSparse) {
17429 TEST_DESCRIPTION("Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017430 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017431
17432 ASSERT_NO_FATAL_FAILURE(InitState());
17433
17434 auto index = m_device->graphics_queue_node_index_;
17435 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT))
17436 return;
17437
17438 m_errorMonitor->ExpectSuccess();
17439
17440 VkImage image;
17441 VkImageCreateInfo image_create_info = {};
17442 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17443 image_create_info.pNext = NULL;
17444 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17445 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17446 image_create_info.extent.width = 64;
17447 image_create_info.extent.height = 64;
17448 image_create_info.extent.depth = 1;
17449 image_create_info.mipLevels = 1;
17450 image_create_info.arrayLayers = 1;
17451 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17452 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17453 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
17454 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
17455 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
17456 ASSERT_VK_SUCCESS(err);
17457
17458 VkMemoryRequirements memory_reqs;
17459 VkDeviceMemory memory_one, memory_two;
17460 bool pass;
17461 VkMemoryAllocateInfo memory_info = {};
17462 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17463 memory_info.pNext = NULL;
17464 memory_info.allocationSize = 0;
17465 memory_info.memoryTypeIndex = 0;
17466 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
17467 // Find an image big enough to allow sparse mapping of 2 memory regions
17468 // Increase the image size until it is at least twice the
17469 // size of the required alignment, to ensure we can bind both
17470 // allocated memory blocks to the image on aligned offsets.
17471 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
17472 vkDestroyImage(m_device->device(), image, nullptr);
17473 image_create_info.extent.width *= 2;
17474 image_create_info.extent.height *= 2;
17475 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
17476 ASSERT_VK_SUCCESS(err);
17477 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
17478 }
17479 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
17480 // at the end of the first
17481 memory_info.allocationSize = memory_reqs.alignment;
17482 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
17483 ASSERT_TRUE(pass);
17484 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
17485 ASSERT_VK_SUCCESS(err);
17486 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
17487 ASSERT_VK_SUCCESS(err);
17488 VkSparseMemoryBind binds[2];
17489 binds[0].flags = 0;
17490 binds[0].memory = memory_one;
17491 binds[0].memoryOffset = 0;
17492 binds[0].resourceOffset = 0;
17493 binds[0].size = memory_info.allocationSize;
17494 binds[1].flags = 0;
17495 binds[1].memory = memory_two;
17496 binds[1].memoryOffset = 0;
17497 binds[1].resourceOffset = memory_info.allocationSize;
17498 binds[1].size = memory_info.allocationSize;
17499
17500 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
17501 opaqueBindInfo.image = image;
17502 opaqueBindInfo.bindCount = 2;
17503 opaqueBindInfo.pBinds = binds;
17504
17505 VkFence fence = VK_NULL_HANDLE;
17506 VkBindSparseInfo bindSparseInfo = {};
17507 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
17508 bindSparseInfo.imageOpaqueBindCount = 1;
17509 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
17510
17511 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
17512 vkQueueWaitIdle(m_device->m_queue);
17513 vkDestroyImage(m_device->device(), image, NULL);
17514 vkFreeMemory(m_device->device(), memory_one, NULL);
17515 vkFreeMemory(m_device->device(), memory_two, NULL);
17516 m_errorMonitor->VerifyNotFound();
17517}
17518
17519TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
17520 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass with an attachment's "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017521 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
17522 "the command buffer has prior knowledge of that "
17523 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017524
17525 m_errorMonitor->ExpectSuccess();
17526
17527 ASSERT_NO_FATAL_FAILURE(InitState());
17528
17529 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017530 VkAttachmentDescription attachment = {0,
17531 VK_FORMAT_R8G8B8A8_UNORM,
17532 VK_SAMPLE_COUNT_1_BIT,
17533 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17534 VK_ATTACHMENT_STORE_OP_STORE,
17535 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17536 VK_ATTACHMENT_STORE_OP_DONT_CARE,
17537 VK_IMAGE_LAYOUT_UNDEFINED,
17538 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017539
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017540 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017541
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017542 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017543
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017544 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017545
17546 VkRenderPass rp;
17547 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
17548 ASSERT_VK_SUCCESS(err);
17549
17550 // A compatible framebuffer.
17551 VkImageObj image(m_device);
17552 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
17553 ASSERT_TRUE(image.initialized());
17554
17555 VkImageViewCreateInfo ivci = {
17556 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
17557 nullptr,
17558 0,
17559 image.handle(),
17560 VK_IMAGE_VIEW_TYPE_2D,
17561 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017562 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
17563 VK_COMPONENT_SWIZZLE_IDENTITY},
17564 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017565 };
17566 VkImageView view;
17567 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
17568 ASSERT_VK_SUCCESS(err);
17569
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017570 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017571 VkFramebuffer fb;
17572 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
17573 ASSERT_VK_SUCCESS(err);
17574
17575 // Record a single command buffer which uses this renderpass twice. The
17576 // bug is triggered at the beginning of the second renderpass, when the
17577 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017578 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 -070017579 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017580 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17581 vkCmdEndRenderPass(m_commandBuffer->handle());
17582 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17583
17584 m_errorMonitor->VerifyNotFound();
17585
17586 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070017587 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017588
17589 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17590 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17591 vkDestroyImageView(m_device->device(), view, nullptr);
17592}
17593
17594TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
17595 TEST_DESCRIPTION("This test should pass. Create a Framebuffer and "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017596 "command buffer, bind them together, then destroy "
17597 "command pool and framebuffer and verify there are no "
17598 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017599
17600 m_errorMonitor->ExpectSuccess();
17601
17602 ASSERT_NO_FATAL_FAILURE(InitState());
17603
17604 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017605 VkAttachmentDescription attachment = {0,
17606 VK_FORMAT_R8G8B8A8_UNORM,
17607 VK_SAMPLE_COUNT_1_BIT,
17608 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17609 VK_ATTACHMENT_STORE_OP_STORE,
17610 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17611 VK_ATTACHMENT_STORE_OP_DONT_CARE,
17612 VK_IMAGE_LAYOUT_UNDEFINED,
17613 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017614
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017615 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017616
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017617 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017618
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017619 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017620
17621 VkRenderPass rp;
17622 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
17623 ASSERT_VK_SUCCESS(err);
17624
17625 // A compatible framebuffer.
17626 VkImageObj image(m_device);
17627 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
17628 ASSERT_TRUE(image.initialized());
17629
17630 VkImageViewCreateInfo ivci = {
17631 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
17632 nullptr,
17633 0,
17634 image.handle(),
17635 VK_IMAGE_VIEW_TYPE_2D,
17636 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017637 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
17638 VK_COMPONENT_SWIZZLE_IDENTITY},
17639 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017640 };
17641 VkImageView view;
17642 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
17643 ASSERT_VK_SUCCESS(err);
17644
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017645 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017646 VkFramebuffer fb;
17647 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
17648 ASSERT_VK_SUCCESS(err);
17649
17650 // Explicitly create a command buffer to bind the FB to so that we can then
17651 // destroy the command pool in order to implicitly free command buffer
17652 VkCommandPool command_pool;
17653 VkCommandPoolCreateInfo pool_create_info{};
17654 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
17655 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
17656 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
17657 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
17658
17659 VkCommandBuffer command_buffer;
17660 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
17661 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
17662 command_buffer_allocate_info.commandPool = command_pool;
17663 command_buffer_allocate_info.commandBufferCount = 1;
17664 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
17665 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
17666
17667 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017668 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 -060017669 VkCommandBufferBeginInfo begin_info{};
17670 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
17671 vkBeginCommandBuffer(command_buffer, &begin_info);
17672
17673 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17674 vkCmdEndRenderPass(command_buffer);
17675 vkEndCommandBuffer(command_buffer);
17676 vkDestroyImageView(m_device->device(), view, nullptr);
17677 // Destroy command pool to implicitly free command buffer
17678 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
17679 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17680 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17681 m_errorMonitor->VerifyNotFound();
17682}
17683
17684TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
17685 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass applies the layout "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017686 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017687
17688 m_errorMonitor->ExpectSuccess();
17689
17690 ASSERT_NO_FATAL_FAILURE(InitState());
17691
17692 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017693 VkAttachmentDescription attachment = {0,
17694 VK_FORMAT_R8G8B8A8_UNORM,
17695 VK_SAMPLE_COUNT_1_BIT,
17696 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17697 VK_ATTACHMENT_STORE_OP_STORE,
17698 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17699 VK_ATTACHMENT_STORE_OP_DONT_CARE,
17700 VK_IMAGE_LAYOUT_UNDEFINED,
17701 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017702
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017703 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017704
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017705 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017706
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017707 VkSubpassDependency dep = {0,
17708 0,
17709 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17710 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17711 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17712 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17713 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017714
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017715 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017716
17717 VkResult err;
17718 VkRenderPass rp;
17719 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
17720 ASSERT_VK_SUCCESS(err);
17721
17722 // A compatible framebuffer.
17723 VkImageObj image(m_device);
17724 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
17725 ASSERT_TRUE(image.initialized());
17726
17727 VkImageViewCreateInfo ivci = {
17728 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
17729 nullptr,
17730 0,
17731 image.handle(),
17732 VK_IMAGE_VIEW_TYPE_2D,
17733 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017734 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
17735 VK_COMPONENT_SWIZZLE_IDENTITY},
17736 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017737 };
17738 VkImageView view;
17739 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
17740 ASSERT_VK_SUCCESS(err);
17741
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017742 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017743 VkFramebuffer fb;
17744 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
17745 ASSERT_VK_SUCCESS(err);
17746
17747 // Record a single command buffer which issues a pipeline barrier w/
17748 // image memory barrier for the attachment. This detects the previously
17749 // missing tracking of the subpass layout by throwing a validation error
17750 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017751 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 -070017752 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017753 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17754
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017755 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
17756 nullptr,
17757 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17758 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17759 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
17760 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
17761 VK_QUEUE_FAMILY_IGNORED,
17762 VK_QUEUE_FAMILY_IGNORED,
17763 image.handle(),
17764 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017765 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017766 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
17767 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017768
17769 vkCmdEndRenderPass(m_commandBuffer->handle());
17770 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070017771 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017772
17773 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17774 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17775 vkDestroyImageView(m_device->device(), view, nullptr);
17776}
17777
17778TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
17779 TEST_DESCRIPTION("Validate that when an imageView of a depth/stencil image "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017780 "is used as a depth/stencil framebuffer attachment, the "
17781 "aspectMask is ignored and both depth and stencil image "
17782 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017783
17784 VkFormatProperties format_properties;
17785 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
17786 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
17787 return;
17788 }
17789
17790 m_errorMonitor->ExpectSuccess();
17791
17792 ASSERT_NO_FATAL_FAILURE(InitState());
17793
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017794 VkAttachmentDescription attachment = {0,
17795 VK_FORMAT_D32_SFLOAT_S8_UINT,
17796 VK_SAMPLE_COUNT_1_BIT,
17797 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17798 VK_ATTACHMENT_STORE_OP_STORE,
17799 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17800 VK_ATTACHMENT_STORE_OP_DONT_CARE,
17801 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
17802 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017803
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017804 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017805
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017806 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017807
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017808 VkSubpassDependency dep = {0,
17809 0,
17810 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17811 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17812 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17813 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17814 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017815
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017816 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017817
17818 VkResult err;
17819 VkRenderPass rp;
17820 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
17821 ASSERT_VK_SUCCESS(err);
17822
17823 VkImageObj image(m_device);
17824 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017825 0x26, // usage
17826 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017827 ASSERT_TRUE(image.initialized());
17828 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
17829
17830 VkImageViewCreateInfo ivci = {
17831 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
17832 nullptr,
17833 0,
17834 image.handle(),
17835 VK_IMAGE_VIEW_TYPE_2D,
17836 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017837 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
17838 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017839 };
17840 VkImageView view;
17841 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
17842 ASSERT_VK_SUCCESS(err);
17843
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017844 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017845 VkFramebuffer fb;
17846 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
17847 ASSERT_VK_SUCCESS(err);
17848
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017849 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 -070017850 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017851 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17852
17853 VkImageMemoryBarrier imb = {};
17854 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17855 imb.pNext = nullptr;
17856 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
17857 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
17858 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17859 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
17860 imb.srcQueueFamilyIndex = 0;
17861 imb.dstQueueFamilyIndex = 0;
17862 imb.image = image.handle();
17863 imb.subresourceRange.aspectMask = 0x6;
17864 imb.subresourceRange.baseMipLevel = 0;
17865 imb.subresourceRange.levelCount = 0x1;
17866 imb.subresourceRange.baseArrayLayer = 0;
17867 imb.subresourceRange.layerCount = 0x1;
17868
17869 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017870 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
17871 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017872
17873 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070017874 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017875 QueueCommandBuffer(false);
17876 m_errorMonitor->VerifyNotFound();
17877
17878 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17879 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17880 vkDestroyImageView(m_device->device(), view, nullptr);
17881}
17882
17883TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
17884 TEST_DESCRIPTION("Ensure that layout transitions work correctly without "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017885 "errors, when an attachment reference is "
17886 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017887
17888 m_errorMonitor->ExpectSuccess();
17889
17890 ASSERT_NO_FATAL_FAILURE(InitState());
17891
17892 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017893 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017894
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017895 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017896
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017897 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017898
17899 VkRenderPass rp;
17900 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
17901 ASSERT_VK_SUCCESS(err);
17902
17903 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017904 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017905 VkFramebuffer fb;
17906 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
17907 ASSERT_VK_SUCCESS(err);
17908
17909 // Record a command buffer which just begins and ends the renderpass. The
17910 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017911 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 -070017912 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017913 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17914 vkCmdEndRenderPass(m_commandBuffer->handle());
17915 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070017916 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017917
17918 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17919 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17920}
17921
17922// This is a positive test. No errors are expected.
17923TEST_F(VkPositiveLayerTest, StencilLoadOp) {
17924 TEST_DESCRIPTION("Create a stencil-only attachment with a LOAD_OP set to "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017925 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017926 VkResult result = VK_SUCCESS;
17927 VkImageFormatProperties formatProps;
17928 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017929 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
17930 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017931 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
17932 return;
17933 }
17934
17935 ASSERT_NO_FATAL_FAILURE(InitState());
17936 VkFormat depth_stencil_fmt = VK_FORMAT_D24_UNORM_S8_UINT;
17937 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017938 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017939 VkAttachmentDescription att = {};
17940 VkAttachmentReference ref = {};
17941 att.format = depth_stencil_fmt;
17942 att.samples = VK_SAMPLE_COUNT_1_BIT;
17943 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
17944 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
17945 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
17946 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
17947 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17948 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17949
17950 VkClearValue clear;
17951 clear.depthStencil.depth = 1.0;
17952 clear.depthStencil.stencil = 0;
17953 ref.attachment = 0;
17954 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17955
17956 VkSubpassDescription subpass = {};
17957 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
17958 subpass.flags = 0;
17959 subpass.inputAttachmentCount = 0;
17960 subpass.pInputAttachments = NULL;
17961 subpass.colorAttachmentCount = 0;
17962 subpass.pColorAttachments = NULL;
17963 subpass.pResolveAttachments = NULL;
17964 subpass.pDepthStencilAttachment = &ref;
17965 subpass.preserveAttachmentCount = 0;
17966 subpass.pPreserveAttachments = NULL;
17967
17968 VkRenderPass rp;
17969 VkRenderPassCreateInfo rp_info = {};
17970 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
17971 rp_info.attachmentCount = 1;
17972 rp_info.pAttachments = &att;
17973 rp_info.subpassCount = 1;
17974 rp_info.pSubpasses = &subpass;
17975 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
17976 ASSERT_VK_SUCCESS(result);
17977
17978 VkImageView *depthView = m_depthStencil->BindInfo();
17979 VkFramebufferCreateInfo fb_info = {};
17980 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
17981 fb_info.pNext = NULL;
17982 fb_info.renderPass = rp;
17983 fb_info.attachmentCount = 1;
17984 fb_info.pAttachments = depthView;
17985 fb_info.width = 100;
17986 fb_info.height = 100;
17987 fb_info.layers = 1;
17988 VkFramebuffer fb;
17989 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
17990 ASSERT_VK_SUCCESS(result);
17991
17992 VkRenderPassBeginInfo rpbinfo = {};
17993 rpbinfo.clearValueCount = 1;
17994 rpbinfo.pClearValues = &clear;
17995 rpbinfo.pNext = NULL;
17996 rpbinfo.renderPass = rp;
17997 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
17998 rpbinfo.renderArea.extent.width = 100;
17999 rpbinfo.renderArea.extent.height = 100;
18000 rpbinfo.renderArea.offset.x = 0;
18001 rpbinfo.renderArea.offset.y = 0;
18002 rpbinfo.framebuffer = fb;
18003
18004 VkFence fence = {};
18005 VkFenceCreateInfo fence_ci = {};
18006 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18007 fence_ci.pNext = nullptr;
18008 fence_ci.flags = 0;
18009 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
18010 ASSERT_VK_SUCCESS(result);
18011
18012 m_commandBuffer->BeginCommandBuffer();
18013 m_commandBuffer->BeginRenderPass(rpbinfo);
18014 m_commandBuffer->EndRenderPass();
18015 m_commandBuffer->EndCommandBuffer();
18016 m_commandBuffer->QueueCommandBuffer(fence);
18017
18018 VkImageObj destImage(m_device);
18019 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 -070018020 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018021 VkImageMemoryBarrier barrier = {};
18022 VkImageSubresourceRange range;
18023 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18024 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
18025 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
18026 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18027 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
18028 barrier.image = m_depthStencil->handle();
18029 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18030 range.baseMipLevel = 0;
18031 range.levelCount = 1;
18032 range.baseArrayLayer = 0;
18033 range.layerCount = 1;
18034 barrier.subresourceRange = range;
18035 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18036 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
18037 cmdbuf.BeginCommandBuffer();
18038 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 -070018039 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018040 barrier.srcAccessMask = 0;
18041 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18042 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
18043 barrier.image = destImage.handle();
18044 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
18045 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 -070018046 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018047 VkImageCopy cregion;
18048 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18049 cregion.srcSubresource.mipLevel = 0;
18050 cregion.srcSubresource.baseArrayLayer = 0;
18051 cregion.srcSubresource.layerCount = 1;
18052 cregion.srcOffset.x = 0;
18053 cregion.srcOffset.y = 0;
18054 cregion.srcOffset.z = 0;
18055 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18056 cregion.dstSubresource.mipLevel = 0;
18057 cregion.dstSubresource.baseArrayLayer = 0;
18058 cregion.dstSubresource.layerCount = 1;
18059 cregion.dstOffset.x = 0;
18060 cregion.dstOffset.y = 0;
18061 cregion.dstOffset.z = 0;
18062 cregion.extent.width = 100;
18063 cregion.extent.height = 100;
18064 cregion.extent.depth = 1;
18065 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018066 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018067 cmdbuf.EndCommandBuffer();
18068
18069 VkSubmitInfo submit_info;
18070 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18071 submit_info.pNext = NULL;
18072 submit_info.waitSemaphoreCount = 0;
18073 submit_info.pWaitSemaphores = NULL;
18074 submit_info.pWaitDstStageMask = NULL;
18075 submit_info.commandBufferCount = 1;
18076 submit_info.pCommandBuffers = &cmdbuf.handle();
18077 submit_info.signalSemaphoreCount = 0;
18078 submit_info.pSignalSemaphores = NULL;
18079
18080 m_errorMonitor->ExpectSuccess();
18081 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18082 m_errorMonitor->VerifyNotFound();
18083
18084 vkQueueWaitIdle(m_device->m_queue);
18085 vkDestroyFence(m_device->device(), fence, nullptr);
18086 vkDestroyRenderPass(m_device->device(), rp, nullptr);
18087 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
18088}
18089
18090// This is a positive test. No errors should be generated.
18091TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
18092 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
18093
18094 m_errorMonitor->ExpectSuccess();
18095 ASSERT_NO_FATAL_FAILURE(InitState());
18096
18097 VkEvent event;
18098 VkEventCreateInfo event_create_info{};
18099 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
18100 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
18101
18102 VkCommandPool command_pool;
18103 VkCommandPoolCreateInfo pool_create_info{};
18104 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18105 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18106 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18107 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18108
18109 VkCommandBuffer command_buffer;
18110 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18111 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18112 command_buffer_allocate_info.commandPool = command_pool;
18113 command_buffer_allocate_info.commandBufferCount = 1;
18114 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18115 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
18116
18117 VkQueue queue = VK_NULL_HANDLE;
18118 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
18119
18120 {
18121 VkCommandBufferBeginInfo begin_info{};
18122 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18123 vkBeginCommandBuffer(command_buffer, &begin_info);
18124
18125 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 -070018126 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018127 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
18128 vkEndCommandBuffer(command_buffer);
18129 }
18130 {
18131 VkSubmitInfo submit_info{};
18132 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18133 submit_info.commandBufferCount = 1;
18134 submit_info.pCommandBuffers = &command_buffer;
18135 submit_info.signalSemaphoreCount = 0;
18136 submit_info.pSignalSemaphores = nullptr;
18137 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18138 }
18139 { vkSetEvent(m_device->device(), event); }
18140
18141 vkQueueWaitIdle(queue);
18142
18143 vkDestroyEvent(m_device->device(), event, nullptr);
18144 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
18145 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18146
18147 m_errorMonitor->VerifyNotFound();
18148}
18149// This is a positive test. No errors should be generated.
18150TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
18151 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
18152
18153 ASSERT_NO_FATAL_FAILURE(InitState());
18154 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
18155 return;
18156
18157 m_errorMonitor->ExpectSuccess();
18158
18159 VkQueryPool query_pool;
18160 VkQueryPoolCreateInfo query_pool_create_info{};
18161 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
18162 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
18163 query_pool_create_info.queryCount = 1;
18164 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
18165
18166 VkCommandPool command_pool;
18167 VkCommandPoolCreateInfo pool_create_info{};
18168 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18169 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18170 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18171 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18172
18173 VkCommandBuffer command_buffer;
18174 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18175 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18176 command_buffer_allocate_info.commandPool = command_pool;
18177 command_buffer_allocate_info.commandBufferCount = 1;
18178 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18179 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
18180
18181 VkCommandBuffer secondary_command_buffer;
18182 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18183 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
18184
18185 VkQueue queue = VK_NULL_HANDLE;
18186 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
18187
18188 uint32_t qfi = 0;
18189 VkBufferCreateInfo buff_create_info = {};
18190 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18191 buff_create_info.size = 1024;
18192 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
18193 buff_create_info.queueFamilyIndexCount = 1;
18194 buff_create_info.pQueueFamilyIndices = &qfi;
18195
18196 VkResult err;
18197 VkBuffer buffer;
18198 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
18199 ASSERT_VK_SUCCESS(err);
18200 VkMemoryAllocateInfo mem_alloc = {};
18201 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18202 mem_alloc.pNext = NULL;
18203 mem_alloc.allocationSize = 1024;
18204 mem_alloc.memoryTypeIndex = 0;
18205
18206 VkMemoryRequirements memReqs;
18207 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
18208 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
18209 if (!pass) {
18210 vkDestroyBuffer(m_device->device(), buffer, NULL);
18211 return;
18212 }
18213
18214 VkDeviceMemory mem;
18215 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
18216 ASSERT_VK_SUCCESS(err);
18217 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
18218 ASSERT_VK_SUCCESS(err);
18219
18220 VkCommandBufferInheritanceInfo hinfo = {};
18221 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18222 hinfo.renderPass = VK_NULL_HANDLE;
18223 hinfo.subpass = 0;
18224 hinfo.framebuffer = VK_NULL_HANDLE;
18225 hinfo.occlusionQueryEnable = VK_FALSE;
18226 hinfo.queryFlags = 0;
18227 hinfo.pipelineStatistics = 0;
18228
18229 {
18230 VkCommandBufferBeginInfo begin_info{};
18231 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18232 begin_info.pInheritanceInfo = &hinfo;
18233 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
18234
18235 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
18236 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
18237
18238 vkEndCommandBuffer(secondary_command_buffer);
18239
18240 begin_info.pInheritanceInfo = nullptr;
18241 vkBeginCommandBuffer(command_buffer, &begin_info);
18242
18243 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
18244 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
18245
18246 vkEndCommandBuffer(command_buffer);
18247 }
18248 {
18249 VkSubmitInfo submit_info{};
18250 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18251 submit_info.commandBufferCount = 1;
18252 submit_info.pCommandBuffers = &command_buffer;
18253 submit_info.signalSemaphoreCount = 0;
18254 submit_info.pSignalSemaphores = nullptr;
18255 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18256 }
18257
18258 vkQueueWaitIdle(queue);
18259
18260 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
18261 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
18262 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
18263 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18264 vkDestroyBuffer(m_device->device(), buffer, NULL);
18265 vkFreeMemory(m_device->device(), mem, NULL);
18266
18267 m_errorMonitor->VerifyNotFound();
18268}
18269
18270// This is a positive test. No errors should be generated.
18271TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
18272 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
18273
18274 ASSERT_NO_FATAL_FAILURE(InitState());
18275 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
18276 return;
18277
18278 m_errorMonitor->ExpectSuccess();
18279
18280 VkQueryPool query_pool;
18281 VkQueryPoolCreateInfo query_pool_create_info{};
18282 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
18283 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
18284 query_pool_create_info.queryCount = 1;
18285 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
18286
18287 VkCommandPool command_pool;
18288 VkCommandPoolCreateInfo pool_create_info{};
18289 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18290 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18291 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18292 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18293
18294 VkCommandBuffer command_buffer[2];
18295 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18296 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18297 command_buffer_allocate_info.commandPool = command_pool;
18298 command_buffer_allocate_info.commandBufferCount = 2;
18299 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18300 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18301
18302 VkQueue queue = VK_NULL_HANDLE;
18303 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
18304
18305 uint32_t qfi = 0;
18306 VkBufferCreateInfo buff_create_info = {};
18307 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18308 buff_create_info.size = 1024;
18309 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
18310 buff_create_info.queueFamilyIndexCount = 1;
18311 buff_create_info.pQueueFamilyIndices = &qfi;
18312
18313 VkResult err;
18314 VkBuffer buffer;
18315 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
18316 ASSERT_VK_SUCCESS(err);
18317 VkMemoryAllocateInfo mem_alloc = {};
18318 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18319 mem_alloc.pNext = NULL;
18320 mem_alloc.allocationSize = 1024;
18321 mem_alloc.memoryTypeIndex = 0;
18322
18323 VkMemoryRequirements memReqs;
18324 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
18325 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
18326 if (!pass) {
18327 vkDestroyBuffer(m_device->device(), buffer, NULL);
18328 return;
18329 }
18330
18331 VkDeviceMemory mem;
18332 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
18333 ASSERT_VK_SUCCESS(err);
18334 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
18335 ASSERT_VK_SUCCESS(err);
18336
18337 {
18338 VkCommandBufferBeginInfo begin_info{};
18339 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18340 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18341
18342 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
18343 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
18344
18345 vkEndCommandBuffer(command_buffer[0]);
18346
18347 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18348
18349 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
18350
18351 vkEndCommandBuffer(command_buffer[1]);
18352 }
18353 {
18354 VkSubmitInfo submit_info{};
18355 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18356 submit_info.commandBufferCount = 2;
18357 submit_info.pCommandBuffers = command_buffer;
18358 submit_info.signalSemaphoreCount = 0;
18359 submit_info.pSignalSemaphores = nullptr;
18360 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18361 }
18362
18363 vkQueueWaitIdle(queue);
18364
18365 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
18366 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
18367 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18368 vkDestroyBuffer(m_device->device(), buffer, NULL);
18369 vkFreeMemory(m_device->device(), mem, NULL);
18370
18371 m_errorMonitor->VerifyNotFound();
18372}
18373
Tony Barbourc46924f2016-11-04 11:49:52 -060018374TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018375 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
18376
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018377 ASSERT_NO_FATAL_FAILURE(InitState());
18378 VkEvent event;
18379 VkEventCreateInfo event_create_info{};
18380 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
18381 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
18382
18383 VkCommandPool command_pool;
18384 VkCommandPoolCreateInfo pool_create_info{};
18385 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18386 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18387 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18388 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18389
18390 VkCommandBuffer command_buffer;
18391 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18392 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18393 command_buffer_allocate_info.commandPool = command_pool;
18394 command_buffer_allocate_info.commandBufferCount = 1;
18395 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18396 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
18397
18398 VkQueue queue = VK_NULL_HANDLE;
18399 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
18400
18401 {
18402 VkCommandBufferBeginInfo begin_info{};
18403 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18404 vkBeginCommandBuffer(command_buffer, &begin_info);
18405
18406 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018407 vkEndCommandBuffer(command_buffer);
18408 }
18409 {
18410 VkSubmitInfo submit_info{};
18411 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18412 submit_info.commandBufferCount = 1;
18413 submit_info.pCommandBuffers = &command_buffer;
18414 submit_info.signalSemaphoreCount = 0;
18415 submit_info.pSignalSemaphores = nullptr;
18416 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18417 }
18418 {
18419 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is already in use by a "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018420 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018421 vkSetEvent(m_device->device(), event);
18422 m_errorMonitor->VerifyFound();
18423 }
18424
18425 vkQueueWaitIdle(queue);
18426
18427 vkDestroyEvent(m_device->device(), event, nullptr);
18428 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
18429 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18430}
18431
18432// This is a positive test. No errors should be generated.
18433TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
18434 TEST_DESCRIPTION("Two command buffers with two separate fences are each "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018435 "run through a Submit & WaitForFences cycle 3 times. This "
18436 "previously revealed a bug so running this positive test "
18437 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018438 m_errorMonitor->ExpectSuccess();
18439
18440 ASSERT_NO_FATAL_FAILURE(InitState());
18441 VkQueue queue = VK_NULL_HANDLE;
18442 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
18443
18444 static const uint32_t NUM_OBJECTS = 2;
18445 static const uint32_t NUM_FRAMES = 3;
18446 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
18447 VkFence fences[NUM_OBJECTS] = {};
18448
18449 VkCommandPool cmd_pool;
18450 VkCommandPoolCreateInfo cmd_pool_ci = {};
18451 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18452 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
18453 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18454 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
18455 ASSERT_VK_SUCCESS(err);
18456
18457 VkCommandBufferAllocateInfo cmd_buf_info = {};
18458 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18459 cmd_buf_info.commandPool = cmd_pool;
18460 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18461 cmd_buf_info.commandBufferCount = 1;
18462
18463 VkFenceCreateInfo fence_ci = {};
18464 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18465 fence_ci.pNext = nullptr;
18466 fence_ci.flags = 0;
18467
18468 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
18469 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
18470 ASSERT_VK_SUCCESS(err);
18471 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
18472 ASSERT_VK_SUCCESS(err);
18473 }
18474
18475 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
18476 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
18477 // Create empty cmd buffer
18478 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
18479 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18480
18481 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
18482 ASSERT_VK_SUCCESS(err);
18483 err = vkEndCommandBuffer(cmd_buffers[obj]);
18484 ASSERT_VK_SUCCESS(err);
18485
18486 VkSubmitInfo submit_info = {};
18487 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18488 submit_info.commandBufferCount = 1;
18489 submit_info.pCommandBuffers = &cmd_buffers[obj];
18490 // Submit cmd buffer and wait for fence
18491 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
18492 ASSERT_VK_SUCCESS(err);
18493 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
18494 ASSERT_VK_SUCCESS(err);
18495 err = vkResetFences(m_device->device(), 1, &fences[obj]);
18496 ASSERT_VK_SUCCESS(err);
18497 }
18498 }
18499 m_errorMonitor->VerifyNotFound();
18500 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
18501 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
18502 vkDestroyFence(m_device->device(), fences[i], nullptr);
18503 }
18504}
18505// This is a positive test. No errors should be generated.
18506TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
18507
18508 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018509 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018510
18511 ASSERT_NO_FATAL_FAILURE(InitState());
18512 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
18513 return;
18514
18515 m_errorMonitor->ExpectSuccess();
18516
18517 VkSemaphore semaphore;
18518 VkSemaphoreCreateInfo semaphore_create_info{};
18519 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
18520 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
18521
18522 VkCommandPool command_pool;
18523 VkCommandPoolCreateInfo pool_create_info{};
18524 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18525 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18526 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18527 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18528
18529 VkCommandBuffer command_buffer[2];
18530 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18531 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18532 command_buffer_allocate_info.commandPool = command_pool;
18533 command_buffer_allocate_info.commandBufferCount = 2;
18534 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18535 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18536
18537 VkQueue queue = VK_NULL_HANDLE;
18538 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
18539
18540 {
18541 VkCommandBufferBeginInfo begin_info{};
18542 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18543 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18544
18545 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 -070018546 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018547
18548 VkViewport viewport{};
18549 viewport.maxDepth = 1.0f;
18550 viewport.minDepth = 0.0f;
18551 viewport.width = 512;
18552 viewport.height = 512;
18553 viewport.x = 0;
18554 viewport.y = 0;
18555 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18556 vkEndCommandBuffer(command_buffer[0]);
18557 }
18558 {
18559 VkCommandBufferBeginInfo begin_info{};
18560 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18561 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18562
18563 VkViewport viewport{};
18564 viewport.maxDepth = 1.0f;
18565 viewport.minDepth = 0.0f;
18566 viewport.width = 512;
18567 viewport.height = 512;
18568 viewport.x = 0;
18569 viewport.y = 0;
18570 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
18571 vkEndCommandBuffer(command_buffer[1]);
18572 }
18573 {
18574 VkSubmitInfo submit_info{};
18575 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18576 submit_info.commandBufferCount = 1;
18577 submit_info.pCommandBuffers = &command_buffer[0];
18578 submit_info.signalSemaphoreCount = 1;
18579 submit_info.pSignalSemaphores = &semaphore;
18580 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18581 }
18582 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018583 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018584 VkSubmitInfo submit_info{};
18585 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18586 submit_info.commandBufferCount = 1;
18587 submit_info.pCommandBuffers = &command_buffer[1];
18588 submit_info.waitSemaphoreCount = 1;
18589 submit_info.pWaitSemaphores = &semaphore;
18590 submit_info.pWaitDstStageMask = flags;
18591 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18592 }
18593
18594 vkQueueWaitIdle(m_device->m_queue);
18595
18596 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
18597 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
18598 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18599
18600 m_errorMonitor->VerifyNotFound();
18601}
18602
18603// This is a positive test. No errors should be generated.
18604TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
18605
18606 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018607 "submitted on separate queues, the second having a fence"
18608 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018609
18610 ASSERT_NO_FATAL_FAILURE(InitState());
18611 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
18612 return;
18613
18614 m_errorMonitor->ExpectSuccess();
18615
18616 VkFence fence;
18617 VkFenceCreateInfo fence_create_info{};
18618 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18619 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
18620
18621 VkSemaphore semaphore;
18622 VkSemaphoreCreateInfo semaphore_create_info{};
18623 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
18624 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
18625
18626 VkCommandPool command_pool;
18627 VkCommandPoolCreateInfo pool_create_info{};
18628 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18629 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18630 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18631 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18632
18633 VkCommandBuffer command_buffer[2];
18634 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18635 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18636 command_buffer_allocate_info.commandPool = command_pool;
18637 command_buffer_allocate_info.commandBufferCount = 2;
18638 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18639 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18640
18641 VkQueue queue = VK_NULL_HANDLE;
18642 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
18643
18644 {
18645 VkCommandBufferBeginInfo begin_info{};
18646 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18647 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18648
18649 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 -070018650 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018651
18652 VkViewport viewport{};
18653 viewport.maxDepth = 1.0f;
18654 viewport.minDepth = 0.0f;
18655 viewport.width = 512;
18656 viewport.height = 512;
18657 viewport.x = 0;
18658 viewport.y = 0;
18659 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18660 vkEndCommandBuffer(command_buffer[0]);
18661 }
18662 {
18663 VkCommandBufferBeginInfo begin_info{};
18664 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18665 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18666
18667 VkViewport viewport{};
18668 viewport.maxDepth = 1.0f;
18669 viewport.minDepth = 0.0f;
18670 viewport.width = 512;
18671 viewport.height = 512;
18672 viewport.x = 0;
18673 viewport.y = 0;
18674 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
18675 vkEndCommandBuffer(command_buffer[1]);
18676 }
18677 {
18678 VkSubmitInfo submit_info{};
18679 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18680 submit_info.commandBufferCount = 1;
18681 submit_info.pCommandBuffers = &command_buffer[0];
18682 submit_info.signalSemaphoreCount = 1;
18683 submit_info.pSignalSemaphores = &semaphore;
18684 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18685 }
18686 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018687 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018688 VkSubmitInfo submit_info{};
18689 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18690 submit_info.commandBufferCount = 1;
18691 submit_info.pCommandBuffers = &command_buffer[1];
18692 submit_info.waitSemaphoreCount = 1;
18693 submit_info.pWaitSemaphores = &semaphore;
18694 submit_info.pWaitDstStageMask = flags;
18695 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
18696 }
18697
18698 vkQueueWaitIdle(m_device->m_queue);
18699
18700 vkDestroyFence(m_device->device(), fence, nullptr);
18701 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
18702 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
18703 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18704
18705 m_errorMonitor->VerifyNotFound();
18706}
18707
18708// This is a positive test. No errors should be generated.
18709TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
18710
18711 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018712 "submitted on separate queues, the second having a fence"
18713 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018714
18715 ASSERT_NO_FATAL_FAILURE(InitState());
18716 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
18717 return;
18718
18719 m_errorMonitor->ExpectSuccess();
18720
18721 VkFence fence;
18722 VkFenceCreateInfo fence_create_info{};
18723 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18724 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
18725
18726 VkSemaphore semaphore;
18727 VkSemaphoreCreateInfo semaphore_create_info{};
18728 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
18729 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
18730
18731 VkCommandPool command_pool;
18732 VkCommandPoolCreateInfo pool_create_info{};
18733 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18734 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18735 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18736 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18737
18738 VkCommandBuffer command_buffer[2];
18739 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18740 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18741 command_buffer_allocate_info.commandPool = command_pool;
18742 command_buffer_allocate_info.commandBufferCount = 2;
18743 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18744 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18745
18746 VkQueue queue = VK_NULL_HANDLE;
18747 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
18748
18749 {
18750 VkCommandBufferBeginInfo begin_info{};
18751 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18752 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18753
18754 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 -070018755 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018756
18757 VkViewport viewport{};
18758 viewport.maxDepth = 1.0f;
18759 viewport.minDepth = 0.0f;
18760 viewport.width = 512;
18761 viewport.height = 512;
18762 viewport.x = 0;
18763 viewport.y = 0;
18764 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18765 vkEndCommandBuffer(command_buffer[0]);
18766 }
18767 {
18768 VkCommandBufferBeginInfo begin_info{};
18769 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18770 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18771
18772 VkViewport viewport{};
18773 viewport.maxDepth = 1.0f;
18774 viewport.minDepth = 0.0f;
18775 viewport.width = 512;
18776 viewport.height = 512;
18777 viewport.x = 0;
18778 viewport.y = 0;
18779 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
18780 vkEndCommandBuffer(command_buffer[1]);
18781 }
18782 {
18783 VkSubmitInfo submit_info{};
18784 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18785 submit_info.commandBufferCount = 1;
18786 submit_info.pCommandBuffers = &command_buffer[0];
18787 submit_info.signalSemaphoreCount = 1;
18788 submit_info.pSignalSemaphores = &semaphore;
18789 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18790 }
18791 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018792 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018793 VkSubmitInfo submit_info{};
18794 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18795 submit_info.commandBufferCount = 1;
18796 submit_info.pCommandBuffers = &command_buffer[1];
18797 submit_info.waitSemaphoreCount = 1;
18798 submit_info.pWaitSemaphores = &semaphore;
18799 submit_info.pWaitDstStageMask = flags;
18800 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
18801 }
18802
18803 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18804 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18805
18806 vkDestroyFence(m_device->device(), fence, nullptr);
18807 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
18808 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
18809 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18810
18811 m_errorMonitor->VerifyNotFound();
18812}
18813
18814TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
18815
18816 ASSERT_NO_FATAL_FAILURE(InitState());
18817 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
18818 printf("Test requires two queues, skipping\n");
18819 return;
18820 }
18821
18822 VkResult err;
18823
18824 m_errorMonitor->ExpectSuccess();
18825
18826 VkQueue q0 = m_device->m_queue;
18827 VkQueue q1 = nullptr;
18828 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
18829 ASSERT_NE(q1, nullptr);
18830
18831 // An (empty) command buffer. We must have work in the first submission --
18832 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018833 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018834 VkCommandPool pool;
18835 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
18836 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018837 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
18838 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018839 VkCommandBuffer cb;
18840 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
18841 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018842 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018843 err = vkBeginCommandBuffer(cb, &cbbi);
18844 ASSERT_VK_SUCCESS(err);
18845 err = vkEndCommandBuffer(cb);
18846 ASSERT_VK_SUCCESS(err);
18847
18848 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018849 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018850 VkSemaphore s;
18851 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
18852 ASSERT_VK_SUCCESS(err);
18853
18854 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018855 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018856
18857 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
18858 ASSERT_VK_SUCCESS(err);
18859
18860 // Second submission, to q1, waiting on s
18861 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018862 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018863
18864 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
18865 ASSERT_VK_SUCCESS(err);
18866
18867 // Wait for q0 idle
18868 err = vkQueueWaitIdle(q0);
18869 ASSERT_VK_SUCCESS(err);
18870
18871 // Command buffer should have been completed (it was on q0); reset the pool.
18872 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
18873
18874 m_errorMonitor->VerifyNotFound();
18875
18876 // Force device completely idle and clean up resources
18877 vkDeviceWaitIdle(m_device->device());
18878 vkDestroyCommandPool(m_device->device(), pool, nullptr);
18879 vkDestroySemaphore(m_device->device(), s, nullptr);
18880}
18881
18882// This is a positive test. No errors should be generated.
18883TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
18884
18885 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018886 "submitted on separate queues, the second having a fence, "
18887 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018888
18889 ASSERT_NO_FATAL_FAILURE(InitState());
18890 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
18891 return;
18892
18893 m_errorMonitor->ExpectSuccess();
18894
18895 ASSERT_NO_FATAL_FAILURE(InitState());
18896 VkFence fence;
18897 VkFenceCreateInfo fence_create_info{};
18898 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18899 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
18900
18901 VkSemaphore semaphore;
18902 VkSemaphoreCreateInfo semaphore_create_info{};
18903 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
18904 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
18905
18906 VkCommandPool command_pool;
18907 VkCommandPoolCreateInfo pool_create_info{};
18908 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18909 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18910 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18911 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18912
18913 VkCommandBuffer command_buffer[2];
18914 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18915 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18916 command_buffer_allocate_info.commandPool = command_pool;
18917 command_buffer_allocate_info.commandBufferCount = 2;
18918 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18919 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18920
18921 VkQueue queue = VK_NULL_HANDLE;
18922 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
18923
18924 {
18925 VkCommandBufferBeginInfo begin_info{};
18926 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18927 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18928
18929 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 -070018930 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018931
18932 VkViewport viewport{};
18933 viewport.maxDepth = 1.0f;
18934 viewport.minDepth = 0.0f;
18935 viewport.width = 512;
18936 viewport.height = 512;
18937 viewport.x = 0;
18938 viewport.y = 0;
18939 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18940 vkEndCommandBuffer(command_buffer[0]);
18941 }
18942 {
18943 VkCommandBufferBeginInfo begin_info{};
18944 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18945 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18946
18947 VkViewport viewport{};
18948 viewport.maxDepth = 1.0f;
18949 viewport.minDepth = 0.0f;
18950 viewport.width = 512;
18951 viewport.height = 512;
18952 viewport.x = 0;
18953 viewport.y = 0;
18954 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
18955 vkEndCommandBuffer(command_buffer[1]);
18956 }
18957 {
18958 VkSubmitInfo submit_info{};
18959 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18960 submit_info.commandBufferCount = 1;
18961 submit_info.pCommandBuffers = &command_buffer[0];
18962 submit_info.signalSemaphoreCount = 1;
18963 submit_info.pSignalSemaphores = &semaphore;
18964 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18965 }
18966 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018967 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018968 VkSubmitInfo submit_info{};
18969 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18970 submit_info.commandBufferCount = 1;
18971 submit_info.pCommandBuffers = &command_buffer[1];
18972 submit_info.waitSemaphoreCount = 1;
18973 submit_info.pWaitSemaphores = &semaphore;
18974 submit_info.pWaitDstStageMask = flags;
18975 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
18976 }
18977
18978 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18979
18980 vkDestroyFence(m_device->device(), fence, nullptr);
18981 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
18982 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
18983 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18984
18985 m_errorMonitor->VerifyNotFound();
18986}
18987
18988// This is a positive test. No errors should be generated.
18989TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
18990
18991 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018992 "on the same queue, sharing a signal/wait semaphore, the "
18993 "second having a fence, "
18994 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018995
18996 m_errorMonitor->ExpectSuccess();
18997
18998 ASSERT_NO_FATAL_FAILURE(InitState());
18999 VkFence fence;
19000 VkFenceCreateInfo fence_create_info{};
19001 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19002 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
19003
19004 VkSemaphore semaphore;
19005 VkSemaphoreCreateInfo semaphore_create_info{};
19006 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19007 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
19008
19009 VkCommandPool command_pool;
19010 VkCommandPoolCreateInfo pool_create_info{};
19011 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19012 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19013 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19014 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19015
19016 VkCommandBuffer command_buffer[2];
19017 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19018 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19019 command_buffer_allocate_info.commandPool = command_pool;
19020 command_buffer_allocate_info.commandBufferCount = 2;
19021 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19022 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19023
19024 {
19025 VkCommandBufferBeginInfo begin_info{};
19026 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19027 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19028
19029 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 -070019030 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019031
19032 VkViewport viewport{};
19033 viewport.maxDepth = 1.0f;
19034 viewport.minDepth = 0.0f;
19035 viewport.width = 512;
19036 viewport.height = 512;
19037 viewport.x = 0;
19038 viewport.y = 0;
19039 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19040 vkEndCommandBuffer(command_buffer[0]);
19041 }
19042 {
19043 VkCommandBufferBeginInfo begin_info{};
19044 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19045 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19046
19047 VkViewport viewport{};
19048 viewport.maxDepth = 1.0f;
19049 viewport.minDepth = 0.0f;
19050 viewport.width = 512;
19051 viewport.height = 512;
19052 viewport.x = 0;
19053 viewport.y = 0;
19054 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19055 vkEndCommandBuffer(command_buffer[1]);
19056 }
19057 {
19058 VkSubmitInfo submit_info{};
19059 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19060 submit_info.commandBufferCount = 1;
19061 submit_info.pCommandBuffers = &command_buffer[0];
19062 submit_info.signalSemaphoreCount = 1;
19063 submit_info.pSignalSemaphores = &semaphore;
19064 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19065 }
19066 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019067 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019068 VkSubmitInfo submit_info{};
19069 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19070 submit_info.commandBufferCount = 1;
19071 submit_info.pCommandBuffers = &command_buffer[1];
19072 submit_info.waitSemaphoreCount = 1;
19073 submit_info.pWaitSemaphores = &semaphore;
19074 submit_info.pWaitDstStageMask = flags;
19075 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
19076 }
19077
19078 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19079
19080 vkDestroyFence(m_device->device(), fence, nullptr);
19081 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
19082 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19083 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19084
19085 m_errorMonitor->VerifyNotFound();
19086}
19087
19088// This is a positive test. No errors should be generated.
19089TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
19090
19091 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019092 "on the same queue, no fences, followed by a third QueueSubmit with NO "
19093 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019094
19095 m_errorMonitor->ExpectSuccess();
19096
19097 ASSERT_NO_FATAL_FAILURE(InitState());
19098 VkFence fence;
19099 VkFenceCreateInfo fence_create_info{};
19100 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19101 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
19102
19103 VkCommandPool command_pool;
19104 VkCommandPoolCreateInfo pool_create_info{};
19105 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19106 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19107 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19108 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19109
19110 VkCommandBuffer command_buffer[2];
19111 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19112 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19113 command_buffer_allocate_info.commandPool = command_pool;
19114 command_buffer_allocate_info.commandBufferCount = 2;
19115 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19116 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19117
19118 {
19119 VkCommandBufferBeginInfo begin_info{};
19120 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19121 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19122
19123 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 -070019124 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019125
19126 VkViewport viewport{};
19127 viewport.maxDepth = 1.0f;
19128 viewport.minDepth = 0.0f;
19129 viewport.width = 512;
19130 viewport.height = 512;
19131 viewport.x = 0;
19132 viewport.y = 0;
19133 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19134 vkEndCommandBuffer(command_buffer[0]);
19135 }
19136 {
19137 VkCommandBufferBeginInfo begin_info{};
19138 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19139 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19140
19141 VkViewport viewport{};
19142 viewport.maxDepth = 1.0f;
19143 viewport.minDepth = 0.0f;
19144 viewport.width = 512;
19145 viewport.height = 512;
19146 viewport.x = 0;
19147 viewport.y = 0;
19148 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19149 vkEndCommandBuffer(command_buffer[1]);
19150 }
19151 {
19152 VkSubmitInfo submit_info{};
19153 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19154 submit_info.commandBufferCount = 1;
19155 submit_info.pCommandBuffers = &command_buffer[0];
19156 submit_info.signalSemaphoreCount = 0;
19157 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
19158 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19159 }
19160 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019161 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019162 VkSubmitInfo submit_info{};
19163 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19164 submit_info.commandBufferCount = 1;
19165 submit_info.pCommandBuffers = &command_buffer[1];
19166 submit_info.waitSemaphoreCount = 0;
19167 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
19168 submit_info.pWaitDstStageMask = flags;
19169 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19170 }
19171
19172 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
19173
19174 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19175 ASSERT_VK_SUCCESS(err);
19176
19177 vkDestroyFence(m_device->device(), fence, nullptr);
19178 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19179 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19180
19181 m_errorMonitor->VerifyNotFound();
19182}
19183
19184// This is a positive test. No errors should be generated.
19185TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
19186
19187 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019188 "on the same queue, the second having a fence, followed "
19189 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019190
19191 m_errorMonitor->ExpectSuccess();
19192
19193 ASSERT_NO_FATAL_FAILURE(InitState());
19194 VkFence fence;
19195 VkFenceCreateInfo fence_create_info{};
19196 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19197 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
19198
19199 VkCommandPool command_pool;
19200 VkCommandPoolCreateInfo pool_create_info{};
19201 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19202 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19203 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19204 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19205
19206 VkCommandBuffer command_buffer[2];
19207 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19208 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19209 command_buffer_allocate_info.commandPool = command_pool;
19210 command_buffer_allocate_info.commandBufferCount = 2;
19211 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19212 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19213
19214 {
19215 VkCommandBufferBeginInfo begin_info{};
19216 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19217 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19218
19219 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 -070019220 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019221
19222 VkViewport viewport{};
19223 viewport.maxDepth = 1.0f;
19224 viewport.minDepth = 0.0f;
19225 viewport.width = 512;
19226 viewport.height = 512;
19227 viewport.x = 0;
19228 viewport.y = 0;
19229 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19230 vkEndCommandBuffer(command_buffer[0]);
19231 }
19232 {
19233 VkCommandBufferBeginInfo begin_info{};
19234 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19235 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19236
19237 VkViewport viewport{};
19238 viewport.maxDepth = 1.0f;
19239 viewport.minDepth = 0.0f;
19240 viewport.width = 512;
19241 viewport.height = 512;
19242 viewport.x = 0;
19243 viewport.y = 0;
19244 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19245 vkEndCommandBuffer(command_buffer[1]);
19246 }
19247 {
19248 VkSubmitInfo submit_info{};
19249 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19250 submit_info.commandBufferCount = 1;
19251 submit_info.pCommandBuffers = &command_buffer[0];
19252 submit_info.signalSemaphoreCount = 0;
19253 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
19254 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19255 }
19256 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019257 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019258 VkSubmitInfo submit_info{};
19259 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19260 submit_info.commandBufferCount = 1;
19261 submit_info.pCommandBuffers = &command_buffer[1];
19262 submit_info.waitSemaphoreCount = 0;
19263 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
19264 submit_info.pWaitDstStageMask = flags;
19265 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
19266 }
19267
19268 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19269
19270 vkDestroyFence(m_device->device(), fence, nullptr);
19271 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19272 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19273
19274 m_errorMonitor->VerifyNotFound();
19275}
19276
19277// This is a positive test. No errors should be generated.
19278TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
19279
19280 TEST_DESCRIPTION("Two command buffers each in a separate SubmitInfo sent in a single "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019281 "QueueSubmit call followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019282 ASSERT_NO_FATAL_FAILURE(InitState());
19283
19284 m_errorMonitor->ExpectSuccess();
19285
19286 VkFence fence;
19287 VkFenceCreateInfo fence_create_info{};
19288 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19289 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
19290
19291 VkSemaphore semaphore;
19292 VkSemaphoreCreateInfo semaphore_create_info{};
19293 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19294 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
19295
19296 VkCommandPool command_pool;
19297 VkCommandPoolCreateInfo pool_create_info{};
19298 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19299 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19300 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19301 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19302
19303 VkCommandBuffer command_buffer[2];
19304 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19305 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19306 command_buffer_allocate_info.commandPool = command_pool;
19307 command_buffer_allocate_info.commandBufferCount = 2;
19308 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19309 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19310
19311 {
19312 VkCommandBufferBeginInfo begin_info{};
19313 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19314 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19315
19316 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 -070019317 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019318
19319 VkViewport viewport{};
19320 viewport.maxDepth = 1.0f;
19321 viewport.minDepth = 0.0f;
19322 viewport.width = 512;
19323 viewport.height = 512;
19324 viewport.x = 0;
19325 viewport.y = 0;
19326 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19327 vkEndCommandBuffer(command_buffer[0]);
19328 }
19329 {
19330 VkCommandBufferBeginInfo begin_info{};
19331 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19332 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19333
19334 VkViewport viewport{};
19335 viewport.maxDepth = 1.0f;
19336 viewport.minDepth = 0.0f;
19337 viewport.width = 512;
19338 viewport.height = 512;
19339 viewport.x = 0;
19340 viewport.y = 0;
19341 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19342 vkEndCommandBuffer(command_buffer[1]);
19343 }
19344 {
19345 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019346 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019347
19348 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19349 submit_info[0].pNext = NULL;
19350 submit_info[0].commandBufferCount = 1;
19351 submit_info[0].pCommandBuffers = &command_buffer[0];
19352 submit_info[0].signalSemaphoreCount = 1;
19353 submit_info[0].pSignalSemaphores = &semaphore;
19354 submit_info[0].waitSemaphoreCount = 0;
19355 submit_info[0].pWaitSemaphores = NULL;
19356 submit_info[0].pWaitDstStageMask = 0;
19357
19358 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19359 submit_info[1].pNext = NULL;
19360 submit_info[1].commandBufferCount = 1;
19361 submit_info[1].pCommandBuffers = &command_buffer[1];
19362 submit_info[1].waitSemaphoreCount = 1;
19363 submit_info[1].pWaitSemaphores = &semaphore;
19364 submit_info[1].pWaitDstStageMask = flags;
19365 submit_info[1].signalSemaphoreCount = 0;
19366 submit_info[1].pSignalSemaphores = NULL;
19367 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
19368 }
19369
19370 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19371
19372 vkDestroyFence(m_device->device(), fence, nullptr);
19373 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19374 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19375 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
19376
19377 m_errorMonitor->VerifyNotFound();
19378}
19379
19380TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
19381 m_errorMonitor->ExpectSuccess();
19382
19383 ASSERT_NO_FATAL_FAILURE(InitState());
19384 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19385
Tony Barbour552f6c02016-12-21 14:34:07 -070019386 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019387
19388 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
19389 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
19390 m_errorMonitor->VerifyNotFound();
19391 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
19392 m_errorMonitor->VerifyNotFound();
19393 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
19394 m_errorMonitor->VerifyNotFound();
19395
19396 m_commandBuffer->EndCommandBuffer();
19397 m_errorMonitor->VerifyNotFound();
19398}
19399
19400TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
19401 TEST_DESCRIPTION("Positive test where we create a renderpass with an "
19402 "attachment that uses LOAD_OP_CLEAR, the first subpass "
19403 "has a valid layout, and a second subpass then uses a "
19404 "valid *READ_ONLY* layout.");
19405 m_errorMonitor->ExpectSuccess();
19406 ASSERT_NO_FATAL_FAILURE(InitState());
19407
19408 VkAttachmentReference attach[2] = {};
19409 attach[0].attachment = 0;
19410 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19411 attach[1].attachment = 0;
19412 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
19413 VkSubpassDescription subpasses[2] = {};
19414 // First subpass clears DS attach on load
19415 subpasses[0].pDepthStencilAttachment = &attach[0];
19416 // 2nd subpass reads in DS as input attachment
19417 subpasses[1].inputAttachmentCount = 1;
19418 subpasses[1].pInputAttachments = &attach[1];
19419 VkAttachmentDescription attach_desc = {};
19420 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
19421 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
19422 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
19423 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
19424 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
19425 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
19426 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19427 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
19428 VkRenderPassCreateInfo rpci = {};
19429 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
19430 rpci.attachmentCount = 1;
19431 rpci.pAttachments = &attach_desc;
19432 rpci.subpassCount = 2;
19433 rpci.pSubpasses = subpasses;
19434
19435 // Now create RenderPass and verify no errors
19436 VkRenderPass rp;
19437 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
19438 m_errorMonitor->VerifyNotFound();
19439
19440 vkDestroyRenderPass(m_device->device(), rp, NULL);
19441}
19442
19443TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
19444 TEST_DESCRIPTION("Test that pipeline validation accepts matrices passed "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019445 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019446 m_errorMonitor->ExpectSuccess();
19447
19448 ASSERT_NO_FATAL_FAILURE(InitState());
19449 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19450
19451 VkVertexInputBindingDescription input_binding;
19452 memset(&input_binding, 0, sizeof(input_binding));
19453
19454 VkVertexInputAttributeDescription input_attribs[2];
19455 memset(input_attribs, 0, sizeof(input_attribs));
19456
19457 for (int i = 0; i < 2; i++) {
19458 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
19459 input_attribs[i].location = i;
19460 }
19461
19462 char const *vsSource = "#version 450\n"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019463 "\n"
19464 "layout(location=0) in mat2x4 x;\n"
19465 "out gl_PerVertex {\n"
19466 " vec4 gl_Position;\n"
19467 "};\n"
19468 "void main(){\n"
19469 " gl_Position = x[0] + x[1];\n"
19470 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019471 char const *fsSource = "#version 450\n"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019472 "\n"
19473 "layout(location=0) out vec4 color;\n"
19474 "void main(){\n"
19475 " color = vec4(1);\n"
19476 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019477
19478 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19479 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19480
19481 VkPipelineObj pipe(m_device);
19482 pipe.AddColorAttachment();
19483 pipe.AddShader(&vs);
19484 pipe.AddShader(&fs);
19485
19486 pipe.AddVertexInputBindings(&input_binding, 1);
19487 pipe.AddVertexInputAttribs(input_attribs, 2);
19488
19489 VkDescriptorSetObj descriptorSet(m_device);
19490 descriptorSet.AppendDummy();
19491 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19492
19493 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19494
19495 /* expect success */
19496 m_errorMonitor->VerifyNotFound();
19497}
19498
19499TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
19500 m_errorMonitor->ExpectSuccess();
19501
19502 ASSERT_NO_FATAL_FAILURE(InitState());
19503 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19504
19505 VkVertexInputBindingDescription input_binding;
19506 memset(&input_binding, 0, sizeof(input_binding));
19507
19508 VkVertexInputAttributeDescription input_attribs[2];
19509 memset(input_attribs, 0, sizeof(input_attribs));
19510
19511 for (int i = 0; i < 2; i++) {
19512 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
19513 input_attribs[i].location = i;
19514 }
19515
19516 char const *vsSource = "#version 450\n"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019517 "\n"
19518 "layout(location=0) in vec4 x[2];\n"
19519 "out gl_PerVertex {\n"
19520 " vec4 gl_Position;\n"
19521 "};\n"
19522 "void main(){\n"
19523 " gl_Position = x[0] + x[1];\n"
19524 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019525 char const *fsSource = "#version 450\n"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019526 "\n"
19527 "layout(location=0) out vec4 color;\n"
19528 "void main(){\n"
19529 " color = vec4(1);\n"
19530 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019531
19532 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19533 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19534
19535 VkPipelineObj pipe(m_device);
19536 pipe.AddColorAttachment();
19537 pipe.AddShader(&vs);
19538 pipe.AddShader(&fs);
19539
19540 pipe.AddVertexInputBindings(&input_binding, 1);
19541 pipe.AddVertexInputAttribs(input_attribs, 2);
19542
19543 VkDescriptorSetObj descriptorSet(m_device);
19544 descriptorSet.AppendDummy();
19545 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19546
19547 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19548
19549 m_errorMonitor->VerifyNotFound();
19550}
19551
19552TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
19553 TEST_DESCRIPTION("Test that pipeline validation accepts consuming a vertex attribute "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019554 "through multiple vertex shader inputs, each consuming a different "
19555 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019556 m_errorMonitor->ExpectSuccess();
19557
19558 ASSERT_NO_FATAL_FAILURE(InitState());
19559 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19560
19561 VkVertexInputBindingDescription input_binding;
19562 memset(&input_binding, 0, sizeof(input_binding));
19563
19564 VkVertexInputAttributeDescription input_attribs[3];
19565 memset(input_attribs, 0, sizeof(input_attribs));
19566
19567 for (int i = 0; i < 3; i++) {
19568 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
19569 input_attribs[i].location = i;
19570 }
19571
19572 char const *vsSource = "#version 450\n"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019573 "\n"
19574 "layout(location=0) in vec4 x;\n"
19575 "layout(location=1) in vec3 y1;\n"
19576 "layout(location=1, component=3) in float y2;\n"
19577 "layout(location=2) in vec4 z;\n"
19578 "out gl_PerVertex {\n"
19579 " vec4 gl_Position;\n"
19580 "};\n"
19581 "void main(){\n"
19582 " gl_Position = x + vec4(y1, y2) + z;\n"
19583 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019584 char const *fsSource = "#version 450\n"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019585 "\n"
19586 "layout(location=0) out vec4 color;\n"
19587 "void main(){\n"
19588 " color = vec4(1);\n"
19589 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019590
19591 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19592 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19593
19594 VkPipelineObj pipe(m_device);
19595 pipe.AddColorAttachment();
19596 pipe.AddShader(&vs);
19597 pipe.AddShader(&fs);
19598
19599 pipe.AddVertexInputBindings(&input_binding, 1);
19600 pipe.AddVertexInputAttribs(input_attribs, 3);
19601
19602 VkDescriptorSetObj descriptorSet(m_device);
19603 descriptorSet.AppendDummy();
19604 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19605
19606 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19607
19608 m_errorMonitor->VerifyNotFound();
19609}
19610
19611TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
19612 m_errorMonitor->ExpectSuccess();
19613
19614 ASSERT_NO_FATAL_FAILURE(InitState());
19615 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19616
19617 char const *vsSource = "#version 450\n"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019618 "out gl_PerVertex {\n"
19619 " vec4 gl_Position;\n"
19620 "};\n"
19621 "void main(){\n"
19622 " gl_Position = vec4(0);\n"
19623 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019624 char const *fsSource = "#version 450\n"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019625 "\n"
19626 "layout(location=0) out vec4 color;\n"
19627 "void main(){\n"
19628 " color = vec4(1);\n"
19629 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019630
19631 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19632 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19633
19634 VkPipelineObj pipe(m_device);
19635 pipe.AddColorAttachment();
19636 pipe.AddShader(&vs);
19637 pipe.AddShader(&fs);
19638
19639 VkDescriptorSetObj descriptorSet(m_device);
19640 descriptorSet.AppendDummy();
19641 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19642
19643 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19644
19645 m_errorMonitor->VerifyNotFound();
19646}
19647
19648TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
19649 TEST_DESCRIPTION("Test that pipeline validation accepts the relaxed type matching rules "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019650 "set out in 14.1.3: fundamental type must match, and producer side must "
19651 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019652 m_errorMonitor->ExpectSuccess();
19653
19654 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
19655
19656 ASSERT_NO_FATAL_FAILURE(InitState());
19657 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19658
19659 char const *vsSource = "#version 450\n"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019660 "out gl_PerVertex {\n"
19661 " vec4 gl_Position;\n"
19662 "};\n"
19663 "layout(location=0) out vec3 x;\n"
19664 "layout(location=1) out ivec3 y;\n"
19665 "layout(location=2) out vec3 z;\n"
19666 "void main(){\n"
19667 " gl_Position = vec4(0);\n"
19668 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
19669 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019670 char const *fsSource = "#version 450\n"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019671 "\n"
19672 "layout(location=0) out vec4 color;\n"
19673 "layout(location=0) in float x;\n"
19674 "layout(location=1) flat in int y;\n"
19675 "layout(location=2) in vec2 z;\n"
19676 "void main(){\n"
19677 " color = vec4(1 + x + y + z.x);\n"
19678 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019679
19680 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19681 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19682
19683 VkPipelineObj pipe(m_device);
19684 pipe.AddColorAttachment();
19685 pipe.AddShader(&vs);
19686 pipe.AddShader(&fs);
19687
19688 VkDescriptorSetObj descriptorSet(m_device);
19689 descriptorSet.AppendDummy();
19690 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19691
19692 VkResult err = VK_SUCCESS;
19693 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19694 ASSERT_VK_SUCCESS(err);
19695
19696 m_errorMonitor->VerifyNotFound();
19697}
19698
19699TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
19700 TEST_DESCRIPTION("Test that pipeline validation accepts per-vertex variables "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019701 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019702 m_errorMonitor->ExpectSuccess();
19703
19704 ASSERT_NO_FATAL_FAILURE(InitState());
19705 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19706
19707 if (!m_device->phy().features().tessellationShader) {
19708 printf("Device does not support tessellation shaders; skipped.\n");
19709 return;
19710 }
19711
19712 char const *vsSource = "#version 450\n"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019713 "void main(){}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019714 char const *tcsSource = "#version 450\n"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019715 "layout(location=0) out int x[];\n"
19716 "layout(vertices=3) out;\n"
19717 "void main(){\n"
19718 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
19719 " gl_TessLevelInner[0] = 1;\n"
19720 " x[gl_InvocationID] = gl_InvocationID;\n"
19721 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019722 char const *tesSource = "#version 450\n"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019723 "layout(triangles, equal_spacing, cw) in;\n"
19724 "layout(location=0) in int x[];\n"
19725 "out gl_PerVertex { vec4 gl_Position; };\n"
19726 "void main(){\n"
19727 " gl_Position.xyz = gl_TessCoord;\n"
19728 " gl_Position.w = x[0] + x[1] + x[2];\n"
19729 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019730 char const *fsSource = "#version 450\n"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019731 "layout(location=0) out vec4 color;\n"
19732 "void main(){\n"
19733 " color = vec4(1);\n"
19734 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019735
19736 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19737 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
19738 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
19739 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19740
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019741 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
19742 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019743
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019744 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019745
19746 VkPipelineObj pipe(m_device);
19747 pipe.SetInputAssembly(&iasci);
19748 pipe.SetTessellation(&tsci);
19749 pipe.AddColorAttachment();
19750 pipe.AddShader(&vs);
19751 pipe.AddShader(&tcs);
19752 pipe.AddShader(&tes);
19753 pipe.AddShader(&fs);
19754
19755 VkDescriptorSetObj descriptorSet(m_device);
19756 descriptorSet.AppendDummy();
19757 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19758
19759 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19760
19761 m_errorMonitor->VerifyNotFound();
19762}
19763
19764TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
19765 TEST_DESCRIPTION("Test that pipeline validation accepts a user-defined "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019766 "interface block passed into the geometry shader. This "
19767 "is interesting because the 'extra' array level is not "
19768 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019769 m_errorMonitor->ExpectSuccess();
19770
19771 ASSERT_NO_FATAL_FAILURE(InitState());
19772 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19773
19774 if (!m_device->phy().features().geometryShader) {
19775 printf("Device does not support geometry shaders; skipped.\n");
19776 return;
19777 }
19778
19779 char const *vsSource = "#version 450\n"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019780 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
19781 "void main(){\n"
19782 " vs_out.x = vec4(1);\n"
19783 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019784 char const *gsSource = "#version 450\n"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019785 "layout(triangles) in;\n"
19786 "layout(triangle_strip, max_vertices=3) out;\n"
19787 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
19788 "out gl_PerVertex { vec4 gl_Position; };\n"
19789 "void main() {\n"
19790 " gl_Position = gs_in[0].x;\n"
19791 " EmitVertex();\n"
19792 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019793 char const *fsSource = "#version 450\n"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019794 "layout(location=0) out vec4 color;\n"
19795 "void main(){\n"
19796 " color = vec4(1);\n"
19797 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019798
19799 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19800 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
19801 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19802
19803 VkPipelineObj pipe(m_device);
19804 pipe.AddColorAttachment();
19805 pipe.AddShader(&vs);
19806 pipe.AddShader(&gs);
19807 pipe.AddShader(&fs);
19808
19809 VkDescriptorSetObj descriptorSet(m_device);
19810 descriptorSet.AppendDummy();
19811 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19812
19813 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19814
19815 m_errorMonitor->VerifyNotFound();
19816}
19817
19818TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
19819 TEST_DESCRIPTION("Test that pipeline validation accepts basic use of 64bit vertex "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019820 "attributes. This is interesting because they consume multiple "
19821 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019822 m_errorMonitor->ExpectSuccess();
19823
19824 ASSERT_NO_FATAL_FAILURE(InitState());
19825 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19826
19827 if (!m_device->phy().features().shaderFloat64) {
19828 printf("Device does not support 64bit vertex attributes; skipped.\n");
19829 return;
19830 }
19831
19832 VkVertexInputBindingDescription input_bindings[1];
19833 memset(input_bindings, 0, sizeof(input_bindings));
19834
19835 VkVertexInputAttributeDescription input_attribs[4];
19836 memset(input_attribs, 0, sizeof(input_attribs));
19837 input_attribs[0].location = 0;
19838 input_attribs[0].offset = 0;
19839 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
19840 input_attribs[1].location = 2;
19841 input_attribs[1].offset = 32;
19842 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
19843 input_attribs[2].location = 4;
19844 input_attribs[2].offset = 64;
19845 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
19846 input_attribs[3].location = 6;
19847 input_attribs[3].offset = 96;
19848 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
19849
19850 char const *vsSource = "#version 450\n"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019851 "\n"
19852 "layout(location=0) in dmat4 x;\n"
19853 "out gl_PerVertex {\n"
19854 " vec4 gl_Position;\n"
19855 "};\n"
19856 "void main(){\n"
19857 " gl_Position = vec4(x[0][0]);\n"
19858 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019859 char const *fsSource = "#version 450\n"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019860 "\n"
19861 "layout(location=0) out vec4 color;\n"
19862 "void main(){\n"
19863 " color = vec4(1);\n"
19864 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019865
19866 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19867 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19868
19869 VkPipelineObj pipe(m_device);
19870 pipe.AddColorAttachment();
19871 pipe.AddShader(&vs);
19872 pipe.AddShader(&fs);
19873
19874 pipe.AddVertexInputBindings(input_bindings, 1);
19875 pipe.AddVertexInputAttribs(input_attribs, 4);
19876
19877 VkDescriptorSetObj descriptorSet(m_device);
19878 descriptorSet.AppendDummy();
19879 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19880
19881 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19882
19883 m_errorMonitor->VerifyNotFound();
19884}
19885
19886TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
19887 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
19888 m_errorMonitor->ExpectSuccess();
19889
19890 ASSERT_NO_FATAL_FAILURE(InitState());
19891
19892 char const *vsSource = "#version 450\n"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019893 "\n"
19894 "out gl_PerVertex {\n"
19895 " vec4 gl_Position;\n"
19896 "};\n"
19897 "void main(){\n"
19898 " gl_Position = vec4(1);\n"
19899 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019900 char const *fsSource = "#version 450\n"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019901 "\n"
19902 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
19903 "layout(location=0) out vec4 color;\n"
19904 "void main() {\n"
19905 " color = subpassLoad(x);\n"
19906 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019907
19908 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19909 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19910
19911 VkPipelineObj pipe(m_device);
19912 pipe.AddShader(&vs);
19913 pipe.AddShader(&fs);
19914 pipe.AddColorAttachment();
19915 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19916
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019917 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
19918 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019919 VkDescriptorSetLayout dsl;
19920 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
19921 ASSERT_VK_SUCCESS(err);
19922
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019923 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019924 VkPipelineLayout pl;
19925 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
19926 ASSERT_VK_SUCCESS(err);
19927
19928 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019929 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
19930 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
19931 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
19932 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
19933 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 -060019934 };
19935 VkAttachmentReference color = {
19936 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
19937 };
19938 VkAttachmentReference input = {
19939 1, VK_IMAGE_LAYOUT_GENERAL,
19940 };
19941
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019942 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019943
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019944 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019945 VkRenderPass rp;
19946 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
19947 ASSERT_VK_SUCCESS(err);
19948
19949 // should be OK. would go wrong here if it's going to...
19950 pipe.CreateVKPipeline(pl, rp);
19951
19952 m_errorMonitor->VerifyNotFound();
19953
19954 vkDestroyRenderPass(m_device->device(), rp, nullptr);
19955 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
19956 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
19957}
19958
19959TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
19960 TEST_DESCRIPTION("Test that pipeline validation accepts a compute pipeline which declares a "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019961 "descriptor-backed resource which is not provided, but the shader does not "
19962 "statically use it. This is interesting because it requires compute pipelines "
19963 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019964 m_errorMonitor->ExpectSuccess();
19965
19966 ASSERT_NO_FATAL_FAILURE(InitState());
19967
19968 char const *csSource = "#version 450\n"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019969 "\n"
19970 "layout(local_size_x=1) in;\n"
19971 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
19972 "void main(){\n"
19973 " // x is not used.\n"
19974 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019975
19976 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
19977
19978 VkDescriptorSetObj descriptorSet(m_device);
19979 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19980
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019981 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
19982 nullptr,
19983 0,
19984 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
19985 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
19986 descriptorSet.GetPipelineLayout(),
19987 VK_NULL_HANDLE,
19988 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019989
19990 VkPipeline pipe;
19991 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
19992
19993 m_errorMonitor->VerifyNotFound();
19994
19995 if (err == VK_SUCCESS) {
19996 vkDestroyPipeline(m_device->device(), pipe, nullptr);
19997 }
19998}
19999
20000TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
20001 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020002 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020003 m_errorMonitor->ExpectSuccess();
20004
20005 ASSERT_NO_FATAL_FAILURE(InitState());
20006
20007 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020008 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
20009 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
20010 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020011 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020012 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020013 VkDescriptorSetLayout dsl;
20014 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
20015 ASSERT_VK_SUCCESS(err);
20016
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020017 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020018 VkPipelineLayout pl;
20019 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
20020 ASSERT_VK_SUCCESS(err);
20021
20022 char const *csSource = "#version 450\n"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020023 "\n"
20024 "layout(local_size_x=1) in;\n"
20025 "layout(set=0, binding=0) uniform sampler s;\n"
20026 "layout(set=0, binding=1) uniform texture2D t;\n"
20027 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
20028 "void main() {\n"
20029 " x = texture(sampler2D(t, s), vec2(0));\n"
20030 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020031 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
20032
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020033 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
20034 nullptr,
20035 0,
20036 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
20037 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
20038 pl,
20039 VK_NULL_HANDLE,
20040 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020041
20042 VkPipeline pipe;
20043 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
20044
20045 m_errorMonitor->VerifyNotFound();
20046
20047 if (err == VK_SUCCESS) {
20048 vkDestroyPipeline(m_device->device(), pipe, nullptr);
20049 }
20050
20051 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
20052 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
20053}
20054
20055TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
20056 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020057 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020058 m_errorMonitor->ExpectSuccess();
20059
20060 ASSERT_NO_FATAL_FAILURE(InitState());
20061
20062 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020063 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
20064 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
20065 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020066 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020067 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020068 VkDescriptorSetLayout dsl;
20069 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
20070 ASSERT_VK_SUCCESS(err);
20071
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020072 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020073 VkPipelineLayout pl;
20074 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
20075 ASSERT_VK_SUCCESS(err);
20076
20077 char const *csSource = "#version 450\n"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020078 "\n"
20079 "layout(local_size_x=1) in;\n"
20080 "layout(set=0, binding=0) uniform texture2D t;\n"
20081 "layout(set=0, binding=1) uniform sampler s;\n"
20082 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
20083 "void main() {\n"
20084 " x = texture(sampler2D(t, s), vec2(0));\n"
20085 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020086 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
20087
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020088 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
20089 nullptr,
20090 0,
20091 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
20092 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
20093 pl,
20094 VK_NULL_HANDLE,
20095 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020096
20097 VkPipeline pipe;
20098 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
20099
20100 m_errorMonitor->VerifyNotFound();
20101
20102 if (err == VK_SUCCESS) {
20103 vkDestroyPipeline(m_device->device(), pipe, nullptr);
20104 }
20105
20106 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
20107 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
20108}
20109
20110TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
20111 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming "
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020112 "both the sampler and the image of a combined image+sampler "
20113 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020114 m_errorMonitor->ExpectSuccess();
20115
20116 ASSERT_NO_FATAL_FAILURE(InitState());
20117
20118 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020119 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
20120 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020121 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020122 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020123 VkDescriptorSetLayout dsl;
20124 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
20125 ASSERT_VK_SUCCESS(err);
20126
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020127 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020128 VkPipelineLayout pl;
20129 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
20130 ASSERT_VK_SUCCESS(err);
20131
20132 char const *csSource = "#version 450\n"
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020133 "\n"
20134 "layout(local_size_x=1) in;\n"
20135 "layout(set=0, binding=0) uniform texture2D t;\n"
20136 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
20137 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
20138 "void main() {\n"
20139 " x = texture(sampler2D(t, s), vec2(0));\n"
20140 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020141 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
20142
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020143 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
20144 nullptr,
20145 0,
20146 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
20147 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
20148 pl,
20149 VK_NULL_HANDLE,
20150 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020151
20152 VkPipeline pipe;
20153 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
20154
20155 m_errorMonitor->VerifyNotFound();
20156
20157 if (err == VK_SUCCESS) {
20158 vkDestroyPipeline(m_device->device(), pipe, nullptr);
20159 }
20160
20161 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
20162 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
20163}
20164
20165TEST_F(VkPositiveLayerTest, ValidStructPNext) {
20166 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
20167
20168 ASSERT_NO_FATAL_FAILURE(InitState());
20169
20170 // Positive test to check parameter_validation and unique_objects support
20171 // for NV_dedicated_allocation
20172 uint32_t extension_count = 0;
20173 bool supports_nv_dedicated_allocation = false;
20174 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
20175 ASSERT_VK_SUCCESS(err);
20176
20177 if (extension_count > 0) {
20178 std::vector<VkExtensionProperties> available_extensions(extension_count);
20179
20180 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
20181 ASSERT_VK_SUCCESS(err);
20182
20183 for (const auto &extension_props : available_extensions) {
20184 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
20185 supports_nv_dedicated_allocation = true;
20186 }
20187 }
20188 }
20189
20190 if (supports_nv_dedicated_allocation) {
20191 m_errorMonitor->ExpectSuccess();
20192
20193 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
20194 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
20195 dedicated_buffer_create_info.pNext = nullptr;
20196 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
20197
20198 uint32_t queue_family_index = 0;
20199 VkBufferCreateInfo buffer_create_info = {};
20200 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20201 buffer_create_info.pNext = &dedicated_buffer_create_info;
20202 buffer_create_info.size = 1024;
20203 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
20204 buffer_create_info.queueFamilyIndexCount = 1;
20205 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
20206
20207 VkBuffer buffer;
20208 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
20209 ASSERT_VK_SUCCESS(err);
20210
20211 VkMemoryRequirements memory_reqs;
20212 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
20213
20214 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
20215 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
20216 dedicated_memory_info.pNext = nullptr;
20217 dedicated_memory_info.buffer = buffer;
20218 dedicated_memory_info.image = VK_NULL_HANDLE;
20219
20220 VkMemoryAllocateInfo memory_info = {};
20221 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20222 memory_info.pNext = &dedicated_memory_info;
20223 memory_info.allocationSize = memory_reqs.size;
20224
20225 bool pass;
20226 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
20227 ASSERT_TRUE(pass);
20228
20229 VkDeviceMemory buffer_memory;
20230 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
20231 ASSERT_VK_SUCCESS(err);
20232
20233 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
20234 ASSERT_VK_SUCCESS(err);
20235
20236 vkDestroyBuffer(m_device->device(), buffer, NULL);
20237 vkFreeMemory(m_device->device(), buffer_memory, NULL);
20238
20239 m_errorMonitor->VerifyNotFound();
20240 }
20241}
20242
20243TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
20244 VkResult err;
20245
20246 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
20247
20248 ASSERT_NO_FATAL_FAILURE(InitState());
20249 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20250
20251 std::vector<const char *> device_extension_names;
20252 auto features = m_device->phy().features();
20253 // Artificially disable support for non-solid fill modes
20254 features.fillModeNonSolid = false;
20255 // The sacrificial device object
20256 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
20257
20258 VkRenderpassObj render_pass(&test_device);
20259
20260 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
20261 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
20262 pipeline_layout_ci.setLayoutCount = 0;
20263 pipeline_layout_ci.pSetLayouts = NULL;
20264
20265 VkPipelineLayout pipeline_layout;
20266 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
20267 ASSERT_VK_SUCCESS(err);
20268
20269 VkPipelineRasterizationStateCreateInfo rs_ci = {};
20270 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
20271 rs_ci.pNext = nullptr;
20272 rs_ci.lineWidth = 1.0f;
20273 rs_ci.rasterizerDiscardEnable = true;
20274
20275 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
20276 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20277
20278 // Set polygonMode=FILL. No error is expected
20279 m_errorMonitor->ExpectSuccess();
20280 {
20281 VkPipelineObj pipe(&test_device);
20282 pipe.AddShader(&vs);
20283 pipe.AddShader(&fs);
20284 pipe.AddColorAttachment();
20285 // Set polygonMode to a good value
20286 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
20287 pipe.SetRasterization(&rs_ci);
20288 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
20289 }
20290 m_errorMonitor->VerifyNotFound();
20291
20292 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
20293}
20294
20295TEST_F(VkPositiveLayerTest, ValidPushConstants) {
20296 VkResult err;
20297 ASSERT_NO_FATAL_FAILURE(InitState());
20298 ASSERT_NO_FATAL_FAILURE(InitViewport());
20299 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20300
20301 VkPipelineLayout pipeline_layout;
20302 VkPushConstantRange pc_range = {};
20303 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
20304 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
20305 pipeline_layout_ci.pushConstantRangeCount = 1;
20306 pipeline_layout_ci.pPushConstantRanges = &pc_range;
20307
20308 //
20309 // Check for invalid push constant ranges in pipeline layouts.
20310 //
20311 struct PipelineLayoutTestCase {
20312 VkPushConstantRange const range;
20313 char const *msg;
20314 };
20315
20316 // Check for overlapping ranges
20317 const uint32_t ranges_per_test = 5;
20318 struct OverlappingRangeTestCase {
20319 VkPushConstantRange const ranges[ranges_per_test];
20320 char const *msg;
20321 };
20322
20323 // Run some positive tests to make sure overlap checking in the layer is OK
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020324 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos = {{{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
20325 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
20326 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
20327 {VK_SHADER_STAGE_VERTEX_BIT, 12, 4},
20328 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
20329 ""},
20330 {{{VK_SHADER_STAGE_VERTEX_BIT, 92, 24},
20331 {VK_SHADER_STAGE_VERTEX_BIT, 80, 4},
20332 {VK_SHADER_STAGE_VERTEX_BIT, 64, 8},
20333 {VK_SHADER_STAGE_VERTEX_BIT, 4, 16},
20334 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
20335 ""}}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020336 for (const auto &iter : overlapping_range_tests_pos) {
20337 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
20338 m_errorMonitor->ExpectSuccess();
20339 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
20340 m_errorMonitor->VerifyNotFound();
20341 if (VK_SUCCESS == err) {
20342 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
20343 }
20344 }
20345
20346 //
20347 // CmdPushConstants tests
20348 //
20349 const uint8_t dummy_values[100] = {};
20350
Tony Barbour552f6c02016-12-21 14:34:07 -070020351 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020352
20353 // positive overlapping range tests with cmd
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020354 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = {{
20355 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, ""},
20356 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4}, ""},
20357 {{VK_SHADER_STAGE_VERTEX_BIT, 20, 12}, ""},
20358 {{VK_SHADER_STAGE_VERTEX_BIT, 56, 36}, ""},
20359 }};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020360
20361 // Setup ranges: [0,16) [20,36) [36,44) [44,52) [56,80) [80,92)
20362 const VkPushConstantRange pc_range4[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020363 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
20364 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12}, {VK_SHADER_STAGE_VERTEX_BIT, 36, 8}, {VK_SHADER_STAGE_VERTEX_BIT, 56, 24},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020365 };
20366
20367 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range4) / sizeof(VkPushConstantRange);
20368 pipeline_layout_ci.pPushConstantRanges = pc_range4;
20369 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
20370 ASSERT_VK_SUCCESS(err);
20371 for (const auto &iter : cmd_overlap_tests_pos) {
20372 m_errorMonitor->ExpectSuccess();
20373 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020374 iter.range.size, dummy_values);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020375 m_errorMonitor->VerifyNotFound();
20376 }
20377 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
20378
Tony Barbour552f6c02016-12-21 14:34:07 -070020379 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020380}
20381
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020382#if 0 // A few devices have issues with this test so disabling for now
20383TEST_F(VkPositiveLayerTest, LongFenceChain)
20384{
20385 m_errorMonitor->ExpectSuccess();
20386
20387 ASSERT_NO_FATAL_FAILURE(InitState());
20388 VkResult err;
20389
20390 std::vector<VkFence> fences;
20391
20392 const int chainLength = 32768;
20393
20394 for (int i = 0; i < chainLength; i++) {
20395 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
20396 VkFence fence;
20397 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
20398 ASSERT_VK_SUCCESS(err);
20399
20400 fences.push_back(fence);
20401
20402 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
20403 0, nullptr, 0, nullptr };
20404 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
20405 ASSERT_VK_SUCCESS(err);
20406
20407 }
20408
20409 // BOOM, stack overflow.
20410 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
20411
20412 for (auto fence : fences)
20413 vkDestroyFence(m_device->device(), fence, nullptr);
20414
20415 m_errorMonitor->VerifyNotFound();
20416}
20417#endif
20418
Cody Northrop1242dfd2016-07-13 17:24:59 -060020419#if defined(ANDROID) && defined(VALIDATION_APK)
20420static bool initialized = false;
20421static bool active = false;
20422
20423// Convert Intents to argv
20424// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020425std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060020426 std::vector<std::string> args;
20427 JavaVM &vm = *app.activity->vm;
20428 JNIEnv *p_env;
20429 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK)
20430 return args;
20431
20432 JNIEnv &env = *p_env;
20433 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020434 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060020435 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020436 jmethodID get_string_extra_method =
20437 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060020438 jvalue get_string_extra_args;
20439 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020440 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060020441
20442 std::string args_str;
20443 if (extra_str) {
20444 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
20445 args_str = extra_utf;
20446 env.ReleaseStringUTFChars(extra_str, extra_utf);
20447 env.DeleteLocalRef(extra_str);
20448 }
20449
20450 env.DeleteLocalRef(get_string_extra_args.l);
20451 env.DeleteLocalRef(intent);
20452 vm.DetachCurrentThread();
20453
20454 // split args_str
20455 std::stringstream ss(args_str);
20456 std::string arg;
20457 while (std::getline(ss, arg, ' ')) {
20458 if (!arg.empty())
20459 args.push_back(arg);
20460 }
20461
20462 return args;
20463}
20464
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020465static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060020466
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020467static void processCommand(struct android_app *app, int32_t cmd) {
20468 switch (cmd) {
20469 case APP_CMD_INIT_WINDOW: {
20470 if (app->window) {
20471 initialized = true;
Cody Northrop1242dfd2016-07-13 17:24:59 -060020472 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020473 break;
20474 }
20475 case APP_CMD_GAINED_FOCUS: {
20476 active = true;
20477 break;
20478 }
20479 case APP_CMD_LOST_FOCUS: {
20480 active = false;
20481 break;
20482 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060020483 }
20484}
20485
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020486void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060020487 app_dummy();
20488
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020489 const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060020490
20491 int vulkanSupport = InitVulkan();
20492 if (vulkanSupport == 0) {
20493 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
20494 return;
20495 }
20496
20497 app->onAppCmd = processCommand;
20498 app->onInputEvent = processInput;
20499
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020500 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060020501 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020502 struct android_poll_source *source;
20503 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060020504 if (source) {
20505 source->process(app, source);
20506 }
20507
20508 if (app->destroyRequested != 0) {
20509 VkTestFramework::Finish();
20510 return;
20511 }
20512 }
20513
20514 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020515 // Use the following key to send arguments to gtest, i.e.
20516 // --es args "--gtest_filter=-VkLayerTest.foo"
20517 const char key[] = "args";
20518 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020519
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020520 std::string filter = "";
20521 if (args.size() > 0) {
20522 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
20523 filter += args[0];
20524 } else {
20525 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
20526 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060020527
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020528 int argc = 2;
20529 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
20530 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020531
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020532 // Route output to files until we can override the gtest output
20533 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
20534 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020535
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020536 ::testing::InitGoogleTest(&argc, argv);
20537 VkTestFramework::InitArgs(&argc, argv);
20538 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020539
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020540 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060020541
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020542 if (result != 0) {
20543 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
20544 } else {
20545 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
20546 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060020547
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020548 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060020549
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020550 fclose(stdout);
20551 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020552
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020553 ANativeActivity_finish(app->activity);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020554
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020555 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060020556 }
20557 }
20558}
20559#endif
20560
Tony Barbour300a6082015-04-07 13:44:53 -060020561int main(int argc, char **argv) {
20562 int result;
20563
Cody Northrop8e54a402016-03-08 22:25:52 -070020564#ifdef ANDROID
20565 int vulkanSupport = InitVulkan();
20566 if (vulkanSupport == 0)
20567 return 1;
20568#endif
20569
Tony Barbour300a6082015-04-07 13:44:53 -060020570 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060020571 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060020572
20573 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
20574
20575 result = RUN_ALL_TESTS();
20576
Tony Barbour6918cd52015-04-09 12:58:51 -060020577 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060020578 return result;
20579}