blob: 67e7b63b52ae648e04075d88511f2eed207dda19 [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"
37#include "vkrenderframework.h"
Tobin Ehlise2eeffa2016-09-21 17:32:26 -060038#include <unordered_set>
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060039#include "vk_validation_error_messages.h"
Tony Barbour300a6082015-04-07 13:44:53 -060040
Mark Lobodzinski3780e142015-05-14 15:08:13 -050041#define GLM_FORCE_RADIANS
42#include "glm/glm.hpp"
43#include <glm/gtc/matrix_transform.hpp>
44
Dustin Gravesffa90fa2016-05-06 11:20:38 -060045#define PARAMETER_VALIDATION_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060046#define MEM_TRACKER_TESTS 1
47#define OBJ_TRACKER_TESTS 1
48#define DRAW_STATE_TESTS 1
49#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120050#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060051#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060052#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060053
Mark Lobodzinski3780e142015-05-14 15:08:13 -050054//--------------------------------------------------------------------------------------
55// Mesh and VertexFormat Data
56//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070057struct Vertex {
58 float posX, posY, posZ, posW; // Position data
59 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050060};
61
Karl Schultz6addd812016-02-02 17:17:23 -070062#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050063
64typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070065 BsoFailNone = 0x00000000,
66 BsoFailLineWidth = 0x00000001,
67 BsoFailDepthBias = 0x00000002,
68 BsoFailViewport = 0x00000004,
69 BsoFailScissor = 0x00000008,
70 BsoFailBlend = 0x00000010,
71 BsoFailDepthBounds = 0x00000020,
72 BsoFailStencilReadMask = 0x00000040,
73 BsoFailStencilWriteMask = 0x00000080,
74 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060075 BsoFailCmdClearAttachments = 0x00000200,
Tobin Ehlis379ba3b2016-07-19 11:22:29 -060076 BsoFailIndexBuffer = 0x00000400,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050077} BsoFailSelect;
78
79struct vktriangle_vs_uniform {
80 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070081 float mvp[4][4];
82 float position[3][4];
83 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050084};
85
Mark Lobodzinskice751c62016-09-08 10:45:35 -060086static const char bindStateVertShaderText[] = "#version 450\n"
87 "vec2 vertices[3];\n"
88 "out gl_PerVertex {\n"
89 " vec4 gl_Position;\n"
90 "};\n"
91 "void main() {\n"
92 " vertices[0] = vec2(-1.0, -1.0);\n"
93 " vertices[1] = vec2( 1.0, -1.0);\n"
94 " vertices[2] = vec2( 0.0, 1.0);\n"
95 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
96 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050097
Mark Lobodzinskice751c62016-09-08 10:45:35 -060098static const char bindStateFragShaderText[] = "#version 450\n"
99 "\n"
100 "layout(location = 0) out vec4 uFragColor;\n"
101 "void main(){\n"
102 " uFragColor = vec4(0,1,0,1);\n"
103 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500104
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600105static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
106 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
107 void *pUserData);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600108
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600109// ErrorMonitor Usage:
110//
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600111// Call SetDesiredFailureMsg with: a string to be compared against all
112// encountered log messages, or a validation error enum identifying
113// desired error message. Passing NULL or VALIDATION_ERROR_MAX_ENUM
114// will match all log messages. logMsg will return true for skipCall
115// only if msg is matched or NULL.
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600116//
117// Call DesiredMsgFound to determine if the desired failure message
118// was encountered.
Tony Barbour300a6082015-04-07 13:44:53 -0600119class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700120 public:
121 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600122 test_platform_thread_create_mutex(&m_mutex);
123 test_platform_thread_lock_mutex(&m_mutex);
Chris Forbes17756132016-09-16 14:36:39 +1200124 m_msgFlags = VK_DEBUG_REPORT_ERROR_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700125 m_bailout = NULL;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600126 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600127 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600128
Dustin Graves48458142016-04-29 16:11:55 -0600129 ~ErrorMonitor() { test_platform_thread_delete_mutex(&m_mutex); }
130
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600131 // ErrorMonitor will look for an error message containing the specified string
Karl Schultz6addd812016-02-02 17:17:23 -0700132 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600133 // Also discard all collected messages to this point
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600134 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600135 m_failure_message_strings.clear();
136 // If we are looking for a matching string, ignore any IDs
137 m_desired_message_ids.clear();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600138 m_otherMsgs.clear();
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600139 m_desired_message_strings.insert(msgString);
Karl Schultz6addd812016-02-02 17:17:23 -0700140 m_msgFound = VK_FALSE;
141 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600142 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600143 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600144
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600145 // ErrorMonitor will look for a message ID matching the specified one
146 void SetDesiredFailureMsg(VkFlags msgFlags, UNIQUE_VALIDATION_ERROR_CODE msg_id) {
147 // Also discard all collected messages to this point
148 test_platform_thread_lock_mutex(&m_mutex);
149 m_failure_message_strings.clear();
150 // If we are looking for IDs don't look for strings
151 m_desired_message_strings.clear();
152 m_otherMsgs.clear();
153 m_desired_message_ids.insert(msg_id);
154 m_msgFound = VK_FALSE;
155 m_msgFlags = msgFlags;
156 test_platform_thread_unlock_mutex(&m_mutex);
157 }
158
159 VkBool32 CheckForDesiredMsg(uint32_t message_code, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600160 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600161 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600162 if (m_bailout != NULL) {
163 *m_bailout = true;
164 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600165 string errorString(msgString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600166 bool found_expected = false;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600167
168 for (auto desired_msg : m_desired_message_strings) {
Karl Schultz05cc4e32016-10-12 13:25:23 -0600169 if (desired_msg.length() == 0) {
170 // An empty desired_msg string "" indicates a positive test - not expecting an error.
171 // Return true to avoid calling layers/driver with this error.
172 // And don't erase the "" string, so it remains if another error is found.
173 result = VK_TRUE;
174 } else if (errorString.find(desired_msg) != string::npos) {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600175 found_expected = true;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600176 m_failure_message_strings.insert(errorString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600177 m_msgFound = VK_TRUE;
178 result = VK_TRUE;
179 // We only want one match for each expected error so remove from set here
180 // Since we're about the break the loop it's ok to remove from set we're iterating over
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600181 m_desired_message_strings.erase(desired_msg);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600182 break;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600183 }
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600184 }
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600185 for (auto desired_id : m_desired_message_ids) {
186 if (desired_id == VALIDATION_ERROR_MAX_ENUM) {
187 // A message ID set to MAX_ENUM indicates a positive test - not expecting an error.
188 // Return true to avoid calling layers/driver with this error.
189 result = VK_TRUE;
190 } else if (desired_id == message_code) {
191 // Double-check that the string matches the error enum
192 if (errorString.find(validation_error_map[desired_id]) != string::npos) {
193 found_expected = true;
194 result = VK_TRUE;
195 m_msgFound = VK_TRUE;
196 m_desired_message_ids.erase(desired_id);
197 break;
198 } else {
199 // Treat this message as a regular unexpected error, but print a warning jic
200 printf("Message (%s) from MessageID %d does not correspond to expected message from error Database (%s)\n",
201 errorString.c_str(), desired_id, validation_error_map[desired_id]);
202 }
203 }
204 }
205
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600206 if (!found_expected) {
Chris Forbes5b9442b2016-09-13 16:49:57 +1200207 printf("Unexpected: %s\n", msgString);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600208 m_otherMsgs.push_back(errorString);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600209 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600210 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600211 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600212 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600213
Karl Schultz6addd812016-02-02 17:17:23 -0700214 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600215
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600216 VkDebugReportFlagsEXT GetMessageFlags(void) { return m_msgFlags; }
217
Karl Schultz6addd812016-02-02 17:17:23 -0700218 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600219
Karl Schultz6addd812016-02-02 17:17:23 -0700220 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600221
Karl Schultz6addd812016-02-02 17:17:23 -0700222 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600223 vector<string> otherMsgs = GetOtherFailureMsgs();
224 cout << "Other error messages logged for this test were:" << endl;
225 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
226 cout << " " << *iter << endl;
227 }
228 }
229
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600230 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200231
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600232 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
233 void ExpectSuccess(VkDebugReportFlagsEXT message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
234 m_msgFlags = message_flag_mask;
235 // Match ANY message matching specified type
236 SetDesiredFailureMsg(message_flag_mask, "");
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200237 }
238
239 void VerifyFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600240 // Not seeing the desired message is a failure. /Before/ throwing, dump any other messages.
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200241 if (!DesiredMsgFound()) {
242 DumpFailureMsgs();
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600243 for (auto desired_msg : m_desired_message_strings) {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600244 FAIL() << "Did not receive expected error '" << desired_msg << "'";
245 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200246 }
247 }
248
249 void VerifyNotFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600250 // ExpectSuccess() configured us to match anything. Any error is a failure.
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200251 if (DesiredMsgFound()) {
252 DumpFailureMsgs();
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600253 for (auto msg : m_failure_message_strings) {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600254 FAIL() << "Expected to succeed but got error: " << msg;
255 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200256 }
257 }
258
Karl Schultz6addd812016-02-02 17:17:23 -0700259 private:
260 VkFlags m_msgFlags;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600261 std::unordered_set<uint32_t>m_desired_message_ids;
262 std::unordered_set<string> m_desired_message_strings;
263 std::unordered_set<string> m_failure_message_strings;
Karl Schultz6addd812016-02-02 17:17:23 -0700264 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600265 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700266 bool *m_bailout;
267 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600268};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500269
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600270static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
271 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
272 void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600273 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
274 if (msgFlags & errMonitor->GetMessageFlags()) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600275 return errMonitor->CheckForDesiredMsg(msgCode, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600276 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600277 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600278}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500279
Karl Schultz6addd812016-02-02 17:17:23 -0700280class VkLayerTest : public VkRenderFramework {
281 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800282 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
283 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600284 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
285 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
Karl Schultz6addd812016-02-02 17:17:23 -0700286 BsoFailSelect failMask);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600287 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
288 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, failMask);
Karl Schultz6addd812016-02-02 17:17:23 -0700289 }
Tony Barbour300a6082015-04-07 13:44:53 -0600290
Tony Barbourfe3351b2015-07-28 10:17:20 -0600291 /* Convenience functions that use built-in command buffer */
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600292 VkResult BeginCommandBuffer() { return BeginCommandBuffer(*m_commandBuffer); }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800293 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600294 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
295 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700296 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600297 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
Karl Schultz6addd812016-02-02 17:17:23 -0700298 uint32_t firstInstance) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600299 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700300 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600301 void QueueCommandBuffer(bool checkSuccess = true) { m_commandBuffer->QueueCommandBuffer(checkSuccess); }
302 void QueueCommandBuffer(const VkFence &fence) { m_commandBuffer->QueueCommandBuffer(fence); }
303 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding) {
Karl Schultz6addd812016-02-02 17:17:23 -0700304 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
305 }
306 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
307 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
308 }
309
310 protected:
311 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600312 bool m_enableWSI;
Tony Barbour300a6082015-04-07 13:44:53 -0600313
314 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600315 std::vector<const char *> instance_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600316 std::vector<const char *> instance_extension_names;
317 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600318
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700319 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600320 /*
321 * Since CreateDbgMsgCallback is an instance level extension call
322 * any extension / layer that utilizes that feature also needs
323 * to be enabled at create instance time.
324 */
Karl Schultz6addd812016-02-02 17:17:23 -0700325 // Use Threading layer first to protect others from
326 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700327 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600328 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800329 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700330 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800331 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600332 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700333 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600334
Ian Elliott2c1daf52016-05-12 09:41:46 -0600335 if (m_enableWSI) {
336 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
337 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
338#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
339#if defined(VK_USE_PLATFORM_ANDROID_KHR)
340 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
341#endif // VK_USE_PLATFORM_ANDROID_KHR
342#if defined(VK_USE_PLATFORM_MIR_KHR)
343 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
344#endif // VK_USE_PLATFORM_MIR_KHR
345#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
346 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
347#endif // VK_USE_PLATFORM_WAYLAND_KHR
348#if defined(VK_USE_PLATFORM_WIN32_KHR)
349 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
350#endif // VK_USE_PLATFORM_WIN32_KHR
351#endif // NEED_TO_TEST_THIS_ON_PLATFORM
352#if defined(VK_USE_PLATFORM_XCB_KHR)
353 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
354#elif defined(VK_USE_PLATFORM_XLIB_KHR)
355 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
356#endif // VK_USE_PLATFORM_XLIB_KHR
357 }
358
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600359 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600360 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800361 this->app_info.pApplicationName = "layer_tests";
362 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600363 this->app_info.pEngineName = "unittest";
364 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600365 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600366
Tony Barbour15524c32015-04-29 17:34:29 -0600367 m_errorMonitor = new ErrorMonitor;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600368 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600369 }
370
371 virtual void TearDown() {
372 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600373 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600374 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600375 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600376
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600377 VkLayerTest() { m_enableWSI = false; }
Tony Barbour300a6082015-04-07 13:44:53 -0600378};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500379
Karl Schultz6addd812016-02-02 17:17:23 -0700380VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600381 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600382
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800383 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600384
385 /*
386 * For render test all drawing happens in a single render pass
387 * on a single command buffer.
388 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200389 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800390 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600391 }
392
393 return result;
394}
395
Karl Schultz6addd812016-02-02 17:17:23 -0700396VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600397 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600398
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200399 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800400 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200401 }
Tony Barbour300a6082015-04-07 13:44:53 -0600402
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800403 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600404
405 return result;
406}
407
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600408void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500409 // Create identity matrix
410 int i;
411 struct vktriangle_vs_uniform data;
412
413 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700414 glm::mat4 View = glm::mat4(1.0f);
415 glm::mat4 Model = glm::mat4(1.0f);
416 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500417 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700418 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500419
420 memcpy(&data.mvp, &MVP[0][0], matrixSize);
421
Karl Schultz6addd812016-02-02 17:17:23 -0700422 static const Vertex tri_data[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600423 {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 -0500424 };
425
Karl Schultz6addd812016-02-02 17:17:23 -0700426 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500427 data.position[i][0] = tri_data[i].posX;
428 data.position[i][1] = tri_data[i].posY;
429 data.position[i][2] = tri_data[i].posZ;
430 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700431 data.color[i][0] = tri_data[i].r;
432 data.color[i][1] = tri_data[i].g;
433 data.color[i][2] = tri_data[i].b;
434 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500435 }
436
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500437 ASSERT_NO_FATAL_FAILURE(InitViewport());
438
Chris Forbesbcfaadd2016-09-16 14:13:53 +1200439 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), (const void *)&data,
440 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500441
Karl Schultz6addd812016-02-02 17:17:23 -0700442 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600443 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500444
445 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800446 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500447 pipelineobj.AddShader(&vs);
448 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600449 if (failMask & BsoFailLineWidth) {
450 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600451 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600452 ia_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600453 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
454 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600455 }
456 if (failMask & BsoFailDepthBias) {
457 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600458 VkPipelineRasterizationStateCreateInfo rs_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600459 rs_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600460 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600461 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600462 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600463 }
Karl Schultz6addd812016-02-02 17:17:23 -0700464 // Viewport and scissors must stay in synch or other errors will occur than
465 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600466 if (failMask & BsoFailViewport) {
467 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
468 }
469 if (failMask & BsoFailScissor) {
470 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
471 }
472 if (failMask & BsoFailBlend) {
473 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600474 VkPipelineColorBlendAttachmentState att_state = {};
475 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
476 att_state.blendEnable = VK_TRUE;
477 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600478 }
479 if (failMask & BsoFailDepthBounds) {
480 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
481 }
482 if (failMask & BsoFailStencilReadMask) {
483 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
484 }
485 if (failMask & BsoFailStencilWriteMask) {
486 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
487 }
488 if (failMask & BsoFailStencilReference) {
489 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
490 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500491
492 VkDescriptorSetObj descriptorSet(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600493 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500494
495 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600496 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500497
Tony Barbourfe3351b2015-07-28 10:17:20 -0600498 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500499
500 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600501 if (failMask & BsoFailIndexBuffer) {
502 // Use DrawIndexed w/o an index buffer bound
503 DrawIndexed(3, 1, 0, 0, 0);
504 } else {
505 Draw(3, 1, 0, 0);
506 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500507
Mark Muellerd4914412016-06-13 17:52:06 -0600508 if (failMask & BsoFailCmdClearAttachments) {
509 VkClearAttachment color_attachment = {};
510 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
511 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
512 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
513
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600514 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Muellerd4914412016-06-13 17:52:06 -0600515 }
516
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500517 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600518 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500519
Tony Barbourfe3351b2015-07-28 10:17:20 -0600520 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500521}
522
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600523void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj,
524 VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500525 if (m_depthStencil->Initialized()) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600526 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500527 } else {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600528 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500529 }
530
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800531 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700532 // Make sure depthWriteEnable is set so that Depth fail test will work
533 // correctly
534 // Make sure stencilTestEnable is set so that Stencil fail test will work
535 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600536 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800537 stencil.failOp = VK_STENCIL_OP_KEEP;
538 stencil.passOp = VK_STENCIL_OP_KEEP;
539 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
540 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600541
542 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
543 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600544 ds_ci.pNext = NULL;
545 ds_ci.depthTestEnable = VK_FALSE;
546 ds_ci.depthWriteEnable = VK_TRUE;
547 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
548 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600549 if (failMask & BsoFailDepthBounds) {
550 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600551 ds_ci.maxDepthBounds = 0.0f;
552 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600553 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600554 ds_ci.stencilTestEnable = VK_TRUE;
555 ds_ci.front = stencil;
556 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600557
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600558 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600559 pipelineobj.SetViewport(m_viewports);
560 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800561 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600562 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600563 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800564 commandBuffer->BindPipeline(pipelineobj);
565 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500566}
567
Ian Elliott2c1daf52016-05-12 09:41:46 -0600568class VkWsiEnabledLayerTest : public VkLayerTest {
569 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600570 protected:
571 VkWsiEnabledLayerTest() { m_enableWSI = true; }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600572};
573
Mark Muellerdfe37552016-07-07 14:47:42 -0600574class VkBufferTest {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600575 public:
Mark Muellerdfe37552016-07-07 14:47:42 -0600576 enum eTestEnFlags {
577 eDoubleDelete,
578 eInvalidDeviceOffset,
579 eInvalidMemoryOffset,
580 eBindNullBuffer,
581 eFreeInvalidHandle,
Mark Mueller4042b652016-09-05 22:52:21 -0600582 eNone,
Mark Muellerdfe37552016-07-07 14:47:42 -0600583 };
584
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600585 enum eTestConditions { eOffsetAlignment = 1 };
Mark Muellerdfe37552016-07-07 14:47:42 -0600586
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600587 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage = 0) {
588 if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600589 return true;
590 }
591 VkDeviceSize offset_limit = 0;
592 if (eInvalidMemoryOffset == aTestFlag) {
593 VkBuffer vulkanBuffer;
594 VkBufferCreateInfo buffer_create_info = {};
595 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
596 buffer_create_info.size = 32;
597 buffer_create_info.usage = aBufferUsage;
598
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600599 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr, &vulkanBuffer);
Mark Mueller4042b652016-09-05 22:52:21 -0600600 VkMemoryRequirements memory_reqs = {};
Mark Muellerdfe37552016-07-07 14:47:42 -0600601
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600602 vkGetBufferMemoryRequirements(aVulkanDevice->device(), vulkanBuffer, &memory_reqs);
Mark Muellerdfe37552016-07-07 14:47:42 -0600603 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
604 offset_limit = memory_reqs.alignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600605 } else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
606 offset_limit = aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600607 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600608 offset_limit = aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600609 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600610 offset_limit = aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600611 }
612 if (eOffsetAlignment < offset_limit) {
613 return true;
614 }
615 return false;
616 }
617
618 // A constructor which performs validation tests within construction.
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600619 VkBufferTest(VkDeviceObj *aVulkanDevice, VkBufferUsageFlags aBufferUsage, eTestEnFlags aTestFlag = eNone)
620 : AllocateCurrent(false), BoundCurrent(false), CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600621
622 if (eBindNullBuffer == aTestFlag) {
623 VulkanMemory = 0;
624 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
625 } else {
626 VkBufferCreateInfo buffer_create_info = {};
627 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
628 buffer_create_info.size = 32;
629 buffer_create_info.usage = aBufferUsage;
630
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600631 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr, &VulkanBuffer);
Mark Muellerdfe37552016-07-07 14:47:42 -0600632
633 CreateCurrent = true;
634
635 VkMemoryRequirements memory_requirements;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600636 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer, &memory_requirements);
Mark Muellerdfe37552016-07-07 14:47:42 -0600637
638 VkMemoryAllocateInfo memory_allocate_info = {};
639 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
640 memory_allocate_info.allocationSize = memory_requirements.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600641 bool pass = aVulkanDevice->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info,
642 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Muellerdfe37552016-07-07 14:47:42 -0600643 if (!pass) {
644 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
645 return;
646 }
647
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600648 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL, &VulkanMemory);
Mark Muellerdfe37552016-07-07 14:47:42 -0600649 AllocateCurrent = true;
650 // NB: 1 is intentionally an invalid offset value
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600651 const bool offset_en = eInvalidDeviceOffset == aTestFlag || eInvalidMemoryOffset == aTestFlag;
652 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, offset_en ? eOffsetAlignment : 0);
Mark Muellerdfe37552016-07-07 14:47:42 -0600653 BoundCurrent = true;
654
655 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
656 }
657 }
658
659 ~VkBufferTest() {
660 if (CreateCurrent) {
661 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
662 }
663 if (AllocateCurrent) {
664 if (InvalidDeleteEn) {
665 union {
666 VkDeviceMemory device_memory;
667 unsigned long long index_access;
668 } bad_index;
669
670 bad_index.device_memory = VulkanMemory;
671 bad_index.index_access++;
672
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600673 vkFreeMemory(VulkanDevice, bad_index.device_memory, nullptr);
Mark Muellerdfe37552016-07-07 14:47:42 -0600674 }
675 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
676 }
677 }
678
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600679 bool GetBufferCurrent() { return AllocateCurrent && BoundCurrent && CreateCurrent; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600680
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600681 const VkBuffer &GetBuffer() { return VulkanBuffer; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600682
683 void TestDoubleDestroy() {
684 // Destroy the buffer but leave the flag set, which will cause
685 // the buffer to be destroyed again in the destructor.
686 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
687 }
688
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600689 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600690 bool AllocateCurrent;
691 bool BoundCurrent;
692 bool CreateCurrent;
693 bool InvalidDeleteEn;
694
695 VkBuffer VulkanBuffer;
696 VkDevice VulkanDevice;
697 VkDeviceMemory VulkanMemory;
Mark Muellerdfe37552016-07-07 14:47:42 -0600698};
699
700class VkVerticesObj {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600701 public:
702 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount, unsigned aBindingCount, unsigned aByteStride,
Mark Muellerdfe37552016-07-07 14:47:42 -0600703 VkDeviceSize aVertexCount, const float *aVerticies)
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600704 : BoundCurrent(false), AttributeCount(aAttributeCount), BindingCount(aBindingCount), BindId(BindIdGenerator),
Mark Muellerdfe37552016-07-07 14:47:42 -0600705 PipelineVertexInputStateCreateInfo(),
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600706 VulkanMemoryBuffer(aVulkanDevice, 1, static_cast<int>(aByteStride * aVertexCount),
707 reinterpret_cast<const void *>(aVerticies), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600708 BindIdGenerator++; // NB: This can wrap w/misuse
709
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600710 VertexInputAttributeDescription = new VkVertexInputAttributeDescription[AttributeCount];
711 VertexInputBindingDescription = new VkVertexInputBindingDescription[BindingCount];
Mark Muellerdfe37552016-07-07 14:47:42 -0600712
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600713 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = VertexInputAttributeDescription;
714 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = AttributeCount;
715 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = VertexInputBindingDescription;
716 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = BindingCount;
717 PipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -0600718
719 unsigned i = 0;
720 do {
721 VertexInputAttributeDescription[i].binding = BindId;
722 VertexInputAttributeDescription[i].location = i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600723 VertexInputAttributeDescription[i].format = VK_FORMAT_R32G32B32_SFLOAT;
724 VertexInputAttributeDescription[i].offset = sizeof(float) * aByteStride;
Mark Muellerdfe37552016-07-07 14:47:42 -0600725 i++;
726 } while (AttributeCount < i);
727
728 i = 0;
729 do {
730 VertexInputBindingDescription[i].binding = BindId;
731 VertexInputBindingDescription[i].stride = aByteStride;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600732 VertexInputBindingDescription[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
Mark Muellerdfe37552016-07-07 14:47:42 -0600733 i++;
734 } while (BindingCount < i);
735 }
736
737 ~VkVerticesObj() {
738 if (VertexInputAttributeDescription) {
739 delete[] VertexInputAttributeDescription;
740 }
741 if (VertexInputBindingDescription) {
742 delete[] VertexInputBindingDescription;
743 }
744 }
745
746 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600747 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription, AttributeCount);
748 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription, BindingCount);
Mark Muellerdfe37552016-07-07 14:47:42 -0600749 return true;
750 }
751
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600752 void BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount = 0, VkDeviceSize *aOffsetList = nullptr) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600753 VkDeviceSize *offsetList;
754 unsigned offsetCount;
755
756 if (aOffsetCount) {
757 offsetList = aOffsetList;
758 offsetCount = aOffsetCount;
759 } else {
760 offsetList = new VkDeviceSize[1]();
761 offsetCount = 1;
762 }
763
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600764 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount, &VulkanMemoryBuffer.handle(), offsetList);
Mark Muellerdfe37552016-07-07 14:47:42 -0600765 BoundCurrent = true;
766
767 if (!aOffsetCount) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600768 delete[] offsetList;
Mark Muellerdfe37552016-07-07 14:47:42 -0600769 }
770 }
771
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600772 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600773 static uint32_t BindIdGenerator;
774
775 bool BoundCurrent;
776 unsigned AttributeCount;
777 unsigned BindingCount;
778 uint32_t BindId;
779
780 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
781 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
782 VkVertexInputBindingDescription *VertexInputBindingDescription;
783 VkConstantBufferObj VulkanMemoryBuffer;
784};
785
786uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500787// ********************************************************************************************************************
788// ********************************************************************************************************************
789// ********************************************************************************************************************
790// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600791#if PARAMETER_VALIDATION_TESTS
792TEST_F(VkLayerTest, RequiredParameter) {
793 TEST_DESCRIPTION("Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
794 "pointer, array, and array count parameters");
795
796 ASSERT_NO_FATAL_FAILURE(InitState());
797
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600798 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600799 // Specify NULL for a pointer to a handle
800 // Expected to trigger an error with
801 // parameter_validation::validate_required_pointer
802 vkGetPhysicalDeviceFeatures(gpu(), NULL);
803 m_errorMonitor->VerifyFound();
804
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
806 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600807 // Specify NULL for pointer to array count
808 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600809 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600810 m_errorMonitor->VerifyFound();
811
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600812 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter viewportCount must be greater than 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600813 // Specify 0 for a required array count
814 // Expected to trigger an error with parameter_validation::validate_array
815 VkViewport view_port = {};
816 m_commandBuffer->SetViewport(0, 0, &view_port);
817 m_errorMonitor->VerifyFound();
818
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pViewports specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600820 // Specify NULL for a required array
821 // Expected to trigger an error with parameter_validation::validate_array
822 m_commandBuffer->SetViewport(0, 1, NULL);
823 m_errorMonitor->VerifyFound();
824
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600826 // Specify VK_NULL_HANDLE for a required handle
827 // Expected to trigger an error with
828 // parameter_validation::validate_required_handle
829 vkUnmapMemory(device(), VK_NULL_HANDLE);
830 m_errorMonitor->VerifyFound();
831
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600832 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
833 "required parameter pFences[0] specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600834 // Specify VK_NULL_HANDLE for a required handle array entry
835 // Expected to trigger an error with
836 // parameter_validation::validate_required_handle_array
837 VkFence fence = VK_NULL_HANDLE;
838 vkResetFences(device(), 1, &fence);
839 m_errorMonitor->VerifyFound();
840
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600841 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600842 // Specify NULL for a required struct pointer
843 // Expected to trigger an error with
844 // parameter_validation::validate_struct_type
845 VkDeviceMemory memory = VK_NULL_HANDLE;
846 vkAllocateMemory(device(), NULL, NULL, &memory);
847 m_errorMonitor->VerifyFound();
848
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600849 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600850 // Specify 0 for a required VkFlags parameter
851 // Expected to trigger an error with parameter_validation::validate_flags
852 m_commandBuffer->SetStencilReference(0, 0);
853 m_errorMonitor->VerifyFound();
854
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600855 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 -0600856 // Specify 0 for a required VkFlags array entry
857 // Expected to trigger an error with
858 // parameter_validation::validate_flags_array
859 VkSemaphore semaphore = VK_NULL_HANDLE;
860 VkPipelineStageFlags stageFlags = 0;
861 VkSubmitInfo submitInfo = {};
862 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
863 submitInfo.waitSemaphoreCount = 1;
864 submitInfo.pWaitSemaphores = &semaphore;
865 submitInfo.pWaitDstStageMask = &stageFlags;
866 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
867 m_errorMonitor->VerifyFound();
868}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600869
Dustin Gravesfce74c02016-05-10 11:42:58 -0600870TEST_F(VkLayerTest, ReservedParameter) {
871 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
872
873 ASSERT_NO_FATAL_FAILURE(InitState());
874
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600875 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
Dustin Gravesfce74c02016-05-10 11:42:58 -0600876 // Specify 0 for a reserved VkFlags parameter
877 // Expected to trigger an error with
878 // parameter_validation::validate_reserved_flags
879 VkEvent event_handle = VK_NULL_HANDLE;
880 VkEventCreateInfo event_info = {};
881 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
882 event_info.flags = 1;
883 vkCreateEvent(device(), &event_info, NULL, &event_handle);
884 m_errorMonitor->VerifyFound();
885}
886
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600887TEST_F(VkLayerTest, InvalidStructSType) {
888 TEST_DESCRIPTION("Specify an invalid VkStructureType for a Vulkan "
889 "structure's sType field");
890
891 ASSERT_NO_FATAL_FAILURE(InitState());
892
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600893 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600894 // Zero struct memory, effectively setting sType to
895 // VK_STRUCTURE_TYPE_APPLICATION_INFO
896 // Expected to trigger an error with
897 // parameter_validation::validate_struct_type
898 VkMemoryAllocateInfo alloc_info = {};
899 VkDeviceMemory memory = VK_NULL_HANDLE;
900 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
901 m_errorMonitor->VerifyFound();
902
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600904 // Zero struct memory, effectively setting sType to
905 // VK_STRUCTURE_TYPE_APPLICATION_INFO
906 // Expected to trigger an error with
907 // parameter_validation::validate_struct_type_array
908 VkSubmitInfo submit_info = {};
909 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
910 m_errorMonitor->VerifyFound();
911}
912
913TEST_F(VkLayerTest, InvalidStructPNext) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600914 TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600915
916 ASSERT_NO_FATAL_FAILURE(InitState());
917
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600918 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600919 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be
Karl Schultz38b50992016-07-11 16:09:09 -0600920 // NULL.
921 // Need to pick a function that has no allowed pNext structure types.
922 // Expected to trigger an error with
923 // parameter_validation::validate_struct_pnext
924 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600925 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600926 // Zero-initialization will provide the correct sType
927 VkApplicationInfo app_info = {};
928 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
929 event_alloc_info.pNext = &app_info;
930 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
931 m_errorMonitor->VerifyFound();
932
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600933 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
934 " chain includes a structure with unexpected VkStructureType ");
Karl Schultz38b50992016-07-11 16:09:09 -0600935 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
936 // a function that has allowed pNext structure types and specify
937 // a structure type that is not allowed.
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600938 // Expected to trigger an error with
939 // parameter_validation::validate_struct_pnext
940 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -0600941 VkMemoryAllocateInfo memory_alloc_info = {};
942 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
943 memory_alloc_info.pNext = &app_info;
944 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600945 m_errorMonitor->VerifyFound();
946
Dustin Gravesfd1c8fe2016-07-15 11:40:20 -0600947 // Positive test to check parameter_validation and unique_objects support
948 // for NV_dedicated_allocation
949 uint32_t extension_count = 0;
950 bool supports_nv_dedicated_allocation = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600951 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
Dustin Gravesfd1c8fe2016-07-15 11:40:20 -0600952 ASSERT_VK_SUCCESS(err);
953
954 if (extension_count > 0) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600955 std::vector<VkExtensionProperties> available_extensions(extension_count);
Dustin Gravesfd1c8fe2016-07-15 11:40:20 -0600956
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600957 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
Dustin Gravesfd1c8fe2016-07-15 11:40:20 -0600958 ASSERT_VK_SUCCESS(err);
959
960 for (const auto &extension_props : available_extensions) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600961 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
Dustin Gravesfd1c8fe2016-07-15 11:40:20 -0600962 supports_nv_dedicated_allocation = true;
963 }
964 }
965 }
966
967 if (supports_nv_dedicated_allocation) {
968 m_errorMonitor->ExpectSuccess();
969
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600970 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
971 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
Dustin Gravesfd1c8fe2016-07-15 11:40:20 -0600972 dedicated_buffer_create_info.pNext = nullptr;
973 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
974
975 uint32_t queue_family_index = 0;
976 VkBufferCreateInfo buffer_create_info = {};
977 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
978 buffer_create_info.pNext = &dedicated_buffer_create_info;
979 buffer_create_info.size = 1024;
980 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
981 buffer_create_info.queueFamilyIndexCount = 1;
982 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
983
984 VkBuffer buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600985 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Dustin Gravesfd1c8fe2016-07-15 11:40:20 -0600986 ASSERT_VK_SUCCESS(err);
987
988 VkMemoryRequirements memory_reqs;
989 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
990
991 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600992 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
Dustin Gravesfd1c8fe2016-07-15 11:40:20 -0600993 dedicated_memory_info.pNext = nullptr;
994 dedicated_memory_info.buffer = buffer;
995 dedicated_memory_info.image = VK_NULL_HANDLE;
996
997 VkMemoryAllocateInfo memory_info = {};
998 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
999 memory_info.pNext = &dedicated_memory_info;
1000 memory_info.allocationSize = memory_reqs.size;
1001
1002 bool pass;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001003 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Dustin Gravesfd1c8fe2016-07-15 11:40:20 -06001004 ASSERT_TRUE(pass);
1005
1006 VkDeviceMemory buffer_memory;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001007 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
Dustin Gravesfd1c8fe2016-07-15 11:40:20 -06001008 ASSERT_VK_SUCCESS(err);
1009
1010 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1011 ASSERT_VK_SUCCESS(err);
1012
1013 vkDestroyBuffer(m_device->device(), buffer, NULL);
1014 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1015
1016 m_errorMonitor->VerifyNotFound();
1017 }
Dustin Gravesc99cf5a2016-05-09 14:40:29 -06001018}
Dustin Graves5d33d532016-05-09 16:21:12 -06001019
1020TEST_F(VkLayerTest, UnrecognizedValue) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001021 TEST_DESCRIPTION("Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
Dustin Graves5d33d532016-05-09 16:21:12 -06001022
1023 ASSERT_NO_FATAL_FAILURE(InitState());
1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001025 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not fall within the begin..end "
1026 "range of the core VkFormat "
1027 "enumeration tokens");
Dustin Graves5d33d532016-05-09 16:21:12 -06001028 // Specify an invalid VkFormat value
1029 // Expected to trigger an error with
1030 // parameter_validation::validate_ranged_enum
1031 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001032 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001033 m_errorMonitor->VerifyFound();
1034
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001035 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 -06001036 // Specify an invalid VkFlags bitmask value
1037 // Expected to trigger an error with parameter_validation::validate_flags
1038 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001039 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1040 static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001041 m_errorMonitor->VerifyFound();
1042
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001043 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 -06001044 // Specify an invalid VkFlags array entry
1045 // Expected to trigger an error with
1046 // parameter_validation::validate_flags_array
1047 VkSemaphore semaphore = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001048 VkPipelineStageFlags stage_flags = static_cast<VkPipelineStageFlags>(1 << 25);
Dustin Graves5d33d532016-05-09 16:21:12 -06001049 VkSubmitInfo submit_info = {};
1050 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1051 submit_info.waitSemaphoreCount = 1;
1052 submit_info.pWaitSemaphores = &semaphore;
1053 submit_info.pWaitDstStageMask = &stage_flags;
1054 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1055 m_errorMonitor->VerifyFound();
1056
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001057 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
Dustin Graves5d33d532016-05-09 16:21:12 -06001058 // Specify an invalid VkBool32 value
1059 // Expected to trigger a warning with
1060 // parameter_validation::validate_bool32
1061 VkSampler sampler = VK_NULL_HANDLE;
1062 VkSamplerCreateInfo sampler_info = {};
1063 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1064 sampler_info.pNext = NULL;
1065 sampler_info.magFilter = VK_FILTER_NEAREST;
1066 sampler_info.minFilter = VK_FILTER_NEAREST;
1067 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1068 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1069 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1070 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1071 sampler_info.mipLodBias = 1.0;
1072 sampler_info.maxAnisotropy = 1;
1073 sampler_info.compareEnable = VK_FALSE;
1074 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1075 sampler_info.minLod = 1.0;
1076 sampler_info.maxLod = 1.0;
1077 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1078 sampler_info.unnormalizedCoordinates = VK_FALSE;
1079 // Not VK_TRUE or VK_FALSE
1080 sampler_info.anisotropyEnable = 3;
1081 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1082 m_errorMonitor->VerifyFound();
1083}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001084
1085TEST_F(VkLayerTest, FailedReturnValue) {
1086 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1087
1088 ASSERT_NO_FATAL_FAILURE(InitState());
1089
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001090 // Find an unsupported image format
1091 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1092 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1093 VkFormat format = static_cast<VkFormat>(f);
1094 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001095 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001096 unsupported = format;
1097 break;
1098 }
1099 }
1100
1101 if (unsupported != VK_FORMAT_UNDEFINED) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001102 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1103 "the requested format is not supported on this device");
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001104 // Specify an unsupported VkFormat value to generate a
1105 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1106 // Expected to trigger a warning from
1107 // parameter_validation::validate_result
1108 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001109 VkResult err = vkGetPhysicalDeviceImageFormatProperties(gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1110 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001111 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1112 m_errorMonitor->VerifyFound();
1113 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001114}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001115
1116TEST_F(VkLayerTest, UpdateBufferAlignment) {
1117 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001118 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001119
1120 ASSERT_NO_FATAL_FAILURE(InitState());
1121
1122 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1123 vk_testing::Buffer buffer;
1124 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1125
1126 BeginCommandBuffer();
1127 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001128 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001129 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1130 m_errorMonitor->VerifyFound();
1131
1132 // Introduce failure by using dataSize that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001133 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001134 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1135 m_errorMonitor->VerifyFound();
1136
1137 // Introduce failure by using dataSize that is < 0
1138 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001139 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001140 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1141 m_errorMonitor->VerifyFound();
1142
1143 // Introduce failure by using dataSize that is > 65536
1144 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001145 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001146 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1147 m_errorMonitor->VerifyFound();
1148
1149 EndCommandBuffer();
1150}
1151
1152TEST_F(VkLayerTest, FillBufferAlignment) {
1153 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1154
1155 ASSERT_NO_FATAL_FAILURE(InitState());
1156
1157 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1158 vk_testing::Buffer buffer;
1159 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1160
1161 BeginCommandBuffer();
1162
1163 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001164 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001165 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1166 m_errorMonitor->VerifyFound();
1167
1168 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001169 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001170 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1171 m_errorMonitor->VerifyFound();
1172
1173 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001174 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001175 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1176 m_errorMonitor->VerifyFound();
1177
1178 EndCommandBuffer();
1179}
Dustin Graves40f35822016-06-23 11:12:53 -06001180
1181// This is a positive test. No failures are expected.
1182TEST_F(VkLayerTest, IgnoreUnrelatedDescriptor) {
Tobin Ehlis1c0ea5f2016-10-17 13:54:32 -06001183 TEST_DESCRIPTION("Ensure that the vkUpdateDescriptorSets validation code "
Dustin Graves40f35822016-06-23 11:12:53 -06001184 "is ignoring VkWriteDescriptorSet members that are not "
1185 "related to the descriptor type specified by "
1186 "VkWriteDescriptorSet::descriptorType. Correct "
1187 "validation behavior will result in the test running to "
1188 "completion without validation errors.");
1189
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001190 const uintptr_t invalid_ptr = 0xcdcdcdcd;
1191
Dustin Graves40f35822016-06-23 11:12:53 -06001192 ASSERT_NO_FATAL_FAILURE(InitState());
1193
1194 // Image Case
1195 {
1196 m_errorMonitor->ExpectSuccess();
1197
1198 VkImage image;
1199 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1200 const int32_t tex_width = 32;
1201 const int32_t tex_height = 32;
1202 VkImageCreateInfo image_create_info = {};
1203 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1204 image_create_info.pNext = NULL;
1205 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1206 image_create_info.format = tex_format;
1207 image_create_info.extent.width = tex_width;
1208 image_create_info.extent.height = tex_height;
1209 image_create_info.extent.depth = 1;
1210 image_create_info.mipLevels = 1;
1211 image_create_info.arrayLayers = 1;
1212 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis51cde412016-07-11 16:08:30 -06001213 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Dustin Graves40f35822016-06-23 11:12:53 -06001214 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1215 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001216 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Dustin Graves40f35822016-06-23 11:12:53 -06001217 ASSERT_VK_SUCCESS(err);
1218
1219 VkMemoryRequirements memory_reqs;
1220 VkDeviceMemory image_memory;
1221 bool pass;
1222 VkMemoryAllocateInfo memory_info = {};
1223 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1224 memory_info.pNext = NULL;
1225 memory_info.allocationSize = 0;
1226 memory_info.memoryTypeIndex = 0;
1227 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
1228 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001229 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Dustin Graves40f35822016-06-23 11:12:53 -06001230 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001231 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Dustin Graves40f35822016-06-23 11:12:53 -06001232 ASSERT_VK_SUCCESS(err);
1233 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
1234 ASSERT_VK_SUCCESS(err);
1235
1236 VkImageViewCreateInfo image_view_create_info = {};
1237 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
1238 image_view_create_info.image = image;
1239 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
1240 image_view_create_info.format = tex_format;
1241 image_view_create_info.subresourceRange.layerCount = 1;
1242 image_view_create_info.subresourceRange.baseMipLevel = 0;
1243 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001244 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Dustin Graves40f35822016-06-23 11:12:53 -06001245
1246 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001247 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Dustin Graves40f35822016-06-23 11:12:53 -06001248 ASSERT_VK_SUCCESS(err);
1249
1250 VkDescriptorPoolSize ds_type_count = {};
1251 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1252 ds_type_count.descriptorCount = 1;
1253
1254 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1255 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1256 ds_pool_ci.pNext = NULL;
1257 ds_pool_ci.maxSets = 1;
1258 ds_pool_ci.poolSizeCount = 1;
1259 ds_pool_ci.pPoolSizes = &ds_type_count;
1260
1261 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001262 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Dustin Graves40f35822016-06-23 11:12:53 -06001263 ASSERT_VK_SUCCESS(err);
1264
1265 VkDescriptorSetLayoutBinding dsl_binding = {};
1266 dsl_binding.binding = 0;
1267 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1268 dsl_binding.descriptorCount = 1;
1269 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1270 dsl_binding.pImmutableSamplers = NULL;
1271
1272 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001273 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Dustin Graves40f35822016-06-23 11:12:53 -06001274 ds_layout_ci.pNext = NULL;
1275 ds_layout_ci.bindingCount = 1;
1276 ds_layout_ci.pBindings = &dsl_binding;
1277 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001278 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Dustin Graves40f35822016-06-23 11:12:53 -06001279 ASSERT_VK_SUCCESS(err);
1280
1281 VkDescriptorSet descriptor_set;
1282 VkDescriptorSetAllocateInfo alloc_info = {};
1283 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1284 alloc_info.descriptorSetCount = 1;
1285 alloc_info.descriptorPool = ds_pool;
1286 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001287 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Dustin Graves40f35822016-06-23 11:12:53 -06001288 ASSERT_VK_SUCCESS(err);
1289
1290 VkDescriptorImageInfo image_info = {};
1291 image_info.imageView = view;
1292 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
1293
1294 VkWriteDescriptorSet descriptor_write;
1295 memset(&descriptor_write, 0, sizeof(descriptor_write));
1296 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1297 descriptor_write.dstSet = descriptor_set;
1298 descriptor_write.dstBinding = 0;
1299 descriptor_write.descriptorCount = 1;
1300 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1301 descriptor_write.pImageInfo = &image_info;
1302
1303 // Set pBufferInfo and pTexelBufferView to invalid values, which should
1304 // be
1305 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
1306 // This will most likely produce a crash if the parameter_validation
1307 // layer
1308 // does not correctly ignore pBufferInfo.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001309 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
1310 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001311
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001312 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Dustin Graves40f35822016-06-23 11:12:53 -06001313
1314 m_errorMonitor->VerifyNotFound();
1315
Dustin Graves40f35822016-06-23 11:12:53 -06001316 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1317 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1318 vkDestroyImageView(m_device->device(), view, NULL);
1319 vkDestroyImage(m_device->device(), image, NULL);
1320 vkFreeMemory(m_device->device(), image_memory, NULL);
1321 }
1322
1323 // Buffer Case
1324 {
1325 m_errorMonitor->ExpectSuccess();
1326
1327 VkBuffer buffer;
1328 uint32_t queue_family_index = 0;
1329 VkBufferCreateInfo buffer_create_info = {};
1330 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1331 buffer_create_info.size = 1024;
1332 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1333 buffer_create_info.queueFamilyIndexCount = 1;
1334 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1335
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001336 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Dustin Graves40f35822016-06-23 11:12:53 -06001337 ASSERT_VK_SUCCESS(err);
1338
1339 VkMemoryRequirements memory_reqs;
1340 VkDeviceMemory buffer_memory;
1341 bool pass;
1342 VkMemoryAllocateInfo memory_info = {};
1343 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1344 memory_info.pNext = NULL;
1345 memory_info.allocationSize = 0;
1346 memory_info.memoryTypeIndex = 0;
1347
1348 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1349 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001350 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Dustin Graves40f35822016-06-23 11:12:53 -06001351 ASSERT_TRUE(pass);
1352
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001353 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
Dustin Graves40f35822016-06-23 11:12:53 -06001354 ASSERT_VK_SUCCESS(err);
1355 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1356 ASSERT_VK_SUCCESS(err);
1357
1358 VkDescriptorPoolSize ds_type_count = {};
1359 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1360 ds_type_count.descriptorCount = 1;
1361
1362 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1363 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1364 ds_pool_ci.pNext = NULL;
1365 ds_pool_ci.maxSets = 1;
1366 ds_pool_ci.poolSizeCount = 1;
1367 ds_pool_ci.pPoolSizes = &ds_type_count;
1368
1369 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001370 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Dustin Graves40f35822016-06-23 11:12:53 -06001371 ASSERT_VK_SUCCESS(err);
1372
1373 VkDescriptorSetLayoutBinding dsl_binding = {};
1374 dsl_binding.binding = 0;
1375 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1376 dsl_binding.descriptorCount = 1;
1377 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1378 dsl_binding.pImmutableSamplers = NULL;
1379
1380 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001381 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Dustin Graves40f35822016-06-23 11:12:53 -06001382 ds_layout_ci.pNext = NULL;
1383 ds_layout_ci.bindingCount = 1;
1384 ds_layout_ci.pBindings = &dsl_binding;
1385 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001386 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Dustin Graves40f35822016-06-23 11:12:53 -06001387 ASSERT_VK_SUCCESS(err);
1388
1389 VkDescriptorSet descriptor_set;
1390 VkDescriptorSetAllocateInfo alloc_info = {};
1391 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1392 alloc_info.descriptorSetCount = 1;
1393 alloc_info.descriptorPool = ds_pool;
1394 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001395 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Dustin Graves40f35822016-06-23 11:12:53 -06001396 ASSERT_VK_SUCCESS(err);
1397
1398 VkDescriptorBufferInfo buffer_info = {};
1399 buffer_info.buffer = buffer;
1400 buffer_info.offset = 0;
1401 buffer_info.range = 1024;
1402
1403 VkWriteDescriptorSet descriptor_write;
1404 memset(&descriptor_write, 0, sizeof(descriptor_write));
1405 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1406 descriptor_write.dstSet = descriptor_set;
1407 descriptor_write.dstBinding = 0;
1408 descriptor_write.descriptorCount = 1;
1409 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1410 descriptor_write.pBufferInfo = &buffer_info;
1411
1412 // Set pImageInfo and pTexelBufferView to invalid values, which should
1413 // be
1414 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
1415 // This will most likely produce a crash if the parameter_validation
1416 // layer
1417 // does not correctly ignore pImageInfo.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001418 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
1419 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001420
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001421 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Dustin Graves40f35822016-06-23 11:12:53 -06001422
1423 m_errorMonitor->VerifyNotFound();
1424
1425 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
1426 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1427 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1428 vkDestroyBuffer(m_device->device(), buffer, NULL);
1429 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1430 }
1431
1432 // Texel Buffer Case
1433 {
1434 m_errorMonitor->ExpectSuccess();
1435
1436 VkBuffer buffer;
1437 uint32_t queue_family_index = 0;
1438 VkBufferCreateInfo buffer_create_info = {};
1439 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1440 buffer_create_info.size = 1024;
1441 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
1442 buffer_create_info.queueFamilyIndexCount = 1;
1443 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1444
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001445 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Dustin Graves40f35822016-06-23 11:12:53 -06001446 ASSERT_VK_SUCCESS(err);
1447
1448 VkMemoryRequirements memory_reqs;
1449 VkDeviceMemory buffer_memory;
1450 bool pass;
1451 VkMemoryAllocateInfo memory_info = {};
1452 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1453 memory_info.pNext = NULL;
1454 memory_info.allocationSize = 0;
1455 memory_info.memoryTypeIndex = 0;
1456
1457 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1458 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001459 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Dustin Graves40f35822016-06-23 11:12:53 -06001460 ASSERT_TRUE(pass);
1461
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001462 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
Dustin Graves40f35822016-06-23 11:12:53 -06001463 ASSERT_VK_SUCCESS(err);
1464 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1465 ASSERT_VK_SUCCESS(err);
1466
1467 VkBufferViewCreateInfo buff_view_ci = {};
1468 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
1469 buff_view_ci.buffer = buffer;
1470 buff_view_ci.format = VK_FORMAT_R8_UNORM;
1471 buff_view_ci.range = VK_WHOLE_SIZE;
1472 VkBufferView buffer_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001473 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
Dustin Graves40f35822016-06-23 11:12:53 -06001474
1475 VkDescriptorPoolSize ds_type_count = {};
1476 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1477 ds_type_count.descriptorCount = 1;
1478
1479 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1480 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1481 ds_pool_ci.pNext = NULL;
1482 ds_pool_ci.maxSets = 1;
1483 ds_pool_ci.poolSizeCount = 1;
1484 ds_pool_ci.pPoolSizes = &ds_type_count;
1485
1486 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001487 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Dustin Graves40f35822016-06-23 11:12:53 -06001488 ASSERT_VK_SUCCESS(err);
1489
1490 VkDescriptorSetLayoutBinding dsl_binding = {};
1491 dsl_binding.binding = 0;
1492 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1493 dsl_binding.descriptorCount = 1;
1494 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1495 dsl_binding.pImmutableSamplers = NULL;
1496
1497 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001498 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Dustin Graves40f35822016-06-23 11:12:53 -06001499 ds_layout_ci.pNext = NULL;
1500 ds_layout_ci.bindingCount = 1;
1501 ds_layout_ci.pBindings = &dsl_binding;
1502 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001503 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Dustin Graves40f35822016-06-23 11:12:53 -06001504 ASSERT_VK_SUCCESS(err);
1505
1506 VkDescriptorSet descriptor_set;
1507 VkDescriptorSetAllocateInfo alloc_info = {};
1508 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1509 alloc_info.descriptorSetCount = 1;
1510 alloc_info.descriptorPool = ds_pool;
1511 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001512 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Dustin Graves40f35822016-06-23 11:12:53 -06001513 ASSERT_VK_SUCCESS(err);
1514
1515 VkWriteDescriptorSet descriptor_write;
1516 memset(&descriptor_write, 0, sizeof(descriptor_write));
1517 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1518 descriptor_write.dstSet = descriptor_set;
1519 descriptor_write.dstBinding = 0;
1520 descriptor_write.descriptorCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001521 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Dustin Graves40f35822016-06-23 11:12:53 -06001522 descriptor_write.pTexelBufferView = &buffer_view;
1523
1524 // Set pImageInfo and pBufferInfo to invalid values, which should be
1525 // ignored for descriptorType ==
1526 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
1527 // This will most likely produce a crash if the parameter_validation
1528 // layer
1529 // does not correctly ignore pImageInfo and pBufferInfo.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001530 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
1531 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001532
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001533 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Dustin Graves40f35822016-06-23 11:12:53 -06001534
1535 m_errorMonitor->VerifyNotFound();
1536
1537 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
1538 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1539 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1540 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
1541 vkDestroyBuffer(m_device->device(), buffer, NULL);
1542 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1543 }
1544}
Cortd889ff92016-07-27 09:51:27 -07001545
Tobin Ehlis1c0ea5f2016-10-17 13:54:32 -06001546// This is a positive test. No failures are expected.
1547TEST_F(VkLayerTest, EmptyDescriptorUpdateTest) {
1548 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
1549 VkResult err;
1550
1551 ASSERT_NO_FATAL_FAILURE(InitState());
1552 m_errorMonitor->ExpectSuccess();
1553 VkDescriptorPoolSize ds_type_count = {};
1554 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1555 ds_type_count.descriptorCount = 2;
1556
1557 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1558 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1559 ds_pool_ci.pNext = NULL;
1560 ds_pool_ci.maxSets = 1;
1561 ds_pool_ci.poolSizeCount = 1;
1562 ds_pool_ci.pPoolSizes = &ds_type_count;
1563
1564 VkDescriptorPool ds_pool;
1565 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
1566 ASSERT_VK_SUCCESS(err);
1567
1568 // Create layout with two uniform buffer descriptors w/ empty binding between them
1569 static const uint32_t NUM_BINDINGS = 3;
1570 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
1571 dsl_binding[0].binding = 0;
1572 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1573 dsl_binding[0].descriptorCount = 1;
1574 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
1575 dsl_binding[0].pImmutableSamplers = NULL;
1576 dsl_binding[1].binding = 1;
1577 dsl_binding[1].descriptorCount = 0; // empty binding
1578 dsl_binding[2].binding = 2;
1579 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1580 dsl_binding[2].descriptorCount = 1;
1581 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
1582 dsl_binding[2].pImmutableSamplers = NULL;
1583
1584 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1585 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1586 ds_layout_ci.pNext = NULL;
1587 ds_layout_ci.bindingCount = NUM_BINDINGS;
1588 ds_layout_ci.pBindings = dsl_binding;
1589 VkDescriptorSetLayout ds_layout;
1590 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
1591 ASSERT_VK_SUCCESS(err);
1592
1593 VkDescriptorSet descriptor_set = {};
1594 VkDescriptorSetAllocateInfo alloc_info = {};
1595 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1596 alloc_info.descriptorSetCount = 1;
1597 alloc_info.descriptorPool = ds_pool;
1598 alloc_info.pSetLayouts = &ds_layout;
1599 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
1600 ASSERT_VK_SUCCESS(err);
1601
1602 // Create a buffer to be used for update
1603 VkBufferCreateInfo buff_ci = {};
1604 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1605 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1606 buff_ci.size = 256;
1607 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1608 VkBuffer buffer;
1609 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
1610 ASSERT_VK_SUCCESS(err);
1611 // Have to bind memory to buffer before descriptor update
1612 VkMemoryAllocateInfo mem_alloc = {};
1613 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1614 mem_alloc.pNext = NULL;
1615 mem_alloc.allocationSize = 512; // one allocation for both buffers
1616 mem_alloc.memoryTypeIndex = 0;
1617
1618 VkMemoryRequirements mem_reqs;
1619 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1620 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
1621 if (!pass) {
1622 vkDestroyBuffer(m_device->device(), buffer, NULL);
1623 return;
1624 }
1625
1626 VkDeviceMemory mem;
1627 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
1628 ASSERT_VK_SUCCESS(err);
1629 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1630 ASSERT_VK_SUCCESS(err);
1631
1632 // Only update the descriptor at binding 2
1633 VkDescriptorBufferInfo buff_info = {};
1634 buff_info.buffer = buffer;
1635 buff_info.offset = 0;
1636 buff_info.range = VK_WHOLE_SIZE;
1637 VkWriteDescriptorSet descriptor_write = {};
1638 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1639 descriptor_write.dstBinding = 2;
1640 descriptor_write.descriptorCount = 1;
1641 descriptor_write.pTexelBufferView = nullptr;
1642 descriptor_write.pBufferInfo = &buff_info;
1643 descriptor_write.pImageInfo = nullptr;
1644 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1645 descriptor_write.dstSet = descriptor_set;
1646
1647 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
1648
1649 m_errorMonitor->VerifyNotFound();
1650 // Cleanup
1651 vkFreeMemory(m_device->device(), mem, NULL);
1652 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1653 vkDestroyBuffer(m_device->device(), buffer, NULL);
1654 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1655}
1656
Cortd889ff92016-07-27 09:51:27 -07001657TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1658 VkResult err;
1659
1660 TEST_DESCRIPTION("Attempt to use a non-solid polygon fill mode in a "
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001661 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001662
1663 ASSERT_NO_FATAL_FAILURE(InitState());
1664 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1665
1666 std::vector<const char *> device_extension_names;
1667 auto features = m_device->phy().features();
1668 // Artificially disable support for non-solid fill modes
1669 features.fillModeNonSolid = false;
1670 // The sacrificial device object
1671 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1672
1673 VkRenderpassObj render_pass(&test_device);
1674
1675 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1676 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1677 pipeline_layout_ci.setLayoutCount = 0;
1678 pipeline_layout_ci.pSetLayouts = NULL;
1679
1680 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001681 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001682 ASSERT_VK_SUCCESS(err);
1683
1684 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1685 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1686 rs_ci.pNext = nullptr;
1687 rs_ci.lineWidth = 1.0f;
1688 rs_ci.rasterizerDiscardEnable = true;
1689
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001690 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1691 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001692
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001693 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001694 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1695 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001696 {
1697 VkPipelineObj pipe(&test_device);
1698 pipe.AddShader(&vs);
1699 pipe.AddShader(&fs);
1700 pipe.AddColorAttachment();
1701 // Introduce failure by setting unsupported polygon mode
1702 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1703 pipe.SetRasterization(&rs_ci);
1704 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1705 }
1706 m_errorMonitor->VerifyFound();
1707
1708 // Try again with polygonMode=LINE, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001709 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1710 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001711 {
1712 VkPipelineObj pipe(&test_device);
1713 pipe.AddShader(&vs);
1714 pipe.AddShader(&fs);
1715 pipe.AddColorAttachment();
1716 // Introduce failure by setting unsupported polygon mode
1717 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1718 pipe.SetRasterization(&rs_ci);
1719 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1720 }
1721 m_errorMonitor->VerifyFound();
1722
1723 // Try again with polygonMode=FILL. No error is expected
1724 m_errorMonitor->ExpectSuccess();
1725 {
1726 VkPipelineObj pipe(&test_device);
1727 pipe.AddShader(&vs);
1728 pipe.AddShader(&fs);
1729 pipe.AddColorAttachment();
1730 // Set polygonMode to a good value
1731 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
1732 pipe.SetRasterization(&rs_ci);
1733 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1734 }
1735 m_errorMonitor->VerifyNotFound();
1736
1737 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1738}
1739
Dustin Gravesffa90fa2016-05-06 11:20:38 -06001740#endif // PARAMETER_VALIDATION_TESTS
1741
Tobin Ehlis0788f522015-05-26 16:11:58 -06001742#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001743#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001744TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001745{
1746 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001747 VkFenceCreateInfo fenceInfo = {};
1748 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1749 fenceInfo.pNext = NULL;
1750 fenceInfo.flags = 0;
1751
Mike Weiblencce7ec72016-10-17 19:33:05 -06001752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001753
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001754 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001755
1756 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1757 vk_testing::Buffer buffer;
1758 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001759
Tony Barbourfe3351b2015-07-28 10:17:20 -06001760 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001761 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001762 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001763
1764 testFence.init(*m_device, fenceInfo);
1765
1766 // Bypass framework since it does the waits automatically
1767 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001768 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001769 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1770 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001771 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001772 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001773 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001774 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001775 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001776 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001777 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001778
1779 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001780 ASSERT_VK_SUCCESS( err );
1781
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001782 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001783 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001784
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001785 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001786}
1787
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001788TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001789{
1790 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001791 VkFenceCreateInfo fenceInfo = {};
1792 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1793 fenceInfo.pNext = NULL;
1794 fenceInfo.flags = 0;
1795
Mike Weiblencce7ec72016-10-17 19:33:05 -06001796 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001797
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001798 ASSERT_NO_FATAL_FAILURE(InitState());
1799 ASSERT_NO_FATAL_FAILURE(InitViewport());
1800 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1801
Tony Barbourfe3351b2015-07-28 10:17:20 -06001802 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001803 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001804 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001805
1806 testFence.init(*m_device, fenceInfo);
1807
1808 // Bypass framework since it does the waits automatically
1809 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001810 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001811 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1812 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001813 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001814 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001815 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001816 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001817 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001818 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001819 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001820
1821 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001822 ASSERT_VK_SUCCESS( err );
1823
Jon Ashburnf19916e2016-01-11 13:12:43 -07001824 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001825 VkCommandBufferBeginInfo info = {};
1826 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1827 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001828 info.renderPass = VK_NULL_HANDLE;
1829 info.subpass = 0;
1830 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001831 info.occlusionQueryEnable = VK_FALSE;
1832 info.queryFlags = 0;
1833 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001834
1835 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001836 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001837
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001838 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001839}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001840#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001841
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001842// This is a positive test. No failures are expected.
1843TEST_F(VkLayerTest, TestAliasedMemoryTracking) {
1844 VkResult err;
1845 bool pass;
1846
1847 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
1848 "the buffer, create an image, and bind the same memory to "
1849 "it");
1850
1851 m_errorMonitor->ExpectSuccess();
1852
1853 ASSERT_NO_FATAL_FAILURE(InitState());
1854
1855 VkBuffer buffer;
1856 VkImage image;
1857 VkDeviceMemory mem;
1858 VkMemoryRequirements mem_reqs;
1859
1860 VkBufferCreateInfo buf_info = {};
1861 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1862 buf_info.pNext = NULL;
1863 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1864 buf_info.size = 256;
1865 buf_info.queueFamilyIndexCount = 0;
1866 buf_info.pQueueFamilyIndices = NULL;
1867 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1868 buf_info.flags = 0;
1869 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1870 ASSERT_VK_SUCCESS(err);
1871
1872 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1873
1874 VkMemoryAllocateInfo alloc_info = {};
1875 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1876 alloc_info.pNext = NULL;
1877 alloc_info.memoryTypeIndex = 0;
1878
1879 // Ensure memory is big enough for both bindings
1880 alloc_info.allocationSize = 0x10000;
1881
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001882 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001883 if (!pass) {
1884 vkDestroyBuffer(m_device->device(), buffer, NULL);
1885 return;
1886 }
1887
1888 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1889 ASSERT_VK_SUCCESS(err);
1890
1891 uint8_t *pData;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001892 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001893 ASSERT_VK_SUCCESS(err);
1894
Mark Lobodzinski2abefa92016-05-05 11:45:57 -06001895 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001896
1897 vkUnmapMemory(m_device->device(), mem);
1898
1899 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1900 ASSERT_VK_SUCCESS(err);
1901
1902 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
1903 // memory. In fact, it was never used by the GPU.
1904 // Just be be sure, wait for idle.
1905 vkDestroyBuffer(m_device->device(), buffer, NULL);
1906 vkDeviceWaitIdle(m_device->device());
1907
1908 VkImageCreateInfo image_create_info = {};
1909 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1910 image_create_info.pNext = NULL;
1911 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1912 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1913 image_create_info.extent.width = 64;
1914 image_create_info.extent.height = 64;
1915 image_create_info.extent.depth = 1;
1916 image_create_info.mipLevels = 1;
1917 image_create_info.arrayLayers = 1;
1918 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1919 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1920 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1921 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1922 image_create_info.queueFamilyIndexCount = 0;
1923 image_create_info.pQueueFamilyIndices = NULL;
1924 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1925 image_create_info.flags = 0;
1926
1927 VkMemoryAllocateInfo mem_alloc = {};
1928 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1929 mem_alloc.pNext = NULL;
1930 mem_alloc.allocationSize = 0;
1931 mem_alloc.memoryTypeIndex = 0;
1932
1933 /* Create a mappable image. It will be the texture if linear images are ok
1934 * to be textures or it will be the staging image if they are not.
1935 */
1936 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1937 ASSERT_VK_SUCCESS(err);
1938
1939 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
1940
1941 mem_alloc.allocationSize = mem_reqs.size;
1942
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001943 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001944 if (!pass) {
1945 vkDestroyImage(m_device->device(), image, NULL);
1946 return;
1947 }
1948
Tobin Ehlis077ded32016-05-12 17:39:13 -06001949 // VALIDATION FAILURE:
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001950 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1951 ASSERT_VK_SUCCESS(err);
1952
1953 m_errorMonitor->VerifyNotFound();
1954
Tony Barbourdf4c0042016-06-01 15:55:43 -06001955 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001956 vkDestroyBuffer(m_device->device(), buffer, NULL);
1957 vkDestroyImage(m_device->device(), image, NULL);
1958}
1959
Tobin Ehlisf11be982016-05-11 13:52:53 -06001960TEST_F(VkLayerTest, InvalidMemoryAliasing) {
1961 TEST_DESCRIPTION("Create a buffer and image, allocate memory, and bind the "
1962 "buffer and image to memory such that they will alias.");
1963 VkResult err;
1964 bool pass;
1965 ASSERT_NO_FATAL_FAILURE(InitState());
1966
Tobin Ehlis077ded32016-05-12 17:39:13 -06001967 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001968 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001969 VkImage image2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001970 VkDeviceMemory mem; // buffer will be bound first
1971 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001972 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001973
1974 VkBufferCreateInfo buf_info = {};
1975 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1976 buf_info.pNext = NULL;
1977 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1978 buf_info.size = 256;
1979 buf_info.queueFamilyIndexCount = 0;
1980 buf_info.pQueueFamilyIndices = NULL;
1981 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1982 buf_info.flags = 0;
1983 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1984 ASSERT_VK_SUCCESS(err);
1985
Tobin Ehlis077ded32016-05-12 17:39:13 -06001986 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001987
1988 VkImageCreateInfo image_create_info = {};
1989 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1990 image_create_info.pNext = NULL;
1991 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1992 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1993 image_create_info.extent.width = 64;
1994 image_create_info.extent.height = 64;
1995 image_create_info.extent.depth = 1;
1996 image_create_info.mipLevels = 1;
1997 image_create_info.arrayLayers = 1;
1998 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001999 // Image tiling must be optimal to trigger error when aliasing linear buffer
2000 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06002001 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
2002 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
2003 image_create_info.queueFamilyIndexCount = 0;
2004 image_create_info.pQueueFamilyIndices = NULL;
2005 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2006 image_create_info.flags = 0;
2007
Tobin Ehlisf11be982016-05-11 13:52:53 -06002008 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2009 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06002010 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
2011 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002012
Tobin Ehlis077ded32016-05-12 17:39:13 -06002013 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
2014
2015 VkMemoryAllocateInfo alloc_info = {};
2016 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2017 alloc_info.pNext = NULL;
2018 alloc_info.memoryTypeIndex = 0;
2019 // Ensure memory is big enough for both bindings
2020 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002021 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
2022 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002023 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06002024 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002025 vkDestroyImage(m_device->device(), image, NULL);
2026 return;
2027 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06002028 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
2029 ASSERT_VK_SUCCESS(err);
2030 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
2031 ASSERT_VK_SUCCESS(err);
2032
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002033 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06002034 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06002035 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2036 m_errorMonitor->VerifyFound();
2037
Tobin Ehlis6cd67182016-09-21 18:32:11 -06002038 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06002039 // aliasing buffer2
2040 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
2041 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002042 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
2043 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06002044 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002045 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002046 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is aliased with non-linear image 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06002047 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002048 m_errorMonitor->VerifyFound();
2049
2050 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06002051 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002052 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06002053 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002054 vkFreeMemory(m_device->device(), mem, NULL);
2055 vkFreeMemory(m_device->device(), mem_img, NULL);
2056}
2057
Tobin Ehlis35372522016-05-12 08:32:31 -06002058TEST_F(VkLayerTest, InvalidMemoryMapping) {
2059 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
2060 VkResult err;
2061 bool pass;
2062 ASSERT_NO_FATAL_FAILURE(InitState());
2063
2064 VkBuffer buffer;
2065 VkDeviceMemory mem;
2066 VkMemoryRequirements mem_reqs;
2067
2068 VkBufferCreateInfo buf_info = {};
2069 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2070 buf_info.pNext = NULL;
2071 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2072 buf_info.size = 256;
2073 buf_info.queueFamilyIndexCount = 0;
2074 buf_info.pQueueFamilyIndices = NULL;
2075 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2076 buf_info.flags = 0;
2077 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
2078 ASSERT_VK_SUCCESS(err);
2079
2080 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
2081 VkMemoryAllocateInfo alloc_info = {};
2082 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2083 alloc_info.pNext = NULL;
2084 alloc_info.memoryTypeIndex = 0;
2085
2086 // Ensure memory is big enough for both bindings
2087 static const VkDeviceSize allocation_size = 0x10000;
2088 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002089 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 -06002090 if (!pass) {
2091 vkDestroyBuffer(m_device->device(), buffer, NULL);
2092 return;
2093 }
2094 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
2095 ASSERT_VK_SUCCESS(err);
2096
2097 uint8_t *pData;
2098 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002099 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 -06002100 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
2101 m_errorMonitor->VerifyFound();
2102 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002103 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06002104 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002105 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2106 "VkMapMemory: Attempting to map memory on an already-mapped object ");
2107 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06002108 m_errorMonitor->VerifyFound();
2109
2110 // Unmap the memory to avoid re-map error
2111 vkUnmapMemory(m_device->device(), mem);
2112 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2114 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
2115 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06002116 m_errorMonitor->VerifyFound();
2117 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
2119 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06002120 m_errorMonitor->VerifyFound();
2121 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002122 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06002123 vkUnmapMemory(m_device->device(), mem);
2124 m_errorMonitor->VerifyFound();
2125 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002126 err = vkMapMemory(m_device->device(), mem, 16, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06002127 ASSERT_VK_SUCCESS(err);
2128 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12002129 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06002130 mmr.memory = mem;
2131 mmr.offset = 15; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002132 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, ") is less than Memory Object's offset (");
Tobin Ehlis35372522016-05-12 08:32:31 -06002133 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2134 m_errorMonitor->VerifyFound();
2135 // Now flush range that oversteps mapped range
2136 vkUnmapMemory(m_device->device(), mem);
2137 err = vkMapMemory(m_device->device(), mem, 0, 256, 0, (void **)&pData);
2138 ASSERT_VK_SUCCESS(err);
2139 mmr.offset = 16;
2140 mmr.size = 256; // flushing bounds (272) exceed mapped bounds (256)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002141 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, ") exceeds the Memory Object's upper-bound (");
Tobin Ehlis35372522016-05-12 08:32:31 -06002142 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2143 m_errorMonitor->VerifyFound();
2144
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002145 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
2146 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06002147 if (!pass) {
2148 vkFreeMemory(m_device->device(), mem, NULL);
2149 vkDestroyBuffer(m_device->device(), buffer, NULL);
2150 return;
2151 }
2152 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
2153 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
2154
2155 vkDestroyBuffer(m_device->device(), buffer, NULL);
2156 vkFreeMemory(m_device->device(), mem, NULL);
2157}
2158
Mark Lobodzinski1f515922016-08-16 10:03:30 -06002159TEST_F(VkLayerTest, NonCoherentMemoryMapping) {
2160
2161 TEST_DESCRIPTION("Ensure that validations handling of non-coherent memory "
2162 "mapping while using VK_WHOLE_SIZE does not cause access "
2163 "violations");
2164 VkResult err;
2165 uint8_t *pData;
2166 ASSERT_NO_FATAL_FAILURE(InitState());
2167
2168 VkDeviceMemory mem;
2169 VkMemoryRequirements mem_reqs;
2170 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
2171 VkMemoryAllocateInfo alloc_info = {};
2172 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2173 alloc_info.pNext = NULL;
2174 alloc_info.memoryTypeIndex = 0;
2175
2176 static const VkDeviceSize allocation_size = 0x1000;
2177 alloc_info.allocationSize = allocation_size;
2178
2179 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002180 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
2181 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski1f515922016-08-16 10:03:30 -06002182 if (!pass) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002183 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
2184 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
2185 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski1f515922016-08-16 10:03:30 -06002186 if (!pass) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002187 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
2188 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
2189 VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
2190 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski1f515922016-08-16 10:03:30 -06002191 if (!pass) {
2192 return;
2193 }
2194 }
2195 }
2196
2197 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
2198 ASSERT_VK_SUCCESS(err);
2199
2200 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire
2201 // mapped range
2202 m_errorMonitor->ExpectSuccess();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002203 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski1f515922016-08-16 10:03:30 -06002204 ASSERT_VK_SUCCESS(err);
2205 VkMappedMemoryRange mmr = {};
2206 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
2207 mmr.memory = mem;
2208 mmr.offset = 0;
2209 mmr.size = VK_WHOLE_SIZE;
2210 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2211 ASSERT_VK_SUCCESS(err);
2212 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
2213 ASSERT_VK_SUCCESS(err);
2214 m_errorMonitor->VerifyNotFound();
2215 vkUnmapMemory(m_device->device(), mem);
2216
2217 // Map/Flush/Invalidate using WHOLE_SIZE and a prime offset and entire
2218 // mapped range
2219 m_errorMonitor->ExpectSuccess();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002220 err = vkMapMemory(m_device->device(), mem, 13, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski1f515922016-08-16 10:03:30 -06002221 ASSERT_VK_SUCCESS(err);
2222 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
2223 mmr.memory = mem;
2224 mmr.offset = 13;
2225 mmr.size = VK_WHOLE_SIZE;
2226 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2227 ASSERT_VK_SUCCESS(err);
2228 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
2229 ASSERT_VK_SUCCESS(err);
2230 m_errorMonitor->VerifyNotFound();
2231 vkUnmapMemory(m_device->device(), mem);
2232
2233 // Map with prime offset and size
2234 // Flush/Invalidate subrange of mapped area with prime offset and size
2235 m_errorMonitor->ExpectSuccess();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002236 err = vkMapMemory(m_device->device(), mem, allocation_size - 137, 109, 0, (void **)&pData);
Mark Lobodzinski1f515922016-08-16 10:03:30 -06002237 ASSERT_VK_SUCCESS(err);
2238 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
2239 mmr.memory = mem;
2240 mmr.offset = allocation_size - 107;
2241 mmr.size = 61;
2242 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2243 ASSERT_VK_SUCCESS(err);
2244 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
2245 ASSERT_VK_SUCCESS(err);
2246 m_errorMonitor->VerifyNotFound();
2247 vkUnmapMemory(m_device->device(), mem);
2248
Tobin Ehlisec19d472016-10-05 15:07:24 -06002249 // Map without offset and flush WHOLE_SIZE with two separate offsets
2250 m_errorMonitor->ExpectSuccess();
2251 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
2252 ASSERT_VK_SUCCESS(err);
2253 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
2254 mmr.memory = mem;
2255 mmr.offset = allocation_size - 100;
2256 mmr.size = VK_WHOLE_SIZE;
2257 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2258 ASSERT_VK_SUCCESS(err);
2259 mmr.offset = allocation_size - 200;
2260 mmr.size = VK_WHOLE_SIZE;
2261 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2262 ASSERT_VK_SUCCESS(err);
2263 m_errorMonitor->VerifyNotFound();
2264 vkUnmapMemory(m_device->device(), mem);
2265
Mark Lobodzinski1f515922016-08-16 10:03:30 -06002266 vkFreeMemory(m_device->device(), mem, NULL);
2267}
2268
Ian Elliott1c32c772016-04-28 14:47:13 -06002269TEST_F(VkLayerTest, EnableWsiBeforeUse) {
2270 VkResult err;
2271 bool pass;
2272
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002273 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
2274 // following declaration (which is temporarily being moved below):
2275 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002276 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2277 VkSwapchainCreateInfoKHR swapchain_create_info = {};
2278 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002279 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06002280 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002281 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06002282
2283 ASSERT_NO_FATAL_FAILURE(InitState());
2284
Ian Elliott3f06ce52016-04-29 14:46:21 -06002285#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
2286#if defined(VK_USE_PLATFORM_ANDROID_KHR)
2287 // Use the functions from the VK_KHR_android_surface extension without
2288 // enabling that extension:
2289
2290 // Create a surface:
2291 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002292 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
2293 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06002294 pass = (err != VK_SUCCESS);
2295 ASSERT_TRUE(pass);
2296 m_errorMonitor->VerifyFound();
2297#endif // VK_USE_PLATFORM_ANDROID_KHR
2298
Ian Elliott3f06ce52016-04-29 14:46:21 -06002299#if defined(VK_USE_PLATFORM_MIR_KHR)
2300 // Use the functions from the VK_KHR_mir_surface extension without enabling
2301 // that extension:
2302
2303 // Create a surface:
2304 VkMirSurfaceCreateInfoKHR mir_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002305 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06002306 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
2307 pass = (err != VK_SUCCESS);
2308 ASSERT_TRUE(pass);
2309 m_errorMonitor->VerifyFound();
2310
2311 // Tell whether an mir_connection supports presentation:
2312 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002313 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
2314 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06002315 m_errorMonitor->VerifyFound();
2316#endif // VK_USE_PLATFORM_MIR_KHR
2317
Ian Elliott3f06ce52016-04-29 14:46:21 -06002318#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
2319 // Use the functions from the VK_KHR_wayland_surface extension without
2320 // enabling that extension:
2321
2322 // Create a surface:
2323 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002324 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
2325 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06002326 pass = (err != VK_SUCCESS);
2327 ASSERT_TRUE(pass);
2328 m_errorMonitor->VerifyFound();
2329
2330 // Tell whether an wayland_display supports presentation:
2331 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002332 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
2333 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06002334 m_errorMonitor->VerifyFound();
2335#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -06002336#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06002337
Ian Elliott3f06ce52016-04-29 14:46:21 -06002338#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002339 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2340 // TO NON-LINUX PLATFORMS:
2341 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06002342 // Use the functions from the VK_KHR_win32_surface extension without
2343 // enabling that extension:
2344
2345 // Create a surface:
2346 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002347 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
2348 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06002349 pass = (err != VK_SUCCESS);
2350 ASSERT_TRUE(pass);
2351 m_errorMonitor->VerifyFound();
2352
2353 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002354 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06002355 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06002356 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002357// Set this (for now, until all platforms are supported and tested):
2358#define NEED_TO_TEST_THIS_ON_PLATFORM
2359#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06002360
Ian Elliott1c32c772016-04-28 14:47:13 -06002361#if defined(VK_USE_PLATFORM_XCB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002362 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2363 // TO NON-LINUX PLATFORMS:
2364 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002365 // Use the functions from the VK_KHR_xcb_surface extension without enabling
2366 // that extension:
2367
2368 // Create a surface:
2369 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002370 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06002371 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2372 pass = (err != VK_SUCCESS);
2373 ASSERT_TRUE(pass);
2374 m_errorMonitor->VerifyFound();
2375
2376 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06002377 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06002378 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002379 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
2380 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06002381 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002382// Set this (for now, until all platforms are supported and tested):
2383#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002384#endif // VK_USE_PLATFORM_XCB_KHR
2385
Ian Elliott12630812016-04-29 14:35:43 -06002386#if defined(VK_USE_PLATFORM_XLIB_KHR)
2387 // Use the functions from the VK_KHR_xlib_surface extension without enabling
2388 // that extension:
2389
2390 // Create a surface:
2391 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002392 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06002393 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
2394 pass = (err != VK_SUCCESS);
2395 ASSERT_TRUE(pass);
2396 m_errorMonitor->VerifyFound();
2397
2398 // Tell whether an Xlib VisualID supports presentation:
2399 Display *dpy = NULL;
2400 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002401 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06002402 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
2403 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002404// Set this (for now, until all platforms are supported and tested):
2405#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06002406#endif // VK_USE_PLATFORM_XLIB_KHR
2407
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002408// Use the functions from the VK_KHR_surface extension without enabling
2409// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06002410
Ian Elliott489eec02016-05-05 14:12:44 -06002411#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002412 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002413 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06002414 vkDestroySurfaceKHR(instance(), surface, NULL);
2415 m_errorMonitor->VerifyFound();
2416
2417 // Check if surface supports presentation:
2418 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002419 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06002420 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2421 pass = (err != VK_SUCCESS);
2422 ASSERT_TRUE(pass);
2423 m_errorMonitor->VerifyFound();
2424
2425 // Check surface capabilities:
2426 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002427 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
2428 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06002429 pass = (err != VK_SUCCESS);
2430 ASSERT_TRUE(pass);
2431 m_errorMonitor->VerifyFound();
2432
2433 // Check surface formats:
2434 uint32_t format_count = 0;
2435 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002436 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
2437 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06002438 pass = (err != VK_SUCCESS);
2439 ASSERT_TRUE(pass);
2440 m_errorMonitor->VerifyFound();
2441
2442 // Check surface present modes:
2443 uint32_t present_mode_count = 0;
2444 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002445 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
2446 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06002447 pass = (err != VK_SUCCESS);
2448 ASSERT_TRUE(pass);
2449 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002450#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002451
Ian Elliott1c32c772016-04-28 14:47:13 -06002452 // Use the functions from the VK_KHR_swapchain extension without enabling
2453 // that extension:
2454
2455 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002456 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06002457 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2458 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002459 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06002460 pass = (err != VK_SUCCESS);
2461 ASSERT_TRUE(pass);
2462 m_errorMonitor->VerifyFound();
2463
2464 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002465 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
2466 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06002467 pass = (err != VK_SUCCESS);
2468 ASSERT_TRUE(pass);
2469 m_errorMonitor->VerifyFound();
2470
Chris Forbeseb7d5502016-09-13 18:19:21 +12002471 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
2472 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
2473 VkFence fence;
2474 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
2475
Ian Elliott1c32c772016-04-28 14:47:13 -06002476 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002477 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12002478 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06002479 pass = (err != VK_SUCCESS);
2480 ASSERT_TRUE(pass);
2481 m_errorMonitor->VerifyFound();
2482
Chris Forbeseb7d5502016-09-13 18:19:21 +12002483 vkDestroyFence(m_device->device(), fence, nullptr);
2484
Ian Elliott1c32c772016-04-28 14:47:13 -06002485 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002486 //
2487 // NOTE: Currently can't test this because a real swapchain is needed (as
2488 // opposed to the fake one we created) in order for the layer to lookup the
2489 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06002490
2491 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002492 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06002493 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
2494 m_errorMonitor->VerifyFound();
2495}
2496
Ian Elliott2c1daf52016-05-12 09:41:46 -06002497TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
Ian Elliott2c1daf52016-05-12 09:41:46 -06002498
Dustin Graves6c6d8982016-05-17 10:09:21 -06002499#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott2c1daf52016-05-12 09:41:46 -06002500 VkSurfaceKHR surface = VK_NULL_HANDLE;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002501
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002502 VkResult err;
2503 bool pass;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002504 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2505 VkSwapchainCreateInfoKHR swapchain_create_info = {};
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002506 // uint32_t swapchain_image_count = 0;
2507 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
2508 // uint32_t image_index = 0;
2509 // VkPresentInfoKHR present_info = {};
Ian Elliott2c1daf52016-05-12 09:41:46 -06002510
2511 ASSERT_NO_FATAL_FAILURE(InitState());
2512
2513 // Use the create function from one of the VK_KHR_*_surface extension in
2514 // order to create a surface, testing all known errors in the process,
2515 // before successfully creating a surface:
2516 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002517 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002518 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
2519 pass = (err != VK_SUCCESS);
2520 ASSERT_TRUE(pass);
2521 m_errorMonitor->VerifyFound();
2522
2523 // Next, try to create a surface with the wrong
2524 // VkXcbSurfaceCreateInfoKHR::sType:
2525 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
2526 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002527 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002528 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2529 pass = (err != VK_SUCCESS);
2530 ASSERT_TRUE(pass);
2531 m_errorMonitor->VerifyFound();
2532
Ian Elliott2c1daf52016-05-12 09:41:46 -06002533 // Create a native window, and then correctly create a surface:
2534 xcb_connection_t *connection;
2535 xcb_screen_t *screen;
2536 xcb_window_t xcb_window;
2537 xcb_intern_atom_reply_t *atom_wm_delete_window;
2538
2539 const xcb_setup_t *setup;
2540 xcb_screen_iterator_t iter;
2541 int scr;
2542 uint32_t value_mask, value_list[32];
2543 int width = 1;
2544 int height = 1;
2545
2546 connection = xcb_connect(NULL, &scr);
2547 ASSERT_TRUE(connection != NULL);
2548 setup = xcb_get_setup(connection);
2549 iter = xcb_setup_roots_iterator(setup);
2550 while (scr-- > 0)
2551 xcb_screen_next(&iter);
2552 screen = iter.data;
2553
2554 xcb_window = xcb_generate_id(connection);
2555
2556 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
2557 value_list[0] = screen->black_pixel;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002558 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002559
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002560 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
2561 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002562
2563 /* Magic code that will send notification when window is destroyed */
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002564 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
2565 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002566
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002567 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002568 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002569 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002570 free(reply);
2571
2572 xcb_map_window(connection, xcb_window);
2573
2574 // Force the x/y coordinates to 100,100 results are identical in consecutive
2575 // runs
2576 const uint32_t coords[] = {100, 100};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002577 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002578
Ian Elliott2c1daf52016-05-12 09:41:46 -06002579 // Finally, try to correctly create a surface:
2580 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
2581 xcb_create_info.pNext = NULL;
2582 xcb_create_info.flags = 0;
2583 xcb_create_info.connection = connection;
2584 xcb_create_info.window = xcb_window;
2585 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2586 pass = (err == VK_SUCCESS);
2587 ASSERT_TRUE(pass);
2588
Ian Elliott2c1daf52016-05-12 09:41:46 -06002589 // Check if surface supports presentation:
2590
2591 // 1st, do so without having queried the queue families:
2592 VkBool32 supported = false;
2593 // TODO: Get the following error to come out:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002594 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2595 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
2596 "function");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002597 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2598 pass = (err != VK_SUCCESS);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002599 // ASSERT_TRUE(pass);
2600 // m_errorMonitor->VerifyFound();
Ian Elliott2c1daf52016-05-12 09:41:46 -06002601
2602 // Next, query a queue family index that's too large:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002603 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
2604 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002605 pass = (err != VK_SUCCESS);
2606 ASSERT_TRUE(pass);
2607 m_errorMonitor->VerifyFound();
2608
2609 // Finally, do so correctly:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002610 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2611 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002612 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2613 pass = (err == VK_SUCCESS);
2614 ASSERT_TRUE(pass);
2615
Ian Elliott2c1daf52016-05-12 09:41:46 -06002616 // Before proceeding, try to create a swapchain without having called
2617 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
2618 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2619 swapchain_create_info.pNext = NULL;
2620 swapchain_create_info.flags = 0;
Chris Forbeseeaffe92016-10-06 13:00:07 +13002621 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
2622 swapchain_create_info.surface = surface;
Chris Forbes5eb90472016-10-06 15:07:38 +13002623 swapchain_create_info.imageArrayLayers = 1;
2624 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
2625 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002626 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2627 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
2628 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002629 pass = (err != VK_SUCCESS);
2630 ASSERT_TRUE(pass);
2631 m_errorMonitor->VerifyFound();
2632
Ian Elliott2c1daf52016-05-12 09:41:46 -06002633 // Get the surface capabilities:
2634 VkSurfaceCapabilitiesKHR surface_capabilities;
2635
2636 // Do so correctly (only error logged by this entrypoint is if the
2637 // extension isn't enabled):
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002638 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002639 pass = (err == VK_SUCCESS);
2640 ASSERT_TRUE(pass);
2641
Ian Elliott2c1daf52016-05-12 09:41:46 -06002642 // Get the surface formats:
2643 uint32_t surface_format_count;
2644
2645 // First, try without a pointer to surface_format_count:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002646 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
2647 "specified as NULL");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002648 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
2649 pass = (err == VK_SUCCESS);
2650 ASSERT_TRUE(pass);
2651 m_errorMonitor->VerifyFound();
2652
2653 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
2654 // correctly done a 1st try (to get the count):
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002655 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002656 surface_format_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002657 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002658 pass = (err == VK_SUCCESS);
2659 ASSERT_TRUE(pass);
2660 m_errorMonitor->VerifyFound();
2661
2662 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002663 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002664 pass = (err == VK_SUCCESS);
2665 ASSERT_TRUE(pass);
2666
2667 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002668 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002669
2670 // Next, do a 2nd try with surface_format_count being set too high:
2671 surface_format_count += 5;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002672 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
2673 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002674 pass = (err == VK_SUCCESS);
2675 ASSERT_TRUE(pass);
2676 m_errorMonitor->VerifyFound();
2677
2678 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002679 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002680 pass = (err == VK_SUCCESS);
2681 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002682 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002683 pass = (err == VK_SUCCESS);
2684 ASSERT_TRUE(pass);
2685
Ian Elliott2c1daf52016-05-12 09:41:46 -06002686 // Get the surface present modes:
2687 uint32_t surface_present_mode_count;
2688
2689 // First, try without a pointer to surface_format_count:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002690 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
2691 "specified as NULL");
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002692
Ian Elliott2c1daf52016-05-12 09:41:46 -06002693 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
2694 pass = (err == VK_SUCCESS);
2695 ASSERT_TRUE(pass);
2696 m_errorMonitor->VerifyFound();
2697
2698 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
2699 // correctly done a 1st try (to get the count):
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002700 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002701 surface_present_mode_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002702 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
2703 (VkPresentModeKHR *)&surface_present_mode_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002704 pass = (err == VK_SUCCESS);
2705 ASSERT_TRUE(pass);
2706 m_errorMonitor->VerifyFound();
2707
2708 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002709 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002710 pass = (err == VK_SUCCESS);
2711 ASSERT_TRUE(pass);
2712
2713 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002714 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002715
2716 // Next, do a 2nd try with surface_format_count being set too high:
2717 surface_present_mode_count += 5;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
2719 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002720 pass = (err == VK_SUCCESS);
2721 ASSERT_TRUE(pass);
2722 m_errorMonitor->VerifyFound();
2723
2724 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002725 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002726 pass = (err == VK_SUCCESS);
2727 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002728 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002729 pass = (err == VK_SUCCESS);
2730 ASSERT_TRUE(pass);
2731
Ian Elliott2c1daf52016-05-12 09:41:46 -06002732 // Create a swapchain:
2733
2734 // First, try without a pointer to swapchain_create_info:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002735 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
2736 "specified as NULL");
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002737
Ian Elliott2c1daf52016-05-12 09:41:46 -06002738 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
2739 pass = (err != VK_SUCCESS);
2740 ASSERT_TRUE(pass);
2741 m_errorMonitor->VerifyFound();
2742
2743 // Next, call with a non-NULL swapchain_create_info, that has the wrong
2744 // sType:
2745 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002746 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002747
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002748 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002749 pass = (err != VK_SUCCESS);
2750 ASSERT_TRUE(pass);
2751 m_errorMonitor->VerifyFound();
2752
2753 // Next, call with a NULL swapchain pointer:
2754 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2755 swapchain_create_info.pNext = NULL;
2756 swapchain_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002757 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
2758 "specified as NULL");
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002759
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002760 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002761 pass = (err != VK_SUCCESS);
2762 ASSERT_TRUE(pass);
2763 m_errorMonitor->VerifyFound();
2764
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002765 // TODO: Enhance swapchain layer so that
2766 // swapchain_create_info.queueFamilyIndexCount is checked against something?
Ian Elliott2c1daf52016-05-12 09:41:46 -06002767
2768 // Next, call with a queue family index that's too large:
2769 uint32_t queueFamilyIndex[2] = {100000, 0};
2770 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2771 swapchain_create_info.queueFamilyIndexCount = 2;
2772 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002773 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
2774 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002775 pass = (err != VK_SUCCESS);
2776 ASSERT_TRUE(pass);
2777 m_errorMonitor->VerifyFound();
2778
2779 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
2780 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2781 swapchain_create_info.queueFamilyIndexCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002782 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2783 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
2784 "pCreateInfo->pQueueFamilyIndices).");
2785 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002786 pass = (err != VK_SUCCESS);
2787 ASSERT_TRUE(pass);
2788 m_errorMonitor->VerifyFound();
2789
2790 // Next, call with an invalid imageSharingMode:
2791 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
2792 swapchain_create_info.queueFamilyIndexCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002793 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2794 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
2795 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002796 pass = (err != VK_SUCCESS);
2797 ASSERT_TRUE(pass);
2798 m_errorMonitor->VerifyFound();
2799 // Fix for the future:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002800 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2801 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002802 swapchain_create_info.queueFamilyIndexCount = 0;
2803 queueFamilyIndex[0] = 0;
2804 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
2805
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002806 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
Ian Elliott2c1daf52016-05-12 09:41:46 -06002807 // Get the images from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002808 // Acquire an image from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002809 // Present an image to a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002810 // Destroy the swapchain:
2811
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002812 // TODOs:
2813 //
2814 // - Try destroying the device without first destroying the swapchain
2815 //
2816 // - Try destroying the device without first destroying the surface
2817 //
2818 // - Try destroying the surface without first destroying the swapchain
Ian Elliott2c1daf52016-05-12 09:41:46 -06002819
2820 // Destroy the surface:
2821 vkDestroySurfaceKHR(instance(), surface, NULL);
2822
Ian Elliott2c1daf52016-05-12 09:41:46 -06002823 // Tear down the window:
2824 xcb_destroy_window(connection, xcb_window);
2825 xcb_disconnect(connection);
2826
2827#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002828 return;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002829#endif // VK_USE_PLATFORM_XCB_KHR
2830}
2831
Karl Schultz6addd812016-02-02 17:17:23 -07002832TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
2833 VkResult err;
2834 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002835
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002836 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2837 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002838
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002839 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002840
2841 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002842 VkImage image;
2843 VkDeviceMemory mem;
2844 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002845
Karl Schultz6addd812016-02-02 17:17:23 -07002846 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2847 const int32_t tex_width = 32;
2848 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002849
Tony Barboureb254902015-07-15 12:50:33 -06002850 VkImageCreateInfo image_create_info = {};
2851 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002852 image_create_info.pNext = NULL;
2853 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2854 image_create_info.format = tex_format;
2855 image_create_info.extent.width = tex_width;
2856 image_create_info.extent.height = tex_height;
2857 image_create_info.extent.depth = 1;
2858 image_create_info.mipLevels = 1;
2859 image_create_info.arrayLayers = 1;
2860 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2861 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2862 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2863 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12002864 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002865
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002866 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002867 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002868 mem_alloc.pNext = NULL;
2869 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002870
Chia-I Wuf7458c52015-10-26 21:10:41 +08002871 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002872 ASSERT_VK_SUCCESS(err);
2873
Karl Schultz6addd812016-02-02 17:17:23 -07002874 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002875
Mark Lobodzinski23065352015-05-29 09:32:35 -05002876 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002877
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002878 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 -07002879 if (!pass) { // If we can't find any unmappable memory this test doesn't
2880 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002881 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002882 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002883 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002884
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002885 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002886 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002887 ASSERT_VK_SUCCESS(err);
2888
2889 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002890 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002891 ASSERT_VK_SUCCESS(err);
2892
2893 // Map memory as if to initialize the image
2894 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002895 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002896
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002897 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002898
Chia-I Wuf7458c52015-10-26 21:10:41 +08002899 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002900 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002901}
2902
Karl Schultz6addd812016-02-02 17:17:23 -07002903TEST_F(VkLayerTest, RebindMemory) {
2904 VkResult err;
2905 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002906
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002907 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002908
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002909 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002910
2911 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002912 VkImage image;
2913 VkDeviceMemory mem1;
2914 VkDeviceMemory mem2;
2915 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002916
Karl Schultz6addd812016-02-02 17:17:23 -07002917 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2918 const int32_t tex_width = 32;
2919 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002920
Tony Barboureb254902015-07-15 12:50:33 -06002921 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002922 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2923 image_create_info.pNext = NULL;
2924 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2925 image_create_info.format = tex_format;
2926 image_create_info.extent.width = tex_width;
2927 image_create_info.extent.height = tex_height;
2928 image_create_info.extent.depth = 1;
2929 image_create_info.mipLevels = 1;
2930 image_create_info.arrayLayers = 1;
2931 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2932 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2933 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2934 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002935
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002936 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002937 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2938 mem_alloc.pNext = NULL;
2939 mem_alloc.allocationSize = 0;
2940 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002941
Karl Schultz6addd812016-02-02 17:17:23 -07002942 // Introduce failure, do NOT set memProps to
2943 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002944 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002945 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002946 ASSERT_VK_SUCCESS(err);
2947
Karl Schultz6addd812016-02-02 17:17:23 -07002948 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002949
2950 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002951 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002952 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002953
2954 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002955 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002956 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002957 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002958 ASSERT_VK_SUCCESS(err);
2959
2960 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002961 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002962 ASSERT_VK_SUCCESS(err);
2963
Karl Schultz6addd812016-02-02 17:17:23 -07002964 // Introduce validation failure, try to bind a different memory object to
2965 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002966 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002967
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002968 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002969
Chia-I Wuf7458c52015-10-26 21:10:41 +08002970 vkDestroyImage(m_device->device(), image, NULL);
2971 vkFreeMemory(m_device->device(), mem1, NULL);
2972 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002973}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002974
Karl Schultz6addd812016-02-02 17:17:23 -07002975TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002976 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002977
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002978 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
2979 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002980
2981 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002982 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2983 fenceInfo.pNext = NULL;
2984 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002985
Tony Barbour300a6082015-04-07 13:44:53 -06002986 ASSERT_NO_FATAL_FAILURE(InitState());
2987 ASSERT_NO_FATAL_FAILURE(InitViewport());
2988 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2989
Tony Barbourfe3351b2015-07-28 10:17:20 -06002990 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002991 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06002992 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002993
2994 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002995
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002996 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002997 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2998 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002999 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003000 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07003001 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003002 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003003 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08003004 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003005 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06003006
3007 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07003008 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06003009
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003010 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06003011}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003012// This is a positive test. We used to expect error in this case but spec now
3013// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07003014TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003015 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06003016 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06003017 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06003018 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3019 fenceInfo.pNext = NULL;
3020
Tony Barbour0b4d9562015-04-09 10:48:04 -06003021 ASSERT_NO_FATAL_FAILURE(InitState());
3022 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08003023 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003024 VkResult result = vkResetFences(m_device->device(), 1, fences);
3025 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06003026
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003027 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06003028}
Tobin Ehlis56ab9022016-08-17 17:59:31 -06003029#if 0 // A few devices have issues with this test so disabling for now
Chris Forbese70b7d32016-06-15 15:49:12 +12003030TEST_F(VkLayerTest, LongFenceChain)
3031{
3032 m_errorMonitor->ExpectSuccess();
3033
3034 ASSERT_NO_FATAL_FAILURE(InitState());
3035 VkResult err;
3036
3037 std::vector<VkFence> fences;
3038
3039 const int chainLength = 32768;
3040
3041 for (int i = 0; i < chainLength; i++) {
3042 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3043 VkFence fence;
3044 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
3045 ASSERT_VK_SUCCESS(err);
3046
3047 fences.push_back(fence);
3048
3049 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3050 0, nullptr, 0, nullptr };
3051 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
3052 ASSERT_VK_SUCCESS(err);
3053
3054 }
3055
3056 // BOOM, stack overflow.
3057 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
3058
3059 for (auto fence : fences)
3060 vkDestroyFence(m_device->device(), fence, nullptr);
3061
3062 m_errorMonitor->VerifyNotFound();
3063}
Tobin Ehlis56ab9022016-08-17 17:59:31 -06003064#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003065TEST_F(VkLayerTest, CommandBufferSimultaneousUseSync) {
Chris Forbes18127d12016-06-08 16:52:28 +12003066 m_errorMonitor->ExpectSuccess();
3067
3068 ASSERT_NO_FATAL_FAILURE(InitState());
3069 VkResult err;
3070
3071 // Record (empty!) command buffer that can be submitted multiple times
3072 // simultaneously.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003073 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
3074 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Chris Forbes18127d12016-06-08 16:52:28 +12003075 m_commandBuffer->BeginCommandBuffer(&cbbi);
3076 m_commandBuffer->EndCommandBuffer();
3077
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003078 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Chris Forbes18127d12016-06-08 16:52:28 +12003079 VkFence fence;
3080 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
3081 ASSERT_VK_SUCCESS(err);
3082
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003083 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Chris Forbes18127d12016-06-08 16:52:28 +12003084 VkSemaphore s1, s2;
3085 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
3086 ASSERT_VK_SUCCESS(err);
3087 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
3088 ASSERT_VK_SUCCESS(err);
3089
3090 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003091 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Chris Forbes18127d12016-06-08 16:52:28 +12003092 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
3093 ASSERT_VK_SUCCESS(err);
3094
3095 // Submit CB again, signaling s2.
3096 si.pSignalSemaphores = &s2;
3097 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
3098 ASSERT_VK_SUCCESS(err);
3099
3100 // Wait for fence.
3101 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3102 ASSERT_VK_SUCCESS(err);
3103
3104 // CB is still in flight from second submission, but semaphore s1 is no
3105 // longer in flight. delete it.
3106 vkDestroySemaphore(m_device->device(), s1, nullptr);
3107
3108 m_errorMonitor->VerifyNotFound();
3109
3110 // Force device idle and clean up remaining objects
3111 vkDeviceWaitIdle(m_device->device());
3112 vkDestroySemaphore(m_device->device(), s2, nullptr);
3113 vkDestroyFence(m_device->device(), fence, nullptr);
3114}
3115
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003116TEST_F(VkLayerTest, FenceCreateSignaledWaitHandling) {
Chris Forbes4e44c912016-06-16 10:20:00 +12003117 m_errorMonitor->ExpectSuccess();
3118
3119 ASSERT_NO_FATAL_FAILURE(InitState());
3120 VkResult err;
3121
3122 // A fence created signaled
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003123 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Chris Forbes4e44c912016-06-16 10:20:00 +12003124 VkFence f1;
3125 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
3126 ASSERT_VK_SUCCESS(err);
3127
3128 // A fence created not
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003129 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Chris Forbes4e44c912016-06-16 10:20:00 +12003130 VkFence f2;
3131 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
3132 ASSERT_VK_SUCCESS(err);
3133
3134 // Submit the unsignaled fence
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003135 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Chris Forbes4e44c912016-06-16 10:20:00 +12003136 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
3137
3138 // Wait on both fences, with signaled first.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003139 VkFence fences[] = {f1, f2};
Chris Forbes4e44c912016-06-16 10:20:00 +12003140 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
3141
3142 // Should have both retired!
3143 vkDestroyFence(m_device->device(), f1, nullptr);
3144 vkDestroyFence(m_device->device(), f2, nullptr);
3145
3146 m_errorMonitor->VerifyNotFound();
3147}
3148
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003149TEST_F(VkLayerTest, InvalidUsageBits) {
3150 TEST_DESCRIPTION("Specify wrong usage for image then create conflicting view of image "
3151 "Initialize buffer with wrong usage then perform copy expecting errors "
3152 "from both the image and the buffer (2 calls)");
3153 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06003154
3155 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06003156 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06003157 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003158 image.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06003159 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06003160
Tony Barbourf92621a2016-05-02 14:28:12 -06003161 VkImageView dsv;
3162 VkImageViewCreateInfo dsvci = {};
3163 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3164 dsvci.image = image.handle();
3165 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3166 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
3167 dsvci.subresourceRange.layerCount = 1;
3168 dsvci.subresourceRange.baseMipLevel = 0;
3169 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003170 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06003171
Tony Barbourf92621a2016-05-02 14:28:12 -06003172 // Create a view with depth / stencil aspect for image with different usage
3173 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003174
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003175 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06003176
3177 // Initialize buffer with TRANSFER_DST usage
3178 vk_testing::Buffer buffer;
3179 VkMemoryPropertyFlags reqs = 0;
3180 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3181 VkBufferImageCopy region = {};
3182 region.bufferRowLength = 128;
3183 region.bufferImageHeight = 128;
3184 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3185 region.imageSubresource.layerCount = 1;
3186 region.imageExtent.height = 16;
3187 region.imageExtent.width = 16;
3188 region.imageExtent.depth = 1;
3189
Tony Barbourf92621a2016-05-02 14:28:12 -06003190 // Buffer usage not set to TRANSFER_SRC and image usage not set to
3191 // TRANSFER_DST
3192 BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06003193
Chris Forbesda581202016-10-06 18:25:26 +13003194 // two separate errors from this call:
3195 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
3196 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "buffer should have VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
3197
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003198 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
3199 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06003200 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06003201}
Tony Barbour75d79f02016-08-30 09:39:07 -06003202
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003203TEST_F(VkLayerTest, ValidUsage) {
3204 TEST_DESCRIPTION("Verify that creating an image view from an image with valid usage "
3205 "doesn't generate validation errors");
Tony Barbour75d79f02016-08-30 09:39:07 -06003206
3207 ASSERT_NO_FATAL_FAILURE(InitState());
3208
3209 m_errorMonitor->ExpectSuccess();
3210 // Verify that we can create a view with usage INPUT_ATTACHMENT
3211 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003212 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour75d79f02016-08-30 09:39:07 -06003213 ASSERT_TRUE(image.initialized());
3214 VkImageView imageView;
3215 VkImageViewCreateInfo ivci = {};
3216 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3217 ivci.image = image.handle();
3218 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3219 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
3220 ivci.subresourceRange.layerCount = 1;
3221 ivci.subresourceRange.baseMipLevel = 0;
3222 ivci.subresourceRange.levelCount = 1;
3223 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3224
3225 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
3226 m_errorMonitor->VerifyNotFound();
3227 vkDestroyImageView(m_device->device(), imageView, NULL);
3228}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003229#endif // MEM_TRACKER_TESTS
3230
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06003231#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003232
3233TEST_F(VkLayerTest, LeakAnObject) {
3234 VkResult err;
3235
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003236 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003237
3238 // Note that we have to create a new device since destroying the
3239 // framework's device causes Teardown() to fail and just calling Teardown
3240 // will destroy the errorMonitor.
3241
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003242 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003243
3244 ASSERT_NO_FATAL_FAILURE(InitState());
3245
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003246 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003247 std::vector<VkDeviceQueueCreateInfo> queue_info;
3248 queue_info.reserve(queue_props.size());
3249 std::vector<std::vector<float>> queue_priorities;
3250 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
3251 VkDeviceQueueCreateInfo qi = {};
3252 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
3253 qi.pNext = NULL;
3254 qi.queueFamilyIndex = i;
3255 qi.queueCount = queue_props[i].queueCount;
3256 queue_priorities.emplace_back(qi.queueCount, 0.0f);
3257 qi.pQueuePriorities = queue_priorities[i].data();
3258 queue_info.push_back(qi);
3259 }
3260
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003261 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003262
3263 // The sacrificial device object
3264 VkDevice testDevice;
3265 VkDeviceCreateInfo device_create_info = {};
3266 auto features = m_device->phy().features();
3267 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
3268 device_create_info.pNext = NULL;
3269 device_create_info.queueCreateInfoCount = queue_info.size();
3270 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06003271 device_create_info.enabledLayerCount = 0;
3272 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003273 device_create_info.pEnabledFeatures = &features;
3274 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
3275 ASSERT_VK_SUCCESS(err);
3276
3277 VkFence fence;
3278 VkFenceCreateInfo fence_create_info = {};
3279 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3280 fence_create_info.pNext = NULL;
3281 fence_create_info.flags = 0;
3282 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
3283 ASSERT_VK_SUCCESS(err);
3284
3285 // Induce failure by not calling vkDestroyFence
3286 vkDestroyDevice(testDevice, NULL);
3287 m_errorMonitor->VerifyFound();
3288}
3289
3290TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
3291
3292 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
3293 "attempt to delete them from another.");
3294
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003295 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003296
Cody Northropc31a84f2016-08-22 10:41:47 -06003297 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003298 VkCommandPool command_pool_one;
3299 VkCommandPool command_pool_two;
3300
3301 VkCommandPoolCreateInfo pool_create_info{};
3302 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3303 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3304 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3305
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003306 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003307
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003308 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003309
3310 VkCommandBuffer command_buffer[9];
3311 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003312 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003313 command_buffer_allocate_info.commandPool = command_pool_one;
3314 command_buffer_allocate_info.commandBufferCount = 9;
3315 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003316 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003317
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003318 vkFreeCommandBuffers(m_device->device(), command_pool_two, 4, &command_buffer[3]);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003319
3320 m_errorMonitor->VerifyFound();
3321
3322 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
3323 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
3324}
3325
3326TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
3327 VkResult err;
3328
3329 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003330 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003331
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003332 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003333
3334 ASSERT_NO_FATAL_FAILURE(InitState());
3335 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3336
3337 VkDescriptorPoolSize ds_type_count = {};
3338 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
3339 ds_type_count.descriptorCount = 1;
3340
3341 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3342 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3343 ds_pool_ci.pNext = NULL;
3344 ds_pool_ci.flags = 0;
3345 ds_pool_ci.maxSets = 1;
3346 ds_pool_ci.poolSizeCount = 1;
3347 ds_pool_ci.pPoolSizes = &ds_type_count;
3348
3349 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003350 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003351 ASSERT_VK_SUCCESS(err);
3352
3353 // Create a second descriptor pool
3354 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003355 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003356 ASSERT_VK_SUCCESS(err);
3357
3358 VkDescriptorSetLayoutBinding dsl_binding = {};
3359 dsl_binding.binding = 0;
3360 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3361 dsl_binding.descriptorCount = 1;
3362 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3363 dsl_binding.pImmutableSamplers = NULL;
3364
3365 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3366 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3367 ds_layout_ci.pNext = NULL;
3368 ds_layout_ci.bindingCount = 1;
3369 ds_layout_ci.pBindings = &dsl_binding;
3370
3371 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003372 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003373 ASSERT_VK_SUCCESS(err);
3374
3375 VkDescriptorSet descriptorSet;
3376 VkDescriptorSetAllocateInfo alloc_info = {};
3377 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3378 alloc_info.descriptorSetCount = 1;
3379 alloc_info.descriptorPool = ds_pool_one;
3380 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003381 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003382 ASSERT_VK_SUCCESS(err);
3383
3384 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
3385
3386 m_errorMonitor->VerifyFound();
3387
3388 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3389 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
3390 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
3391}
3392
3393TEST_F(VkLayerTest, CreateUnknownObject) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003394 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid Image Object ");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003395
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003396 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003397
3398 ASSERT_NO_FATAL_FAILURE(InitState());
3399
3400 // Pass bogus handle into GetImageMemoryRequirements
3401 VkMemoryRequirements mem_reqs;
3402 uint64_t fakeImageHandle = 0xCADECADE;
3403 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
3404
3405 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
3406
3407 m_errorMonitor->VerifyFound();
3408}
3409
Karl Schultz6addd812016-02-02 17:17:23 -07003410TEST_F(VkLayerTest, PipelineNotBound) {
3411 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003412
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003413 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003414
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003415 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid Pipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003416
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003417 ASSERT_NO_FATAL_FAILURE(InitState());
3418 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003419
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003420 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003421 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3422 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003423
3424 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003425 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3426 ds_pool_ci.pNext = NULL;
3427 ds_pool_ci.maxSets = 1;
3428 ds_pool_ci.poolSizeCount = 1;
3429 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003430
3431 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003432 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003433 ASSERT_VK_SUCCESS(err);
3434
3435 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003436 dsl_binding.binding = 0;
3437 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3438 dsl_binding.descriptorCount = 1;
3439 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3440 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003441
3442 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003443 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3444 ds_layout_ci.pNext = NULL;
3445 ds_layout_ci.bindingCount = 1;
3446 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003447
3448 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003449 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003450 ASSERT_VK_SUCCESS(err);
3451
3452 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003453 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003454 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003455 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003456 alloc_info.descriptorPool = ds_pool;
3457 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003458 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003459 ASSERT_VK_SUCCESS(err);
3460
3461 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003462 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3463 pipeline_layout_ci.pNext = NULL;
3464 pipeline_layout_ci.setLayoutCount = 1;
3465 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003466
3467 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003468 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003469 ASSERT_VK_SUCCESS(err);
3470
Mark Youngad779052016-01-06 14:26:04 -07003471 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003472
3473 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003474 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003475
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003476 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003477
Chia-I Wuf7458c52015-10-26 21:10:41 +08003478 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3479 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3480 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003481}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003482
Tony Barbour80f529d2016-10-10 15:01:12 -06003483// This is a positive test. No failures are expected.
3484TEST_F(VkLayerTest, BindSparse) {
3485 TEST_DESCRIPTION("Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
3486 "and then free the memory");
3487
3488 ASSERT_NO_FATAL_FAILURE(InitState());
3489
3490 auto index = m_device->graphics_queue_node_index_;
3491 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT))
3492 return;
3493
3494 m_errorMonitor->ExpectSuccess();
3495
3496 VkImage image;
3497 VkImageCreateInfo image_create_info = {};
3498 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3499 image_create_info.pNext = NULL;
3500 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3501 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3502 image_create_info.extent.width = 64;
3503 image_create_info.extent.height = 64;
3504 image_create_info.extent.depth = 1;
3505 image_create_info.mipLevels = 1;
3506 image_create_info.arrayLayers = 1;
3507 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3508 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3509 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
3510 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
3511 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3512 ASSERT_VK_SUCCESS(err);
3513
3514 VkMemoryRequirements memory_reqs;
3515 VkDeviceMemory memory_one, memory_two;
3516 bool pass;
3517 VkMemoryAllocateInfo memory_info = {};
3518 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3519 memory_info.pNext = NULL;
3520 memory_info.allocationSize = 0;
3521 memory_info.memoryTypeIndex = 0;
3522 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
3523 // Find an image big enough to allow sparse mapping of 2 memory regions
3524 // Increase the image size until it is at least twice the
3525 // size of the required alignment, to ensure we can bind both
3526 // allocated memory blocks to the image on aligned offsets.
3527 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
3528 vkDestroyImage(m_device->device(), image, nullptr);
3529 image_create_info.extent.width *= 2;
3530 image_create_info.extent.height *= 2;
3531 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
3532 ASSERT_VK_SUCCESS(err);
3533 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
3534 }
3535 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
3536 // at the end of the first
3537 memory_info.allocationSize = memory_reqs.alignment;
3538 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
3539 ASSERT_TRUE(pass);
3540 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
3541 ASSERT_VK_SUCCESS(err);
3542 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
3543 ASSERT_VK_SUCCESS(err);
3544 VkSparseMemoryBind binds[2];
3545 binds[0].flags = 0;
3546 binds[0].memory = memory_one;
3547 binds[0].memoryOffset = 0;
3548 binds[0].resourceOffset = 0;
3549 binds[0].size = memory_info.allocationSize;
3550 binds[1].flags = 0;
3551 binds[1].memory = memory_two;
3552 binds[1].memoryOffset = 0;
3553 binds[1].resourceOffset = memory_info.allocationSize;
3554 binds[1].size = memory_info.allocationSize;
3555
3556 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
3557 opaqueBindInfo.image = image;
3558 opaqueBindInfo.bindCount = 2;
3559 opaqueBindInfo.pBinds = binds;
3560
3561 VkFence fence = VK_NULL_HANDLE;
3562 VkBindSparseInfo bindSparseInfo = {};
3563 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
3564 bindSparseInfo.imageOpaqueBindCount = 1;
3565 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
3566
3567 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
3568 vkQueueWaitIdle(m_device->m_queue);
3569 vkDestroyImage(m_device->device(), image, NULL);
3570 vkFreeMemory(m_device->device(), memory_one, NULL);
3571 vkFreeMemory(m_device->device(), memory_two, NULL);
3572 m_errorMonitor->VerifyNotFound();
3573}
3574
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003575TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
3576 VkResult err;
3577
3578 TEST_DESCRIPTION("Test validation check for an invalid memory type index "
3579 "during bind[Buffer|Image]Memory time");
3580
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003581 ASSERT_NO_FATAL_FAILURE(InitState());
3582
3583 // Create an image, allocate memory, set a bad typeIndex and then try to
3584 // bind it
3585 VkImage image;
3586 VkDeviceMemory mem;
3587 VkMemoryRequirements mem_reqs;
3588 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3589 const int32_t tex_width = 32;
3590 const int32_t tex_height = 32;
3591
3592 VkImageCreateInfo image_create_info = {};
3593 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3594 image_create_info.pNext = NULL;
3595 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3596 image_create_info.format = tex_format;
3597 image_create_info.extent.width = tex_width;
3598 image_create_info.extent.height = tex_height;
3599 image_create_info.extent.depth = 1;
3600 image_create_info.mipLevels = 1;
3601 image_create_info.arrayLayers = 1;
3602 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3603 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3604 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3605 image_create_info.flags = 0;
3606
3607 VkMemoryAllocateInfo mem_alloc = {};
3608 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3609 mem_alloc.pNext = NULL;
3610 mem_alloc.allocationSize = 0;
3611 mem_alloc.memoryTypeIndex = 0;
3612
3613 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3614 ASSERT_VK_SUCCESS(err);
3615
3616 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
3617 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003618
3619 // Introduce Failure, select invalid TypeIndex
3620 VkPhysicalDeviceMemoryProperties memory_info;
3621
3622 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
3623 unsigned int i;
3624 for (i = 0; i < memory_info.memoryTypeCount; i++) {
3625 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
3626 mem_alloc.memoryTypeIndex = i;
3627 break;
3628 }
3629 }
3630 if (i >= memory_info.memoryTypeCount) {
3631 printf("No invalid memory type index could be found; skipped.\n");
3632 vkDestroyImage(m_device->device(), image, NULL);
3633 return;
3634 }
3635
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003636 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 -06003637
3638 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
3639 ASSERT_VK_SUCCESS(err);
3640
3641 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3642 (void)err;
3643
3644 m_errorMonitor->VerifyFound();
3645
3646 vkDestroyImage(m_device->device(), image, NULL);
3647 vkFreeMemory(m_device->device(), mem, NULL);
3648}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003649
Karl Schultz6addd812016-02-02 17:17:23 -07003650TEST_F(VkLayerTest, BindInvalidMemory) {
3651 VkResult err;
3652 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003653
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid Device Memory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003655
Tobin Ehlisec598302015-09-15 15:02:17 -06003656 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003657
3658 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07003659 VkImage image;
3660 VkDeviceMemory mem;
3661 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003662
Karl Schultz6addd812016-02-02 17:17:23 -07003663 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3664 const int32_t tex_width = 32;
3665 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003666
3667 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003668 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3669 image_create_info.pNext = NULL;
3670 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3671 image_create_info.format = tex_format;
3672 image_create_info.extent.width = tex_width;
3673 image_create_info.extent.height = tex_height;
3674 image_create_info.extent.depth = 1;
3675 image_create_info.mipLevels = 1;
3676 image_create_info.arrayLayers = 1;
3677 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3678 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3679 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3680 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003681
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003682 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003683 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3684 mem_alloc.pNext = NULL;
3685 mem_alloc.allocationSize = 0;
3686 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003687
Chia-I Wuf7458c52015-10-26 21:10:41 +08003688 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003689 ASSERT_VK_SUCCESS(err);
3690
Karl Schultz6addd812016-02-02 17:17:23 -07003691 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003692
3693 mem_alloc.allocationSize = mem_reqs.size;
3694
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003695 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003696 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003697
3698 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003699 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003700 ASSERT_VK_SUCCESS(err);
3701
3702 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003703 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003704
3705 // Try to bind free memory that has been freed
3706 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3707 // This may very well return an error.
3708 (void)err;
3709
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003710 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003711
Chia-I Wuf7458c52015-10-26 21:10:41 +08003712 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003713}
3714
Karl Schultz6addd812016-02-02 17:17:23 -07003715TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
3716 VkResult err;
3717 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003718
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003719 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid Image Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003720
Tobin Ehlisec598302015-09-15 15:02:17 -06003721 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003722
Karl Schultz6addd812016-02-02 17:17:23 -07003723 // Create an image object, allocate memory, destroy the object and then try
3724 // to bind it
3725 VkImage image;
3726 VkDeviceMemory mem;
3727 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003728
Karl Schultz6addd812016-02-02 17:17:23 -07003729 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3730 const int32_t tex_width = 32;
3731 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003732
3733 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003734 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3735 image_create_info.pNext = NULL;
3736 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3737 image_create_info.format = tex_format;
3738 image_create_info.extent.width = tex_width;
3739 image_create_info.extent.height = tex_height;
3740 image_create_info.extent.depth = 1;
3741 image_create_info.mipLevels = 1;
3742 image_create_info.arrayLayers = 1;
3743 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3744 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3745 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3746 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003747
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003748 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003749 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3750 mem_alloc.pNext = NULL;
3751 mem_alloc.allocationSize = 0;
3752 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003753
Chia-I Wuf7458c52015-10-26 21:10:41 +08003754 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003755 ASSERT_VK_SUCCESS(err);
3756
Karl Schultz6addd812016-02-02 17:17:23 -07003757 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003758
3759 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003760 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003761 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003762
3763 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003764 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003765 ASSERT_VK_SUCCESS(err);
3766
3767 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003768 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003769 ASSERT_VK_SUCCESS(err);
3770
3771 // Now Try to bind memory to this destroyed object
3772 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3773 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07003774 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06003775
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003776 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003777
Chia-I Wuf7458c52015-10-26 21:10:41 +08003778 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003779}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003780
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003781#endif // OBJ_TRACKER_TESTS
3782
Tobin Ehlis0788f522015-05-26 16:11:58 -06003783#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06003784
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003785TEST_F(VkLayerTest, ImageSampleCounts) {
3786
3787 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger "
3788 "validation errors.");
3789 ASSERT_NO_FATAL_FAILURE(InitState());
3790
3791 VkMemoryPropertyFlags reqs = 0;
3792 VkImageCreateInfo image_create_info = {};
3793 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3794 image_create_info.pNext = NULL;
3795 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3796 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3797 image_create_info.extent.width = 256;
3798 image_create_info.extent.height = 256;
3799 image_create_info.extent.depth = 1;
3800 image_create_info.mipLevels = 1;
3801 image_create_info.arrayLayers = 1;
3802 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3803 image_create_info.flags = 0;
3804
3805 VkImageBlit blit_region = {};
3806 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3807 blit_region.srcSubresource.baseArrayLayer = 0;
3808 blit_region.srcSubresource.layerCount = 1;
3809 blit_region.srcSubresource.mipLevel = 0;
3810 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3811 blit_region.dstSubresource.baseArrayLayer = 0;
3812 blit_region.dstSubresource.layerCount = 1;
3813 blit_region.dstSubresource.mipLevel = 0;
3814
3815 // Create two images, the source with sampleCount = 2, and attempt to blit
3816 // between them
3817 {
3818 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003819 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003820 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003821 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003822 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003823 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003824 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003825 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003826 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003827 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was created with a sample count "
3828 "of VK_SAMPLE_COUNT_2_BIT but "
3829 "must be VK_SAMPLE_COUNT_1_BIT");
3830 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3831 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003832 m_errorMonitor->VerifyFound();
3833 m_commandBuffer->EndCommandBuffer();
3834 }
3835
3836 // Create two images, the dest with sampleCount = 4, and attempt to blit
3837 // between them
3838 {
3839 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003840 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003841 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003842 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003843 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003844 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003845 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003846 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003847 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003848 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was created with a sample count "
3849 "of VK_SAMPLE_COUNT_4_BIT but "
3850 "must be VK_SAMPLE_COUNT_1_BIT");
3851 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3852 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003853 m_errorMonitor->VerifyFound();
3854 m_commandBuffer->EndCommandBuffer();
3855 }
3856
3857 VkBufferImageCopy copy_region = {};
3858 copy_region.bufferRowLength = 128;
3859 copy_region.bufferImageHeight = 128;
3860 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3861 copy_region.imageSubresource.layerCount = 1;
3862 copy_region.imageExtent.height = 64;
3863 copy_region.imageExtent.width = 64;
3864 copy_region.imageExtent.depth = 1;
3865
3866 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
3867 // buffer to image
3868 {
3869 vk_testing::Buffer src_buffer;
3870 VkMemoryPropertyFlags reqs = 0;
3871 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
3872 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003873 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003874 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003875 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003876 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was created with a sample count "
3878 "of VK_SAMPLE_COUNT_8_BIT but "
3879 "must be VK_SAMPLE_COUNT_1_BIT");
3880 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
3881 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003882 m_errorMonitor->VerifyFound();
3883 m_commandBuffer->EndCommandBuffer();
3884 }
3885
3886 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
3887 // image to buffer
3888 {
3889 vk_testing::Buffer dst_buffer;
3890 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
3891 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003892 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003893 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003894 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003895 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003896 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was created with a sample count "
3897 "of VK_SAMPLE_COUNT_2_BIT but "
3898 "must be VK_SAMPLE_COUNT_1_BIT");
3899 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003900 dst_buffer.handle(), 1, &copy_region);
3901 m_errorMonitor->VerifyFound();
3902 m_commandBuffer->EndCommandBuffer();
3903 }
3904}
3905
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003906TEST_F(VkLayerTest, BlitImageFormats) {
3907
3908 // Image blit with mismatched formats
3909 const char * expected_message =
3910 "vkCmdBlitImage: If one of srcImage and dstImage images has signed/unsigned integer format,"
3911 " the other one must also have signed/unsigned integer format";
3912
3913 ASSERT_NO_FATAL_FAILURE(InitState());
3914
3915 VkImageObj src_image(m_device);
3916 src_image.init(64, 64, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
3917 VkImageObj dst_image(m_device);
3918 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
3919 VkImageObj dst_image2(m_device);
Mike Stroyan131f3e72016-10-18 11:10:23 -06003920 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 -06003921
3922 VkImageBlit blitRegion = {};
3923 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3924 blitRegion.srcSubresource.baseArrayLayer = 0;
3925 blitRegion.srcSubresource.layerCount = 1;
3926 blitRegion.srcSubresource.mipLevel = 0;
3927 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3928 blitRegion.dstSubresource.baseArrayLayer = 0;
3929 blitRegion.dstSubresource.layerCount = 1;
3930 blitRegion.dstSubresource.mipLevel = 0;
3931
3932 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, expected_message);
3933
3934 // Unsigned int vs not an int
3935 BeginCommandBuffer();
3936 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image.image(),
3937 dst_image.layout(), 1, &blitRegion, VK_FILTER_NEAREST);
3938
3939 m_errorMonitor->VerifyFound();
3940
3941 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, expected_message);
3942
3943 // Unsigned int vs signed int
3944 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image2.image(),
3945 dst_image2.layout(), 1, &blitRegion, VK_FILTER_NEAREST);
3946
3947 m_errorMonitor->VerifyFound();
3948
3949 EndCommandBuffer();
3950}
3951
3952
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003953TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
3954 VkResult err;
3955 bool pass;
3956
3957 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
3958 ASSERT_NO_FATAL_FAILURE(InitState());
3959
3960 // If w/d/h granularity is 1, test is not meaningful
3961 // TODO: When virtual device limits are available, create a set of limits for this test that
3962 // will always have a granularity of > 1 for w, h, and d
3963 auto index = m_device->graphics_queue_node_index_;
3964 auto queue_family_properties = m_device->phy().queue_properties();
3965
3966 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
3967 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
3968 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
3969 return;
3970 }
3971
3972 // Create two images of different types and try to copy between them
3973 VkImage srcImage;
3974 VkImage dstImage;
3975 VkDeviceMemory srcMem;
3976 VkDeviceMemory destMem;
3977 VkMemoryRequirements memReqs;
3978
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003979 VkImageCreateInfo image_create_info = {};
3980 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3981 image_create_info.pNext = NULL;
3982 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3983 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3984 image_create_info.extent.width = 32;
3985 image_create_info.extent.height = 32;
3986 image_create_info.extent.depth = 1;
3987 image_create_info.mipLevels = 1;
3988 image_create_info.arrayLayers = 4;
3989 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3990 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3991 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3992 image_create_info.flags = 0;
3993
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003994 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003995 ASSERT_VK_SUCCESS(err);
3996
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003997 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003998 ASSERT_VK_SUCCESS(err);
3999
4000 // Allocate memory
4001 VkMemoryAllocateInfo memAlloc = {};
4002 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4003 memAlloc.pNext = NULL;
4004 memAlloc.allocationSize = 0;
4005 memAlloc.memoryTypeIndex = 0;
4006
4007 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
4008 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004009 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06004010 ASSERT_TRUE(pass);
4011 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
4012 ASSERT_VK_SUCCESS(err);
4013
4014 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
4015 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004016 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06004017 ASSERT_VK_SUCCESS(err);
4018 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
4019 ASSERT_VK_SUCCESS(err);
4020
4021 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
4022 ASSERT_VK_SUCCESS(err);
4023 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
4024 ASSERT_VK_SUCCESS(err);
4025
4026 BeginCommandBuffer();
4027 VkImageCopy copyRegion;
4028 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4029 copyRegion.srcSubresource.mipLevel = 0;
4030 copyRegion.srcSubresource.baseArrayLayer = 0;
4031 copyRegion.srcSubresource.layerCount = 1;
4032 copyRegion.srcOffset.x = 0;
4033 copyRegion.srcOffset.y = 0;
4034 copyRegion.srcOffset.z = 0;
4035 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4036 copyRegion.dstSubresource.mipLevel = 0;
4037 copyRegion.dstSubresource.baseArrayLayer = 0;
4038 copyRegion.dstSubresource.layerCount = 1;
4039 copyRegion.dstOffset.x = 0;
4040 copyRegion.dstOffset.y = 0;
4041 copyRegion.dstOffset.z = 0;
4042 copyRegion.extent.width = 1;
4043 copyRegion.extent.height = 1;
4044 copyRegion.extent.depth = 1;
4045
4046 // Introduce failure by setting srcOffset to a bad granularity value
4047 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004048 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
4049 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06004050 m_errorMonitor->VerifyFound();
4051
4052 // Introduce failure by setting extent to a bad granularity value
4053 copyRegion.srcOffset.y = 0;
4054 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004055 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
4056 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06004057 m_errorMonitor->VerifyFound();
4058
4059 // Now do some buffer/image copies
4060 vk_testing::Buffer buffer;
4061 VkMemoryPropertyFlags reqs = 0;
4062 buffer.init_as_dst(*m_device, 128 * 128, reqs);
4063 VkBufferImageCopy region = {};
4064 region.bufferOffset = 0;
4065 region.bufferRowLength = 3;
4066 region.bufferImageHeight = 128;
4067 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4068 region.imageSubresource.layerCount = 1;
4069 region.imageExtent.height = 16;
4070 region.imageExtent.width = 16;
4071 region.imageExtent.depth = 1;
4072 region.imageOffset.x = 0;
4073 region.imageOffset.y = 0;
4074 region.imageOffset.z = 0;
4075
4076 // Introduce failure by setting bufferRowLength to a bad granularity value
4077 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004078 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
4079 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
4080 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06004081 m_errorMonitor->VerifyFound();
4082 region.bufferRowLength = 128;
4083
4084 // Introduce failure by setting bufferOffset to a bad granularity value
4085 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004086 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
4087 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
4088 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06004089 m_errorMonitor->VerifyFound();
4090 region.bufferOffset = 0;
4091
4092 // Introduce failure by setting bufferImageHeight to a bad granularity value
4093 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004094 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
4095 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
4096 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06004097 m_errorMonitor->VerifyFound();
4098 region.bufferImageHeight = 128;
4099
4100 // Introduce failure by setting imageExtent to a bad granularity value
4101 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004102 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
4103 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
4104 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06004105 m_errorMonitor->VerifyFound();
4106 region.imageExtent.width = 16;
4107
4108 // Introduce failure by setting imageOffset to a bad granularity value
4109 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004110 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
4111 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
4112 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06004113 m_errorMonitor->VerifyFound();
4114
4115 EndCommandBuffer();
4116
4117 vkDestroyImage(m_device->device(), srcImage, NULL);
4118 vkDestroyImage(m_device->device(), dstImage, NULL);
4119 vkFreeMemory(m_device->device(), srcMem, NULL);
4120 vkFreeMemory(m_device->device(), destMem, NULL);
4121}
4122
Mark Lobodzinski570efc62016-08-09 16:43:19 -06004123TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski570efc62016-08-09 16:43:19 -06004124 TEST_DESCRIPTION("Submit command buffer created using one queue family and "
4125 "attempt to submit them on a queue created in a different "
4126 "queue family.");
4127
Cody Northropc31a84f2016-08-22 10:41:47 -06004128 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski570efc62016-08-09 16:43:19 -06004129 // This test is meaningless unless we have multiple queue families
4130 auto queue_family_properties = m_device->phy().queue_properties();
4131 if (queue_family_properties.size() < 2) {
4132 return;
4133 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004134 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06004135 // Get safe index of another queue family
4136 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
4137 ASSERT_NO_FATAL_FAILURE(InitState());
4138 // Create a second queue using a different queue family
4139 VkQueue other_queue;
4140 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
4141
4142 // Record an empty cmd buffer
4143 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
4144 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4145 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
4146 vkEndCommandBuffer(m_commandBuffer->handle());
4147
4148 // And submit on the wrong queue
4149 VkSubmitInfo submit_info = {};
4150 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4151 submit_info.commandBufferCount = 1;
4152 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06004153 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06004154
4155 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06004156}
4157
Chris Forbes48a53902016-06-30 11:46:27 +12004158TEST_F(VkLayerTest, RenderPassInitialLayoutUndefined) {
4159 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass with an attachment's "
4160 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
4161 "the command buffer has prior knowledge of that "
4162 "attachment's layout.");
4163
4164 m_errorMonitor->ExpectSuccess();
4165
4166 ASSERT_NO_FATAL_FAILURE(InitState());
4167
4168 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004169 VkAttachmentDescription attachment = {0,
4170 VK_FORMAT_R8G8B8A8_UNORM,
4171 VK_SAMPLE_COUNT_1_BIT,
4172 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4173 VK_ATTACHMENT_STORE_OP_STORE,
4174 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4175 VK_ATTACHMENT_STORE_OP_DONT_CARE,
4176 VK_IMAGE_LAYOUT_UNDEFINED,
4177 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes48a53902016-06-30 11:46:27 +12004178
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004179 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes48a53902016-06-30 11:46:27 +12004180
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004181 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Chris Forbes48a53902016-06-30 11:46:27 +12004182
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004183 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Chris Forbes48a53902016-06-30 11:46:27 +12004184
4185 VkRenderPass rp;
4186 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4187 ASSERT_VK_SUCCESS(err);
4188
4189 // A compatible framebuffer.
4190 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004191 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Chris Forbes48a53902016-06-30 11:46:27 +12004192 ASSERT_TRUE(image.initialized());
4193
4194 VkImageViewCreateInfo ivci = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004195 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4196 nullptr,
4197 0,
4198 image.handle(),
4199 VK_IMAGE_VIEW_TYPE_2D,
4200 VK_FORMAT_R8G8B8A8_UNORM,
4201 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
4202 VK_COMPONENT_SWIZZLE_IDENTITY},
4203 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Chris Forbes48a53902016-06-30 11:46:27 +12004204 };
4205 VkImageView view;
4206 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4207 ASSERT_VK_SUCCESS(err);
4208
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004209 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Chris Forbes48a53902016-06-30 11:46:27 +12004210 VkFramebuffer fb;
4211 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4212 ASSERT_VK_SUCCESS(err);
4213
4214 // Record a single command buffer which uses this renderpass twice. The
4215 // bug is triggered at the beginning of the second renderpass, when the
4216 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004217 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
Chris Forbes48a53902016-06-30 11:46:27 +12004218 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004219 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
Chris Forbes48a53902016-06-30 11:46:27 +12004220 vkCmdEndRenderPass(m_commandBuffer->handle());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004221 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
Chris Forbes48a53902016-06-30 11:46:27 +12004222
4223 m_errorMonitor->VerifyNotFound();
4224
4225 vkCmdEndRenderPass(m_commandBuffer->handle());
4226 EndCommandBuffer();
4227
4228 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4229 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4230 vkDestroyImageView(m_device->device(), view, nullptr);
4231}
4232
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06004233TEST_F(VkLayerTest, FramebufferBindingDestroyCommandPool) {
4234 TEST_DESCRIPTION("This test should pass. Create a Framebuffer and "
4235 "command buffer, bind them together, then destroy "
4236 "command pool and framebuffer and verify there are no "
4237 "errors.");
4238
4239 m_errorMonitor->ExpectSuccess();
4240
4241 ASSERT_NO_FATAL_FAILURE(InitState());
4242
4243 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004244 VkAttachmentDescription attachment = {0,
4245 VK_FORMAT_R8G8B8A8_UNORM,
4246 VK_SAMPLE_COUNT_1_BIT,
4247 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4248 VK_ATTACHMENT_STORE_OP_STORE,
4249 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4250 VK_ATTACHMENT_STORE_OP_DONT_CARE,
4251 VK_IMAGE_LAYOUT_UNDEFINED,
4252 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06004253
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004254 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06004255
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004256 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06004257
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004258 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06004259
4260 VkRenderPass rp;
4261 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4262 ASSERT_VK_SUCCESS(err);
4263
4264 // A compatible framebuffer.
4265 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004266 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06004267 ASSERT_TRUE(image.initialized());
4268
4269 VkImageViewCreateInfo ivci = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004270 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4271 nullptr,
4272 0,
4273 image.handle(),
4274 VK_IMAGE_VIEW_TYPE_2D,
4275 VK_FORMAT_R8G8B8A8_UNORM,
4276 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
4277 VK_COMPONENT_SWIZZLE_IDENTITY},
4278 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06004279 };
4280 VkImageView view;
4281 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4282 ASSERT_VK_SUCCESS(err);
4283
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004284 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06004285 VkFramebuffer fb;
4286 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4287 ASSERT_VK_SUCCESS(err);
4288
4289 // Explicitly create a command buffer to bind the FB to so that we can then
4290 // destroy the command pool in order to implicitly free command buffer
4291 VkCommandPool command_pool;
4292 VkCommandPoolCreateInfo pool_create_info{};
4293 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4294 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4295 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004296 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06004297
4298 VkCommandBuffer command_buffer;
4299 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004300 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06004301 command_buffer_allocate_info.commandPool = command_pool;
4302 command_buffer_allocate_info.commandBufferCount = 1;
4303 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004304 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06004305
4306 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004307 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06004308 VkCommandBufferBeginInfo begin_info{};
4309 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4310 vkBeginCommandBuffer(command_buffer, &begin_info);
4311
4312 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
4313 vkCmdEndRenderPass(command_buffer);
4314 vkEndCommandBuffer(command_buffer);
Mark Lobodzinski7d10a822016-08-03 14:08:40 -06004315 vkDestroyImageView(m_device->device(), view, nullptr);
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06004316 // Destroy command pool to implicitly free command buffer
4317 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
4318 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4319 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4320 m_errorMonitor->VerifyNotFound();
4321}
4322
Chris Forbes51bf7c92016-06-30 15:22:08 +12004323TEST_F(VkLayerTest, RenderPassSubpassZeroTransitionsApplied) {
4324 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass applies the layout "
4325 "transitions for the first subpass");
4326
4327 m_errorMonitor->ExpectSuccess();
4328
4329 ASSERT_NO_FATAL_FAILURE(InitState());
4330
4331 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004332 VkAttachmentDescription attachment = {0,
4333 VK_FORMAT_R8G8B8A8_UNORM,
4334 VK_SAMPLE_COUNT_1_BIT,
4335 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4336 VK_ATTACHMENT_STORE_OP_STORE,
4337 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4338 VK_ATTACHMENT_STORE_OP_DONT_CARE,
4339 VK_IMAGE_LAYOUT_UNDEFINED,
4340 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes51bf7c92016-06-30 15:22:08 +12004341
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004342 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes51bf7c92016-06-30 15:22:08 +12004343
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004344 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Chris Forbes51bf7c92016-06-30 15:22:08 +12004345
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004346 VkSubpassDependency dep = {0,
4347 0,
4348 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4349 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4350 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4351 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4352 VK_DEPENDENCY_BY_REGION_BIT};
Chris Forbes51bf7c92016-06-30 15:22:08 +12004353
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004354 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Chris Forbes51bf7c92016-06-30 15:22:08 +12004355
4356 VkResult err;
4357 VkRenderPass rp;
4358 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4359 ASSERT_VK_SUCCESS(err);
4360
4361 // A compatible framebuffer.
4362 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004363 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Chris Forbes51bf7c92016-06-30 15:22:08 +12004364 ASSERT_TRUE(image.initialized());
4365
4366 VkImageViewCreateInfo ivci = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004367 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4368 nullptr,
4369 0,
4370 image.handle(),
4371 VK_IMAGE_VIEW_TYPE_2D,
4372 VK_FORMAT_R8G8B8A8_UNORM,
4373 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
4374 VK_COMPONENT_SWIZZLE_IDENTITY},
4375 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Chris Forbes51bf7c92016-06-30 15:22:08 +12004376 };
4377 VkImageView view;
4378 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4379 ASSERT_VK_SUCCESS(err);
4380
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004381 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Chris Forbes51bf7c92016-06-30 15:22:08 +12004382 VkFramebuffer fb;
4383 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4384 ASSERT_VK_SUCCESS(err);
4385
4386 // Record a single command buffer which issues a pipeline barrier w/
4387 // image memory barrier for the attachment. This detects the previously
4388 // missing tracking of the subpass layout by throwing a validation error
4389 // if it doesn't occur.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004390 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
Chris Forbes51bf7c92016-06-30 15:22:08 +12004391 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004392 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
Chris Forbes51bf7c92016-06-30 15:22:08 +12004393
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004394 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
4395 nullptr,
4396 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4397 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4398 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4399 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4400 VK_QUEUE_FAMILY_IGNORED,
4401 VK_QUEUE_FAMILY_IGNORED,
4402 image.handle(),
4403 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
4404 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4405 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
4406 &imb);
Chris Forbes51bf7c92016-06-30 15:22:08 +12004407
4408 vkCmdEndRenderPass(m_commandBuffer->handle());
4409 m_errorMonitor->VerifyNotFound();
4410 EndCommandBuffer();
4411
4412 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4413 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4414 vkDestroyImageView(m_device->device(), view, nullptr);
4415}
4416
Chris Forbesa58c4522016-09-28 15:19:39 +13004417TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
4418 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
4419 ASSERT_NO_FATAL_FAILURE(InitState());
4420
4421 // A renderpass with two subpasses, both writing the same attachment.
4422 VkAttachmentDescription attach[] = {
4423 { 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
4424 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4425 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4426 VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4427 },
4428 };
4429 VkAttachmentReference ref = { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
4430 VkSubpassDescription subpasses[] = {
4431 { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
4432 1, &ref, nullptr, nullptr, 0, nullptr },
4433 { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
4434 1, &ref, nullptr, nullptr, 0, nullptr },
4435 };
4436 VkSubpassDependency dep = {
4437 0, 1,
4438 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4439 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4440 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4441 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4442 VK_DEPENDENCY_BY_REGION_BIT
4443 };
4444 VkRenderPassCreateInfo rpci = {
4445 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4446 0, 1, attach, 2, subpasses, 1, &dep
4447 };
4448 VkRenderPass rp;
4449 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4450 ASSERT_VK_SUCCESS(err);
4451
4452 VkImageObj image(m_device);
4453 image.init_no_layout(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
4454 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
4455 VK_IMAGE_TILING_OPTIMAL, 0);
4456 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
4457
4458 VkFramebufferCreateInfo fbci = {
4459 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
4460 0, rp, 1, &imageView, 32, 32, 1
4461 };
4462 VkFramebuffer fb;
4463 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
4464 ASSERT_VK_SUCCESS(err);
4465
4466 char const *vsSource =
4467 "#version 450\n"
4468 "void main() { gl_Position = vec4(1); }\n";
4469 char const *fsSource =
4470 "#version 450\n"
4471 "layout(location=0) out vec4 color;\n"
4472 "void main() { color = vec4(1); }\n";
4473
4474 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4475 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4476 VkPipelineObj pipe(m_device);
4477 pipe.AddColorAttachment();
4478 pipe.AddShader(&vs);
4479 pipe.AddShader(&fs);
4480 VkViewport view_port = {};
4481 m_viewports.push_back(view_port);
4482 pipe.SetViewport(m_viewports);
4483 VkRect2D rect = {};
4484 m_scissors.push_back(rect);
4485 pipe.SetScissor(m_scissors);
4486
4487 VkPipelineLayoutCreateInfo plci = {
4488 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
4489 0, 0, nullptr, 0, nullptr
4490 };
4491 VkPipelineLayout pl;
4492 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
4493 ASSERT_VK_SUCCESS(err);
4494 pipe.CreateVKPipeline(pl, rp);
4495
4496 BeginCommandBuffer();
4497
4498 VkRenderPassBeginInfo rpbi = {
4499 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
4500 rp, fb, { { 0, 0, }, { 32, 32 } }, 0, nullptr
4501 };
4502
4503 // subtest 1: bind in the wrong subpass
4504 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
4505 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
4506 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4507 "built for subpass 0 but used in subpass 1");
4508 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4509 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
4510 m_errorMonitor->VerifyFound();
4511
4512 vkCmdEndRenderPass(m_commandBuffer->handle());
4513
4514 // subtest 2: bind in correct subpass, then transition to next subpass
4515 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
4516 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4517 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
4518 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4519 "built for subpass 0 but used in subpass 1");
4520 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
4521 m_errorMonitor->VerifyFound();
4522
4523 vkCmdEndRenderPass(m_commandBuffer->handle());
4524
4525 EndCommandBuffer();
4526
4527 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
4528 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4529 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4530}
4531
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06004532TEST_F(VkLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
4533 TEST_DESCRIPTION("Validate that when an imageView of a depth/stencil image "
4534 "is used as a depth/stencil framebuffer attachment, the "
4535 "aspectMask is ignored and both depth and stencil image "
4536 "subresources are used.");
4537
4538 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004539 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
4540 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06004541 return;
4542 }
4543
4544 m_errorMonitor->ExpectSuccess();
4545
4546 ASSERT_NO_FATAL_FAILURE(InitState());
4547
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004548 VkAttachmentDescription attachment = {0,
4549 VK_FORMAT_D32_SFLOAT_S8_UINT,
4550 VK_SAMPLE_COUNT_1_BIT,
4551 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4552 VK_ATTACHMENT_STORE_OP_STORE,
4553 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4554 VK_ATTACHMENT_STORE_OP_DONT_CARE,
4555 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
4556 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06004557
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004558 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06004559
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004560 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06004561
4562 VkSubpassDependency dep = {0,
4563 0,
4564 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4565 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4566 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4567 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4568 VK_DEPENDENCY_BY_REGION_BIT};
4569
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004570 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06004571
4572 VkResult err;
4573 VkRenderPass rp;
4574 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4575 ASSERT_VK_SUCCESS(err);
4576
4577 VkImageObj image(m_device);
4578 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
4579 0x26, // usage
4580 VK_IMAGE_TILING_OPTIMAL, 0);
4581 ASSERT_TRUE(image.initialized());
4582 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
4583
4584 VkImageViewCreateInfo ivci = {
4585 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4586 nullptr,
4587 0,
4588 image.handle(),
4589 VK_IMAGE_VIEW_TYPE_2D,
4590 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004591 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06004592 {0x2, 0, 1, 0, 1},
4593 };
4594 VkImageView view;
4595 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4596 ASSERT_VK_SUCCESS(err);
4597
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004598 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06004599 VkFramebuffer fb;
4600 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4601 ASSERT_VK_SUCCESS(err);
4602
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004603 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06004604 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004605 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06004606
4607 VkImageMemoryBarrier imb = {};
4608 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
4609 imb.pNext = nullptr;
4610 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4611 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4612 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4613 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4614 imb.srcQueueFamilyIndex = 0;
4615 imb.dstQueueFamilyIndex = 0;
4616 imb.image = image.handle();
4617 imb.subresourceRange.aspectMask = 0x6;
4618 imb.subresourceRange.baseMipLevel = 0;
4619 imb.subresourceRange.levelCount = 0x1;
4620 imb.subresourceRange.baseArrayLayer = 0;
4621 imb.subresourceRange.layerCount = 0x1;
4622
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004623 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4624 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06004625 &imb);
4626
4627 vkCmdEndRenderPass(m_commandBuffer->handle());
4628 EndCommandBuffer();
4629 QueueCommandBuffer(false);
4630 m_errorMonitor->VerifyNotFound();
4631
4632 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4633 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4634 vkDestroyImageView(m_device->device(), view, nullptr);
4635}
Tony Barbourd5f7b822016-08-02 15:39:33 -06004636
Tony Barbour4e919972016-08-09 13:27:40 -06004637TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
4638 TEST_DESCRIPTION("Generate INVALID_RENDER_AREA error by beginning renderpass"
4639 "with extent outside of framebuffer");
4640 ASSERT_NO_FATAL_FAILURE(InitState());
4641 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4642
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004643 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot execute a render pass with renderArea "
4644 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06004645
4646 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
4647 m_renderPassBeginInfo.renderArea.extent.width = 257;
4648 m_renderPassBeginInfo.renderArea.extent.height = 257;
4649 BeginCommandBuffer();
4650 m_errorMonitor->VerifyFound();
4651}
4652
4653TEST_F(VkLayerTest, DisabledIndependentBlend) {
4654 TEST_DESCRIPTION("Generate INDEPENDENT_BLEND by disabling independent "
4655 "blend and then specifying different blend states for two "
4656 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06004657 VkPhysicalDeviceFeatures features = {};
4658 features.independentBlend = VK_FALSE;
Cody Northropc31a84f2016-08-22 10:41:47 -06004659 ASSERT_NO_FATAL_FAILURE(InitState(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06004660
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4662 "Invalid Pipeline CreateInfo: If independent blend feature not "
4663 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06004664
Cody Northropc31a84f2016-08-22 10:41:47 -06004665 VkDescriptorSetObj descriptorSet(m_device);
4666 descriptorSet.AppendDummy();
4667 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06004668
Cody Northropc31a84f2016-08-22 10:41:47 -06004669 VkPipelineObj pipeline(m_device);
4670 VkRenderpassObj renderpass(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004671 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06004672 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06004673
Cody Northropc31a84f2016-08-22 10:41:47 -06004674 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
4675 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
4676 att_state1.blendEnable = VK_TRUE;
4677 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
4678 att_state2.blendEnable = VK_FALSE;
4679 pipeline.AddColorAttachment(0, &att_state1);
4680 pipeline.AddColorAttachment(1, &att_state2);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004681 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass.handle());
Cody Northropc31a84f2016-08-22 10:41:47 -06004682 m_errorMonitor->VerifyFound();
Tony Barbour4e919972016-08-09 13:27:40 -06004683}
4684
4685TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
4686 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
4687 "depth attachments in subpass");
Cody Northropc31a84f2016-08-22 10:41:47 -06004688 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbour4e919972016-08-09 13:27:40 -06004689
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004690 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4691 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
Tony Barbour4e919972016-08-09 13:27:40 -06004692
4693 // Create a renderPass with a single color attachment
4694 VkAttachmentReference attach = {};
4695 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4696 VkSubpassDescription subpass = {};
4697 VkRenderPassCreateInfo rpci = {};
4698 rpci.subpassCount = 1;
4699 rpci.pSubpasses = &subpass;
4700 rpci.attachmentCount = 1;
4701 VkAttachmentDescription attach_desc = {};
4702 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
4703 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4704 rpci.pAttachments = &attach_desc;
4705 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4706 VkRenderPass rp;
4707 subpass.pDepthStencilAttachment = &attach;
4708 subpass.pColorAttachments = NULL;
4709 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4710 m_errorMonitor->VerifyFound();
4711}
4712
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004713TEST_F(VkLayerTest, RenderPassTransitionsAttachmentUnused) {
4714 TEST_DESCRIPTION("Ensure that layout transitions work correctly without "
4715 "errors, when an attachment reference is "
4716 "VK_ATTACHMENT_UNUSED");
4717
4718 m_errorMonitor->ExpectSuccess();
4719
4720 ASSERT_NO_FATAL_FAILURE(InitState());
4721
4722 // A renderpass with no attachments
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004723 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004724
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004725 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004726
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004727 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004728
4729 VkRenderPass rp;
4730 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4731 ASSERT_VK_SUCCESS(err);
4732
4733 // A compatible framebuffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004734 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004735 VkFramebuffer fb;
4736 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4737 ASSERT_VK_SUCCESS(err);
4738
4739 // Record a command buffer which just begins and ends the renderpass. The
4740 // bug manifests in BeginRenderPass.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004741 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004742 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004743 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004744 vkCmdEndRenderPass(m_commandBuffer->handle());
4745 m_errorMonitor->VerifyNotFound();
4746 EndCommandBuffer();
4747
4748 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4749 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4750}
4751
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004752// This is a positive test. No errors are expected.
4753TEST_F(VkLayerTest, StencilLoadOp) {
4754 TEST_DESCRIPTION("Create a stencil-only attachment with a LOAD_OP set to "
4755 "CLEAR. stencil[Load|Store]Op used to be ignored.");
4756 VkResult result = VK_SUCCESS;
4757 VkImageFormatProperties formatProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004758 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
4759 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
4760 &formatProps);
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004761 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
4762 return;
4763 }
4764
4765 ASSERT_NO_FATAL_FAILURE(InitState());
4766 VkFormat depth_stencil_fmt = VK_FORMAT_D24_UNORM_S8_UINT;
4767 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004768 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004769 VkAttachmentDescription att = {};
4770 VkAttachmentReference ref = {};
4771 att.format = depth_stencil_fmt;
Chris Forbes787b4532016-09-16 16:45:16 +12004772 att.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004773 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
4774 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
4775 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
4776 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
4777 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4778 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4779
4780 VkClearValue clear;
4781 clear.depthStencil.depth = 1.0;
4782 clear.depthStencil.stencil = 0;
4783 ref.attachment = 0;
4784 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4785
4786 VkSubpassDescription subpass = {};
4787 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
4788 subpass.flags = 0;
4789 subpass.inputAttachmentCount = 0;
4790 subpass.pInputAttachments = NULL;
4791 subpass.colorAttachmentCount = 0;
4792 subpass.pColorAttachments = NULL;
4793 subpass.pResolveAttachments = NULL;
4794 subpass.pDepthStencilAttachment = &ref;
4795 subpass.preserveAttachmentCount = 0;
4796 subpass.pPreserveAttachments = NULL;
4797
4798 VkRenderPass rp;
4799 VkRenderPassCreateInfo rp_info = {};
4800 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4801 rp_info.attachmentCount = 1;
4802 rp_info.pAttachments = &att;
4803 rp_info.subpassCount = 1;
4804 rp_info.pSubpasses = &subpass;
4805 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
4806 ASSERT_VK_SUCCESS(result);
4807
4808 VkImageView *depthView = m_depthStencil->BindInfo();
4809 VkFramebufferCreateInfo fb_info = {};
4810 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4811 fb_info.pNext = NULL;
4812 fb_info.renderPass = rp;
4813 fb_info.attachmentCount = 1;
4814 fb_info.pAttachments = depthView;
4815 fb_info.width = 100;
4816 fb_info.height = 100;
4817 fb_info.layers = 1;
4818 VkFramebuffer fb;
4819 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4820 ASSERT_VK_SUCCESS(result);
4821
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004822 VkRenderPassBeginInfo rpbinfo = {};
4823 rpbinfo.clearValueCount = 1;
4824 rpbinfo.pClearValues = &clear;
4825 rpbinfo.pNext = NULL;
4826 rpbinfo.renderPass = rp;
4827 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4828 rpbinfo.renderArea.extent.width = 100;
4829 rpbinfo.renderArea.extent.height = 100;
4830 rpbinfo.renderArea.offset.x = 0;
4831 rpbinfo.renderArea.offset.y = 0;
4832 rpbinfo.framebuffer = fb;
4833
4834 VkFence fence = {};
4835 VkFenceCreateInfo fence_ci = {};
4836 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4837 fence_ci.pNext = nullptr;
4838 fence_ci.flags = 0;
4839 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
4840 ASSERT_VK_SUCCESS(result);
4841
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004842 m_commandBuffer->BeginCommandBuffer();
4843 m_commandBuffer->BeginRenderPass(rpbinfo);
4844 m_commandBuffer->EndRenderPass();
4845 m_commandBuffer->EndCommandBuffer();
4846 m_commandBuffer->QueueCommandBuffer(fence);
4847
4848 VkImageObj destImage(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004849 destImage.init(100, 100, depth_stencil_fmt, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004850 VK_IMAGE_TILING_OPTIMAL, 0);
4851 VkImageMemoryBarrier barrier = {};
4852 VkImageSubresourceRange range;
4853 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004854 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4855 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004856 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4857 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
4858 barrier.image = m_depthStencil->handle();
4859 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4860 range.baseMipLevel = 0;
4861 range.levelCount = 1;
4862 range.baseArrayLayer = 0;
4863 range.layerCount = 1;
4864 barrier.subresourceRange = range;
4865 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
4866 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
4867 cmdbuf.BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004868 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
4869 &barrier);
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004870 barrier.srcAccessMask = 0;
4871 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4872 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
4873 barrier.image = destImage.handle();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004874 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4875 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
4876 &barrier);
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004877 VkImageCopy cregion;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004878 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004879 cregion.srcSubresource.mipLevel = 0;
4880 cregion.srcSubresource.baseArrayLayer = 0;
4881 cregion.srcSubresource.layerCount = 1;
4882 cregion.srcOffset.x = 0;
4883 cregion.srcOffset.y = 0;
4884 cregion.srcOffset.z = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004885 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004886 cregion.dstSubresource.mipLevel = 0;
4887 cregion.dstSubresource.baseArrayLayer = 0;
4888 cregion.dstSubresource.layerCount = 1;
4889 cregion.dstOffset.x = 0;
4890 cregion.dstOffset.y = 0;
4891 cregion.dstOffset.z = 0;
4892 cregion.extent.width = 100;
4893 cregion.extent.height = 100;
4894 cregion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004895 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004896 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
4897 cmdbuf.EndCommandBuffer();
4898
4899 VkSubmitInfo submit_info;
4900 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4901 submit_info.pNext = NULL;
4902 submit_info.waitSemaphoreCount = 0;
4903 submit_info.pWaitSemaphores = NULL;
4904 submit_info.pWaitDstStageMask = NULL;
4905 submit_info.commandBufferCount = 1;
4906 submit_info.pCommandBuffers = &cmdbuf.handle();
4907 submit_info.signalSemaphoreCount = 0;
4908 submit_info.pSignalSemaphores = NULL;
4909
4910 m_errorMonitor->ExpectSuccess();
4911 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4912 m_errorMonitor->VerifyNotFound();
4913
Mark Lobodzinskid0440da2016-06-17 15:10:03 -06004914 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004915 vkDestroyFence(m_device->device(), fence, nullptr);
4916 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4917 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4918}
4919
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004920TEST_F(VkLayerTest, UnusedPreserveAttachment) {
4921 TEST_DESCRIPTION("Create a framebuffer where a subpass has a preserve "
4922 "attachment reference of VK_ATTACHMENT_UNUSED");
4923
4924 ASSERT_NO_FATAL_FAILURE(InitState());
4925 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4926
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004927 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must not be VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004928
4929 VkAttachmentReference color_attach = {};
4930 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4931 color_attach.attachment = 0;
4932 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
4933 VkSubpassDescription subpass = {};
4934 subpass.colorAttachmentCount = 1;
4935 subpass.pColorAttachments = &color_attach;
4936 subpass.preserveAttachmentCount = 1;
4937 subpass.pPreserveAttachments = &preserve_attachment;
4938
4939 VkRenderPassCreateInfo rpci = {};
4940 rpci.subpassCount = 1;
4941 rpci.pSubpasses = &subpass;
4942 rpci.attachmentCount = 1;
4943 VkAttachmentDescription attach_desc = {};
4944 attach_desc.format = VK_FORMAT_UNDEFINED;
4945 rpci.pAttachments = &attach_desc;
4946 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4947 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004948 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004949
4950 m_errorMonitor->VerifyFound();
4951
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004952 if (result == VK_SUCCESS) {
4953 vkDestroyRenderPass(m_device->device(), rp, NULL);
4954 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004955}
4956
Chris Forbesc5389742016-06-29 11:49:23 +12004957TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004958 TEST_DESCRIPTION("Ensure that CreateRenderPass produces a validation error "
4959 "when the source of a subpass multisample resolve "
4960 "does not have multiple samples.");
4961
Chris Forbesc5389742016-06-29 11:49:23 +12004962 ASSERT_NO_FATAL_FAILURE(InitState());
4963
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004964 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4965 "Subpass 0 requests multisample resolve from attachment 0 which has "
4966 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12004967
4968 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004969 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4970 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4971 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
4972 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4973 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4974 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12004975 };
4976
4977 VkAttachmentReference color = {
4978 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4979 };
4980
4981 VkAttachmentReference resolve = {
4982 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4983 };
4984
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004985 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12004986
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004987 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12004988
4989 VkRenderPass rp;
4990 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4991
4992 m_errorMonitor->VerifyFound();
4993
4994 if (err == VK_SUCCESS)
4995 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4996}
4997
4998TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004999 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
5000 "when a subpass multisample resolve operation is "
5001 "requested, and the destination of that resolve has "
5002 "multiple samples.");
5003
Chris Forbesc5389742016-06-29 11:49:23 +12005004 ASSERT_NO_FATAL_FAILURE(InitState());
5005
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005006 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5007 "Subpass 0 requests multisample resolve into attachment 1, which "
5008 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12005009
5010 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005011 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
5012 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
5013 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
5014 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
5015 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
5016 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12005017 };
5018
5019 VkAttachmentReference color = {
5020 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
5021 };
5022
5023 VkAttachmentReference resolve = {
5024 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
5025 };
5026
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005027 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12005028
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005029 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12005030
5031 VkRenderPass rp;
5032 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
5033
5034 m_errorMonitor->VerifyFound();
5035
5036 if (err == VK_SUCCESS)
5037 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5038}
5039
Chris Forbes3f128ef2016-06-29 14:58:53 +12005040TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Chris Forbes6655bb32016-07-01 18:27:30 +12005041 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
5042 "when the color and depth attachments used by a subpass "
5043 "have inconsistent sample counts");
5044
Chris Forbes3f128ef2016-06-29 14:58:53 +12005045 ASSERT_NO_FATAL_FAILURE(InitState());
5046
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005047 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5048 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
Chris Forbes3f128ef2016-06-29 14:58:53 +12005049
5050 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005051 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
5052 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
5053 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
5054 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
5055 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
5056 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbes3f128ef2016-06-29 14:58:53 +12005057 };
5058
5059 VkAttachmentReference color[] = {
5060 {
5061 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
5062 },
5063 {
5064 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
5065 },
5066 };
5067
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005068 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, color, nullptr, nullptr, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12005069
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005070 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12005071
5072 VkRenderPass rp;
5073 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
5074
5075 m_errorMonitor->VerifyFound();
5076
5077 if (err == VK_SUCCESS)
5078 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5079}
5080
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06005081TEST_F(VkLayerTest, FramebufferCreateErrors) {
5082 TEST_DESCRIPTION("Hit errors when attempting to create a framebuffer :\n"
Mike Weiblencce7ec72016-10-17 19:33:05 -06005083 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06005084 " 2. Use a color image as depthStencil attachment\n"
Mike Weiblencce7ec72016-10-17 19:33:05 -06005085 " 3. Mismatch framebuffer & renderPass attachment formats\n"
5086 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
5087 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
5088 " 6. Framebuffer attachment where dimensions don't match\n"
5089 " 7. Framebuffer attachment w/o identity swizzle\n"
5090 " 8. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06005091
5092 ASSERT_NO_FATAL_FAILURE(InitState());
5093 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5094
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005095 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5096 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 "
5097 "does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06005098
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06005099 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06005100 VkAttachmentReference attach = {};
5101 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
5102 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06005103 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06005104 VkRenderPassCreateInfo rpci = {};
5105 rpci.subpassCount = 1;
5106 rpci.pSubpasses = &subpass;
5107 rpci.attachmentCount = 1;
5108 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06005109 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06005110 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06005111 rpci.pAttachments = &attach_desc;
5112 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5113 VkRenderPass rp;
5114 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5115 ASSERT_VK_SUCCESS(err);
5116
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06005117 VkImageView ivs[2];
5118 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
5119 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06005120 VkFramebufferCreateInfo fb_info = {};
5121 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
5122 fb_info.pNext = NULL;
5123 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06005124 // Set mis-matching attachmentCount
5125 fb_info.attachmentCount = 2;
5126 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06005127 fb_info.width = 100;
5128 fb_info.height = 100;
5129 fb_info.layers = 1;
5130
5131 VkFramebuffer fb;
5132 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
5133
5134 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06005135 if (err == VK_SUCCESS) {
5136 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5137 }
5138 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06005139
5140 // Create a renderPass with a depth-stencil attachment created with
5141 // IMAGE_USAGE_COLOR_ATTACHMENT
5142 // Add our color attachment to pDepthStencilAttachment
5143 subpass.pDepthStencilAttachment = &attach;
5144 subpass.pColorAttachments = NULL;
5145 VkRenderPass rp_ds;
5146 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
5147 ASSERT_VK_SUCCESS(err);
5148 // Set correct attachment count, but attachment has COLOR usage bit set
5149 fb_info.attachmentCount = 1;
5150 fb_info.renderPass = rp_ds;
5151
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005152 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " conflicts with the image's IMAGE_USAGE flags ");
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06005153 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
5154
5155 m_errorMonitor->VerifyFound();
5156 if (err == VK_SUCCESS) {
5157 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5158 }
5159 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06005160
5161 // Create new renderpass with alternate attachment format from fb
5162 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
5163 subpass.pDepthStencilAttachment = NULL;
5164 subpass.pColorAttachments = &attach;
5165 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5166 ASSERT_VK_SUCCESS(err);
5167
5168 // Cause error due to mis-matched formats between rp & fb
5169 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
5170 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5172 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06005173 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
5174
5175 m_errorMonitor->VerifyFound();
5176 if (err == VK_SUCCESS) {
5177 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5178 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06005179 vkDestroyRenderPass(m_device->device(), rp, NULL);
5180
5181 // Create new renderpass with alternate sample count from fb
5182 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
5183 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
5184 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5185 ASSERT_VK_SUCCESS(err);
5186
5187 // Cause error due to mis-matched sample count between rp & fb
5188 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005189 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has VK_SAMPLE_COUNT_1_BIT samples "
5190 "that do not match the "
5191 "VK_SAMPLE_COUNT_4_BIT ");
Tobin Ehlis77d717c2016-06-22 14:19:19 -06005192 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
5193
5194 m_errorMonitor->VerifyFound();
5195 if (err == VK_SUCCESS) {
5196 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5197 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06005198
5199 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06005200
5201 // Create a custom imageView with non-1 mip levels
5202 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005203 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 -06005204 ASSERT_TRUE(image.initialized());
5205
5206 VkImageView view;
5207 VkImageViewCreateInfo ivci = {};
5208 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5209 ivci.image = image.handle();
5210 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
5211 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
5212 ivci.subresourceRange.layerCount = 1;
5213 ivci.subresourceRange.baseMipLevel = 0;
5214 // Set level count 2 (only 1 is allowed for FB attachment)
5215 ivci.subresourceRange.levelCount = 2;
5216 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5217 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
5218 ASSERT_VK_SUCCESS(err);
5219 // Re-create renderpass to have matching sample count
5220 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
5221 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5222 ASSERT_VK_SUCCESS(err);
5223
5224 fb_info.renderPass = rp;
5225 fb_info.pAttachments = &view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005226 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has mip levelCount of 2 but only ");
Tobin Ehlis6cfda642016-06-22 16:12:58 -06005227 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
5228
5229 m_errorMonitor->VerifyFound();
5230 if (err == VK_SUCCESS) {
5231 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5232 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06005233 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06005234 // Update view to original color buffer and grow FB dimensions too big
5235 fb_info.pAttachments = ivs;
5236 fb_info.height = 1024;
5237 fb_info.width = 1024;
5238 fb_info.layers = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005239 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " Attachment dimensions must be at "
5240 "least as large. ");
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06005241 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
5242
5243 m_errorMonitor->VerifyFound();
5244 if (err == VK_SUCCESS) {
5245 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5246 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06005247 // Create view attachment with non-identity swizzle
5248 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5249 ivci.image = image.handle();
5250 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
5251 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
5252 ivci.subresourceRange.layerCount = 1;
5253 ivci.subresourceRange.baseMipLevel = 0;
5254 ivci.subresourceRange.levelCount = 1;
5255 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5256 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
5257 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
5258 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
5259 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
5260 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
5261 ASSERT_VK_SUCCESS(err);
5262
5263 fb_info.pAttachments = &view;
5264 fb_info.height = 100;
5265 fb_info.width = 100;
5266 fb_info.layers = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005267 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has non-identy swizzle. All "
5268 "framebuffer attachments must have "
5269 "been created with the identity "
5270 "swizzle. ");
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06005271 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
5272
5273 m_errorMonitor->VerifyFound();
5274 if (err == VK_SUCCESS) {
5275 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5276 }
5277 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06005278 // Request fb that exceeds max dimensions
5279 // reset attachment to color attachment
5280 fb_info.pAttachments = ivs;
5281 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
5282 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
5283 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005284 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " Requested VkFramebufferCreateInfo "
5285 "dimensions exceed physical device "
5286 "limits. ");
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06005287 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
5288
5289 m_errorMonitor->VerifyFound();
5290 if (err == VK_SUCCESS) {
5291 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5292 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06005293
Tobin Ehlis6cfda642016-06-22 16:12:58 -06005294 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06005295}
5296
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005297// This is a positive test. No errors should be generated.
Michael Lentine860b0fe2016-05-20 10:14:00 -05005298TEST_F(VkLayerTest, WaitEventThenSet) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005299 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
Michael Lentine860b0fe2016-05-20 10:14:00 -05005300
Michael Lentine860b0fe2016-05-20 10:14:00 -05005301 m_errorMonitor->ExpectSuccess();
Cody Northropc31a84f2016-08-22 10:41:47 -06005302 ASSERT_NO_FATAL_FAILURE(InitState());
Michael Lentine860b0fe2016-05-20 10:14:00 -05005303
5304 VkEvent event;
5305 VkEventCreateInfo event_create_info{};
5306 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5307 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
5308
5309 VkCommandPool command_pool;
5310 VkCommandPoolCreateInfo pool_create_info{};
5311 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5312 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5313 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005314 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
Michael Lentine860b0fe2016-05-20 10:14:00 -05005315
5316 VkCommandBuffer command_buffer;
5317 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005318 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Michael Lentine860b0fe2016-05-20 10:14:00 -05005319 command_buffer_allocate_info.commandPool = command_pool;
5320 command_buffer_allocate_info.commandBufferCount = 1;
5321 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005322 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
Michael Lentine860b0fe2016-05-20 10:14:00 -05005323
5324 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005325 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05005326
5327 {
5328 VkCommandBufferBeginInfo begin_info{};
5329 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5330 vkBeginCommandBuffer(command_buffer, &begin_info);
5331
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005332 vkCmdWaitEvents(command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
Michael Lentine860b0fe2016-05-20 10:14:00 -05005333 nullptr, 0, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005334 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Michael Lentine860b0fe2016-05-20 10:14:00 -05005335 vkEndCommandBuffer(command_buffer);
5336 }
5337 {
5338 VkSubmitInfo submit_info{};
5339 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5340 submit_info.commandBufferCount = 1;
5341 submit_info.pCommandBuffers = &command_buffer;
5342 submit_info.signalSemaphoreCount = 0;
5343 submit_info.pSignalSemaphores = nullptr;
5344 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5345 }
5346 { vkSetEvent(m_device->device(), event); }
5347
5348 vkQueueWaitIdle(queue);
5349
5350 vkDestroyEvent(m_device->device(), event, nullptr);
5351 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
5352 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5353
5354 m_errorMonitor->VerifyNotFound();
5355}
Michael Lentine5627e692016-05-20 17:45:02 -05005356// This is a positive test. No errors should be generated.
Michael Lentinef01fb382016-07-21 17:24:56 -05005357TEST_F(VkLayerTest, QueryAndCopySecondaryCommandBuffers) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005358 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
Michael Lentinef01fb382016-07-21 17:24:56 -05005359
Cody Northropc31a84f2016-08-22 10:41:47 -06005360 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005361 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
Michael Lentinef01fb382016-07-21 17:24:56 -05005362 return;
5363
5364 m_errorMonitor->ExpectSuccess();
5365
5366 VkQueryPool query_pool;
5367 VkQueryPoolCreateInfo query_pool_create_info{};
5368 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5369 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
5370 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005371 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Michael Lentinef01fb382016-07-21 17:24:56 -05005372
5373 VkCommandPool command_pool;
5374 VkCommandPoolCreateInfo pool_create_info{};
5375 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5376 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5377 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005378 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
Michael Lentinef01fb382016-07-21 17:24:56 -05005379
5380 VkCommandBuffer command_buffer;
5381 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005382 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Michael Lentinef01fb382016-07-21 17:24:56 -05005383 command_buffer_allocate_info.commandPool = command_pool;
5384 command_buffer_allocate_info.commandBufferCount = 1;
5385 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005386 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
Michael Lentinef01fb382016-07-21 17:24:56 -05005387
5388 VkCommandBuffer secondary_command_buffer;
5389 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005390 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
Michael Lentinef01fb382016-07-21 17:24:56 -05005391
5392 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005393 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
Michael Lentinef01fb382016-07-21 17:24:56 -05005394
5395 uint32_t qfi = 0;
5396 VkBufferCreateInfo buff_create_info = {};
5397 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5398 buff_create_info.size = 1024;
5399 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
5400 buff_create_info.queueFamilyIndexCount = 1;
5401 buff_create_info.pQueueFamilyIndices = &qfi;
5402
5403 VkResult err;
5404 VkBuffer buffer;
5405 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
5406 ASSERT_VK_SUCCESS(err);
5407 VkMemoryAllocateInfo mem_alloc = {};
5408 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5409 mem_alloc.pNext = NULL;
5410 mem_alloc.allocationSize = 1024;
5411 mem_alloc.memoryTypeIndex = 0;
5412
5413 VkMemoryRequirements memReqs;
5414 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005415 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Michael Lentinef01fb382016-07-21 17:24:56 -05005416 if (!pass) {
5417 vkDestroyBuffer(m_device->device(), buffer, NULL);
5418 return;
5419 }
5420
5421 VkDeviceMemory mem;
5422 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5423 ASSERT_VK_SUCCESS(err);
5424 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5425 ASSERT_VK_SUCCESS(err);
5426
5427 VkCommandBufferInheritanceInfo hinfo = {};
5428 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
5429 hinfo.renderPass = VK_NULL_HANDLE;
5430 hinfo.subpass = 0;
5431 hinfo.framebuffer = VK_NULL_HANDLE;
5432 hinfo.occlusionQueryEnable = VK_FALSE;
5433 hinfo.queryFlags = 0;
5434 hinfo.pipelineStatistics = 0;
5435
5436 {
5437 VkCommandBufferBeginInfo begin_info{};
5438 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5439 begin_info.pInheritanceInfo = &hinfo;
5440 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
5441
5442 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005443 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
Michael Lentinef01fb382016-07-21 17:24:56 -05005444
5445 vkEndCommandBuffer(secondary_command_buffer);
5446
5447 begin_info.pInheritanceInfo = nullptr;
5448 vkBeginCommandBuffer(command_buffer, &begin_info);
5449
5450 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005451 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
Michael Lentinef01fb382016-07-21 17:24:56 -05005452
5453 vkEndCommandBuffer(command_buffer);
5454 }
5455 {
5456 VkSubmitInfo submit_info{};
5457 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5458 submit_info.commandBufferCount = 1;
5459 submit_info.pCommandBuffers = &command_buffer;
5460 submit_info.signalSemaphoreCount = 0;
5461 submit_info.pSignalSemaphores = nullptr;
5462 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5463 }
5464
5465 vkQueueWaitIdle(queue);
5466
5467 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
5468 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
5469 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
5470 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5471 vkDestroyBuffer(m_device->device(), buffer, NULL);
5472 vkFreeMemory(m_device->device(), mem, NULL);
5473
5474 m_errorMonitor->VerifyNotFound();
5475}
5476
5477// This is a positive test. No errors should be generated.
Michael Lentine5627e692016-05-20 17:45:02 -05005478TEST_F(VkLayerTest, QueryAndCopyMultipleCommandBuffers) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005479 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
Michael Lentine5627e692016-05-20 17:45:02 -05005480
Cody Northropc31a84f2016-08-22 10:41:47 -06005481 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005482 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
Michael Lentine5627e692016-05-20 17:45:02 -05005483 return;
5484
5485 m_errorMonitor->ExpectSuccess();
5486
5487 VkQueryPool query_pool;
5488 VkQueryPoolCreateInfo query_pool_create_info{};
5489 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5490 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
5491 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005492 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Michael Lentine5627e692016-05-20 17:45:02 -05005493
5494 VkCommandPool command_pool;
5495 VkCommandPoolCreateInfo pool_create_info{};
5496 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5497 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5498 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005499 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
Michael Lentine5627e692016-05-20 17:45:02 -05005500
5501 VkCommandBuffer command_buffer[2];
5502 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005503 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Michael Lentine5627e692016-05-20 17:45:02 -05005504 command_buffer_allocate_info.commandPool = command_pool;
5505 command_buffer_allocate_info.commandBufferCount = 2;
5506 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005507 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
Michael Lentine5627e692016-05-20 17:45:02 -05005508
5509 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005510 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
Michael Lentine5627e692016-05-20 17:45:02 -05005511
5512 uint32_t qfi = 0;
5513 VkBufferCreateInfo buff_create_info = {};
5514 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5515 buff_create_info.size = 1024;
5516 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
5517 buff_create_info.queueFamilyIndexCount = 1;
5518 buff_create_info.pQueueFamilyIndices = &qfi;
5519
5520 VkResult err;
5521 VkBuffer buffer;
5522 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
5523 ASSERT_VK_SUCCESS(err);
5524 VkMemoryAllocateInfo mem_alloc = {};
5525 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5526 mem_alloc.pNext = NULL;
5527 mem_alloc.allocationSize = 1024;
5528 mem_alloc.memoryTypeIndex = 0;
5529
5530 VkMemoryRequirements memReqs;
5531 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005532 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Michael Lentine5627e692016-05-20 17:45:02 -05005533 if (!pass) {
5534 vkDestroyBuffer(m_device->device(), buffer, NULL);
5535 return;
5536 }
5537
5538 VkDeviceMemory mem;
5539 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5540 ASSERT_VK_SUCCESS(err);
5541 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5542 ASSERT_VK_SUCCESS(err);
5543
5544 {
5545 VkCommandBufferBeginInfo begin_info{};
5546 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5547 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5548
5549 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005550 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
Michael Lentine5627e692016-05-20 17:45:02 -05005551
5552 vkEndCommandBuffer(command_buffer[0]);
5553
5554 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5555
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005556 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
Michael Lentine5627e692016-05-20 17:45:02 -05005557
5558 vkEndCommandBuffer(command_buffer[1]);
5559 }
5560 {
5561 VkSubmitInfo submit_info{};
5562 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5563 submit_info.commandBufferCount = 2;
5564 submit_info.pCommandBuffers = command_buffer;
5565 submit_info.signalSemaphoreCount = 0;
5566 submit_info.pSignalSemaphores = nullptr;
5567 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5568 }
5569
5570 vkQueueWaitIdle(queue);
5571
5572 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
5573 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
5574 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06005575 vkDestroyBuffer(m_device->device(), buffer, NULL);
5576 vkFreeMemory(m_device->device(), mem, NULL);
Michael Lentine5627e692016-05-20 17:45:02 -05005577
5578 m_errorMonitor->VerifyNotFound();
5579}
Michael Lentine860b0fe2016-05-20 10:14:00 -05005580
5581TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005582 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
Michael Lentine860b0fe2016-05-20 10:14:00 -05005583
Michael Lentine860b0fe2016-05-20 10:14:00 -05005584 m_errorMonitor->ExpectSuccess();
5585
Cody Northropc31a84f2016-08-22 10:41:47 -06005586 ASSERT_NO_FATAL_FAILURE(InitState());
Michael Lentine860b0fe2016-05-20 10:14:00 -05005587 VkEvent event;
5588 VkEventCreateInfo event_create_info{};
5589 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5590 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
5591
5592 VkCommandPool command_pool;
5593 VkCommandPoolCreateInfo pool_create_info{};
5594 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5595 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5596 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005597 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
Michael Lentine860b0fe2016-05-20 10:14:00 -05005598
5599 VkCommandBuffer command_buffer;
5600 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005601 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Michael Lentine860b0fe2016-05-20 10:14:00 -05005602 command_buffer_allocate_info.commandPool = command_pool;
5603 command_buffer_allocate_info.commandBufferCount = 1;
5604 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005605 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
Michael Lentine860b0fe2016-05-20 10:14:00 -05005606
5607 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005608 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05005609
5610 {
5611 VkCommandBufferBeginInfo begin_info{};
5612 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5613 vkBeginCommandBuffer(command_buffer, &begin_info);
5614
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005615 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
5616 vkCmdWaitEvents(command_buffer, 1, &event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
5617 nullptr, 0, nullptr, 0, nullptr);
Michael Lentine860b0fe2016-05-20 10:14:00 -05005618 vkEndCommandBuffer(command_buffer);
5619 }
5620 {
5621 VkSubmitInfo submit_info{};
5622 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5623 submit_info.commandBufferCount = 1;
5624 submit_info.pCommandBuffers = &command_buffer;
5625 submit_info.signalSemaphoreCount = 0;
5626 submit_info.pSignalSemaphores = nullptr;
5627 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5628 }
5629 {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005630 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is already in use by a "
5631 "command buffer.");
Michael Lentine860b0fe2016-05-20 10:14:00 -05005632 vkSetEvent(m_device->device(), event);
5633 m_errorMonitor->VerifyFound();
5634 }
5635
5636 vkQueueWaitIdle(queue);
5637
5638 vkDestroyEvent(m_device->device(), event, nullptr);
5639 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
5640 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5641}
5642
5643// This is a positive test. No errors should be generated.
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005644TEST_F(VkLayerTest, TwoFencesThreeFrames) {
5645 TEST_DESCRIPTION("Two command buffers with two separate fences are each "
5646 "run through a Submit & WaitForFences cycle 3 times. This "
5647 "previously revealed a bug so running this positive test "
5648 "to prevent a regression.");
5649 m_errorMonitor->ExpectSuccess();
5650
5651 ASSERT_NO_FATAL_FAILURE(InitState());
5652 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005653 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005654
5655 static const uint32_t NUM_OBJECTS = 2;
5656 static const uint32_t NUM_FRAMES = 3;
5657 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
5658 VkFence fences[NUM_OBJECTS] = {};
5659
5660 VkCommandPool cmd_pool;
5661 VkCommandPoolCreateInfo cmd_pool_ci = {};
5662 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5663 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
5664 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005665 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005666 ASSERT_VK_SUCCESS(err);
5667
5668 VkCommandBufferAllocateInfo cmd_buf_info = {};
5669 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5670 cmd_buf_info.commandPool = cmd_pool;
5671 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5672 cmd_buf_info.commandBufferCount = 1;
5673
5674 VkFenceCreateInfo fence_ci = {};
5675 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5676 fence_ci.pNext = nullptr;
5677 fence_ci.flags = 0;
5678
5679 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005680 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005681 ASSERT_VK_SUCCESS(err);
5682 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
5683 ASSERT_VK_SUCCESS(err);
5684 }
5685
5686 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
Tobin Ehlisf9025162016-05-26 06:55:21 -06005687 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
5688 // Create empty cmd buffer
5689 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
5690 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005691
Tobin Ehlisf9025162016-05-26 06:55:21 -06005692 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
5693 ASSERT_VK_SUCCESS(err);
5694 err = vkEndCommandBuffer(cmd_buffers[obj]);
5695 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005696
Tobin Ehlisf9025162016-05-26 06:55:21 -06005697 VkSubmitInfo submit_info = {};
5698 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5699 submit_info.commandBufferCount = 1;
5700 submit_info.pCommandBuffers = &cmd_buffers[obj];
5701 // Submit cmd buffer and wait for fence
5702 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
5703 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005704 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
Tobin Ehlisf9025162016-05-26 06:55:21 -06005705 ASSERT_VK_SUCCESS(err);
5706 err = vkResetFences(m_device->device(), 1, &fences[obj]);
5707 ASSERT_VK_SUCCESS(err);
5708 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005709 }
5710 m_errorMonitor->VerifyNotFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06005711 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
5712 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
5713 vkDestroyFence(m_device->device(), fences[i], nullptr);
5714 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005715}
5716// This is a positive test. No errors should be generated.
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005717TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
5718
5719 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005720 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005721
Cody Northropc31a84f2016-08-22 10:41:47 -06005722 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005723 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005724 return;
5725
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005726 m_errorMonitor->ExpectSuccess();
5727
5728 VkSemaphore semaphore;
5729 VkSemaphoreCreateInfo semaphore_create_info{};
5730 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005731 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005732
5733 VkCommandPool command_pool;
5734 VkCommandPoolCreateInfo pool_create_info{};
5735 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5736 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5737 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005738 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005739
5740 VkCommandBuffer command_buffer[2];
5741 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005742 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005743 command_buffer_allocate_info.commandPool = command_pool;
5744 command_buffer_allocate_info.commandBufferCount = 2;
5745 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005746 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005747
5748 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005749 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005750
5751 {
5752 VkCommandBufferBeginInfo begin_info{};
5753 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5754 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5755
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005756 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
5757 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005758
5759 VkViewport viewport{};
5760 viewport.maxDepth = 1.0f;
5761 viewport.minDepth = 0.0f;
5762 viewport.width = 512;
5763 viewport.height = 512;
5764 viewport.x = 0;
5765 viewport.y = 0;
5766 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5767 vkEndCommandBuffer(command_buffer[0]);
5768 }
5769 {
5770 VkCommandBufferBeginInfo begin_info{};
5771 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5772 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5773
5774 VkViewport viewport{};
5775 viewport.maxDepth = 1.0f;
5776 viewport.minDepth = 0.0f;
5777 viewport.width = 512;
5778 viewport.height = 512;
5779 viewport.x = 0;
5780 viewport.y = 0;
5781 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5782 vkEndCommandBuffer(command_buffer[1]);
5783 }
5784 {
5785 VkSubmitInfo submit_info{};
5786 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5787 submit_info.commandBufferCount = 1;
5788 submit_info.pCommandBuffers = &command_buffer[0];
5789 submit_info.signalSemaphoreCount = 1;
5790 submit_info.pSignalSemaphores = &semaphore;
5791 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5792 }
5793 {
5794 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5795 VkSubmitInfo submit_info{};
5796 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5797 submit_info.commandBufferCount = 1;
5798 submit_info.pCommandBuffers = &command_buffer[1];
5799 submit_info.waitSemaphoreCount = 1;
5800 submit_info.pWaitSemaphores = &semaphore;
5801 submit_info.pWaitDstStageMask = flags;
5802 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5803 }
5804
5805 vkQueueWaitIdle(m_device->m_queue);
5806
5807 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005808 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005809 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5810
5811 m_errorMonitor->VerifyNotFound();
5812}
5813
5814// This is a positive test. No errors should be generated.
5815TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
5816
5817 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5818 "submitted on separate queues, the second having a fence"
5819 "followed by a QueueWaitIdle.");
5820
Cody Northropc31a84f2016-08-22 10:41:47 -06005821 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005822 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005823 return;
5824
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005825 m_errorMonitor->ExpectSuccess();
5826
5827 VkFence fence;
5828 VkFenceCreateInfo fence_create_info{};
5829 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5830 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5831
5832 VkSemaphore semaphore;
5833 VkSemaphoreCreateInfo semaphore_create_info{};
5834 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005835 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005836
5837 VkCommandPool command_pool;
5838 VkCommandPoolCreateInfo pool_create_info{};
5839 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5840 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5841 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005842 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005843
5844 VkCommandBuffer command_buffer[2];
5845 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005846 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005847 command_buffer_allocate_info.commandPool = command_pool;
5848 command_buffer_allocate_info.commandBufferCount = 2;
5849 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005850 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005851
5852 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005853 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005854
5855 {
5856 VkCommandBufferBeginInfo begin_info{};
5857 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5858 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5859
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005860 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
5861 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005862
5863 VkViewport viewport{};
5864 viewport.maxDepth = 1.0f;
5865 viewport.minDepth = 0.0f;
5866 viewport.width = 512;
5867 viewport.height = 512;
5868 viewport.x = 0;
5869 viewport.y = 0;
5870 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5871 vkEndCommandBuffer(command_buffer[0]);
5872 }
5873 {
5874 VkCommandBufferBeginInfo begin_info{};
5875 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5876 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5877
5878 VkViewport viewport{};
5879 viewport.maxDepth = 1.0f;
5880 viewport.minDepth = 0.0f;
5881 viewport.width = 512;
5882 viewport.height = 512;
5883 viewport.x = 0;
5884 viewport.y = 0;
5885 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5886 vkEndCommandBuffer(command_buffer[1]);
5887 }
5888 {
5889 VkSubmitInfo submit_info{};
5890 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5891 submit_info.commandBufferCount = 1;
5892 submit_info.pCommandBuffers = &command_buffer[0];
5893 submit_info.signalSemaphoreCount = 1;
5894 submit_info.pSignalSemaphores = &semaphore;
5895 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5896 }
5897 {
5898 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5899 VkSubmitInfo submit_info{};
5900 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5901 submit_info.commandBufferCount = 1;
5902 submit_info.pCommandBuffers = &command_buffer[1];
5903 submit_info.waitSemaphoreCount = 1;
5904 submit_info.pWaitSemaphores = &semaphore;
5905 submit_info.pWaitDstStageMask = flags;
5906 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5907 }
5908
5909 vkQueueWaitIdle(m_device->m_queue);
5910
5911 vkDestroyFence(m_device->device(), fence, nullptr);
5912 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005913 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005914 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5915
5916 m_errorMonitor->VerifyNotFound();
5917}
5918
5919// This is a positive test. No errors should be generated.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005920TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005921
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005922 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5923 "submitted on separate queues, the second having a fence"
5924 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005925
Cody Northropc31a84f2016-08-22 10:41:47 -06005926 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005927 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005928 return;
5929
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005930 m_errorMonitor->ExpectSuccess();
5931
5932 VkFence fence;
5933 VkFenceCreateInfo fence_create_info{};
5934 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5935 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5936
5937 VkSemaphore semaphore;
5938 VkSemaphoreCreateInfo semaphore_create_info{};
5939 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005940 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005941
5942 VkCommandPool command_pool;
5943 VkCommandPoolCreateInfo pool_create_info{};
5944 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5945 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5946 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005947 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005948
5949 VkCommandBuffer command_buffer[2];
5950 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005951 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005952 command_buffer_allocate_info.commandPool = command_pool;
5953 command_buffer_allocate_info.commandBufferCount = 2;
5954 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005955 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005956
5957 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005958 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005959
5960 {
5961 VkCommandBufferBeginInfo begin_info{};
5962 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5963 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5964
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005965 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
5966 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005967
5968 VkViewport viewport{};
5969 viewport.maxDepth = 1.0f;
5970 viewport.minDepth = 0.0f;
5971 viewport.width = 512;
5972 viewport.height = 512;
5973 viewport.x = 0;
5974 viewport.y = 0;
5975 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5976 vkEndCommandBuffer(command_buffer[0]);
5977 }
5978 {
5979 VkCommandBufferBeginInfo begin_info{};
5980 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5981 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5982
5983 VkViewport viewport{};
5984 viewport.maxDepth = 1.0f;
5985 viewport.minDepth = 0.0f;
5986 viewport.width = 512;
5987 viewport.height = 512;
5988 viewport.x = 0;
5989 viewport.y = 0;
5990 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5991 vkEndCommandBuffer(command_buffer[1]);
5992 }
5993 {
5994 VkSubmitInfo submit_info{};
5995 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5996 submit_info.commandBufferCount = 1;
5997 submit_info.pCommandBuffers = &command_buffer[0];
5998 submit_info.signalSemaphoreCount = 1;
5999 submit_info.pSignalSemaphores = &semaphore;
6000 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
6001 }
6002 {
6003 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6004 VkSubmitInfo submit_info{};
6005 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6006 submit_info.commandBufferCount = 1;
6007 submit_info.pCommandBuffers = &command_buffer[1];
6008 submit_info.waitSemaphoreCount = 1;
6009 submit_info.pWaitSemaphores = &semaphore;
6010 submit_info.pWaitDstStageMask = flags;
6011 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
6012 }
6013
6014 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6015 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6016
6017 vkDestroyFence(m_device->device(), fence, nullptr);
6018 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006019 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006020 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
6021
6022 m_errorMonitor->VerifyNotFound();
6023}
6024
Chris Forbes0f8126b2016-06-20 17:48:22 +12006025TEST_F(VkLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Cody Northropc31a84f2016-08-22 10:41:47 -06006026
6027 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006028 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Chris Forbes0f8126b2016-06-20 17:48:22 +12006029 printf("Test requires two queues, skipping\n");
6030 return;
6031 }
6032
6033 VkResult err;
6034
6035 m_errorMonitor->ExpectSuccess();
6036
6037 VkQueue q0 = m_device->m_queue;
6038 VkQueue q1 = nullptr;
6039 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
6040 ASSERT_NE(q1, nullptr);
6041
6042 // An (empty) command buffer. We must have work in the first submission --
6043 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006044 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Chris Forbes0f8126b2016-06-20 17:48:22 +12006045 VkCommandPool pool;
6046 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
6047 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006048 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
6049 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Chris Forbes0f8126b2016-06-20 17:48:22 +12006050 VkCommandBuffer cb;
6051 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
6052 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006053 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes0f8126b2016-06-20 17:48:22 +12006054 err = vkBeginCommandBuffer(cb, &cbbi);
6055 ASSERT_VK_SUCCESS(err);
6056 err = vkEndCommandBuffer(cb);
6057 ASSERT_VK_SUCCESS(err);
6058
6059 // A semaphore
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006060 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Chris Forbes0f8126b2016-06-20 17:48:22 +12006061 VkSemaphore s;
6062 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
6063 ASSERT_VK_SUCCESS(err);
6064
6065 // First submission, to q0
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006066 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Chris Forbes0f8126b2016-06-20 17:48:22 +12006067
6068 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
6069 ASSERT_VK_SUCCESS(err);
6070
6071 // Second submission, to q1, waiting on s
6072 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006073 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Chris Forbes0f8126b2016-06-20 17:48:22 +12006074
6075 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
6076 ASSERT_VK_SUCCESS(err);
6077
6078 // Wait for q0 idle
6079 err = vkQueueWaitIdle(q0);
6080 ASSERT_VK_SUCCESS(err);
6081
6082 // Command buffer should have been completed (it was on q0); reset the pool.
6083 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
6084
6085 m_errorMonitor->VerifyNotFound();
6086
6087 // Force device completely idle and clean up resources
6088 vkDeviceWaitIdle(m_device->device());
6089 vkDestroyCommandPool(m_device->device(), pool, nullptr);
6090 vkDestroySemaphore(m_device->device(), s, nullptr);
6091}
Chris Forbes0f8126b2016-06-20 17:48:22 +12006092
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006093// This is a positive test. No errors should be generated.
6094TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
6095
6096 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
6097 "submitted on separate queues, the second having a fence, "
6098 "followed by a WaitForFences call.");
6099
Cody Northropc31a84f2016-08-22 10:41:47 -06006100 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006101 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06006102 return;
6103
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006104 m_errorMonitor->ExpectSuccess();
6105
Cody Northropc31a84f2016-08-22 10:41:47 -06006106 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006107 VkFence fence;
6108 VkFenceCreateInfo fence_create_info{};
6109 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6110 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6111
6112 VkSemaphore semaphore;
6113 VkSemaphoreCreateInfo semaphore_create_info{};
6114 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006115 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006116
6117 VkCommandPool command_pool;
6118 VkCommandPoolCreateInfo pool_create_info{};
6119 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6120 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6121 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006122 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006123
6124 VkCommandBuffer command_buffer[2];
6125 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006126 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006127 command_buffer_allocate_info.commandPool = command_pool;
6128 command_buffer_allocate_info.commandBufferCount = 2;
6129 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006130 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006131
6132 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006133 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006134
6135 {
6136 VkCommandBufferBeginInfo begin_info{};
6137 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6138 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6139
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006140 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
6141 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006142
6143 VkViewport viewport{};
6144 viewport.maxDepth = 1.0f;
6145 viewport.minDepth = 0.0f;
6146 viewport.width = 512;
6147 viewport.height = 512;
6148 viewport.x = 0;
6149 viewport.y = 0;
6150 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6151 vkEndCommandBuffer(command_buffer[0]);
6152 }
6153 {
6154 VkCommandBufferBeginInfo begin_info{};
6155 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6156 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6157
6158 VkViewport viewport{};
6159 viewport.maxDepth = 1.0f;
6160 viewport.minDepth = 0.0f;
6161 viewport.width = 512;
6162 viewport.height = 512;
6163 viewport.x = 0;
6164 viewport.y = 0;
6165 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6166 vkEndCommandBuffer(command_buffer[1]);
6167 }
6168 {
6169 VkSubmitInfo submit_info{};
6170 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6171 submit_info.commandBufferCount = 1;
6172 submit_info.pCommandBuffers = &command_buffer[0];
6173 submit_info.signalSemaphoreCount = 1;
6174 submit_info.pSignalSemaphores = &semaphore;
6175 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
6176 }
6177 {
6178 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6179 VkSubmitInfo submit_info{};
6180 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6181 submit_info.commandBufferCount = 1;
6182 submit_info.pCommandBuffers = &command_buffer[1];
6183 submit_info.waitSemaphoreCount = 1;
6184 submit_info.pWaitSemaphores = &semaphore;
6185 submit_info.pWaitDstStageMask = flags;
6186 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
6187 }
6188
6189 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6190
6191 vkDestroyFence(m_device->device(), fence, nullptr);
6192 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006193 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006194 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
6195
6196 m_errorMonitor->VerifyNotFound();
6197}
6198
6199// This is a positive test. No errors should be generated.
6200TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
6201
6202 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
6203 "on the same queue, sharing a signal/wait semaphore, the "
6204 "second having a fence, "
6205 "followed by a WaitForFences call.");
6206
6207 m_errorMonitor->ExpectSuccess();
6208
Cody Northropc31a84f2016-08-22 10:41:47 -06006209 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006210 VkFence fence;
6211 VkFenceCreateInfo fence_create_info{};
6212 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6213 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6214
6215 VkSemaphore semaphore;
6216 VkSemaphoreCreateInfo semaphore_create_info{};
6217 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006218 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006219
6220 VkCommandPool command_pool;
6221 VkCommandPoolCreateInfo pool_create_info{};
6222 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6223 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6224 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006225 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006226
6227 VkCommandBuffer command_buffer[2];
6228 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006229 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006230 command_buffer_allocate_info.commandPool = command_pool;
6231 command_buffer_allocate_info.commandBufferCount = 2;
6232 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006233 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006234
6235 {
6236 VkCommandBufferBeginInfo begin_info{};
6237 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6238 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6239
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006240 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
6241 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006242
6243 VkViewport viewport{};
6244 viewport.maxDepth = 1.0f;
6245 viewport.minDepth = 0.0f;
6246 viewport.width = 512;
6247 viewport.height = 512;
6248 viewport.x = 0;
6249 viewport.y = 0;
6250 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6251 vkEndCommandBuffer(command_buffer[0]);
6252 }
6253 {
6254 VkCommandBufferBeginInfo begin_info{};
6255 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6256 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6257
6258 VkViewport viewport{};
6259 viewport.maxDepth = 1.0f;
6260 viewport.minDepth = 0.0f;
6261 viewport.width = 512;
6262 viewport.height = 512;
6263 viewport.x = 0;
6264 viewport.y = 0;
6265 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6266 vkEndCommandBuffer(command_buffer[1]);
6267 }
6268 {
6269 VkSubmitInfo submit_info{};
6270 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6271 submit_info.commandBufferCount = 1;
6272 submit_info.pCommandBuffers = &command_buffer[0];
6273 submit_info.signalSemaphoreCount = 1;
6274 submit_info.pSignalSemaphores = &semaphore;
6275 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6276 }
6277 {
6278 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6279 VkSubmitInfo submit_info{};
6280 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6281 submit_info.commandBufferCount = 1;
6282 submit_info.pCommandBuffers = &command_buffer[1];
6283 submit_info.waitSemaphoreCount = 1;
6284 submit_info.pWaitSemaphores = &semaphore;
6285 submit_info.pWaitDstStageMask = flags;
6286 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
6287 }
6288
6289 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6290
6291 vkDestroyFence(m_device->device(), fence, nullptr);
6292 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006293 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006294 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
6295
6296 m_errorMonitor->VerifyNotFound();
6297}
6298
6299// This is a positive test. No errors should be generated.
6300TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
6301
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006302 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
6303 "on the same queue, no fences, followed by a third QueueSubmit with NO "
6304 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006305
6306 m_errorMonitor->ExpectSuccess();
6307
Cody Northropc31a84f2016-08-22 10:41:47 -06006308 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006309 VkFence fence;
6310 VkFenceCreateInfo fence_create_info{};
6311 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6312 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6313
6314 VkCommandPool command_pool;
6315 VkCommandPoolCreateInfo pool_create_info{};
6316 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6317 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6318 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006319 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006320
6321 VkCommandBuffer command_buffer[2];
6322 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006323 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006324 command_buffer_allocate_info.commandPool = command_pool;
6325 command_buffer_allocate_info.commandBufferCount = 2;
6326 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006327 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006328
6329 {
6330 VkCommandBufferBeginInfo begin_info{};
6331 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6332 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6333
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006334 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
6335 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006336
6337 VkViewport viewport{};
6338 viewport.maxDepth = 1.0f;
6339 viewport.minDepth = 0.0f;
6340 viewport.width = 512;
6341 viewport.height = 512;
6342 viewport.x = 0;
6343 viewport.y = 0;
6344 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6345 vkEndCommandBuffer(command_buffer[0]);
6346 }
6347 {
6348 VkCommandBufferBeginInfo begin_info{};
6349 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6350 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6351
6352 VkViewport viewport{};
6353 viewport.maxDepth = 1.0f;
6354 viewport.minDepth = 0.0f;
6355 viewport.width = 512;
6356 viewport.height = 512;
6357 viewport.x = 0;
6358 viewport.y = 0;
6359 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6360 vkEndCommandBuffer(command_buffer[1]);
6361 }
6362 {
6363 VkSubmitInfo submit_info{};
6364 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6365 submit_info.commandBufferCount = 1;
6366 submit_info.pCommandBuffers = &command_buffer[0];
6367 submit_info.signalSemaphoreCount = 0;
6368 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
6369 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6370 }
6371 {
6372 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6373 VkSubmitInfo submit_info{};
6374 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6375 submit_info.commandBufferCount = 1;
6376 submit_info.pCommandBuffers = &command_buffer[1];
6377 submit_info.waitSemaphoreCount = 0;
6378 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
6379 submit_info.pWaitDstStageMask = flags;
6380 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6381 }
6382
6383 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
6384
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006385 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
Mike Stroyancd1c3e52016-06-21 09:20:01 -06006386 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006387
6388 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006389 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006390 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
6391
6392 m_errorMonitor->VerifyNotFound();
6393}
6394
6395// This is a positive test. No errors should be generated.
6396TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
6397
6398 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
6399 "on the same queue, the second having a fence, followed "
6400 "by a WaitForFences call.");
6401
6402 m_errorMonitor->ExpectSuccess();
6403
Cody Northropc31a84f2016-08-22 10:41:47 -06006404 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006405 VkFence fence;
6406 VkFenceCreateInfo fence_create_info{};
6407 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6408 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6409
6410 VkCommandPool command_pool;
6411 VkCommandPoolCreateInfo pool_create_info{};
6412 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6413 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6414 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006415 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006416
6417 VkCommandBuffer command_buffer[2];
6418 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006419 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006420 command_buffer_allocate_info.commandPool = command_pool;
6421 command_buffer_allocate_info.commandBufferCount = 2;
6422 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006423 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006424
6425 {
6426 VkCommandBufferBeginInfo begin_info{};
6427 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6428 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6429
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006430 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
6431 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006432
6433 VkViewport viewport{};
6434 viewport.maxDepth = 1.0f;
6435 viewport.minDepth = 0.0f;
6436 viewport.width = 512;
6437 viewport.height = 512;
6438 viewport.x = 0;
6439 viewport.y = 0;
6440 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6441 vkEndCommandBuffer(command_buffer[0]);
6442 }
6443 {
6444 VkCommandBufferBeginInfo begin_info{};
6445 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6446 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6447
6448 VkViewport viewport{};
6449 viewport.maxDepth = 1.0f;
6450 viewport.minDepth = 0.0f;
6451 viewport.width = 512;
6452 viewport.height = 512;
6453 viewport.x = 0;
6454 viewport.y = 0;
6455 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6456 vkEndCommandBuffer(command_buffer[1]);
6457 }
6458 {
6459 VkSubmitInfo submit_info{};
6460 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6461 submit_info.commandBufferCount = 1;
6462 submit_info.pCommandBuffers = &command_buffer[0];
6463 submit_info.signalSemaphoreCount = 0;
6464 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
6465 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6466 }
6467 {
6468 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6469 VkSubmitInfo submit_info{};
6470 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6471 submit_info.commandBufferCount = 1;
6472 submit_info.pCommandBuffers = &command_buffer[1];
6473 submit_info.waitSemaphoreCount = 0;
6474 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
6475 submit_info.pWaitDstStageMask = flags;
6476 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
6477 }
6478
6479 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6480
6481 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006482 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006483 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
6484
6485 m_errorMonitor->VerifyNotFound();
6486}
6487
6488// This is a positive test. No errors should be generated.
6489TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
6490
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006491 TEST_DESCRIPTION("Two command buffers each in a separate SubmitInfo sent in a single "
6492 "QueueSubmit call followed by a WaitForFences call.");
Cody Northropc31a84f2016-08-22 10:41:47 -06006493 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006494
6495 m_errorMonitor->ExpectSuccess();
6496
6497 VkFence fence;
6498 VkFenceCreateInfo fence_create_info{};
6499 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6500 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6501
6502 VkSemaphore semaphore;
6503 VkSemaphoreCreateInfo semaphore_create_info{};
6504 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006505 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006506
6507 VkCommandPool command_pool;
6508 VkCommandPoolCreateInfo pool_create_info{};
6509 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6510 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6511 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006512 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006513
6514 VkCommandBuffer command_buffer[2];
6515 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006516 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006517 command_buffer_allocate_info.commandPool = command_pool;
6518 command_buffer_allocate_info.commandBufferCount = 2;
6519 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006520 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006521
6522 {
6523 VkCommandBufferBeginInfo begin_info{};
6524 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6525 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6526
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006527 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
6528 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006529
6530 VkViewport viewport{};
6531 viewport.maxDepth = 1.0f;
6532 viewport.minDepth = 0.0f;
6533 viewport.width = 512;
6534 viewport.height = 512;
6535 viewport.x = 0;
6536 viewport.y = 0;
6537 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6538 vkEndCommandBuffer(command_buffer[0]);
6539 }
6540 {
6541 VkCommandBufferBeginInfo begin_info{};
6542 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6543 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6544
6545 VkViewport viewport{};
6546 viewport.maxDepth = 1.0f;
6547 viewport.minDepth = 0.0f;
6548 viewport.width = 512;
6549 viewport.height = 512;
6550 viewport.x = 0;
6551 viewport.y = 0;
6552 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6553 vkEndCommandBuffer(command_buffer[1]);
6554 }
6555 {
6556 VkSubmitInfo submit_info[2];
6557 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6558
6559 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6560 submit_info[0].pNext = NULL;
6561 submit_info[0].commandBufferCount = 1;
6562 submit_info[0].pCommandBuffers = &command_buffer[0];
6563 submit_info[0].signalSemaphoreCount = 1;
6564 submit_info[0].pSignalSemaphores = &semaphore;
6565 submit_info[0].waitSemaphoreCount = 0;
6566 submit_info[0].pWaitSemaphores = NULL;
6567 submit_info[0].pWaitDstStageMask = 0;
6568
6569 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6570 submit_info[1].pNext = NULL;
6571 submit_info[1].commandBufferCount = 1;
6572 submit_info[1].pCommandBuffers = &command_buffer[1];
6573 submit_info[1].waitSemaphoreCount = 1;
6574 submit_info[1].pWaitSemaphores = &semaphore;
6575 submit_info[1].pWaitDstStageMask = flags;
6576 submit_info[1].signalSemaphoreCount = 0;
6577 submit_info[1].pSignalSemaphores = NULL;
6578 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
6579 }
6580
6581 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6582
6583 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006584 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006585 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006586 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006587
6588 m_errorMonitor->VerifyNotFound();
6589}
6590
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006591TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006592 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Depth Bias dynamic "
6593 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006594
Cody Northropc31a84f2016-08-22 10:41:47 -06006595 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006596 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006597 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
6598 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006599 m_errorMonitor->VerifyFound();
6600}
6601
6602TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006603 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Line Width dynamic "
6604 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006605
Cody Northropc31a84f2016-08-22 10:41:47 -06006606 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006607 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006608 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
6609 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006610 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006611}
6612
6613TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006614 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Viewport dynamic "
6615 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006616
Cody Northropc31a84f2016-08-22 10:41:47 -06006617 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006618 // Dynamic viewport state
Mike Weiblen95dd0f92016-10-19 12:28:27 -06006619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006620 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006621 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006622}
6623
6624TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006625 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Scissor dynamic "
6626 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006627
Cody Northropc31a84f2016-08-22 10:41:47 -06006628 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006629 // Dynamic scissor state
Mike Weiblen95dd0f92016-10-19 12:28:27 -06006630 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006631 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006632 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006633}
6634
Cortd713fe82016-07-27 09:51:27 -07006635TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006636 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Blend Constants "
6637 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06006638
6639 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis21c88352016-05-26 06:15:45 -06006640 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006641 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6642 "Dynamic blend constants state not set for this command buffer");
6643 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06006644 m_errorMonitor->VerifyFound();
6645}
6646
6647TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006648 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Depth Bounds dynamic "
6649 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06006650
6651 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis21c88352016-05-26 06:15:45 -06006652 if (!m_device->phy().features().depthBounds) {
6653 printf("Device does not support depthBounds test; skipped.\n");
6654 return;
6655 }
6656 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006657 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6658 "Dynamic depth bounds state not set for this command buffer");
6659 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006660 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006661}
6662
6663TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006664 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Stencil Read dynamic "
6665 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06006666
6667 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006668 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006669 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6670 "Dynamic stencil read mask state not set for this command buffer");
6671 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006672 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006673}
6674
6675TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006676 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Stencil Write dynamic"
6677 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06006678
6679 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006680 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006681 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6682 "Dynamic stencil write mask state not set for this command buffer");
6683 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006684 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006685}
6686
6687TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006688 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Stencil Ref dynamic "
6689 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06006690
6691 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006692 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006693 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6694 "Dynamic stencil reference state not set for this command buffer");
6695 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006696 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06006697}
6698
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06006699TEST_F(VkLayerTest, IndexBufferNotBound) {
6700 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06006701
6702 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006703 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6704 "Index buffer object not bound to this command buffer when Indexed ");
6705 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06006706 m_errorMonitor->VerifyFound();
6707}
6708
Karl Schultz6addd812016-02-02 17:17:23 -07006709TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006710 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6711 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
6712 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006713
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006714 ASSERT_NO_FATAL_FAILURE(InitState());
6715 ASSERT_NO_FATAL_FAILURE(InitViewport());
6716 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6717
Karl Schultz6addd812016-02-02 17:17:23 -07006718 // We luck out b/c by default the framework creates CB w/ the
6719 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006720 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006721 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006722 EndCommandBuffer();
6723
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006724 // Bypass framework since it does the waits automatically
6725 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006726 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08006727 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6728 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006729 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006730 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07006731 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006732 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006733 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08006734 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006735 submit_info.pSignalSemaphores = NULL;
6736
Chris Forbes40028e22016-06-13 09:59:34 +12006737 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07006738 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006739
Karl Schultz6addd812016-02-02 17:17:23 -07006740 // Cause validation error by re-submitting cmd buffer that should only be
6741 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12006742 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006743
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006744 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006745}
6746
Karl Schultz6addd812016-02-02 17:17:23 -07006747TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006748 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07006749 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006750
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006751 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unable to allocate 1 descriptors of "
6752 "type "
6753 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006754
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006755 ASSERT_NO_FATAL_FAILURE(InitState());
6756 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006757
Karl Schultz6addd812016-02-02 17:17:23 -07006758 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
6759 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006760 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006761 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
6762 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006763
6764 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006765 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6766 ds_pool_ci.pNext = NULL;
6767 ds_pool_ci.flags = 0;
6768 ds_pool_ci.maxSets = 1;
6769 ds_pool_ci.poolSizeCount = 1;
6770 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006771
6772 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006773 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006774 ASSERT_VK_SUCCESS(err);
6775
6776 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006777 dsl_binding.binding = 0;
6778 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6779 dsl_binding.descriptorCount = 1;
6780 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6781 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006782
6783 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006784 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6785 ds_layout_ci.pNext = NULL;
6786 ds_layout_ci.bindingCount = 1;
6787 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006788
6789 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006790 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006791 ASSERT_VK_SUCCESS(err);
6792
6793 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006794 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006795 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006796 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006797 alloc_info.descriptorPool = ds_pool;
6798 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006799 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006800
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006801 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006802
Chia-I Wuf7458c52015-10-26 21:10:41 +08006803 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6804 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006805}
6806
Karl Schultz6addd812016-02-02 17:17:23 -07006807TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
6808 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06006809
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006810 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6811 "It is invalid to call vkFreeDescriptorSets() with a pool created "
6812 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006813
Tobin Ehlise735c692015-10-08 13:13:50 -06006814 ASSERT_NO_FATAL_FAILURE(InitState());
6815 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06006816
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006817 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006818 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6819 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06006820
6821 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006822 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6823 ds_pool_ci.pNext = NULL;
6824 ds_pool_ci.maxSets = 1;
6825 ds_pool_ci.poolSizeCount = 1;
6826 ds_pool_ci.flags = 0;
6827 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
6828 // app can only call vkResetDescriptorPool on this pool.;
6829 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06006830
6831 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006832 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06006833 ASSERT_VK_SUCCESS(err);
6834
6835 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006836 dsl_binding.binding = 0;
6837 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6838 dsl_binding.descriptorCount = 1;
6839 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6840 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06006841
6842 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006843 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6844 ds_layout_ci.pNext = NULL;
6845 ds_layout_ci.bindingCount = 1;
6846 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06006847
6848 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006849 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06006850 ASSERT_VK_SUCCESS(err);
6851
6852 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006853 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006854 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006855 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006856 alloc_info.descriptorPool = ds_pool;
6857 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006858 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06006859 ASSERT_VK_SUCCESS(err);
6860
6861 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006862 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06006863
Chia-I Wuf7458c52015-10-26 21:10:41 +08006864 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6865 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06006866}
6867
Karl Schultz6addd812016-02-02 17:17:23 -07006868TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006869 // Attempt to clear Descriptor Pool with bad object.
6870 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06006871
6872 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006873 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid Descriptor Pool Object 0xbaad6001");
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006874 uint64_t fake_pool_handle = 0xbaad6001;
6875 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
6876 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06006877 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006878}
6879
Karl Schultz6addd812016-02-02 17:17:23 -07006880TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006881 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
6882 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006883 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06006884 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006885
6886 uint64_t fake_set_handle = 0xbaad6001;
6887 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006888 VkResult err;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid Descriptor Set Object 0xbaad6001");
Karl Schultzbdb75952016-04-19 11:36:49 -06006890
6891 ASSERT_NO_FATAL_FAILURE(InitState());
6892
6893 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
6894 layout_bindings[0].binding = 0;
6895 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6896 layout_bindings[0].descriptorCount = 1;
6897 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
6898 layout_bindings[0].pImmutableSamplers = NULL;
6899
6900 VkDescriptorSetLayout descriptor_set_layout;
6901 VkDescriptorSetLayoutCreateInfo dslci = {};
6902 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6903 dslci.pNext = NULL;
6904 dslci.bindingCount = 1;
6905 dslci.pBindings = layout_bindings;
6906 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006907 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006908
6909 VkPipelineLayout pipeline_layout;
6910 VkPipelineLayoutCreateInfo plci = {};
6911 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6912 plci.pNext = NULL;
6913 plci.setLayoutCount = 1;
6914 plci.pSetLayouts = &descriptor_set_layout;
6915 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006916 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006917
6918 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006919 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
6920 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06006921 m_errorMonitor->VerifyFound();
6922 EndCommandBuffer();
6923 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
6924 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006925}
6926
Karl Schultz6addd812016-02-02 17:17:23 -07006927TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006928 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
6929 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006930 uint64_t fake_layout_handle = 0xbaad6001;
6931 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006932 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid Descriptor Set Layout Object 0xbaad6001");
Cody Northropc31a84f2016-08-22 10:41:47 -06006933 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultzbdb75952016-04-19 11:36:49 -06006934 VkPipelineLayout pipeline_layout;
6935 VkPipelineLayoutCreateInfo plci = {};
6936 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6937 plci.pNext = NULL;
6938 plci.setLayoutCount = 1;
6939 plci.pSetLayouts = &bad_layout;
6940 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
6941
6942 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006943}
6944
Mark Muellerd4914412016-06-13 17:52:06 -06006945TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
6946 TEST_DESCRIPTION("This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
6947 "1) A uniform buffer update must have a valid buffer index."
6948 "2) When using an array of descriptors in a single WriteDescriptor,"
6949 " the descriptor types and stageflags must all be the same."
6950 "3) Immutable Sampler state must match across descriptors");
6951
6952 const char *invalid_BufferInfo_ErrorMessage =
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006953 "vkUpdateDescriptorSets: if pDescriptorWrites[0].descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, "
6954 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or "
6955 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pDescriptorWrites[0].pBufferInfo must not be NULL";
6956 const char *stateFlag_ErrorMessage = "Attempting write update to descriptor set ";
6957 const char *immutable_ErrorMessage = "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006958
Mark Muellerd4914412016-06-13 17:52:06 -06006959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_BufferInfo_ErrorMessage);
6960
6961 ASSERT_NO_FATAL_FAILURE(InitState());
6962 VkDescriptorPoolSize ds_type_count[4] = {};
6963 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6964 ds_type_count[0].descriptorCount = 1;
6965 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6966 ds_type_count[1].descriptorCount = 1;
6967 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6968 ds_type_count[2].descriptorCount = 1;
6969 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
6970 ds_type_count[3].descriptorCount = 1;
6971
6972 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6973 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6974 ds_pool_ci.maxSets = 1;
6975 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
6976 ds_pool_ci.pPoolSizes = ds_type_count;
6977
6978 VkDescriptorPool ds_pool;
6979 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6980 ASSERT_VK_SUCCESS(err);
6981
Mark Muellerb9896722016-06-16 09:54:29 -06006982 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006983 layout_binding[0].binding = 0;
6984 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6985 layout_binding[0].descriptorCount = 1;
6986 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6987 layout_binding[0].pImmutableSamplers = NULL;
6988
6989 layout_binding[1].binding = 1;
6990 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6991 layout_binding[1].descriptorCount = 1;
6992 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6993 layout_binding[1].pImmutableSamplers = NULL;
6994
6995 VkSamplerCreateInfo sampler_ci = {};
6996 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6997 sampler_ci.pNext = NULL;
6998 sampler_ci.magFilter = VK_FILTER_NEAREST;
6999 sampler_ci.minFilter = VK_FILTER_NEAREST;
7000 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
7001 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7002 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7003 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7004 sampler_ci.mipLodBias = 1.0;
7005 sampler_ci.anisotropyEnable = VK_FALSE;
7006 sampler_ci.maxAnisotropy = 1;
7007 sampler_ci.compareEnable = VK_FALSE;
7008 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
7009 sampler_ci.minLod = 1.0;
7010 sampler_ci.maxLod = 1.0;
7011 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
7012 sampler_ci.unnormalizedCoordinates = VK_FALSE;
7013 VkSampler sampler;
7014
7015 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
7016 ASSERT_VK_SUCCESS(err);
7017
7018 layout_binding[2].binding = 2;
7019 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
7020 layout_binding[2].descriptorCount = 1;
7021 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
7022 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
7023
Mark Muellerd4914412016-06-13 17:52:06 -06007024 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7025 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7026 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
7027 ds_layout_ci.pBindings = layout_binding;
7028 VkDescriptorSetLayout ds_layout;
7029 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
7030 ASSERT_VK_SUCCESS(err);
7031
7032 VkDescriptorSetAllocateInfo alloc_info = {};
7033 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7034 alloc_info.descriptorSetCount = 1;
7035 alloc_info.descriptorPool = ds_pool;
7036 alloc_info.pSetLayouts = &ds_layout;
7037 VkDescriptorSet descriptorSet;
7038 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
7039 ASSERT_VK_SUCCESS(err);
7040
7041 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7042 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7043 pipeline_layout_ci.pNext = NULL;
7044 pipeline_layout_ci.setLayoutCount = 1;
7045 pipeline_layout_ci.pSetLayouts = &ds_layout;
7046
7047 VkPipelineLayout pipeline_layout;
7048 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
7049 ASSERT_VK_SUCCESS(err);
7050
Mark Mueller5c838ce2016-06-16 09:54:29 -06007051 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06007052 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7053 descriptor_write.dstSet = descriptorSet;
7054 descriptor_write.dstBinding = 0;
7055 descriptor_write.descriptorCount = 1;
7056 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7057
Mark Mueller5c838ce2016-06-16 09:54:29 -06007058 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06007059 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7060 m_errorMonitor->VerifyFound();
7061
7062 // Create a buffer to update the descriptor with
7063 uint32_t qfi = 0;
7064 VkBufferCreateInfo buffCI = {};
7065 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7066 buffCI.size = 1024;
7067 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7068 buffCI.queueFamilyIndexCount = 1;
7069 buffCI.pQueueFamilyIndices = &qfi;
7070
7071 VkBuffer dyub;
7072 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7073 ASSERT_VK_SUCCESS(err);
7074 VkDescriptorBufferInfo buffInfo = {};
7075 buffInfo.buffer = dyub;
7076 buffInfo.offset = 0;
7077 buffInfo.range = 1024;
7078
7079 descriptor_write.pBufferInfo = &buffInfo;
7080 descriptor_write.descriptorCount = 2;
7081
Mark Mueller5c838ce2016-06-16 09:54:29 -06007082 // 2) The stateFlags don't match between the first and second descriptor
Mark Muellerd4914412016-06-13 17:52:06 -06007083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, stateFlag_ErrorMessage);
7084 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7085 m_errorMonitor->VerifyFound();
7086
Mark Mueller5c838ce2016-06-16 09:54:29 -06007087 // 3) The second descriptor has a null_ptr pImmutableSamplers and
7088 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06007089 descriptor_write.dstBinding = 1;
7090 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06007091
Mark Mueller5c838ce2016-06-16 09:54:29 -06007092 // Make pImageInfo index non-null to avoid complaints of it missing
7093 VkDescriptorImageInfo imageInfo = {};
7094 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
7095 descriptor_write.pImageInfo = &imageInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06007096 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, immutable_ErrorMessage);
7097 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7098 m_errorMonitor->VerifyFound();
7099
Mark Muellerd4914412016-06-13 17:52:06 -06007100 vkDestroyBuffer(m_device->device(), dyub, NULL);
7101 vkDestroySampler(m_device->device(), sampler, NULL);
7102 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7103 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7104 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7105}
7106
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06007107TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
7108 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7109 "due to a buffer dependency being destroyed.");
7110 ASSERT_NO_FATAL_FAILURE(InitState());
7111
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06007112 VkBuffer buffer;
7113 VkDeviceMemory mem;
7114 VkMemoryRequirements mem_reqs;
7115
7116 VkBufferCreateInfo buf_info = {};
7117 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12007118 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06007119 buf_info.size = 256;
7120 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7121 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
7122 ASSERT_VK_SUCCESS(err);
7123
7124 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
7125
7126 VkMemoryAllocateInfo alloc_info = {};
7127 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7128 alloc_info.allocationSize = 256;
7129 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007130 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 -06007131 if (!pass) {
7132 vkDestroyBuffer(m_device->device(), buffer, NULL);
7133 return;
7134 }
7135 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
7136 ASSERT_VK_SUCCESS(err);
7137
7138 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
7139 ASSERT_VK_SUCCESS(err);
7140
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06007141 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12007142 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06007143 m_commandBuffer->EndCommandBuffer();
7144
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007145 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06007146 // Destroy buffer dependency prior to submit to cause ERROR
7147 vkDestroyBuffer(m_device->device(), buffer, NULL);
7148
7149 VkSubmitInfo submit_info = {};
7150 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7151 submit_info.commandBufferCount = 1;
7152 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7153 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7154
7155 m_errorMonitor->VerifyFound();
7156 vkFreeMemory(m_device->handle(), mem, NULL);
7157}
7158
Tobin Ehlisea413442016-09-28 10:23:59 -06007159TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
7160 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
7161
7162 ASSERT_NO_FATAL_FAILURE(InitState());
7163 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7164
7165 VkDescriptorPoolSize ds_type_count;
7166 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7167 ds_type_count.descriptorCount = 1;
7168
7169 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7170 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7171 ds_pool_ci.maxSets = 1;
7172 ds_pool_ci.poolSizeCount = 1;
7173 ds_pool_ci.pPoolSizes = &ds_type_count;
7174
7175 VkDescriptorPool ds_pool;
7176 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
7177 ASSERT_VK_SUCCESS(err);
7178
7179 VkDescriptorSetLayoutBinding layout_binding;
7180 layout_binding.binding = 0;
7181 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7182 layout_binding.descriptorCount = 1;
7183 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
7184 layout_binding.pImmutableSamplers = NULL;
7185
7186 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7187 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7188 ds_layout_ci.bindingCount = 1;
7189 ds_layout_ci.pBindings = &layout_binding;
7190 VkDescriptorSetLayout ds_layout;
7191 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
7192 ASSERT_VK_SUCCESS(err);
7193
7194 VkDescriptorSetAllocateInfo alloc_info = {};
7195 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7196 alloc_info.descriptorSetCount = 1;
7197 alloc_info.descriptorPool = ds_pool;
7198 alloc_info.pSetLayouts = &ds_layout;
7199 VkDescriptorSet descriptor_set;
7200 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
7201 ASSERT_VK_SUCCESS(err);
7202
7203 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7204 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7205 pipeline_layout_ci.pNext = NULL;
7206 pipeline_layout_ci.setLayoutCount = 1;
7207 pipeline_layout_ci.pSetLayouts = &ds_layout;
7208
7209 VkPipelineLayout pipeline_layout;
7210 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
7211 ASSERT_VK_SUCCESS(err);
7212
7213 VkBuffer buffer;
7214 uint32_t queue_family_index = 0;
7215 VkBufferCreateInfo buffer_create_info = {};
7216 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7217 buffer_create_info.size = 1024;
7218 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
7219 buffer_create_info.queueFamilyIndexCount = 1;
7220 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
7221
7222 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
7223 ASSERT_VK_SUCCESS(err);
7224
7225 VkMemoryRequirements memory_reqs;
7226 VkDeviceMemory buffer_memory;
7227
7228 VkMemoryAllocateInfo memory_info = {};
7229 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7230 memory_info.allocationSize = 0;
7231 memory_info.memoryTypeIndex = 0;
7232
7233 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
7234 memory_info.allocationSize = memory_reqs.size;
7235 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
7236 ASSERT_TRUE(pass);
7237
7238 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
7239 ASSERT_VK_SUCCESS(err);
7240 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
7241 ASSERT_VK_SUCCESS(err);
7242
7243 VkBufferView view;
7244 VkBufferViewCreateInfo bvci = {};
7245 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
7246 bvci.buffer = buffer;
7247 bvci.format = VK_FORMAT_R8_UNORM;
7248 bvci.range = VK_WHOLE_SIZE;
7249
7250 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
7251 ASSERT_VK_SUCCESS(err);
7252
7253 VkWriteDescriptorSet descriptor_write = {};
7254 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7255 descriptor_write.dstSet = descriptor_set;
7256 descriptor_write.dstBinding = 0;
7257 descriptor_write.descriptorCount = 1;
7258 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7259 descriptor_write.pTexelBufferView = &view;
7260
7261 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7262
7263 char const *vsSource = "#version 450\n"
7264 "\n"
7265 "out gl_PerVertex { \n"
7266 " vec4 gl_Position;\n"
7267 "};\n"
7268 "void main(){\n"
7269 " gl_Position = vec4(1);\n"
7270 "}\n";
7271 char const *fsSource = "#version 450\n"
7272 "\n"
7273 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
7274 "layout(location=0) out vec4 x;\n"
7275 "void main(){\n"
7276 " x = imageLoad(s, 0);\n"
7277 "}\n";
7278 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7279 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7280 VkPipelineObj pipe(m_device);
7281 pipe.AddShader(&vs);
7282 pipe.AddShader(&fs);
7283 pipe.AddColorAttachment();
7284 pipe.CreateVKPipeline(pipeline_layout, renderPass());
7285
7286 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot submit cmd buffer using deleted buffer view ");
7287 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer view ");
7288
7289 BeginCommandBuffer();
7290 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7291 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7292 VkRect2D scissor = {{0, 0}, {16, 16}};
7293 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7294 // Bind pipeline to cmd buffer
7295 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7296 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
7297 &descriptor_set, 0, nullptr);
7298 Draw(1, 0, 0, 0);
7299 EndCommandBuffer();
7300
7301 // Delete BufferView in order to invalidate cmd buffer
7302 vkDestroyBufferView(m_device->device(), view, NULL);
7303 // Now attempt submit of cmd buffer
7304 VkSubmitInfo submit_info = {};
7305 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7306 submit_info.commandBufferCount = 1;
7307 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7308 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7309 m_errorMonitor->VerifyFound();
7310
7311 // Clean-up
7312 vkDestroyBuffer(m_device->device(), buffer, NULL);
7313 vkFreeMemory(m_device->device(), buffer_memory, NULL);
7314 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7315 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7316 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7317}
7318
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007319TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
7320 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7321 "due to an image dependency being destroyed.");
7322 ASSERT_NO_FATAL_FAILURE(InitState());
7323
7324 VkImage image;
7325 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7326 VkImageCreateInfo image_create_info = {};
7327 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7328 image_create_info.pNext = NULL;
7329 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7330 image_create_info.format = tex_format;
7331 image_create_info.extent.width = 32;
7332 image_create_info.extent.height = 32;
7333 image_create_info.extent.depth = 1;
7334 image_create_info.mipLevels = 1;
7335 image_create_info.arrayLayers = 1;
7336 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7337 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007338 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007339 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007340 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007341 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06007342 // Have to bind memory to image before recording cmd in cmd buffer using it
7343 VkMemoryRequirements mem_reqs;
7344 VkDeviceMemory image_mem;
7345 bool pass;
7346 VkMemoryAllocateInfo mem_alloc = {};
7347 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7348 mem_alloc.pNext = NULL;
7349 mem_alloc.memoryTypeIndex = 0;
7350 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
7351 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007352 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06007353 ASSERT_TRUE(pass);
7354 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
7355 ASSERT_VK_SUCCESS(err);
7356 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
7357 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007358
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007359 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06007360 VkClearColorValue ccv;
7361 ccv.float32[0] = 1.0f;
7362 ccv.float32[1] = 1.0f;
7363 ccv.float32[2] = 1.0f;
7364 ccv.float32[3] = 1.0f;
7365 VkImageSubresourceRange isr = {};
7366 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06007367 isr.baseArrayLayer = 0;
7368 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06007369 isr.layerCount = 1;
7370 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007371 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007372 m_commandBuffer->EndCommandBuffer();
7373
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007374 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007375 // Destroy image dependency prior to submit to cause ERROR
7376 vkDestroyImage(m_device->device(), image, NULL);
7377
7378 VkSubmitInfo submit_info = {};
7379 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7380 submit_info.commandBufferCount = 1;
7381 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7382 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7383
7384 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06007385 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007386}
7387
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06007388TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
7389 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7390 "due to a framebuffer image dependency being destroyed.");
7391 VkFormatProperties format_properties;
7392 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007393 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
7394 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06007395 return;
7396 }
7397
7398 ASSERT_NO_FATAL_FAILURE(InitState());
7399 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7400
7401 VkImageCreateInfo image_ci = {};
7402 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7403 image_ci.pNext = NULL;
7404 image_ci.imageType = VK_IMAGE_TYPE_2D;
7405 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
7406 image_ci.extent.width = 32;
7407 image_ci.extent.height = 32;
7408 image_ci.extent.depth = 1;
7409 image_ci.mipLevels = 1;
7410 image_ci.arrayLayers = 1;
7411 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
7412 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007413 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06007414 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
7415 image_ci.flags = 0;
7416 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007417 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06007418
7419 VkMemoryRequirements memory_reqs;
7420 VkDeviceMemory image_memory;
7421 bool pass;
7422 VkMemoryAllocateInfo memory_info = {};
7423 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7424 memory_info.pNext = NULL;
7425 memory_info.allocationSize = 0;
7426 memory_info.memoryTypeIndex = 0;
7427 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
7428 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007429 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06007430 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007431 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06007432 ASSERT_VK_SUCCESS(err);
7433 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
7434 ASSERT_VK_SUCCESS(err);
7435
7436 VkImageViewCreateInfo ivci = {
7437 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
7438 nullptr,
7439 0,
7440 image,
7441 VK_IMAGE_VIEW_TYPE_2D,
7442 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007443 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06007444 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
7445 };
7446 VkImageView view;
7447 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
7448 ASSERT_VK_SUCCESS(err);
7449
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007450 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06007451 VkFramebuffer fb;
7452 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
7453 ASSERT_VK_SUCCESS(err);
7454
7455 // Just use default renderpass with our framebuffer
7456 m_renderPassBeginInfo.framebuffer = fb;
7457 // Create Null cmd buffer for submit
7458 BeginCommandBuffer();
7459 EndCommandBuffer();
7460 // Destroy image attached to framebuffer to invalidate cmd buffer
7461 vkDestroyImage(m_device->device(), image, NULL);
7462 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007463 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06007464 QueueCommandBuffer(false);
7465 m_errorMonitor->VerifyFound();
7466
7467 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
7468 vkDestroyImageView(m_device->device(), view, nullptr);
7469 vkFreeMemory(m_device->device(), image_memory, nullptr);
7470}
7471
Tobin Ehlisb329f992016-10-12 13:20:29 -06007472TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
7473 TEST_DESCRIPTION("Delete in-use framebuffer.");
7474 VkFormatProperties format_properties;
7475 VkResult err = VK_SUCCESS;
7476 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
7477
7478 ASSERT_NO_FATAL_FAILURE(InitState());
7479 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7480
7481 VkImageObj image(m_device);
7482 image.init(256, 256, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
7483 ASSERT_TRUE(image.initialized());
7484 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
7485
7486 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
7487 VkFramebuffer fb;
7488 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
7489 ASSERT_VK_SUCCESS(err);
7490
7491 // Just use default renderpass with our framebuffer
7492 m_renderPassBeginInfo.framebuffer = fb;
7493 // Create Null cmd buffer for submit
7494 BeginCommandBuffer();
7495 EndCommandBuffer();
7496 // Submit cmd buffer to put it in-flight
7497 VkSubmitInfo submit_info = {};
7498 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7499 submit_info.commandBufferCount = 1;
7500 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7501 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7502 // Destroy framebuffer while in-flight
7503 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete framebuffer 0x");
7504 vkDestroyFramebuffer(m_device->device(), fb, NULL);
7505 m_errorMonitor->VerifyFound();
7506 // Wait for queue to complete so we can safely destroy everything
7507 vkQueueWaitIdle(m_device->m_queue);
7508 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
7509}
7510
Tobin Ehlis88becd72016-09-21 14:33:41 -06007511TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
7512 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
7513 VkFormatProperties format_properties;
7514 VkResult err = VK_SUCCESS;
7515 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06007516
7517 ASSERT_NO_FATAL_FAILURE(InitState());
7518 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7519
7520 VkImageCreateInfo image_ci = {};
7521 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7522 image_ci.pNext = NULL;
7523 image_ci.imageType = VK_IMAGE_TYPE_2D;
7524 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
7525 image_ci.extent.width = 256;
7526 image_ci.extent.height = 256;
7527 image_ci.extent.depth = 1;
7528 image_ci.mipLevels = 1;
7529 image_ci.arrayLayers = 1;
7530 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
7531 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06007532 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06007533 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
7534 image_ci.flags = 0;
7535 VkImage image;
7536 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
7537
7538 VkMemoryRequirements memory_reqs;
7539 VkDeviceMemory image_memory;
7540 bool pass;
7541 VkMemoryAllocateInfo memory_info = {};
7542 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7543 memory_info.pNext = NULL;
7544 memory_info.allocationSize = 0;
7545 memory_info.memoryTypeIndex = 0;
7546 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
7547 memory_info.allocationSize = memory_reqs.size;
7548 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
7549 ASSERT_TRUE(pass);
7550 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
7551 ASSERT_VK_SUCCESS(err);
7552 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
7553 ASSERT_VK_SUCCESS(err);
7554
7555 VkImageViewCreateInfo ivci = {
7556 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
7557 nullptr,
7558 0,
7559 image,
7560 VK_IMAGE_VIEW_TYPE_2D,
7561 VK_FORMAT_B8G8R8A8_UNORM,
7562 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
7563 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
7564 };
7565 VkImageView view;
7566 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
7567 ASSERT_VK_SUCCESS(err);
7568
7569 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
7570 VkFramebuffer fb;
7571 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
7572 ASSERT_VK_SUCCESS(err);
7573
7574 // Just use default renderpass with our framebuffer
7575 m_renderPassBeginInfo.framebuffer = fb;
7576 // Create Null cmd buffer for submit
7577 BeginCommandBuffer();
7578 EndCommandBuffer();
7579 // Submit cmd buffer to put it (and attached imageView) in-flight
7580 VkSubmitInfo submit_info = {};
7581 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7582 submit_info.commandBufferCount = 1;
7583 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7584 // Submit cmd buffer to put framebuffer and children in-flight
7585 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7586 // Destroy image attached to framebuffer while in-flight
7587 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete image 0x");
7588 vkDestroyImage(m_device->device(), image, NULL);
7589 m_errorMonitor->VerifyFound();
7590 // Wait for queue to complete so we can safely destroy image and other objects
7591 vkQueueWaitIdle(m_device->m_queue);
7592 vkDestroyImage(m_device->device(), image, NULL);
7593 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
7594 vkDestroyImageView(m_device->device(), view, nullptr);
7595 vkFreeMemory(m_device->device(), image_memory, nullptr);
7596}
7597
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06007598TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007599 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06007600 ASSERT_NO_FATAL_FAILURE(InitState());
7601
7602 VkImage image;
7603 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7604 VkImageCreateInfo image_create_info = {};
7605 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7606 image_create_info.pNext = NULL;
7607 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7608 image_create_info.format = tex_format;
7609 image_create_info.extent.width = 32;
7610 image_create_info.extent.height = 32;
7611 image_create_info.extent.depth = 1;
7612 image_create_info.mipLevels = 1;
7613 image_create_info.arrayLayers = 1;
7614 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7615 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007616 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06007617 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007618 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06007619 ASSERT_VK_SUCCESS(err);
7620 // Have to bind memory to image before recording cmd in cmd buffer using it
7621 VkMemoryRequirements mem_reqs;
7622 VkDeviceMemory image_mem;
7623 bool pass;
7624 VkMemoryAllocateInfo mem_alloc = {};
7625 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7626 mem_alloc.pNext = NULL;
7627 mem_alloc.memoryTypeIndex = 0;
7628 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
7629 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007630 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06007631 ASSERT_TRUE(pass);
7632 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
7633 ASSERT_VK_SUCCESS(err);
7634
Tobin Ehlisfed999f2016-09-21 15:09:45 -06007635 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
7636 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06007637 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06007638
7639 m_commandBuffer->BeginCommandBuffer();
7640 VkClearColorValue ccv;
7641 ccv.float32[0] = 1.0f;
7642 ccv.float32[1] = 1.0f;
7643 ccv.float32[2] = 1.0f;
7644 ccv.float32[3] = 1.0f;
7645 VkImageSubresourceRange isr = {};
7646 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7647 isr.baseArrayLayer = 0;
7648 isr.baseMipLevel = 0;
7649 isr.layerCount = 1;
7650 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007651 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06007652 m_commandBuffer->EndCommandBuffer();
7653
7654 m_errorMonitor->VerifyFound();
7655 vkDestroyImage(m_device->device(), image, NULL);
7656 vkFreeMemory(m_device->device(), image_mem, nullptr);
7657}
7658
7659TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007660 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06007661 ASSERT_NO_FATAL_FAILURE(InitState());
7662
7663 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007664 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 -06007665 VK_IMAGE_TILING_OPTIMAL, 0);
7666 ASSERT_TRUE(image.initialized());
7667
7668 VkBuffer buffer;
7669 VkDeviceMemory mem;
7670 VkMemoryRequirements mem_reqs;
7671
7672 VkBufferCreateInfo buf_info = {};
7673 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12007674 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06007675 buf_info.size = 256;
7676 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7677 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
7678 ASSERT_VK_SUCCESS(err);
7679
7680 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
7681
7682 VkMemoryAllocateInfo alloc_info = {};
7683 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7684 alloc_info.allocationSize = 256;
7685 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007686 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 -06007687 if (!pass) {
7688 vkDestroyBuffer(m_device->device(), buffer, NULL);
7689 return;
7690 }
7691 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
7692 ASSERT_VK_SUCCESS(err);
7693
Tobin Ehlisfed999f2016-09-21 15:09:45 -06007694 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
7695 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06007696 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06007697 VkBufferImageCopy region = {};
7698 region.bufferRowLength = 128;
7699 region.bufferImageHeight = 128;
7700 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7701
7702 region.imageSubresource.layerCount = 1;
7703 region.imageExtent.height = 4;
7704 region.imageExtent.width = 4;
7705 region.imageExtent.depth = 1;
7706 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007707 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
7708 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06007709 m_commandBuffer->EndCommandBuffer();
7710
7711 m_errorMonitor->VerifyFound();
7712
7713 vkDestroyBuffer(m_device->device(), buffer, NULL);
7714 vkFreeMemory(m_device->handle(), mem, NULL);
7715}
7716
Tobin Ehlis85940f52016-07-07 16:57:21 -06007717TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
7718 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7719 "due to an event dependency being destroyed.");
7720 ASSERT_NO_FATAL_FAILURE(InitState());
7721
7722 VkEvent event;
7723 VkEventCreateInfo evci = {};
7724 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
7725 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
7726 ASSERT_VK_SUCCESS(result);
7727
7728 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007729 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06007730 m_commandBuffer->EndCommandBuffer();
7731
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007732 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06007733 // Destroy event dependency prior to submit to cause ERROR
7734 vkDestroyEvent(m_device->device(), event, NULL);
7735
7736 VkSubmitInfo submit_info = {};
7737 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7738 submit_info.commandBufferCount = 1;
7739 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7740 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7741
7742 m_errorMonitor->VerifyFound();
7743}
7744
Tobin Ehlisdbea7552016-07-08 14:33:31 -06007745TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
7746 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7747 "due to a query pool dependency being destroyed.");
7748 ASSERT_NO_FATAL_FAILURE(InitState());
7749
7750 VkQueryPool query_pool;
7751 VkQueryPoolCreateInfo qpci{};
7752 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
7753 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
7754 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007755 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06007756 ASSERT_VK_SUCCESS(result);
7757
7758 m_commandBuffer->BeginCommandBuffer();
7759 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
7760 m_commandBuffer->EndCommandBuffer();
7761
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007762 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound query pool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06007763 // Destroy query pool dependency prior to submit to cause ERROR
7764 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
7765
7766 VkSubmitInfo submit_info = {};
7767 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7768 submit_info.commandBufferCount = 1;
7769 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7770 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7771
7772 m_errorMonitor->VerifyFound();
7773}
7774
Tobin Ehlis24130d92016-07-08 15:50:53 -06007775TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
7776 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7777 "due to a pipeline dependency being destroyed.");
7778 ASSERT_NO_FATAL_FAILURE(InitState());
7779 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7780
7781 VkResult err;
7782
7783 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7784 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7785
7786 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007787 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06007788 ASSERT_VK_SUCCESS(err);
7789
7790 VkPipelineViewportStateCreateInfo vp_state_ci = {};
7791 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7792 vp_state_ci.viewportCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007793 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06007794 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06007795 vp_state_ci.scissorCount = 1;
7796 VkRect2D scissors = {}; // Dummy scissors to point to
7797 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06007798
7799 VkPipelineShaderStageCreateInfo shaderStages[2];
7800 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7801
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007802 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7803 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
7804 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06007805 shaderStages[0] = vs.GetStageCreateInfo();
7806 shaderStages[1] = fs.GetStageCreateInfo();
7807
7808 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7809 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7810
7811 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7812 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7813 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7814
7815 VkPipelineRasterizationStateCreateInfo rs_ci = {};
7816 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12007817 rs_ci.rasterizerDiscardEnable = true;
7818 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06007819
7820 VkPipelineColorBlendAttachmentState att = {};
7821 att.blendEnable = VK_FALSE;
7822 att.colorWriteMask = 0xf;
7823
7824 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7825 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7826 cb_ci.attachmentCount = 1;
7827 cb_ci.pAttachments = &att;
7828
7829 VkGraphicsPipelineCreateInfo gp_ci = {};
7830 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7831 gp_ci.stageCount = 2;
7832 gp_ci.pStages = shaderStages;
7833 gp_ci.pVertexInputState = &vi_ci;
7834 gp_ci.pInputAssemblyState = &ia_ci;
7835 gp_ci.pViewportState = &vp_state_ci;
7836 gp_ci.pRasterizationState = &rs_ci;
7837 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06007838 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7839 gp_ci.layout = pipeline_layout;
7840 gp_ci.renderPass = renderPass();
7841
7842 VkPipelineCacheCreateInfo pc_ci = {};
7843 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7844
7845 VkPipeline pipeline;
7846 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007847 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06007848 ASSERT_VK_SUCCESS(err);
7849
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007850 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06007851 ASSERT_VK_SUCCESS(err);
7852
7853 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007854 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06007855 m_commandBuffer->EndCommandBuffer();
7856 // Now destroy pipeline in order to cause error when submitting
7857 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
7858
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007859 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06007860
7861 VkSubmitInfo submit_info = {};
7862 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7863 submit_info.commandBufferCount = 1;
7864 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7865 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7866
7867 m_errorMonitor->VerifyFound();
7868 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7869 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7870}
7871
Tobin Ehlis31289162016-08-17 14:57:58 -06007872TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
7873 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7874 "due to a bound descriptor set with a buffer dependency "
7875 "being destroyed.");
7876 ASSERT_NO_FATAL_FAILURE(InitState());
7877 ASSERT_NO_FATAL_FAILURE(InitViewport());
7878 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7879
7880 VkDescriptorPoolSize ds_type_count = {};
7881 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7882 ds_type_count.descriptorCount = 1;
7883
7884 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7885 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7886 ds_pool_ci.pNext = NULL;
7887 ds_pool_ci.maxSets = 1;
7888 ds_pool_ci.poolSizeCount = 1;
7889 ds_pool_ci.pPoolSizes = &ds_type_count;
7890
7891 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007892 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06007893 ASSERT_VK_SUCCESS(err);
7894
7895 VkDescriptorSetLayoutBinding dsl_binding = {};
7896 dsl_binding.binding = 0;
7897 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7898 dsl_binding.descriptorCount = 1;
7899 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7900 dsl_binding.pImmutableSamplers = NULL;
7901
7902 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7903 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7904 ds_layout_ci.pNext = NULL;
7905 ds_layout_ci.bindingCount = 1;
7906 ds_layout_ci.pBindings = &dsl_binding;
7907 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007908 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06007909 ASSERT_VK_SUCCESS(err);
7910
7911 VkDescriptorSet descriptorSet;
7912 VkDescriptorSetAllocateInfo alloc_info = {};
7913 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7914 alloc_info.descriptorSetCount = 1;
7915 alloc_info.descriptorPool = ds_pool;
7916 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007917 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06007918 ASSERT_VK_SUCCESS(err);
7919
7920 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7921 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7922 pipeline_layout_ci.pNext = NULL;
7923 pipeline_layout_ci.setLayoutCount = 1;
7924 pipeline_layout_ci.pSetLayouts = &ds_layout;
7925
7926 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007927 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06007928 ASSERT_VK_SUCCESS(err);
7929
7930 // Create a buffer to update the descriptor with
7931 uint32_t qfi = 0;
7932 VkBufferCreateInfo buffCI = {};
7933 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7934 buffCI.size = 1024;
7935 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7936 buffCI.queueFamilyIndexCount = 1;
7937 buffCI.pQueueFamilyIndices = &qfi;
7938
7939 VkBuffer buffer;
7940 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
7941 ASSERT_VK_SUCCESS(err);
7942 // Allocate memory and bind to buffer so we can make it to the appropriate
7943 // error
7944 VkMemoryAllocateInfo mem_alloc = {};
7945 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7946 mem_alloc.pNext = NULL;
7947 mem_alloc.allocationSize = 1024;
7948 mem_alloc.memoryTypeIndex = 0;
7949
7950 VkMemoryRequirements memReqs;
7951 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007952 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06007953 if (!pass) {
7954 vkDestroyBuffer(m_device->device(), buffer, NULL);
7955 return;
7956 }
7957
7958 VkDeviceMemory mem;
7959 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
7960 ASSERT_VK_SUCCESS(err);
7961 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
7962 ASSERT_VK_SUCCESS(err);
7963 // Correctly update descriptor to avoid "NOT_UPDATED" error
7964 VkDescriptorBufferInfo buffInfo = {};
7965 buffInfo.buffer = buffer;
7966 buffInfo.offset = 0;
7967 buffInfo.range = 1024;
7968
7969 VkWriteDescriptorSet descriptor_write;
7970 memset(&descriptor_write, 0, sizeof(descriptor_write));
7971 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7972 descriptor_write.dstSet = descriptorSet;
7973 descriptor_write.dstBinding = 0;
7974 descriptor_write.descriptorCount = 1;
7975 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7976 descriptor_write.pBufferInfo = &buffInfo;
7977
7978 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7979
7980 // Create PSO to be used for draw-time errors below
7981 char const *vsSource = "#version 450\n"
7982 "\n"
7983 "out gl_PerVertex { \n"
7984 " vec4 gl_Position;\n"
7985 "};\n"
7986 "void main(){\n"
7987 " gl_Position = vec4(1);\n"
7988 "}\n";
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007989 char const *fsSource = "#version 450\n"
7990 "\n"
7991 "layout(location=0) out vec4 x;\n"
7992 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7993 "void main(){\n"
7994 " x = vec4(bar.y);\n"
7995 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06007996 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7997 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7998 VkPipelineObj pipe(m_device);
7999 pipe.AddShader(&vs);
8000 pipe.AddShader(&fs);
8001 pipe.AddColorAttachment();
8002 pipe.CreateVKPipeline(pipeline_layout, renderPass());
8003
8004 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008005 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
8006 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
8007 &descriptorSet, 0, NULL);
Tobin Ehlis31289162016-08-17 14:57:58 -06008008 Draw(1, 0, 0, 0);
8009 EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06008011 // Destroy buffer should invalidate the cmd buffer, causing error on submit
8012 vkDestroyBuffer(m_device->device(), buffer, NULL);
8013 // Attempt to submit cmd buffer
8014 VkSubmitInfo submit_info = {};
8015 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
8016 submit_info.commandBufferCount = 1;
8017 submit_info.pCommandBuffers = &m_commandBuffer->handle();
8018 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
8019 m_errorMonitor->VerifyFound();
8020 // Cleanup
8021 vkFreeMemory(m_device->device(), mem, NULL);
8022
8023 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8024 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8025 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
8026}
8027
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06008028TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
8029 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
8030 "due to a bound descriptor sets with a combined image "
8031 "sampler having their image, sampler, and descriptor set "
8032 "each respectively destroyed and then attempting to "
Mark Mueller917f6bc2016-08-30 10:57:19 -06008033 "submit associated cmd buffers. Attempt to destroy a "
8034 "DescriptorSet that is in use.");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06008035 ASSERT_NO_FATAL_FAILURE(InitState());
8036 ASSERT_NO_FATAL_FAILURE(InitViewport());
8037 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8038
8039 VkDescriptorPoolSize ds_type_count = {};
8040 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
8041 ds_type_count.descriptorCount = 1;
8042
8043 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8044 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8045 ds_pool_ci.pNext = NULL;
8046 ds_pool_ci.maxSets = 1;
8047 ds_pool_ci.poolSizeCount = 1;
8048 ds_pool_ci.pPoolSizes = &ds_type_count;
8049
8050 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008051 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06008052 ASSERT_VK_SUCCESS(err);
8053
8054 VkDescriptorSetLayoutBinding dsl_binding = {};
8055 dsl_binding.binding = 0;
8056 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
8057 dsl_binding.descriptorCount = 1;
8058 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8059 dsl_binding.pImmutableSamplers = NULL;
8060
8061 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8062 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8063 ds_layout_ci.pNext = NULL;
8064 ds_layout_ci.bindingCount = 1;
8065 ds_layout_ci.pBindings = &dsl_binding;
8066 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008067 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06008068 ASSERT_VK_SUCCESS(err);
8069
8070 VkDescriptorSet descriptorSet;
8071 VkDescriptorSetAllocateInfo alloc_info = {};
8072 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8073 alloc_info.descriptorSetCount = 1;
8074 alloc_info.descriptorPool = ds_pool;
8075 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008076 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06008077 ASSERT_VK_SUCCESS(err);
8078
8079 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8080 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8081 pipeline_layout_ci.pNext = NULL;
8082 pipeline_layout_ci.setLayoutCount = 1;
8083 pipeline_layout_ci.pSetLayouts = &ds_layout;
8084
8085 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008086 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06008087 ASSERT_VK_SUCCESS(err);
8088
8089 // Create images to update the descriptor with
8090 VkImage image;
8091 VkImage image2;
8092 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8093 const int32_t tex_width = 32;
8094 const int32_t tex_height = 32;
8095 VkImageCreateInfo image_create_info = {};
8096 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8097 image_create_info.pNext = NULL;
8098 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8099 image_create_info.format = tex_format;
8100 image_create_info.extent.width = tex_width;
8101 image_create_info.extent.height = tex_height;
8102 image_create_info.extent.depth = 1;
8103 image_create_info.mipLevels = 1;
8104 image_create_info.arrayLayers = 1;
8105 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8106 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8107 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8108 image_create_info.flags = 0;
8109 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
8110 ASSERT_VK_SUCCESS(err);
8111 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
8112 ASSERT_VK_SUCCESS(err);
8113
8114 VkMemoryRequirements memory_reqs;
8115 VkDeviceMemory image_memory;
8116 bool pass;
8117 VkMemoryAllocateInfo memory_info = {};
8118 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8119 memory_info.pNext = NULL;
8120 memory_info.allocationSize = 0;
8121 memory_info.memoryTypeIndex = 0;
8122 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
8123 // Allocate enough memory for both images
8124 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008125 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06008126 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008127 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06008128 ASSERT_VK_SUCCESS(err);
8129 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
8130 ASSERT_VK_SUCCESS(err);
8131 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008132 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06008133 ASSERT_VK_SUCCESS(err);
8134
8135 VkImageViewCreateInfo image_view_create_info = {};
8136 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
8137 image_view_create_info.image = image;
8138 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8139 image_view_create_info.format = tex_format;
8140 image_view_create_info.subresourceRange.layerCount = 1;
8141 image_view_create_info.subresourceRange.baseMipLevel = 0;
8142 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008143 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06008144
8145 VkImageView view;
8146 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008147 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06008148 ASSERT_VK_SUCCESS(err);
8149 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008150 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06008151 ASSERT_VK_SUCCESS(err);
8152 // Create Samplers
8153 VkSamplerCreateInfo sampler_ci = {};
8154 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
8155 sampler_ci.pNext = NULL;
8156 sampler_ci.magFilter = VK_FILTER_NEAREST;
8157 sampler_ci.minFilter = VK_FILTER_NEAREST;
8158 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
8159 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
8160 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
8161 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
8162 sampler_ci.mipLodBias = 1.0;
8163 sampler_ci.anisotropyEnable = VK_FALSE;
8164 sampler_ci.maxAnisotropy = 1;
8165 sampler_ci.compareEnable = VK_FALSE;
8166 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
8167 sampler_ci.minLod = 1.0;
8168 sampler_ci.maxLod = 1.0;
8169 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
8170 sampler_ci.unnormalizedCoordinates = VK_FALSE;
8171 VkSampler sampler;
8172 VkSampler sampler2;
8173 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
8174 ASSERT_VK_SUCCESS(err);
8175 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
8176 ASSERT_VK_SUCCESS(err);
8177 // Update descriptor with image and sampler
8178 VkDescriptorImageInfo img_info = {};
8179 img_info.sampler = sampler;
8180 img_info.imageView = view;
8181 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
8182
8183 VkWriteDescriptorSet descriptor_write;
8184 memset(&descriptor_write, 0, sizeof(descriptor_write));
8185 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8186 descriptor_write.dstSet = descriptorSet;
8187 descriptor_write.dstBinding = 0;
8188 descriptor_write.descriptorCount = 1;
8189 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
8190 descriptor_write.pImageInfo = &img_info;
8191
8192 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8193
8194 // Create PSO to be used for draw-time errors below
8195 char const *vsSource = "#version 450\n"
8196 "\n"
8197 "out gl_PerVertex { \n"
8198 " vec4 gl_Position;\n"
8199 "};\n"
8200 "void main(){\n"
8201 " gl_Position = vec4(1);\n"
8202 "}\n";
8203 char const *fsSource = "#version 450\n"
8204 "\n"
8205 "layout(set=0, binding=0) uniform sampler2D s;\n"
8206 "layout(location=0) out vec4 x;\n"
8207 "void main(){\n"
8208 " x = texture(s, vec2(1));\n"
8209 "}\n";
8210 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8211 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8212 VkPipelineObj pipe(m_device);
8213 pipe.AddShader(&vs);
8214 pipe.AddShader(&fs);
8215 pipe.AddColorAttachment();
8216 pipe.CreateVKPipeline(pipeline_layout, renderPass());
8217
8218 // First error case is destroying sampler prior to cmd buffer submission
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot submit cmd buffer using deleted sampler ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06008220 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008221 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
8222 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
8223 &descriptorSet, 0, NULL);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06008224 Draw(1, 0, 0, 0);
8225 EndCommandBuffer();
8226 // Destroy sampler invalidates the cmd buffer, causing error on submit
8227 vkDestroySampler(m_device->device(), sampler, NULL);
8228 // Attempt to submit cmd buffer
8229 VkSubmitInfo submit_info = {};
8230 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
8231 submit_info.commandBufferCount = 1;
8232 submit_info.pCommandBuffers = &m_commandBuffer->handle();
8233 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
8234 m_errorMonitor->VerifyFound();
8235 // Now re-update descriptor with valid sampler and delete image
8236 img_info.sampler = sampler2;
8237 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008238 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06008239 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008240 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
8241 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
8242 &descriptorSet, 0, NULL);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06008243 Draw(1, 0, 0, 0);
8244 EndCommandBuffer();
8245 // Destroy image invalidates the cmd buffer, causing error on submit
8246 vkDestroyImage(m_device->device(), image, NULL);
8247 // Attempt to submit cmd buffer
8248 submit_info = {};
8249 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
8250 submit_info.commandBufferCount = 1;
8251 submit_info.pCommandBuffers = &m_commandBuffer->handle();
8252 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
8253 m_errorMonitor->VerifyFound();
8254 // Now update descriptor to be valid, but then free descriptor
8255 img_info.imageView = view2;
8256 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008257 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound descriptor set ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06008258 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008259 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
8260 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
8261 &descriptorSet, 0, NULL);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06008262 Draw(1, 0, 0, 0);
8263 EndCommandBuffer();
8264 // Destroy descriptor set invalidates the cb, causing error on submit
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008265 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06008266 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06008267 m_errorMonitor->VerifyFound();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06008268 // Attempt to submit cmd buffer
8269 submit_info = {};
8270 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
8271 submit_info.commandBufferCount = 1;
8272 submit_info.pCommandBuffers = &m_commandBuffer->handle();
8273 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
8274 m_errorMonitor->VerifyFound();
8275 // Cleanup
8276 vkFreeMemory(m_device->device(), image_memory, NULL);
8277 vkDestroySampler(m_device->device(), sampler2, NULL);
8278 vkDestroyImage(m_device->device(), image2, NULL);
8279 vkDestroyImageView(m_device->device(), view, NULL);
8280 vkDestroyImageView(m_device->device(), view2, NULL);
8281 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8282 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8283 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
8284}
8285
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06008286TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
8287 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
8288 ASSERT_NO_FATAL_FAILURE(InitState());
8289 ASSERT_NO_FATAL_FAILURE(InitViewport());
8290 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8291
8292 VkDescriptorPoolSize ds_type_count = {};
8293 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
8294 ds_type_count.descriptorCount = 1;
8295
8296 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8297 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8298 ds_pool_ci.pNext = NULL;
8299 ds_pool_ci.maxSets = 1;
8300 ds_pool_ci.poolSizeCount = 1;
8301 ds_pool_ci.pPoolSizes = &ds_type_count;
8302
8303 VkDescriptorPool ds_pool;
8304 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
8305 ASSERT_VK_SUCCESS(err);
8306
8307 VkDescriptorSetLayoutBinding dsl_binding = {};
8308 dsl_binding.binding = 0;
8309 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
8310 dsl_binding.descriptorCount = 1;
8311 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8312 dsl_binding.pImmutableSamplers = NULL;
8313
8314 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8315 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8316 ds_layout_ci.pNext = NULL;
8317 ds_layout_ci.bindingCount = 1;
8318 ds_layout_ci.pBindings = &dsl_binding;
8319 VkDescriptorSetLayout ds_layout;
8320 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
8321 ASSERT_VK_SUCCESS(err);
8322
8323 VkDescriptorSet descriptor_set;
8324 VkDescriptorSetAllocateInfo alloc_info = {};
8325 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8326 alloc_info.descriptorSetCount = 1;
8327 alloc_info.descriptorPool = ds_pool;
8328 alloc_info.pSetLayouts = &ds_layout;
8329 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
8330 ASSERT_VK_SUCCESS(err);
8331
8332 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8333 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8334 pipeline_layout_ci.pNext = NULL;
8335 pipeline_layout_ci.setLayoutCount = 1;
8336 pipeline_layout_ci.pSetLayouts = &ds_layout;
8337
8338 VkPipelineLayout pipeline_layout;
8339 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
8340 ASSERT_VK_SUCCESS(err);
8341
8342 // Create image to update the descriptor with
8343 VkImageObj image(m_device);
8344 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
8345 ASSERT_TRUE(image.initialized());
8346
8347 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
8348 // Create Sampler
8349 VkSamplerCreateInfo sampler_ci = {};
8350 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
8351 sampler_ci.pNext = NULL;
8352 sampler_ci.magFilter = VK_FILTER_NEAREST;
8353 sampler_ci.minFilter = VK_FILTER_NEAREST;
8354 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
8355 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
8356 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
8357 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
8358 sampler_ci.mipLodBias = 1.0;
8359 sampler_ci.anisotropyEnable = VK_FALSE;
8360 sampler_ci.maxAnisotropy = 1;
8361 sampler_ci.compareEnable = VK_FALSE;
8362 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
8363 sampler_ci.minLod = 1.0;
8364 sampler_ci.maxLod = 1.0;
8365 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
8366 sampler_ci.unnormalizedCoordinates = VK_FALSE;
8367 VkSampler sampler;
8368 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
8369 ASSERT_VK_SUCCESS(err);
8370 // Update descriptor with image and sampler
8371 VkDescriptorImageInfo img_info = {};
8372 img_info.sampler = sampler;
8373 img_info.imageView = view;
8374 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
8375
8376 VkWriteDescriptorSet descriptor_write;
8377 memset(&descriptor_write, 0, sizeof(descriptor_write));
8378 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8379 descriptor_write.dstSet = descriptor_set;
8380 descriptor_write.dstBinding = 0;
8381 descriptor_write.descriptorCount = 1;
8382 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
8383 descriptor_write.pImageInfo = &img_info;
8384
8385 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8386
8387 // Create PSO to be used for draw-time errors below
8388 char const *vsSource = "#version 450\n"
8389 "\n"
8390 "out gl_PerVertex { \n"
8391 " vec4 gl_Position;\n"
8392 "};\n"
8393 "void main(){\n"
8394 " gl_Position = vec4(1);\n"
8395 "}\n";
8396 char const *fsSource = "#version 450\n"
8397 "\n"
8398 "layout(set=0, binding=0) uniform sampler2D s;\n"
8399 "layout(location=0) out vec4 x;\n"
8400 "void main(){\n"
8401 " x = texture(s, vec2(1));\n"
8402 "}\n";
8403 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8404 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8405 VkPipelineObj pipe(m_device);
8406 pipe.AddShader(&vs);
8407 pipe.AddShader(&fs);
8408 pipe.AddColorAttachment();
8409 pipe.CreateVKPipeline(pipeline_layout, renderPass());
8410
8411 BeginCommandBuffer();
8412 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
8413 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
8414 &descriptor_set, 0, NULL);
8415 Draw(1, 0, 0, 0);
8416 EndCommandBuffer();
8417 // Submit cmd buffer to put pool in-flight
8418 VkSubmitInfo submit_info = {};
8419 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
8420 submit_info.commandBufferCount = 1;
8421 submit_info.pCommandBuffers = &m_commandBuffer->handle();
8422 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
8423 // Destroy pool while in-flight, causing error
8424 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete descriptor pool ");
8425 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
8426 m_errorMonitor->VerifyFound();
8427 vkQueueWaitIdle(m_device->m_queue);
8428 // Cleanup
8429 vkDestroySampler(m_device->device(), sampler, NULL);
8430 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8431 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8432 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
8433}
8434
Tobin Ehlis50a095d2016-09-21 17:32:49 -06008435TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
8436 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
8437 ASSERT_NO_FATAL_FAILURE(InitState());
8438 ASSERT_NO_FATAL_FAILURE(InitViewport());
8439 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8440
8441 VkDescriptorPoolSize ds_type_count = {};
8442 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
8443 ds_type_count.descriptorCount = 1;
8444
8445 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8446 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8447 ds_pool_ci.pNext = NULL;
8448 ds_pool_ci.maxSets = 1;
8449 ds_pool_ci.poolSizeCount = 1;
8450 ds_pool_ci.pPoolSizes = &ds_type_count;
8451
8452 VkDescriptorPool ds_pool;
8453 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
8454 ASSERT_VK_SUCCESS(err);
8455
8456 VkDescriptorSetLayoutBinding dsl_binding = {};
8457 dsl_binding.binding = 0;
8458 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
8459 dsl_binding.descriptorCount = 1;
8460 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8461 dsl_binding.pImmutableSamplers = NULL;
8462
8463 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8464 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8465 ds_layout_ci.pNext = NULL;
8466 ds_layout_ci.bindingCount = 1;
8467 ds_layout_ci.pBindings = &dsl_binding;
8468 VkDescriptorSetLayout ds_layout;
8469 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
8470 ASSERT_VK_SUCCESS(err);
8471
8472 VkDescriptorSet descriptorSet;
8473 VkDescriptorSetAllocateInfo alloc_info = {};
8474 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8475 alloc_info.descriptorSetCount = 1;
8476 alloc_info.descriptorPool = ds_pool;
8477 alloc_info.pSetLayouts = &ds_layout;
8478 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
8479 ASSERT_VK_SUCCESS(err);
8480
8481 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8482 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8483 pipeline_layout_ci.pNext = NULL;
8484 pipeline_layout_ci.setLayoutCount = 1;
8485 pipeline_layout_ci.pSetLayouts = &ds_layout;
8486
8487 VkPipelineLayout pipeline_layout;
8488 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
8489 ASSERT_VK_SUCCESS(err);
8490
8491 // Create images to update the descriptor with
8492 VkImage image;
8493 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8494 const int32_t tex_width = 32;
8495 const int32_t tex_height = 32;
8496 VkImageCreateInfo image_create_info = {};
8497 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8498 image_create_info.pNext = NULL;
8499 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8500 image_create_info.format = tex_format;
8501 image_create_info.extent.width = tex_width;
8502 image_create_info.extent.height = tex_height;
8503 image_create_info.extent.depth = 1;
8504 image_create_info.mipLevels = 1;
8505 image_create_info.arrayLayers = 1;
8506 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8507 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8508 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8509 image_create_info.flags = 0;
8510 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
8511 ASSERT_VK_SUCCESS(err);
8512 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
8513 VkMemoryRequirements memory_reqs;
8514 VkDeviceMemory image_memory;
8515 bool pass;
8516 VkMemoryAllocateInfo memory_info = {};
8517 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8518 memory_info.pNext = NULL;
8519 memory_info.allocationSize = 0;
8520 memory_info.memoryTypeIndex = 0;
8521 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
8522 // Allocate enough memory for image
8523 memory_info.allocationSize = memory_reqs.size;
8524 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
8525 ASSERT_TRUE(pass);
8526 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
8527 ASSERT_VK_SUCCESS(err);
8528 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
8529 ASSERT_VK_SUCCESS(err);
8530
8531 VkImageViewCreateInfo image_view_create_info = {};
8532 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
8533 image_view_create_info.image = image;
8534 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8535 image_view_create_info.format = tex_format;
8536 image_view_create_info.subresourceRange.layerCount = 1;
8537 image_view_create_info.subresourceRange.baseMipLevel = 0;
8538 image_view_create_info.subresourceRange.levelCount = 1;
8539 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8540
8541 VkImageView view;
8542 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
8543 ASSERT_VK_SUCCESS(err);
8544 // Create Samplers
8545 VkSamplerCreateInfo sampler_ci = {};
8546 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
8547 sampler_ci.pNext = NULL;
8548 sampler_ci.magFilter = VK_FILTER_NEAREST;
8549 sampler_ci.minFilter = VK_FILTER_NEAREST;
8550 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
8551 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
8552 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
8553 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
8554 sampler_ci.mipLodBias = 1.0;
8555 sampler_ci.anisotropyEnable = VK_FALSE;
8556 sampler_ci.maxAnisotropy = 1;
8557 sampler_ci.compareEnable = VK_FALSE;
8558 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
8559 sampler_ci.minLod = 1.0;
8560 sampler_ci.maxLod = 1.0;
8561 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
8562 sampler_ci.unnormalizedCoordinates = VK_FALSE;
8563 VkSampler sampler;
8564 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
8565 ASSERT_VK_SUCCESS(err);
8566 // Update descriptor with image and sampler
8567 VkDescriptorImageInfo img_info = {};
8568 img_info.sampler = sampler;
8569 img_info.imageView = view;
8570 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
8571
8572 VkWriteDescriptorSet descriptor_write;
8573 memset(&descriptor_write, 0, sizeof(descriptor_write));
8574 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8575 descriptor_write.dstSet = descriptorSet;
8576 descriptor_write.dstBinding = 0;
8577 descriptor_write.descriptorCount = 1;
8578 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
8579 descriptor_write.pImageInfo = &img_info;
8580 // Break memory binding and attempt update
8581 vkFreeMemory(m_device->device(), image_memory, nullptr);
8582 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06008583 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06008584 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8585 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
8586 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8587 m_errorMonitor->VerifyFound();
8588 // Cleanup
8589 vkDestroyImage(m_device->device(), image, NULL);
8590 vkDestroySampler(m_device->device(), sampler, NULL);
8591 vkDestroyImageView(m_device->device(), view, NULL);
8592 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8593 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8594 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
8595}
8596
Karl Schultz6addd812016-02-02 17:17:23 -07008597TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06008598 // Attempt to bind an invalid Pipeline to a valid Command Buffer
8599 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008600 // Create a valid cmd buffer
8601 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06008602 uint64_t fake_pipeline_handle = 0xbaad6001;
8603 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06008604 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12008605 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8606
8607 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid Pipeline Object 0xbaad6001");
Karl Schultzbdb75952016-04-19 11:36:49 -06008608 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008609 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06008610 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12008611
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06008612 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008613 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 -06008614 Draw(1, 0, 0, 0);
8615 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12008616
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06008617 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008618 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 +12008619 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06008620 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
8621 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008622}
8623
Karl Schultz6addd812016-02-02 17:17:23 -07008624TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06008625 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07008626 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008627
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008628 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008629
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008630 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06008631 ASSERT_NO_FATAL_FAILURE(InitViewport());
8632 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008633 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008634 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8635 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06008636
8637 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008638 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8639 ds_pool_ci.pNext = NULL;
8640 ds_pool_ci.maxSets = 1;
8641 ds_pool_ci.poolSizeCount = 1;
8642 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06008643
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008644 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008645 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008646 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008647
Tony Barboureb254902015-07-15 12:50:33 -06008648 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008649 dsl_binding.binding = 0;
8650 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8651 dsl_binding.descriptorCount = 1;
8652 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8653 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008654
Tony Barboureb254902015-07-15 12:50:33 -06008655 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008656 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8657 ds_layout_ci.pNext = NULL;
8658 ds_layout_ci.bindingCount = 1;
8659 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008660 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008661 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008662 ASSERT_VK_SUCCESS(err);
8663
8664 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008665 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008666 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008667 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008668 alloc_info.descriptorPool = ds_pool;
8669 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008670 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008671 ASSERT_VK_SUCCESS(err);
8672
Tony Barboureb254902015-07-15 12:50:33 -06008673 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008674 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8675 pipeline_layout_ci.pNext = NULL;
8676 pipeline_layout_ci.setLayoutCount = 1;
8677 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008678
8679 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008680 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008681 ASSERT_VK_SUCCESS(err);
8682
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008683 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06008684 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07008685 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008686 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008687
Tony Barbourc95e4ac2015-08-04 17:05:26 -06008688 VkPipelineObj pipe(m_device);
8689 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06008690 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06008691 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06008692 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06008693
8694 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008695 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
8696 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
8697 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008698
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008699 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008700
Chia-I Wuf7458c52015-10-26 21:10:41 +08008701 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8702 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8703 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008704}
8705
Karl Schultz6addd812016-02-02 17:17:23 -07008706TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07008707 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07008708 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07008709
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008710 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
8711 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07008712
8713 ASSERT_NO_FATAL_FAILURE(InitState());
8714 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008715 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
8716 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07008717
8718 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008719 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8720 ds_pool_ci.pNext = NULL;
8721 ds_pool_ci.maxSets = 1;
8722 ds_pool_ci.poolSizeCount = 1;
8723 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07008724
8725 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008726 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07008727 ASSERT_VK_SUCCESS(err);
8728
8729 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008730 dsl_binding.binding = 0;
8731 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
8732 dsl_binding.descriptorCount = 1;
8733 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8734 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07008735
8736 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008737 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8738 ds_layout_ci.pNext = NULL;
8739 ds_layout_ci.bindingCount = 1;
8740 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07008741 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008742 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07008743 ASSERT_VK_SUCCESS(err);
8744
8745 VkDescriptorSet descriptorSet;
8746 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008747 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008748 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07008749 alloc_info.descriptorPool = ds_pool;
8750 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008751 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07008752 ASSERT_VK_SUCCESS(err);
8753
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008754 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07008755 VkWriteDescriptorSet descriptor_write;
8756 memset(&descriptor_write, 0, sizeof(descriptor_write));
8757 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8758 descriptor_write.dstSet = descriptorSet;
8759 descriptor_write.dstBinding = 0;
8760 descriptor_write.descriptorCount = 1;
8761 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
8762 descriptor_write.pTexelBufferView = &view;
8763
8764 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8765
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008766 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07008767
8768 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8769 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
8770}
8771
Mark Youngd339ba32016-05-30 13:28:35 -06008772TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06008773 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 -06008774
8775 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06008776 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06008777 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06008778
8779 ASSERT_NO_FATAL_FAILURE(InitState());
8780
8781 // Create a buffer with no bound memory and then attempt to create
8782 // a buffer view.
8783 VkBufferCreateInfo buff_ci = {};
8784 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12008785 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06008786 buff_ci.size = 256;
8787 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
8788 VkBuffer buffer;
8789 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
8790 ASSERT_VK_SUCCESS(err);
8791
8792 VkBufferViewCreateInfo buff_view_ci = {};
8793 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
8794 buff_view_ci.buffer = buffer;
8795 buff_view_ci.format = VK_FORMAT_R8_UNORM;
8796 buff_view_ci.range = VK_WHOLE_SIZE;
8797 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008798 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06008799
8800 m_errorMonitor->VerifyFound();
8801 vkDestroyBuffer(m_device->device(), buffer, NULL);
8802 // If last error is success, it still created the view, so delete it.
8803 if (err == VK_SUCCESS) {
8804 vkDestroyBufferView(m_device->device(), buff_view, NULL);
8805 }
8806}
8807
Karl Schultz6addd812016-02-02 17:17:23 -07008808TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
8809 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
8810 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07008811 // 1. No dynamicOffset supplied
8812 // 2. Too many dynamicOffsets supplied
8813 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07008814 VkResult err;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008815 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " requires 1 dynamicOffsets, but only "
8816 "0 dynamicOffsets are left in "
8817 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008818
8819 ASSERT_NO_FATAL_FAILURE(InitState());
8820 ASSERT_NO_FATAL_FAILURE(InitViewport());
8821 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8822
8823 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008824 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
8825 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008826
8827 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008828 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8829 ds_pool_ci.pNext = NULL;
8830 ds_pool_ci.maxSets = 1;
8831 ds_pool_ci.poolSizeCount = 1;
8832 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008833
8834 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008835 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008836 ASSERT_VK_SUCCESS(err);
8837
8838 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008839 dsl_binding.binding = 0;
8840 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
8841 dsl_binding.descriptorCount = 1;
8842 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8843 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008844
8845 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008846 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8847 ds_layout_ci.pNext = NULL;
8848 ds_layout_ci.bindingCount = 1;
8849 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008850 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008851 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008852 ASSERT_VK_SUCCESS(err);
8853
8854 VkDescriptorSet descriptorSet;
8855 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008856 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008857 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008858 alloc_info.descriptorPool = ds_pool;
8859 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008860 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008861 ASSERT_VK_SUCCESS(err);
8862
8863 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008864 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8865 pipeline_layout_ci.pNext = NULL;
8866 pipeline_layout_ci.setLayoutCount = 1;
8867 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008868
8869 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008870 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008871 ASSERT_VK_SUCCESS(err);
8872
8873 // Create a buffer to update the descriptor with
8874 uint32_t qfi = 0;
8875 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008876 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8877 buffCI.size = 1024;
8878 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
8879 buffCI.queueFamilyIndexCount = 1;
8880 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008881
8882 VkBuffer dyub;
8883 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
8884 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06008885 // Allocate memory and bind to buffer so we can make it to the appropriate
8886 // error
8887 VkMemoryAllocateInfo mem_alloc = {};
8888 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8889 mem_alloc.pNext = NULL;
8890 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12008891 mem_alloc.memoryTypeIndex = 0;
8892
8893 VkMemoryRequirements memReqs;
8894 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008895 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12008896 if (!pass) {
8897 vkDestroyBuffer(m_device->device(), dyub, NULL);
8898 return;
8899 }
8900
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06008901 VkDeviceMemory mem;
8902 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
8903 ASSERT_VK_SUCCESS(err);
8904 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
8905 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008906 // Correctly update descriptor to avoid "NOT_UPDATED" error
8907 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008908 buffInfo.buffer = dyub;
8909 buffInfo.offset = 0;
8910 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008911
8912 VkWriteDescriptorSet descriptor_write;
8913 memset(&descriptor_write, 0, sizeof(descriptor_write));
8914 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8915 descriptor_write.dstSet = descriptorSet;
8916 descriptor_write.dstBinding = 0;
8917 descriptor_write.descriptorCount = 1;
8918 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
8919 descriptor_write.pBufferInfo = &buffInfo;
8920
8921 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8922
8923 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008924 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
8925 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008926 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07008927 uint32_t pDynOff[2] = {512, 756};
8928 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8930 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
8931 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
8932 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12008933 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07008934 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008935 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " dynamic offset 512 combined with "
8936 "offset 0 and range 1024 that "
8937 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07008938 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008939 char const *vsSource = "#version 450\n"
8940 "\n"
8941 "out gl_PerVertex { \n"
8942 " vec4 gl_Position;\n"
8943 "};\n"
8944 "void main(){\n"
8945 " gl_Position = vec4(1);\n"
8946 "}\n";
8947 char const *fsSource = "#version 450\n"
8948 "\n"
8949 "layout(location=0) out vec4 x;\n"
8950 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
8951 "void main(){\n"
8952 " x = vec4(bar.y);\n"
8953 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07008954 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8955 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8956 VkPipelineObj pipe(m_device);
8957 pipe.AddShader(&vs);
8958 pipe.AddShader(&fs);
8959 pipe.AddColorAttachment();
8960 pipe.CreateVKPipeline(pipeline_layout, renderPass());
8961
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008962 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07008963 // This update should succeed, but offset size of 512 will overstep buffer
8964 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008965 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
8966 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07008967 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008968 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008969
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06008970 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06008971 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06008972
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008973 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008974 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008975 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
8976}
8977
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06008978TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
8979 TEST_DESCRIPTION("Attempt to update a descriptor with a non-sparse buffer "
8980 "that doesn't have memory bound");
8981 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06008982 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06008983 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06008984 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8985 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06008986
8987 ASSERT_NO_FATAL_FAILURE(InitState());
8988 ASSERT_NO_FATAL_FAILURE(InitViewport());
8989 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8990
8991 VkDescriptorPoolSize ds_type_count = {};
8992 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
8993 ds_type_count.descriptorCount = 1;
8994
8995 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8996 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8997 ds_pool_ci.pNext = NULL;
8998 ds_pool_ci.maxSets = 1;
8999 ds_pool_ci.poolSizeCount = 1;
9000 ds_pool_ci.pPoolSizes = &ds_type_count;
9001
9002 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009003 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06009004 ASSERT_VK_SUCCESS(err);
9005
9006 VkDescriptorSetLayoutBinding dsl_binding = {};
9007 dsl_binding.binding = 0;
9008 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
9009 dsl_binding.descriptorCount = 1;
9010 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9011 dsl_binding.pImmutableSamplers = NULL;
9012
9013 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9014 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9015 ds_layout_ci.pNext = NULL;
9016 ds_layout_ci.bindingCount = 1;
9017 ds_layout_ci.pBindings = &dsl_binding;
9018 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009019 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06009020 ASSERT_VK_SUCCESS(err);
9021
9022 VkDescriptorSet descriptorSet;
9023 VkDescriptorSetAllocateInfo alloc_info = {};
9024 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9025 alloc_info.descriptorSetCount = 1;
9026 alloc_info.descriptorPool = ds_pool;
9027 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009028 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06009029 ASSERT_VK_SUCCESS(err);
9030
9031 // Create a buffer to update the descriptor with
9032 uint32_t qfi = 0;
9033 VkBufferCreateInfo buffCI = {};
9034 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9035 buffCI.size = 1024;
9036 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9037 buffCI.queueFamilyIndexCount = 1;
9038 buffCI.pQueueFamilyIndices = &qfi;
9039
9040 VkBuffer dyub;
9041 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
9042 ASSERT_VK_SUCCESS(err);
9043
9044 // Attempt to update descriptor without binding memory to it
9045 VkDescriptorBufferInfo buffInfo = {};
9046 buffInfo.buffer = dyub;
9047 buffInfo.offset = 0;
9048 buffInfo.range = 1024;
9049
9050 VkWriteDescriptorSet descriptor_write;
9051 memset(&descriptor_write, 0, sizeof(descriptor_write));
9052 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9053 descriptor_write.dstSet = descriptorSet;
9054 descriptor_write.dstBinding = 0;
9055 descriptor_write.descriptorCount = 1;
9056 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
9057 descriptor_write.pBufferInfo = &buffInfo;
9058
9059 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9060 m_errorMonitor->VerifyFound();
9061
9062 vkDestroyBuffer(m_device->device(), dyub, NULL);
9063 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9064 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9065}
9066
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07009067TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07009068 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07009069 ASSERT_NO_FATAL_FAILURE(InitState());
9070 ASSERT_NO_FATAL_FAILURE(InitViewport());
9071 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9072
Karl Schultzfc8eaf12016-05-06 13:56:42 -06009073 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07009074 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07009075 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
9076 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9077 pipeline_layout_ci.pushConstantRangeCount = 1;
9078 pipeline_layout_ci.pPushConstantRanges = &pc_range;
9079
Karl Schultzfc8eaf12016-05-06 13:56:42 -06009080 //
9081 // Check for invalid push constant ranges in pipeline layouts.
9082 //
9083 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06009084 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06009085 char const *msg;
9086 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07009087
Karl Schultzc81037d2016-05-12 08:11:23 -06009088 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
9089 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
9090 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
9091 "vkCreatePipelineLayout() call has push constants index 0 with "
9092 "size 0."},
9093 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
9094 "vkCreatePipelineLayout() call has push constants index 0 with "
9095 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06009096 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06009097 "vkCreatePipelineLayout() call has push constants index 0 with "
9098 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06009099 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06009100 "vkCreatePipelineLayout() call has push constants index 0 with "
9101 "size 0."},
9102 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
9103 "vkCreatePipelineLayout() call has push constants index 0 with "
9104 "offset 1. Offset must"},
9105 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
9106 "vkCreatePipelineLayout() call has push constants index 0 "
9107 "with offset "},
9108 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
9109 "vkCreatePipelineLayout() call has push constants "
9110 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06009111 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06009112 "vkCreatePipelineLayout() call has push constants index 0 "
9113 "with offset "},
9114 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
9115 "vkCreatePipelineLayout() call has push "
9116 "constants index 0 with offset "},
9117 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
9118 "vkCreatePipelineLayout() call has push "
9119 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06009120 }};
9121
9122 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06009123 for (const auto &iter : range_tests) {
9124 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009125 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
9126 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06009127 m_errorMonitor->VerifyFound();
9128 if (VK_SUCCESS == err) {
9129 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9130 }
9131 }
9132
9133 // Check for invalid stage flag
9134 pc_range.offset = 0;
9135 pc_range.size = 16;
9136 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06009137 m_errorMonitor->SetDesiredFailureMsg(
9138 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9139 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009140 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009141 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06009142 if (VK_SUCCESS == err) {
9143 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9144 }
9145
9146 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06009147 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06009148 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06009149 VkPushConstantRange const ranges[ranges_per_test];
Karl Schultzfc8eaf12016-05-06 13:56:42 -06009150 char const *msg;
9151 };
9152
Karl Schultzc81037d2016-05-12 08:11:23 -06009153 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06009154 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
9155 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
9156 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
9157 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
9158 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06009159 "vkCreatePipelineLayout() call has push constants with overlapping ranges:"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06009160 {
9161 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
9162 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
9163 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
9164 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
9165 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06009166 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 3:[12, 20), 4:[16, 20)",
Karl Schultzfc8eaf12016-05-06 13:56:42 -06009167 },
9168 {
9169 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
9170 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
9171 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
9172 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
9173 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06009174 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[16, 20), 1:[12, 20)",
Karl Schultzfc8eaf12016-05-06 13:56:42 -06009175 },
9176 {
9177 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
9178 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
9179 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
9180 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
9181 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06009182 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[16, 20), 3:[12, 20)",
Karl Schultzfc8eaf12016-05-06 13:56:42 -06009183 },
9184 {
9185 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
9186 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
9187 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
9188 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
9189 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06009190 "vkCreatePipelineLayout() call has push constants with overlapping ranges:",
Karl Schultzfc8eaf12016-05-06 13:56:42 -06009191 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06009192
Karl Schultzc81037d2016-05-12 08:11:23 -06009193 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06009194 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06009195 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009196 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, iter.msg);
9197 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06009198 m_errorMonitor->VerifyFound();
9199 if (VK_SUCCESS == err) {
9200 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9201 }
9202 }
9203
9204 // Run some positive tests to make sure overlap checking in the layer is OK
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009205 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos = {{{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
9206 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
9207 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
9208 {VK_SHADER_STAGE_VERTEX_BIT, 12, 4},
9209 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
9210 ""},
9211 {{{VK_SHADER_STAGE_VERTEX_BIT, 92, 24},
9212 {VK_SHADER_STAGE_VERTEX_BIT, 80, 4},
9213 {VK_SHADER_STAGE_VERTEX_BIT, 64, 8},
9214 {VK_SHADER_STAGE_VERTEX_BIT, 4, 16},
9215 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
9216 ""}}};
Karl Schultzc81037d2016-05-12 08:11:23 -06009217 for (const auto &iter : overlapping_range_tests_pos) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06009218 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
9219 m_errorMonitor->ExpectSuccess();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009220 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06009221 m_errorMonitor->VerifyNotFound();
9222 if (VK_SUCCESS == err) {
9223 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9224 }
9225 }
9226
9227 //
9228 // CmdPushConstants tests
9229 //
Karl Schultzc81037d2016-05-12 08:11:23 -06009230 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06009231
9232 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06009233 const std::array<PipelineLayoutTestCase, 11> cmd_range_tests = {{
9234 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0}, "vkCmdPushConstants: parameter size must be greater than 0"},
Karl Schultzc81037d2016-05-12 08:11:23 -06009235 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
9236 "vkCmdPushConstants() call has push constants with size 1. Size "
9237 "must be greater than zero and a multiple of 4."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06009238 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06009239 "vkCmdPushConstants() call has push constants with size 1. Size "
9240 "must be greater than zero and a multiple of 4."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06009241 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06009242 "vkCmdPushConstants() call has push constants with offset 1. "
9243 "Offset must be a multiple of 4."},
9244 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
9245 "vkCmdPushConstants() call has push constants with offset 1. "
9246 "Offset must be a multiple of 4."},
9247 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
9248 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
9249 "0x1 not within flag-matching ranges in pipeline layout"},
9250 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
9251 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
9252 "0x1 not within flag-matching ranges in pipeline layout"},
9253 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
9254 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
9255 "0x1 not within flag-matching ranges in pipeline layout"},
9256 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
9257 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
9258 "0x1 not within flag-matching ranges in pipeline layout"},
9259 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
9260 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
9261 "any of the ranges in pipeline layout"},
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009262 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06009263 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
9264 "any of the ranges in pipeline layout"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06009265 }};
9266
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06009267 BeginCommandBuffer();
9268
9269 // Setup ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06009270 const VkPushConstantRange pc_range2[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009271 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06009272 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009273 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06009274 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009275 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07009276 ASSERT_VK_SUCCESS(err);
Karl Schultzc81037d2016-05-12 08:11:23 -06009277 for (const auto &iter : cmd_range_tests) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009278 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
9279 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
Karl Schultzc81037d2016-05-12 08:11:23 -06009280 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06009281 m_errorMonitor->VerifyFound();
9282 }
9283
9284 // Check for invalid stage flag
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06009285 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009286 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009287 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06009288 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06009289
Karl Schultzc81037d2016-05-12 08:11:23 -06009290 // overlapping range tests with cmd
9291 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
9292 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
9293 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
9294 "0x1 not within flag-matching ranges in pipeline layout"},
9295 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
9296 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
9297 "0x1 not within flag-matching ranges in pipeline layout"},
9298 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
9299 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
9300 "0x1 not within flag-matching ranges in pipeline layout"},
9301 }};
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06009302 // Setup ranges: [0,16), [20,36), [36,44), [44,52), [80,92)
Karl Schultzc81037d2016-05-12 08:11:23 -06009303 const VkPushConstantRange pc_range3[] = {
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06009304 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
9305 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12}, {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
Karl Schultzc81037d2016-05-12 08:11:23 -06009306 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009307 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range3) / sizeof(VkPushConstantRange);
Karl Schultzc81037d2016-05-12 08:11:23 -06009308 pipeline_layout_ci.pPushConstantRanges = pc_range3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009309 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzc81037d2016-05-12 08:11:23 -06009310 ASSERT_VK_SUCCESS(err);
Karl Schultzc81037d2016-05-12 08:11:23 -06009311 for (const auto &iter : cmd_overlap_tests) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009312 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
9313 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
Karl Schultzc81037d2016-05-12 08:11:23 -06009314 iter.range.size, dummy_values);
9315 m_errorMonitor->VerifyFound();
9316 }
Karl Schultzc81037d2016-05-12 08:11:23 -06009317 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9318
9319 // positive overlapping range tests with cmd
9320 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = {{
9321 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, ""},
9322 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4}, ""},
9323 {{VK_SHADER_STAGE_VERTEX_BIT, 20, 12}, ""},
9324 {{VK_SHADER_STAGE_VERTEX_BIT, 56, 36}, ""},
9325 }};
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06009326 // Setup ranges: [0,16) [20,36) [36,44) [44,52) [56,80) [80,92)
Karl Schultzc81037d2016-05-12 08:11:23 -06009327 const VkPushConstantRange pc_range4[] = {
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06009328 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
9329 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12}, {VK_SHADER_STAGE_VERTEX_BIT, 36, 8}, {VK_SHADER_STAGE_VERTEX_BIT, 56, 24},
Karl Schultzc81037d2016-05-12 08:11:23 -06009330 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009331 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range4) / sizeof(VkPushConstantRange);
Karl Schultzc81037d2016-05-12 08:11:23 -06009332 pipeline_layout_ci.pPushConstantRanges = pc_range4;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009333 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzc81037d2016-05-12 08:11:23 -06009334 ASSERT_VK_SUCCESS(err);
Karl Schultzc81037d2016-05-12 08:11:23 -06009335 for (const auto &iter : cmd_overlap_tests_pos) {
9336 m_errorMonitor->ExpectSuccess();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009337 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
Karl Schultzc81037d2016-05-12 08:11:23 -06009338 iter.range.size, dummy_values);
9339 m_errorMonitor->VerifyNotFound();
9340 }
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07009341 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06009342
9343 EndCommandBuffer();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07009344}
9345
Karl Schultz6addd812016-02-02 17:17:23 -07009346TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07009347 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07009348 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07009349
9350 ASSERT_NO_FATAL_FAILURE(InitState());
9351 ASSERT_NO_FATAL_FAILURE(InitViewport());
9352 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9353
Mike Stroyanb8a61002016-06-20 16:00:28 -06009354 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
9355 VkImageTiling tiling;
9356 VkFormatProperties format_properties;
9357 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009358 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Mike Stroyanb8a61002016-06-20 16:00:28 -06009359 tiling = VK_IMAGE_TILING_LINEAR;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009360 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Mike Stroyanb8a61002016-06-20 16:00:28 -06009361 tiling = VK_IMAGE_TILING_OPTIMAL;
9362 } else {
9363 printf("Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
9364 "skipped.\n");
9365 return;
9366 }
9367
Tobin Ehlis559c6382015-11-05 09:52:49 -07009368 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
9369 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009370 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9371 ds_type_count[0].descriptorCount = 10;
9372 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
9373 ds_type_count[1].descriptorCount = 2;
9374 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
9375 ds_type_count[2].descriptorCount = 2;
9376 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
9377 ds_type_count[3].descriptorCount = 5;
9378 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
9379 // type
9380 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9381 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
9382 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07009383
9384 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009385 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9386 ds_pool_ci.pNext = NULL;
9387 ds_pool_ci.maxSets = 5;
9388 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
9389 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07009390
9391 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009392 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07009393 ASSERT_VK_SUCCESS(err);
9394
9395 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
9396 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009397 dsl_binding[0].binding = 0;
9398 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9399 dsl_binding[0].descriptorCount = 5;
9400 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
9401 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07009402
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009403 // Create layout identical to set0 layout but w/ different stageFlags
9404 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009405 dsl_fs_stage_only.binding = 0;
9406 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9407 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009408 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
9409 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07009410 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07009411 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009412 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9413 ds_layout_ci.pNext = NULL;
9414 ds_layout_ci.bindingCount = 1;
9415 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07009416 static const uint32_t NUM_LAYOUTS = 4;
9417 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009418 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009419 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
9420 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009421 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07009422 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07009423 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009424 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009425 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07009426 dsl_binding[0].binding = 0;
9427 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009428 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07009429 dsl_binding[1].binding = 1;
9430 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
9431 dsl_binding[1].descriptorCount = 2;
9432 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
9433 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07009434 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07009435 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009436 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07009437 ASSERT_VK_SUCCESS(err);
9438 dsl_binding[0].binding = 0;
9439 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009440 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07009441 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009442 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07009443 ASSERT_VK_SUCCESS(err);
9444 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009445 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009446 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07009447 ASSERT_VK_SUCCESS(err);
9448
9449 static const uint32_t NUM_SETS = 4;
9450 VkDescriptorSet descriptorSet[NUM_SETS] = {};
9451 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009452 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009453 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07009454 alloc_info.descriptorPool = ds_pool;
9455 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009456 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07009457 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009458 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07009459 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009460 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009461 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009462 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07009463
9464 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009465 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9466 pipeline_layout_ci.pNext = NULL;
9467 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
9468 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07009469
9470 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009471 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07009472 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009473 // Create pipelineLayout with only one setLayout
9474 pipeline_layout_ci.setLayoutCount = 1;
9475 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009476 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009477 ASSERT_VK_SUCCESS(err);
9478 // Create pipelineLayout with 2 descriptor setLayout at index 0
9479 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
9480 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009481 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009482 ASSERT_VK_SUCCESS(err);
9483 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
9484 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
9485 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009486 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009487 ASSERT_VK_SUCCESS(err);
9488 // Create pipelineLayout with UB type, but stageFlags for FS only
9489 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
9490 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009491 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009492 ASSERT_VK_SUCCESS(err);
9493 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
9494 VkDescriptorSetLayout pl_bad_s0[2] = {};
9495 pl_bad_s0[0] = ds_layout_fs_only;
9496 pl_bad_s0[1] = ds_layout[1];
9497 pipeline_layout_ci.setLayoutCount = 2;
9498 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
9499 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009500 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009501 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07009502
9503 // Create a buffer to update the descriptor with
9504 uint32_t qfi = 0;
9505 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009506 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9507 buffCI.size = 1024;
9508 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9509 buffCI.queueFamilyIndexCount = 1;
9510 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07009511
9512 VkBuffer dyub;
9513 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
9514 ASSERT_VK_SUCCESS(err);
9515 // Correctly update descriptor to avoid "NOT_UPDATED" error
9516 static const uint32_t NUM_BUFFS = 5;
9517 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009518 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07009519 buffInfo[i].buffer = dyub;
9520 buffInfo[i].offset = 0;
9521 buffInfo[i].range = 1024;
9522 }
Karl Schultz6addd812016-02-02 17:17:23 -07009523 VkImage image;
Karl Schultz6addd812016-02-02 17:17:23 -07009524 const int32_t tex_width = 32;
9525 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009526 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009527 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9528 image_create_info.pNext = NULL;
9529 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9530 image_create_info.format = tex_format;
9531 image_create_info.extent.width = tex_width;
9532 image_create_info.extent.height = tex_height;
9533 image_create_info.extent.depth = 1;
9534 image_create_info.mipLevels = 1;
9535 image_create_info.arrayLayers = 1;
9536 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyanb8a61002016-06-20 16:00:28 -06009537 image_create_info.tiling = tiling;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009538 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07009539 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009540 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
9541 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07009542
Karl Schultz6addd812016-02-02 17:17:23 -07009543 VkMemoryRequirements memReqs;
9544 VkDeviceMemory imageMem;
9545 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07009546 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009547 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9548 memAlloc.pNext = NULL;
9549 memAlloc.allocationSize = 0;
9550 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07009551 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
9552 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009553 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07009554 ASSERT_TRUE(pass);
9555 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
9556 ASSERT_VK_SUCCESS(err);
9557 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
9558 ASSERT_VK_SUCCESS(err);
9559
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009560 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009561 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9562 image_view_create_info.image = image;
9563 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
9564 image_view_create_info.format = tex_format;
9565 image_view_create_info.subresourceRange.layerCount = 1;
9566 image_view_create_info.subresourceRange.baseMipLevel = 0;
9567 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009568 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07009569
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009570 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009571 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009572 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07009573 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009574 imageInfo[0].imageView = view;
9575 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
9576 imageInfo[1].imageView = view;
9577 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07009578 imageInfo[2].imageView = view;
Tobin Ehlisa1fccbc2016-10-10 14:54:43 -06009579 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07009580 imageInfo[3].imageView = view;
Tobin Ehlisa1fccbc2016-10-10 14:54:43 -06009581 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009582
9583 static const uint32_t NUM_SET_UPDATES = 3;
9584 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
9585 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9586 descriptor_write[0].dstSet = descriptorSet[0];
9587 descriptor_write[0].dstBinding = 0;
9588 descriptor_write[0].descriptorCount = 5;
9589 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9590 descriptor_write[0].pBufferInfo = buffInfo;
9591 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9592 descriptor_write[1].dstSet = descriptorSet[1];
9593 descriptor_write[1].dstBinding = 0;
9594 descriptor_write[1].descriptorCount = 2;
9595 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
9596 descriptor_write[1].pImageInfo = imageInfo;
9597 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9598 descriptor_write[2].dstSet = descriptorSet[1];
9599 descriptor_write[2].dstBinding = 1;
9600 descriptor_write[2].descriptorCount = 2;
9601 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07009602 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009603
9604 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07009605
Tobin Ehlis88452832015-12-03 09:40:56 -07009606 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009607 char const *vsSource = "#version 450\n"
9608 "\n"
9609 "out gl_PerVertex {\n"
9610 " vec4 gl_Position;\n"
9611 "};\n"
9612 "void main(){\n"
9613 " gl_Position = vec4(1);\n"
9614 "}\n";
9615 char const *fsSource = "#version 450\n"
9616 "\n"
9617 "layout(location=0) out vec4 x;\n"
9618 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
9619 "void main(){\n"
9620 " x = vec4(bar.y);\n"
9621 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07009622 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9623 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07009624 VkPipelineObj pipe(m_device);
9625 pipe.AddShader(&vs);
9626 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07009627 pipe.AddColorAttachment();
9628 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07009629
9630 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07009631
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009632 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07009633 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
9634 // of PSO
9635 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
9636 // cmd_pipeline.c
9637 // due to the fact that cmd_alloc_dset_data() has not been called in
9638 // cmd_bind_graphics_pipeline()
9639 // TODO : Want to cause various binding incompatibility issues here to test
9640 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07009641 // First cause various verify_layout_compatibility() fails
9642 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009643 // verify_set_layout_compatibility fail cases:
9644 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009645 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid Pipeline Layout Object ");
9646 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
9647 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009648 m_errorMonitor->VerifyFound();
9649
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009650 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009651 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
9652 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
9653 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009654 m_errorMonitor->VerifyFound();
9655
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009656 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07009657 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
9658 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009659 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
9660 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
9661 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009662 m_errorMonitor->VerifyFound();
9663
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009664 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
9665 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009666 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
9667 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
9668 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009669 m_errorMonitor->VerifyFound();
9670
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009671 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
9672 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9674 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
9675 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
9676 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009677 m_errorMonitor->VerifyFound();
9678
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009679 // Cause INFO messages due to disturbing previously bound Sets
9680 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009681 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
9682 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009683 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009684 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
9685 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
9686 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009687 m_errorMonitor->VerifyFound();
9688
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009689 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
9690 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009691 // 2. Disturb set after last bound set
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009692 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " newly bound as set #0 so set #1 and "
9693 "any subsequent sets were disturbed ");
9694 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
9695 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009696 m_errorMonitor->VerifyFound();
9697
Tobin Ehlis10fad692016-07-07 12:00:36 -06009698 // Now that we're done actively using the pipelineLayout that gfx pipeline
9699 // was created with, we should be able to delete it. Do that now to verify
9700 // that validation obeys pipelineLayout lifetime
9701 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
9702
Tobin Ehlis88452832015-12-03 09:40:56 -07009703 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07009704 // 1. Error due to not binding required set (we actually use same code as
9705 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009706 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
9707 &descriptorSet[0], 0, NULL);
9708 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
9709 &descriptorSet[1], 0, NULL);
9710 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07009711 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009712 m_errorMonitor->VerifyFound();
9713
Tobin Ehlis991d45a2016-01-06 08:48:41 -07009714 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07009715 // 2. Error due to bound set not being compatible with PSO's
9716 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009717 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
9718 &descriptorSet[0], 0, NULL);
9719 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07009720 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009721 m_errorMonitor->VerifyFound();
9722
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009723 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07009724 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009725 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
9726 }
9727 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009728 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07009729 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9730 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009731 vkFreeMemory(m_device->device(), imageMem, NULL);
9732 vkDestroyImage(m_device->device(), image, NULL);
9733 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07009734}
Tobin Ehlis559c6382015-11-05 09:52:49 -07009735
Karl Schultz6addd812016-02-02 17:17:23 -07009736TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009737
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009738 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9739 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009740
9741 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009742 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009743 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009744 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009745
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009746 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009747}
9748
Karl Schultz6addd812016-02-02 17:17:23 -07009749TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
9750 VkResult err;
9751 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009752
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009753 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009754
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06009755 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06009756
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009757 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009758 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06009759 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009760 cmd.commandPool = m_commandPool;
9761 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009762 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06009763
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009764 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06009765 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06009766
9767 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009768 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07009769 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009770 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06009771 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009772 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 -07009773 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06009774
9775 // The error should be caught by validation of the BeginCommandBuffer call
9776 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
9777
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009778 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009779 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06009780}
9781
Karl Schultz6addd812016-02-02 17:17:23 -07009782TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07009783 // Cause error due to Begin while recording CB
9784 // Then cause 2 errors for attempting to reset CB w/o having
9785 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
9786 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06009787 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07009788
9789 ASSERT_NO_FATAL_FAILURE(InitState());
9790
9791 // Calls AllocateCommandBuffers
9792 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
9793
Karl Schultz6addd812016-02-02 17:17:23 -07009794 // Force the failure by setting the Renderpass and Framebuffer fields with
9795 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07009796 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07009797 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07009798 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9799 cmd_buf_info.pNext = NULL;
9800 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009801 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07009802
9803 // Begin CB to transition to recording state
9804 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
9805 // Can't re-begin. This should trigger error
9806 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009807 m_errorMonitor->VerifyFound();
9808
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009809 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07009810 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
9811 // Reset attempt will trigger error due to incorrect CommandPool state
9812 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009813 m_errorMonitor->VerifyFound();
9814
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009815 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07009816 // Transition CB to RECORDED state
9817 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
9818 // Now attempting to Begin will implicitly reset, which triggers error
9819 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009820 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07009821}
9822
Karl Schultz6addd812016-02-02 17:17:23 -07009823TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009824 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07009825 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009826
Mike Weiblencce7ec72016-10-17 19:33:05 -06009827 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009828
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009829 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06009830 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06009831
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009832 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009833 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9834 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009835
9836 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009837 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9838 ds_pool_ci.pNext = NULL;
9839 ds_pool_ci.maxSets = 1;
9840 ds_pool_ci.poolSizeCount = 1;
9841 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06009842
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009843 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009844 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009845 ASSERT_VK_SUCCESS(err);
9846
Tony Barboureb254902015-07-15 12:50:33 -06009847 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009848 dsl_binding.binding = 0;
9849 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9850 dsl_binding.descriptorCount = 1;
9851 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9852 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009853
Tony Barboureb254902015-07-15 12:50:33 -06009854 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009855 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9856 ds_layout_ci.pNext = NULL;
9857 ds_layout_ci.bindingCount = 1;
9858 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009859
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009860 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009861 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009862 ASSERT_VK_SUCCESS(err);
9863
9864 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009865 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009866 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009867 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009868 alloc_info.descriptorPool = ds_pool;
9869 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009870 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009871 ASSERT_VK_SUCCESS(err);
9872
Tony Barboureb254902015-07-15 12:50:33 -06009873 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009874 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9875 pipeline_layout_ci.setLayoutCount = 1;
9876 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009877
9878 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009879 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009880 ASSERT_VK_SUCCESS(err);
9881
Tobin Ehlise68360f2015-10-01 11:15:13 -06009882 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07009883 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06009884
9885 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009886 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9887 vp_state_ci.scissorCount = 1;
9888 vp_state_ci.pScissors = &sc;
9889 vp_state_ci.viewportCount = 1;
9890 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009891
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009892 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
9893 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9894 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
9895 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
9896 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9897 rs_state_ci.depthClampEnable = VK_FALSE;
9898 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
9899 rs_state_ci.depthBiasEnable = VK_FALSE;
9900
Tony Barboureb254902015-07-15 12:50:33 -06009901 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009902 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9903 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009904 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07009905 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9906 gp_ci.layout = pipeline_layout;
9907 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06009908
9909 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009910 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9911 pc_ci.initialDataSize = 0;
9912 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009913
9914 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06009915 VkPipelineCache pipelineCache;
9916
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009917 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06009918 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009919 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06009920
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009921 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009922
Chia-I Wuf7458c52015-10-26 21:10:41 +08009923 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9924 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9925 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9926 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009927}
Tobin Ehlis912df022015-09-17 08:46:18 -06009928/*// TODO : This test should be good, but needs Tess support in compiler to run
9929TEST_F(VkLayerTest, InvalidPatchControlPoints)
9930{
9931 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06009932 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009933
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009934 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009935 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
9936primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009937
Tobin Ehlis912df022015-09-17 08:46:18 -06009938 ASSERT_NO_FATAL_FAILURE(InitState());
9939 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06009940
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009941 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06009942 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009943 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06009944
9945 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9946 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9947 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009948 ds_pool_ci.poolSizeCount = 1;
9949 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06009950
9951 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009952 err = vkCreateDescriptorPool(m_device->device(),
9953VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06009954 ASSERT_VK_SUCCESS(err);
9955
9956 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08009957 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06009958 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08009959 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06009960 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9961 dsl_binding.pImmutableSamplers = NULL;
9962
9963 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009964 ds_layout_ci.sType =
9965VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06009966 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009967 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07009968 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06009969
9970 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009971 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9972&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06009973 ASSERT_VK_SUCCESS(err);
9974
9975 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07009976 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
9977VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06009978 ASSERT_VK_SUCCESS(err);
9979
9980 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009981 pipeline_layout_ci.sType =
9982VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06009983 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009984 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06009985 pipeline_layout_ci.pSetLayouts = &ds_layout;
9986
9987 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009988 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9989&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06009990 ASSERT_VK_SUCCESS(err);
9991
9992 VkPipelineShaderStageCreateInfo shaderStages[3];
9993 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
9994
Karl Schultz6addd812016-02-02 17:17:23 -07009995 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
9996this);
Tobin Ehlis912df022015-09-17 08:46:18 -06009997 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07009998 VkShaderObj
9999tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
10000this);
10001 VkShaderObj
10002te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
10003this);
Tobin Ehlis912df022015-09-17 08:46:18 -060010004
Karl Schultz6addd812016-02-02 17:17:23 -070010005 shaderStages[0].sType =
10006VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060010007 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -060010008 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070010009 shaderStages[1].sType =
10010VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060010011 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -060010012 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070010013 shaderStages[2].sType =
10014VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060010015 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -060010016 shaderStages[2].shader = te.handle();
10017
10018 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010019 iaCI.sType =
10020VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +080010021 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -060010022
10023 VkPipelineTessellationStateCreateInfo tsCI = {};
10024 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
10025 tsCI.patchControlPoints = 0; // This will cause an error
10026
10027 VkGraphicsPipelineCreateInfo gp_ci = {};
10028 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
10029 gp_ci.pNext = NULL;
10030 gp_ci.stageCount = 3;
10031 gp_ci.pStages = shaderStages;
10032 gp_ci.pVertexInputState = NULL;
10033 gp_ci.pInputAssemblyState = &iaCI;
10034 gp_ci.pTessellationState = &tsCI;
10035 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010036 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -060010037 gp_ci.pMultisampleState = NULL;
10038 gp_ci.pDepthStencilState = NULL;
10039 gp_ci.pColorBlendState = NULL;
10040 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
10041 gp_ci.layout = pipeline_layout;
10042 gp_ci.renderPass = renderPass();
10043
10044 VkPipelineCacheCreateInfo pc_ci = {};
10045 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
10046 pc_ci.pNext = NULL;
10047 pc_ci.initialSize = 0;
10048 pc_ci.initialData = 0;
10049 pc_ci.maxSize = 0;
10050
10051 VkPipeline pipeline;
10052 VkPipelineCache pipelineCache;
10053
Karl Schultz6addd812016-02-02 17:17:23 -070010054 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
10055&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -060010056 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -070010057 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
10058&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -060010059
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010060 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010061
Chia-I Wuf7458c52015-10-26 21:10:41 +080010062 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
10063 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10064 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10065 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -060010066}
10067*/
Tobin Ehlise68360f2015-10-01 11:15:13 -060010068// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -070010069TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070010070 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -060010071
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10073 "Gfx Pipeline viewport count (1) must match scissor count (0).");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010074
Tobin Ehlise68360f2015-10-01 11:15:13 -060010075 ASSERT_NO_FATAL_FAILURE(InitState());
10076 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -060010077
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010078 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010079 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10080 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -060010081
10082 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010083 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10084 ds_pool_ci.maxSets = 1;
10085 ds_pool_ci.poolSizeCount = 1;
10086 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -060010087
10088 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010089 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -060010090 ASSERT_VK_SUCCESS(err);
10091
10092 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010093 dsl_binding.binding = 0;
10094 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10095 dsl_binding.descriptorCount = 1;
10096 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -060010097
10098 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010099 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10100 ds_layout_ci.bindingCount = 1;
10101 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -060010102
10103 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010104 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -060010105 ASSERT_VK_SUCCESS(err);
10106
10107 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010108 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010109 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010110 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010111 alloc_info.descriptorPool = ds_pool;
10112 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010113 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -060010114 ASSERT_VK_SUCCESS(err);
10115
10116 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010117 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10118 pipeline_layout_ci.setLayoutCount = 1;
10119 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -060010120
10121 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010122 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -060010123 ASSERT_VK_SUCCESS(err);
10124
10125 VkViewport vp = {}; // Just need dummy vp to point to
10126
10127 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010128 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
10129 vp_state_ci.scissorCount = 0;
10130 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
10131 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -060010132
Karl Schultzdfdb8d42016-03-08 10:30:21 -070010133 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
10134 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
10135 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
10136 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
10137 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
10138 rs_state_ci.depthClampEnable = VK_FALSE;
10139 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
10140 rs_state_ci.depthBiasEnable = VK_FALSE;
10141
Cody Northropeb3a6c12015-10-05 14:44:45 -060010142 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -070010143 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -060010144
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010145 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
10146 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
10147 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +080010148 shaderStages[0] = vs.GetStageCreateInfo();
10149 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -060010150
10151 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010152 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
10153 gp_ci.stageCount = 2;
10154 gp_ci.pStages = shaderStages;
10155 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -070010156 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -070010157 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
10158 gp_ci.layout = pipeline_layout;
10159 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -060010160
10161 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010162 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -060010163
10164 VkPipeline pipeline;
10165 VkPipelineCache pipelineCache;
10166
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010167 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -060010168 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010169 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -060010170
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010171 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -060010172
Chia-I Wuf7458c52015-10-26 21:10:41 +080010173 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
10174 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10175 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10176 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -060010177}
Karl Schultz6addd812016-02-02 17:17:23 -070010178// Don't set viewport state in PSO. This is an error b/c we always need this
10179// state
Tobin Ehlisd332f282015-10-02 11:00:56 -060010180// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -070010181TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -060010182 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -070010183 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -060010184
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Gfx Pipeline pViewportState is null. Even if ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010186
Tobin Ehlise68360f2015-10-01 11:15:13 -060010187 ASSERT_NO_FATAL_FAILURE(InitState());
10188 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -060010189
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010190 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010191 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10192 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -060010193
10194 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010195 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10196 ds_pool_ci.maxSets = 1;
10197 ds_pool_ci.poolSizeCount = 1;
10198 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -060010199
10200 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010201 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -060010202 ASSERT_VK_SUCCESS(err);
10203
10204 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010205 dsl_binding.binding = 0;
10206 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10207 dsl_binding.descriptorCount = 1;
10208 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -060010209
10210 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010211 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10212 ds_layout_ci.bindingCount = 1;
10213 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -060010214
10215 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010216 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -060010217 ASSERT_VK_SUCCESS(err);
10218
10219 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010220 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010221 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010222 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010223 alloc_info.descriptorPool = ds_pool;
10224 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010225 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -060010226 ASSERT_VK_SUCCESS(err);
10227
10228 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010229 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10230 pipeline_layout_ci.setLayoutCount = 1;
10231 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -060010232
10233 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010234 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -060010235 ASSERT_VK_SUCCESS(err);
10236
10237 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
10238 // Set scissor as dynamic to avoid second error
10239 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010240 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
10241 dyn_state_ci.dynamicStateCount = 1;
10242 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -060010243
Cody Northropeb3a6c12015-10-05 14:44:45 -060010244 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -070010245 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -060010246
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010247 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
10248 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
10249 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +080010250 shaderStages[0] = vs.GetStageCreateInfo();
10251 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -060010252
Karl Schultzdfdb8d42016-03-08 10:30:21 -070010253 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
10254 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
10255 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
10256 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
10257 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
10258 rs_state_ci.depthClampEnable = VK_FALSE;
10259 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
10260 rs_state_ci.depthBiasEnable = VK_FALSE;
10261
Tobin Ehlise68360f2015-10-01 11:15:13 -060010262 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010263 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
10264 gp_ci.stageCount = 2;
10265 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -070010266 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -070010267 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
10268 // should cause validation error
10269 gp_ci.pDynamicState = &dyn_state_ci;
10270 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
10271 gp_ci.layout = pipeline_layout;
10272 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -060010273
10274 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010275 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -060010276
10277 VkPipeline pipeline;
10278 VkPipelineCache pipelineCache;
10279
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010280 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -060010281 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010282 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -060010283
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010284 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -060010285
Chia-I Wuf7458c52015-10-26 21:10:41 +080010286 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
10287 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10288 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10289 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -060010290}
10291// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -070010292// Then run second test where dynamic scissor count doesn't match PSO scissor
10293// count
10294TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
10295 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -060010296
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010297 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10298 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010299
Tobin Ehlise68360f2015-10-01 11:15:13 -060010300 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +120010301
10302 if (!m_device->phy().features().multiViewport) {
10303 printf("Device does not support multiple viewports/scissors; skipped.\n");
10304 return;
10305 }
10306
Tobin Ehlise68360f2015-10-01 11:15:13 -060010307 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -060010308
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010309 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010310 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10311 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -060010312
10313 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010314 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10315 ds_pool_ci.maxSets = 1;
10316 ds_pool_ci.poolSizeCount = 1;
10317 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -060010318
10319 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010320 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -060010321 ASSERT_VK_SUCCESS(err);
10322
10323 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010324 dsl_binding.binding = 0;
10325 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10326 dsl_binding.descriptorCount = 1;
10327 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -060010328
10329 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010330 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10331 ds_layout_ci.bindingCount = 1;
10332 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -060010333
10334 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010335 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -060010336 ASSERT_VK_SUCCESS(err);
10337
10338 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010339 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010340 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010341 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010342 alloc_info.descriptorPool = ds_pool;
10343 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010344 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -060010345 ASSERT_VK_SUCCESS(err);
10346
10347 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010348 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10349 pipeline_layout_ci.setLayoutCount = 1;
10350 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -060010351
10352 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010353 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -060010354 ASSERT_VK_SUCCESS(err);
10355
10356 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010357 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
10358 vp_state_ci.viewportCount = 1;
10359 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
10360 vp_state_ci.scissorCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010361 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -060010362
10363 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
10364 // Set scissor as dynamic to avoid that error
10365 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010366 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
10367 dyn_state_ci.dynamicStateCount = 1;
10368 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -060010369
Cody Northropeb3a6c12015-10-05 14:44:45 -060010370 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -070010371 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -060010372
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010373 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
10374 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
10375 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +080010376 shaderStages[0] = vs.GetStageCreateInfo();
10377 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -060010378
Cody Northropf6622dc2015-10-06 10:33:21 -060010379 VkPipelineVertexInputStateCreateInfo vi_ci = {};
10380 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
10381 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010382 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -060010383 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010384 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -060010385 vi_ci.pVertexAttributeDescriptions = nullptr;
10386
10387 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
10388 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
10389 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
10390
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010391 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010392 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -060010393 rs_ci.pNext = nullptr;
10394
Mark Youngc89c6312016-03-31 16:03:20 -060010395 VkPipelineColorBlendAttachmentState att = {};
10396 att.blendEnable = VK_FALSE;
10397 att.colorWriteMask = 0xf;
10398
Cody Northropf6622dc2015-10-06 10:33:21 -060010399 VkPipelineColorBlendStateCreateInfo cb_ci = {};
10400 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
10401 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -060010402 cb_ci.attachmentCount = 1;
10403 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -060010404
Tobin Ehlise68360f2015-10-01 11:15:13 -060010405 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010406 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
10407 gp_ci.stageCount = 2;
10408 gp_ci.pStages = shaderStages;
10409 gp_ci.pVertexInputState = &vi_ci;
10410 gp_ci.pInputAssemblyState = &ia_ci;
10411 gp_ci.pViewportState = &vp_state_ci;
10412 gp_ci.pRasterizationState = &rs_ci;
10413 gp_ci.pColorBlendState = &cb_ci;
10414 gp_ci.pDynamicState = &dyn_state_ci;
10415 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
10416 gp_ci.layout = pipeline_layout;
10417 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -060010418
10419 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010420 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -060010421
10422 VkPipeline pipeline;
10423 VkPipelineCache pipelineCache;
10424
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010425 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -060010426 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010427 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -060010428
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010429 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010430
Tobin Ehlisd332f282015-10-02 11:00:56 -060010431 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -070010432 // First need to successfully create the PSO from above by setting
10433 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -060010434 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 -070010435
10436 VkViewport vp = {}; // Just need dummy vp to point to
10437 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010438 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -070010439 ASSERT_VK_SUCCESS(err);
10440 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010441 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Chris Forbesc08a6ca2016-07-28 14:14:07 +120010442 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -070010443 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +120010444 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -070010445 Draw(1, 0, 0, 0);
10446
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010447 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -070010448
10449 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
10450 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10451 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10452 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060010453 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -070010454}
10455// Create PSO w/o non-zero scissorCount but no scissor data
10456// Then run second test where dynamic viewportCount doesn't match PSO
10457// viewportCount
10458TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
10459 VkResult err;
10460
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010461 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
Karl Schultz6addd812016-02-02 17:17:23 -070010462
10463 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +120010464
10465 if (!m_device->phy().features().multiViewport) {
10466 printf("Device does not support multiple viewports/scissors; skipped.\n");
10467 return;
10468 }
10469
Karl Schultz6addd812016-02-02 17:17:23 -070010470 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10471
10472 VkDescriptorPoolSize ds_type_count = {};
10473 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10474 ds_type_count.descriptorCount = 1;
10475
10476 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10477 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10478 ds_pool_ci.maxSets = 1;
10479 ds_pool_ci.poolSizeCount = 1;
10480 ds_pool_ci.pPoolSizes = &ds_type_count;
10481
10482 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010483 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -070010484 ASSERT_VK_SUCCESS(err);
10485
10486 VkDescriptorSetLayoutBinding dsl_binding = {};
10487 dsl_binding.binding = 0;
10488 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10489 dsl_binding.descriptorCount = 1;
10490 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10491
10492 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10493 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10494 ds_layout_ci.bindingCount = 1;
10495 ds_layout_ci.pBindings = &dsl_binding;
10496
10497 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010498 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -070010499 ASSERT_VK_SUCCESS(err);
10500
10501 VkDescriptorSet descriptorSet;
10502 VkDescriptorSetAllocateInfo alloc_info = {};
10503 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10504 alloc_info.descriptorSetCount = 1;
10505 alloc_info.descriptorPool = ds_pool;
10506 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010507 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -070010508 ASSERT_VK_SUCCESS(err);
10509
10510 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10511 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10512 pipeline_layout_ci.setLayoutCount = 1;
10513 pipeline_layout_ci.pSetLayouts = &ds_layout;
10514
10515 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010516 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -070010517 ASSERT_VK_SUCCESS(err);
10518
10519 VkPipelineViewportStateCreateInfo vp_state_ci = {};
10520 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
10521 vp_state_ci.scissorCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010522 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -070010523 vp_state_ci.viewportCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010524 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -070010525
10526 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
10527 // Set scissor as dynamic to avoid that error
10528 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
10529 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
10530 dyn_state_ci.dynamicStateCount = 1;
10531 dyn_state_ci.pDynamicStates = &vp_state;
10532
10533 VkPipelineShaderStageCreateInfo shaderStages[2];
10534 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
10535
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010536 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
10537 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
10538 // but add it to be able to run on more devices
Karl Schultz6addd812016-02-02 17:17:23 -070010539 shaderStages[0] = vs.GetStageCreateInfo();
10540 shaderStages[1] = fs.GetStageCreateInfo();
10541
10542 VkPipelineVertexInputStateCreateInfo vi_ci = {};
10543 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
10544 vi_ci.pNext = nullptr;
10545 vi_ci.vertexBindingDescriptionCount = 0;
10546 vi_ci.pVertexBindingDescriptions = nullptr;
10547 vi_ci.vertexAttributeDescriptionCount = 0;
10548 vi_ci.pVertexAttributeDescriptions = nullptr;
10549
10550 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
10551 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
10552 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
10553
10554 VkPipelineRasterizationStateCreateInfo rs_ci = {};
10555 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
10556 rs_ci.pNext = nullptr;
10557
Mark Youngc89c6312016-03-31 16:03:20 -060010558 VkPipelineColorBlendAttachmentState att = {};
10559 att.blendEnable = VK_FALSE;
10560 att.colorWriteMask = 0xf;
10561
Karl Schultz6addd812016-02-02 17:17:23 -070010562 VkPipelineColorBlendStateCreateInfo cb_ci = {};
10563 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
10564 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -060010565 cb_ci.attachmentCount = 1;
10566 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -070010567
10568 VkGraphicsPipelineCreateInfo gp_ci = {};
10569 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
10570 gp_ci.stageCount = 2;
10571 gp_ci.pStages = shaderStages;
10572 gp_ci.pVertexInputState = &vi_ci;
10573 gp_ci.pInputAssemblyState = &ia_ci;
10574 gp_ci.pViewportState = &vp_state_ci;
10575 gp_ci.pRasterizationState = &rs_ci;
10576 gp_ci.pColorBlendState = &cb_ci;
10577 gp_ci.pDynamicState = &dyn_state_ci;
10578 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
10579 gp_ci.layout = pipeline_layout;
10580 gp_ci.renderPass = renderPass();
10581
10582 VkPipelineCacheCreateInfo pc_ci = {};
10583 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
10584
10585 VkPipeline pipeline;
10586 VkPipelineCache pipelineCache;
10587
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010588 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -070010589 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010590 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -070010591
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010592 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -070010593
10594 // Now hit second fail case where we set scissor w/ different count than PSO
10595 // First need to successfully create the PSO from above by setting
10596 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -060010597 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010598
Tobin Ehlisd332f282015-10-02 11:00:56 -060010599 VkRect2D sc = {}; // Just need dummy vp to point to
10600 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010601 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -060010602 ASSERT_VK_SUCCESS(err);
10603 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010604 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Chris Forbesc08a6ca2016-07-28 14:14:07 +120010605 VkViewport viewports[1] = {}; // don't care about data
Tobin Ehlisd332f282015-10-02 11:00:56 -060010606 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +120010607 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -060010608 Draw(1, 0, 0, 0);
10609
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010610 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -060010611
Chia-I Wuf7458c52015-10-26 21:10:41 +080010612 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
10613 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10614 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10615 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060010616 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -060010617}
10618
Mark Young7394fdd2016-03-31 14:56:43 -060010619TEST_F(VkLayerTest, PSOLineWidthInvalid) {
10620 VkResult err;
10621
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010622 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -060010623
10624 ASSERT_NO_FATAL_FAILURE(InitState());
10625 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10626
10627 VkDescriptorPoolSize ds_type_count = {};
10628 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10629 ds_type_count.descriptorCount = 1;
10630
10631 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10632 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10633 ds_pool_ci.maxSets = 1;
10634 ds_pool_ci.poolSizeCount = 1;
10635 ds_pool_ci.pPoolSizes = &ds_type_count;
10636
10637 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010638 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -060010639 ASSERT_VK_SUCCESS(err);
10640
10641 VkDescriptorSetLayoutBinding dsl_binding = {};
10642 dsl_binding.binding = 0;
10643 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10644 dsl_binding.descriptorCount = 1;
10645 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10646
10647 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10648 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10649 ds_layout_ci.bindingCount = 1;
10650 ds_layout_ci.pBindings = &dsl_binding;
10651
10652 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010653 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -060010654 ASSERT_VK_SUCCESS(err);
10655
10656 VkDescriptorSet descriptorSet;
10657 VkDescriptorSetAllocateInfo alloc_info = {};
10658 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10659 alloc_info.descriptorSetCount = 1;
10660 alloc_info.descriptorPool = ds_pool;
10661 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010662 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -060010663 ASSERT_VK_SUCCESS(err);
10664
10665 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10666 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10667 pipeline_layout_ci.setLayoutCount = 1;
10668 pipeline_layout_ci.pSetLayouts = &ds_layout;
10669
10670 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010671 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -060010672 ASSERT_VK_SUCCESS(err);
10673
10674 VkPipelineViewportStateCreateInfo vp_state_ci = {};
10675 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
10676 vp_state_ci.scissorCount = 1;
10677 vp_state_ci.pScissors = NULL;
10678 vp_state_ci.viewportCount = 1;
10679 vp_state_ci.pViewports = NULL;
10680
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010681 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -060010682 // Set scissor as dynamic to avoid that error
10683 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
10684 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
10685 dyn_state_ci.dynamicStateCount = 2;
10686 dyn_state_ci.pDynamicStates = dynamic_states;
10687
10688 VkPipelineShaderStageCreateInfo shaderStages[2];
10689 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
10690
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010691 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
10692 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Young7394fdd2016-03-31 14:56:43 -060010693 this); // TODO - We shouldn't need a fragment shader
10694 // but add it to be able to run on more devices
10695 shaderStages[0] = vs.GetStageCreateInfo();
10696 shaderStages[1] = fs.GetStageCreateInfo();
10697
10698 VkPipelineVertexInputStateCreateInfo vi_ci = {};
10699 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
10700 vi_ci.pNext = nullptr;
10701 vi_ci.vertexBindingDescriptionCount = 0;
10702 vi_ci.pVertexBindingDescriptions = nullptr;
10703 vi_ci.vertexAttributeDescriptionCount = 0;
10704 vi_ci.pVertexAttributeDescriptions = nullptr;
10705
10706 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
10707 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
10708 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
10709
10710 VkPipelineRasterizationStateCreateInfo rs_ci = {};
10711 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
10712 rs_ci.pNext = nullptr;
10713
Mark Young47107952016-05-02 15:59:55 -060010714 // Check too low (line width of -1.0f).
10715 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -060010716
10717 VkPipelineColorBlendAttachmentState att = {};
10718 att.blendEnable = VK_FALSE;
10719 att.colorWriteMask = 0xf;
10720
10721 VkPipelineColorBlendStateCreateInfo cb_ci = {};
10722 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
10723 cb_ci.pNext = nullptr;
10724 cb_ci.attachmentCount = 1;
10725 cb_ci.pAttachments = &att;
10726
10727 VkGraphicsPipelineCreateInfo gp_ci = {};
10728 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
10729 gp_ci.stageCount = 2;
10730 gp_ci.pStages = shaderStages;
10731 gp_ci.pVertexInputState = &vi_ci;
10732 gp_ci.pInputAssemblyState = &ia_ci;
10733 gp_ci.pViewportState = &vp_state_ci;
10734 gp_ci.pRasterizationState = &rs_ci;
10735 gp_ci.pColorBlendState = &cb_ci;
10736 gp_ci.pDynamicState = &dyn_state_ci;
10737 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
10738 gp_ci.layout = pipeline_layout;
10739 gp_ci.renderPass = renderPass();
10740
10741 VkPipelineCacheCreateInfo pc_ci = {};
10742 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
10743
10744 VkPipeline pipeline;
10745 VkPipelineCache pipelineCache;
10746
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010747 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -060010748 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010749 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -060010750
10751 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060010752 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -060010753
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010754 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -060010755
10756 // Check too high (line width of 65536.0f).
10757 rs_ci.lineWidth = 65536.0f;
10758
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010759 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -060010760 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010761 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -060010762
10763 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060010764 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -060010765
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010766 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -060010767
10768 dyn_state_ci.dynamicStateCount = 3;
10769
10770 rs_ci.lineWidth = 1.0f;
10771
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010772 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -060010773 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010774 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -060010775 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010776 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -060010777
10778 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -060010779 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -060010780 m_errorMonitor->VerifyFound();
10781
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010782 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -060010783
10784 // Check too high with dynamic setting.
10785 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
10786 m_errorMonitor->VerifyFound();
10787 EndCommandBuffer();
10788
10789 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
10790 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10791 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10792 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060010793 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -060010794}
10795
Karl Schultz6addd812016-02-02 17:17:23 -070010796TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -060010797 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010798 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10799 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -060010800
10801 ASSERT_NO_FATAL_FAILURE(InitState());
10802 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -060010803
Tony Barbourfe3351b2015-07-28 10:17:20 -060010804 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070010805 // Don't care about RenderPass handle b/c error should be flagged before
10806 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010807 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -060010808
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010809 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -060010810}
10811
Karl Schultz6addd812016-02-02 17:17:23 -070010812TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -060010813 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010814 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10815 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -060010816
10817 ASSERT_NO_FATAL_FAILURE(InitState());
10818 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -060010819
Tony Barbourfe3351b2015-07-28 10:17:20 -060010820 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070010821 // Just create a dummy Renderpass that's non-NULL so we can get to the
10822 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010823 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -060010824
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010825 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010826}
10827
Chris Forbes2eeabe32016-06-21 20:52:34 +120010828TEST_F(VkLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
10829 m_errorMonitor->ExpectSuccess();
10830
10831 ASSERT_NO_FATAL_FAILURE(InitState());
10832 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10833
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010834 BeginCommandBuffer(); // framework implicitly begins the renderpass.
Chris Forbes2eeabe32016-06-21 20:52:34 +120010835 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // end implicit.
10836
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010837 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Chris Forbes2eeabe32016-06-21 20:52:34 +120010838 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
10839 m_errorMonitor->VerifyNotFound();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010840 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Chris Forbes2eeabe32016-06-21 20:52:34 +120010841 m_errorMonitor->VerifyNotFound();
10842 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
10843 m_errorMonitor->VerifyNotFound();
10844
10845 m_commandBuffer->EndCommandBuffer();
10846 m_errorMonitor->VerifyNotFound();
10847}
10848
Tobin Ehlis5a1c0332016-05-31 13:59:26 -060010849TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
10850 TEST_DESCRIPTION("Begin a renderPass where clearValueCount is less than"
10851 "the number of renderPass attachments that use loadOp"
10852 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
10853
10854 ASSERT_NO_FATAL_FAILURE(InitState());
10855 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10856
10857 // Create a renderPass with a single attachment that uses loadOp CLEAR
10858 VkAttachmentReference attach = {};
10859 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
10860 VkSubpassDescription subpass = {};
10861 subpass.inputAttachmentCount = 1;
10862 subpass.pInputAttachments = &attach;
10863 VkRenderPassCreateInfo rpci = {};
10864 rpci.subpassCount = 1;
10865 rpci.pSubpasses = &subpass;
10866 rpci.attachmentCount = 1;
10867 VkAttachmentDescription attach_desc = {};
10868 attach_desc.format = VK_FORMAT_UNDEFINED;
10869 // Set loadOp to CLEAR
10870 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
10871 rpci.pAttachments = &attach_desc;
10872 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
10873 VkRenderPass rp;
10874 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10875
10876 VkCommandBufferInheritanceInfo hinfo = {};
10877 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
10878 hinfo.renderPass = VK_NULL_HANDLE;
10879 hinfo.subpass = 0;
10880 hinfo.framebuffer = VK_NULL_HANDLE;
10881 hinfo.occlusionQueryEnable = VK_FALSE;
10882 hinfo.queryFlags = 0;
10883 hinfo.pipelineStatistics = 0;
10884 VkCommandBufferBeginInfo info = {};
10885 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
10886 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
10887 info.pInheritanceInfo = &hinfo;
10888
10889 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
10890 VkRenderPassBeginInfo rp_begin = {};
10891 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
10892 rp_begin.pNext = NULL;
10893 rp_begin.renderPass = renderPass();
10894 rp_begin.framebuffer = framebuffer();
10895 rp_begin.clearValueCount = 0; // Should be 1
10896
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has a clearValueCount of 0 but "
10898 "there must be at least 1 entries in "
10899 "pClearValues array to account for ");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -060010900
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010901 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -060010902
10903 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -060010904
10905 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -060010906}
10907
Cody Northrop3bb4d962016-05-09 16:15:57 -060010908TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
10909
10910 TEST_DESCRIPTION("End a command buffer with an active render pass");
10911
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010912 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10913 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -060010914
10915 ASSERT_NO_FATAL_FAILURE(InitState());
10916 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10917
10918 // The framework's BeginCommandBuffer calls CreateRenderPass
10919 BeginCommandBuffer();
10920
10921 // Call directly into vkEndCommandBuffer instead of the
10922 // the framework's EndCommandBuffer, which inserts a
10923 // vkEndRenderPass
10924 vkEndCommandBuffer(m_commandBuffer->GetBufferHandle());
10925
10926 m_errorMonitor->VerifyFound();
10927
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010928 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
10929 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -060010930}
10931
Karl Schultz6addd812016-02-02 17:17:23 -070010932TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010933 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010934 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10935 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010936
10937 ASSERT_NO_FATAL_FAILURE(InitState());
10938 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010939
10940 // Renderpass is started here
10941 BeginCommandBuffer();
10942
10943 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010944 vk_testing::Buffer dstBuffer;
10945 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010946
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010947 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010948
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010949 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010950}
10951
Karl Schultz6addd812016-02-02 17:17:23 -070010952TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010953 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10955 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010956
10957 ASSERT_NO_FATAL_FAILURE(InitState());
10958 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010959
10960 // Renderpass is started here
10961 BeginCommandBuffer();
10962
10963 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010964 vk_testing::Buffer dstBuffer;
10965 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010966
Karl Schultz6addd812016-02-02 17:17:23 -070010967 VkDeviceSize dstOffset = 0;
10968 VkDeviceSize dataSize = 1024;
Karl Schultzee344492016-07-11 15:09:57 -060010969 const void *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010970
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010971 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010972
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010973 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010974}
10975
Karl Schultz6addd812016-02-02 17:17:23 -070010976TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010977 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010978 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10979 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010980
10981 ASSERT_NO_FATAL_FAILURE(InitState());
10982 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010983
10984 // Renderpass is started here
10985 BeginCommandBuffer();
10986
Michael Lentine0a369f62016-02-03 16:51:46 -060010987 VkClearColorValue clear_color;
10988 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -070010989 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
10990 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
10991 const int32_t tex_width = 32;
10992 const int32_t tex_height = 32;
10993 VkImageCreateInfo image_create_info = {};
10994 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10995 image_create_info.pNext = NULL;
10996 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10997 image_create_info.format = tex_format;
10998 image_create_info.extent.width = tex_width;
10999 image_create_info.extent.height = tex_height;
11000 image_create_info.extent.depth = 1;
11001 image_create_info.mipLevels = 1;
11002 image_create_info.arrayLayers = 1;
11003 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11004 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
11005 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -060011006
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011007 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011008 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060011009
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011010 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060011011
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011012 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060011013
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011014 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060011015}
11016
Karl Schultz6addd812016-02-02 17:17:23 -070011017TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -060011018 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011019 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11020 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -060011021
11022 ASSERT_NO_FATAL_FAILURE(InitState());
11023 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060011024
11025 // Renderpass is started here
11026 BeginCommandBuffer();
11027
11028 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -070011029 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070011030 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
11031 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11032 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
11033 image_create_info.extent.width = 64;
11034 image_create_info.extent.height = 64;
11035 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11036 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -060011037
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011038 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011039 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060011040
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011041 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060011042
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011043 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
11044 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060011045
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011046 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060011047}
11048
Karl Schultz6addd812016-02-02 17:17:23 -070011049TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011050 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -070011051 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -060011052
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011053 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearAttachments(): This call "
11054 "must be issued inside an active "
11055 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011056
Mark Lobodzinskid5639502015-09-24 09:51:47 -060011057 ASSERT_NO_FATAL_FAILURE(InitState());
11058 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060011059
11060 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011061 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060011062 ASSERT_VK_SUCCESS(err);
11063
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011064 VkClearAttachment color_attachment;
11065 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11066 color_attachment.clearValue.color.float32[0] = 0;
11067 color_attachment.clearValue.color.float32[1] = 0;
11068 color_attachment.clearValue.color.float32[2] = 0;
11069 color_attachment.clearValue.color.float32[3] = 0;
11070 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070011071 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011072 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060011073
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011074 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060011075}
11076
Chris Forbes3b97e932016-09-07 11:29:24 +120011077TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
11078 TEST_DESCRIPTION("Test that an error is produced when CmdNextSubpass is "
11079 "called too many times in a renderpass instance");
11080
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011081 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdNextSubpass(): Attempted to advance "
11082 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +120011083
11084 ASSERT_NO_FATAL_FAILURE(InitState());
11085 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11086
11087 BeginCommandBuffer();
11088
11089 // error here.
11090 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
11091 m_errorMonitor->VerifyFound();
11092
11093 EndCommandBuffer();
11094}
11095
Chris Forbes6d624702016-09-07 13:57:05 +120011096TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
11097 TEST_DESCRIPTION("Test that an error is produced when CmdEndRenderPass is "
11098 "called before the final subpass has been reached");
11099
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011100 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdEndRenderPass(): Called before reaching "
11101 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +120011102
11103 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011104 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
11105 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +120011106
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011107 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +120011108
11109 VkRenderPass rp;
11110 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
11111 ASSERT_VK_SUCCESS(err);
11112
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011113 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +120011114
11115 VkFramebuffer fb;
11116 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
11117 ASSERT_VK_SUCCESS(err);
11118
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011119 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +120011120
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011121 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 +120011122
11123 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
11124
11125 // Error here.
11126 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
11127 m_errorMonitor->VerifyFound();
11128
11129 // Clean up.
11130 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
11131 vkDestroyRenderPass(m_device->device(), rp, nullptr);
11132}
11133
Karl Schultz9e66a292016-04-21 15:57:51 -060011134TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
11135 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011136 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11137 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -060011138
11139 ASSERT_NO_FATAL_FAILURE(InitState());
11140 BeginCommandBuffer();
11141
11142 VkBufferMemoryBarrier buf_barrier = {};
11143 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
11144 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
11145 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
11146 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
11147 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
11148 buf_barrier.buffer = VK_NULL_HANDLE;
11149 buf_barrier.offset = 0;
11150 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011151 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
11152 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -060011153
11154 m_errorMonitor->VerifyFound();
11155}
11156
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060011157TEST_F(VkLayerTest, InvalidBarriers) {
11158 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
11159
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011160 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060011161
11162 ASSERT_NO_FATAL_FAILURE(InitState());
11163 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11164
11165 VkMemoryBarrier mem_barrier = {};
11166 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
11167 mem_barrier.pNext = NULL;
11168 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
11169 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
11170 BeginCommandBuffer();
11171 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011172 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060011173 &mem_barrier, 0, nullptr, 0, nullptr);
11174 m_errorMonitor->VerifyFound();
11175
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011176 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060011177 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011178 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 -060011179 ASSERT_TRUE(image.initialized());
11180 VkImageMemoryBarrier img_barrier = {};
11181 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11182 img_barrier.pNext = NULL;
11183 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
11184 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
11185 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11186 // New layout can't be UNDEFINED
11187 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
11188 img_barrier.image = image.handle();
11189 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
11190 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
11191 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11192 img_barrier.subresourceRange.baseArrayLayer = 0;
11193 img_barrier.subresourceRange.baseMipLevel = 0;
11194 img_barrier.subresourceRange.layerCount = 1;
11195 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011196 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
11197 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060011198 m_errorMonitor->VerifyFound();
11199 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11200
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the "
11202 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060011203 // baseArrayLayer + layerCount must be <= image's arrayLayers
11204 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011205 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
11206 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060011207 m_errorMonitor->VerifyFound();
11208 img_barrier.subresourceRange.baseArrayLayer = 0;
11209
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011210 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060011211 // baseMipLevel + levelCount must be <= image's mipLevels
11212 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011213 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
11214 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060011215 m_errorMonitor->VerifyFound();
11216 img_barrier.subresourceRange.baseMipLevel = 0;
11217
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011218 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 -060011219 vk_testing::Buffer buffer;
11220 buffer.init(*m_device, 256);
11221 VkBufferMemoryBarrier buf_barrier = {};
11222 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
11223 buf_barrier.pNext = NULL;
11224 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
11225 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
11226 buf_barrier.buffer = buffer.handle();
11227 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
11228 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
11229 buf_barrier.offset = 0;
11230 buf_barrier.size = VK_WHOLE_SIZE;
11231 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011232 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
11233 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060011234 m_errorMonitor->VerifyFound();
11235 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
11236
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011237 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060011238 buf_barrier.offset = 257;
11239 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011240 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
11241 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060011242 m_errorMonitor->VerifyFound();
11243 buf_barrier.offset = 0;
11244
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011245 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060011246 buf_barrier.size = 257;
11247 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011248 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
11249 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060011250 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060011251
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060011252 // Now exercise barrier aspect bit errors, first DS
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image is a depth and stencil format and thus must "
11254 "have either one or both of VK_IMAGE_ASPECT_DEPTH_BIT and "
11255 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060011256 VkDepthStencilObj ds_image(m_device);
11257 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
11258 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -060011259 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
11260 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060011261 img_barrier.image = ds_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -060011262 // Use of COLOR aspect on DS image is error
11263 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011264 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
11265 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060011266 m_errorMonitor->VerifyFound();
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060011267 // Now test depth-only
11268 VkFormatProperties format_props;
11269
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011270 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
11271 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
11272 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image is a depth-only format and thus must "
11273 "have VK_IMAGE_ASPECT_DEPTH_BIT set.");
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060011274 VkDepthStencilObj d_image(m_device);
11275 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
11276 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011277 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -060011278 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060011279 img_barrier.image = d_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -060011280 // Use of COLOR aspect on depth image is error
11281 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011282 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
11283 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060011284 m_errorMonitor->VerifyFound();
11285 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011286 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
11287 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060011288 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011289 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image is a stencil-only format and thus must "
11290 "have VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060011291 VkDepthStencilObj s_image(m_device);
11292 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
11293 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011294 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -060011295 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060011296 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -060011297 // Use of COLOR aspect on depth image is error
11298 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011299 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
11300 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060011301 m_errorMonitor->VerifyFound();
11302 }
11303 // Finally test color
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011304 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image is a color format and thus must "
11305 "have VK_IMAGE_ASPECT_COLOR_BIT set.");
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060011306 VkImageObj c_image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011307 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 -060011308 ASSERT_TRUE(c_image.initialized());
11309 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11310 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
11311 img_barrier.image = c_image.handle();
11312 // Set aspect to depth (non-color)
11313 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011314 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
11315 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060011316 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060011317}
11318
Tony Barbour18ba25c2016-09-29 13:42:40 -060011319TEST_F(VkLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
11320 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ in srcAccessMask
11321
11322 m_errorMonitor->SetDesiredFailureMsg(
11323 VK_DEBUG_REPORT_WARNING_BIT_EXT,
11324 "must have required access bit");
11325 ASSERT_NO_FATAL_FAILURE(InitState());
11326 VkImageObj image(m_device);
Tony Barbour256c80a2016-10-05 13:23:46 -060011327 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 -060011328 ASSERT_TRUE(image.initialized());
11329
11330 VkImageMemoryBarrier barrier = {};
11331 VkImageSubresourceRange range;
11332 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11333 barrier.srcAccessMask = 0;
11334 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
11335 barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
11336 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11337 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
11338 barrier.image = image.handle();
11339 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11340 range.baseMipLevel = 0;
11341 range.levelCount = 1;
11342 range.baseArrayLayer = 0;
11343 range.layerCount = 1;
11344 barrier.subresourceRange = range;
11345 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
11346 cmdbuf.BeginCommandBuffer();
11347 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
11348 &barrier);
11349 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
11350 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
11351 barrier.srcAccessMask = 0;
11352 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
11353 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
11354 &barrier);
11355
11356 m_errorMonitor->VerifyFound();
11357}
11358
Karl Schultz6addd812016-02-02 17:17:23 -070011359TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -060011360 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -070011361 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -060011362
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011363 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011364
Tobin Ehlisc4c23182015-09-17 12:24:13 -060011365 ASSERT_NO_FATAL_FAILURE(InitState());
11366 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060011367 uint32_t qfi = 0;
11368 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011369 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
11370 buffCI.size = 1024;
11371 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
11372 buffCI.queueFamilyIndexCount = 1;
11373 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -060011374
11375 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011376 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060011377 ASSERT_VK_SUCCESS(err);
11378
11379 BeginCommandBuffer();
11380 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -070011381 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11382 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060011383 // Should error before calling to driver so don't care about actual data
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011384 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7, VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060011385
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011386 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011387
Chia-I Wuf7458c52015-10-26 21:10:41 +080011388 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060011389}
11390
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070011391TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
11392 // Create an out-of-range queueFamilyIndex
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011393 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11394 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
11395 "of the indices specified when the device was created, via the "
11396 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070011397
11398 ASSERT_NO_FATAL_FAILURE(InitState());
11399 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11400 VkBufferCreateInfo buffCI = {};
11401 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
11402 buffCI.size = 1024;
11403 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
11404 buffCI.queueFamilyIndexCount = 1;
11405 // Introduce failure by specifying invalid queue_family_index
11406 uint32_t qfi = 777;
11407 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -060011408 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070011409
11410 VkBuffer ib;
11411 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
11412
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011413 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060011414 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070011415}
11416
Karl Schultz6addd812016-02-02 17:17:23 -070011417TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mike Weiblencce7ec72016-10-17 19:33:05 -060011418 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a primary command buffer"
Tobin Ehlis0c94db02016-07-19 10:49:32 -060011419 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011420
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060011421 ASSERT_NO_FATAL_FAILURE(InitState());
11422 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060011423
Chris Forbesf29a84f2016-10-06 18:39:28 +130011424 // An empty primary command buffer
11425 VkCommandBufferObj cb(m_device, m_commandPool);
11426 cb.BeginCommandBuffer();
11427 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -060011428
Chris Forbesf29a84f2016-10-06 18:39:28 +130011429 m_commandBuffer->BeginCommandBuffer();
11430 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
11431 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060011432
Chris Forbesf29a84f2016-10-06 18:39:28 +130011433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
11434 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011435 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060011436}
11437
Tobin Ehlis17826bd2016-05-25 11:12:50 -060011438TEST_F(VkLayerTest, DSUsageBitsErrors) {
11439 TEST_DESCRIPTION("Attempt to update descriptor sets for images and buffers "
11440 "that do not have correct usage bits sets.");
11441 VkResult err;
11442
11443 ASSERT_NO_FATAL_FAILURE(InitState());
11444 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
11445 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
11446 ds_type_count[i].type = VkDescriptorType(i);
11447 ds_type_count[i].descriptorCount = 1;
11448 }
11449 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11450 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11451 ds_pool_ci.pNext = NULL;
11452 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
11453 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
11454 ds_pool_ci.pPoolSizes = ds_type_count;
11455
11456 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011457 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060011458 ASSERT_VK_SUCCESS(err);
11459
11460 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011461 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -060011462 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
11463 dsl_binding[i].binding = 0;
11464 dsl_binding[i].descriptorType = VkDescriptorType(i);
11465 dsl_binding[i].descriptorCount = 1;
11466 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
11467 dsl_binding[i].pImmutableSamplers = NULL;
11468 }
11469
11470 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11471 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11472 ds_layout_ci.pNext = NULL;
11473 ds_layout_ci.bindingCount = 1;
11474 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
11475 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
11476 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011477 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060011478 ASSERT_VK_SUCCESS(err);
11479 }
11480 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
11481 VkDescriptorSetAllocateInfo alloc_info = {};
11482 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11483 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
11484 alloc_info.descriptorPool = ds_pool;
11485 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011486 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060011487 ASSERT_VK_SUCCESS(err);
11488
11489 // Create a buffer & bufferView to be used for invalid updates
11490 VkBufferCreateInfo buff_ci = {};
11491 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
11492 // This usage is not valid for any descriptor type
11493 buff_ci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
11494 buff_ci.size = 256;
11495 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
11496 VkBuffer buffer;
11497 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
11498 ASSERT_VK_SUCCESS(err);
11499
11500 VkBufferViewCreateInfo buff_view_ci = {};
11501 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
11502 buff_view_ci.buffer = buffer;
11503 buff_view_ci.format = VK_FORMAT_R8_UNORM;
11504 buff_view_ci.range = VK_WHOLE_SIZE;
11505 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011506 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060011507 ASSERT_VK_SUCCESS(err);
11508
11509 // Create an image to be used for invalid updates
11510 VkImageCreateInfo image_ci = {};
11511 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11512 image_ci.imageType = VK_IMAGE_TYPE_2D;
11513 image_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
11514 image_ci.extent.width = 64;
11515 image_ci.extent.height = 64;
11516 image_ci.extent.depth = 1;
11517 image_ci.mipLevels = 1;
11518 image_ci.arrayLayers = 1;
11519 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
11520 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
11521 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
11522 // This usage is not valid for any descriptor type
11523 image_ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
11524 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
11525 VkImage image;
11526 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
11527 ASSERT_VK_SUCCESS(err);
11528 // Bind memory to image
11529 VkMemoryRequirements mem_reqs;
11530 VkDeviceMemory image_mem;
11531 bool pass;
11532 VkMemoryAllocateInfo mem_alloc = {};
11533 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11534 mem_alloc.pNext = NULL;
11535 mem_alloc.allocationSize = 0;
11536 mem_alloc.memoryTypeIndex = 0;
11537 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
11538 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011539 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060011540 ASSERT_TRUE(pass);
11541 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
11542 ASSERT_VK_SUCCESS(err);
11543 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
11544 ASSERT_VK_SUCCESS(err);
11545 // Now create view for image
11546 VkImageViewCreateInfo image_view_ci = {};
11547 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
11548 image_view_ci.image = image;
11549 image_view_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
11550 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
11551 image_view_ci.subresourceRange.layerCount = 1;
11552 image_view_ci.subresourceRange.baseArrayLayer = 0;
11553 image_view_ci.subresourceRange.levelCount = 1;
11554 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11555 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011556 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060011557 ASSERT_VK_SUCCESS(err);
11558
11559 VkDescriptorBufferInfo buff_info = {};
11560 buff_info.buffer = buffer;
11561 VkDescriptorImageInfo img_info = {};
11562 img_info.imageView = image_view;
11563 VkWriteDescriptorSet descriptor_write = {};
11564 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11565 descriptor_write.dstBinding = 0;
11566 descriptor_write.descriptorCount = 1;
11567 descriptor_write.pTexelBufferView = &buff_view;
11568 descriptor_write.pBufferInfo = &buff_info;
11569 descriptor_write.pImageInfo = &img_info;
11570
11571 // These error messages align with VkDescriptorType struct
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011572 const char *error_msgs[] = {"", // placeholder, no error for SAMPLER descriptor
11573 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
11574 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
11575 " does not have VK_IMAGE_USAGE_STORAGE_BIT set.",
11576 " does not have VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT set.",
11577 " does not have VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set.",
11578 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
11579 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
11580 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
11581 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
11582 " does not have VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set."};
Tobin Ehlis17826bd2016-05-25 11:12:50 -060011583 // Start loop at 1 as SAMPLER desc type has no usage bit error
11584 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
11585 descriptor_write.descriptorType = VkDescriptorType(i);
11586 descriptor_write.dstSet = descriptor_sets[i];
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011587 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msgs[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060011588
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011589 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060011590
11591 m_errorMonitor->VerifyFound();
11592 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
11593 }
11594 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
11595 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060011596 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060011597 vkDestroyImageView(m_device->device(), image_view, NULL);
11598 vkDestroyBuffer(m_device->device(), buffer, NULL);
11599 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011600 vkFreeDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_TYPE_RANGE_SIZE, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060011601 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11602}
11603
Tobin Ehlis585f66d2016-07-01 18:23:58 -060011604TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011605 TEST_DESCRIPTION("Attempt to update buffer descriptor set that has incorrect "
11606 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
11607 "1. offset value greater than buffer size\n"
11608 "2. range value of 0\n"
11609 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -060011610 VkResult err;
11611
11612 ASSERT_NO_FATAL_FAILURE(InitState());
11613 VkDescriptorPoolSize ds_type_count = {};
11614 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11615 ds_type_count.descriptorCount = 1;
11616
11617 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11618 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11619 ds_pool_ci.pNext = NULL;
11620 ds_pool_ci.maxSets = 1;
11621 ds_pool_ci.poolSizeCount = 1;
11622 ds_pool_ci.pPoolSizes = &ds_type_count;
11623
11624 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011625 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060011626 ASSERT_VK_SUCCESS(err);
11627
11628 // Create layout with single uniform buffer descriptor
11629 VkDescriptorSetLayoutBinding dsl_binding = {};
11630 dsl_binding.binding = 0;
11631 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11632 dsl_binding.descriptorCount = 1;
11633 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11634 dsl_binding.pImmutableSamplers = NULL;
11635
11636 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11637 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11638 ds_layout_ci.pNext = NULL;
11639 ds_layout_ci.bindingCount = 1;
11640 ds_layout_ci.pBindings = &dsl_binding;
11641 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011642 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060011643 ASSERT_VK_SUCCESS(err);
11644
11645 VkDescriptorSet descriptor_set = {};
11646 VkDescriptorSetAllocateInfo alloc_info = {};
11647 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11648 alloc_info.descriptorSetCount = 1;
11649 alloc_info.descriptorPool = ds_pool;
11650 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011651 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060011652 ASSERT_VK_SUCCESS(err);
11653
11654 // Create a buffer to be used for invalid updates
11655 VkBufferCreateInfo buff_ci = {};
11656 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
11657 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
11658 buff_ci.size = 256;
11659 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
11660 VkBuffer buffer;
11661 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
11662 ASSERT_VK_SUCCESS(err);
11663 // Have to bind memory to buffer before descriptor update
11664 VkMemoryAllocateInfo mem_alloc = {};
11665 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11666 mem_alloc.pNext = NULL;
11667 mem_alloc.allocationSize = 256;
11668 mem_alloc.memoryTypeIndex = 0;
11669
11670 VkMemoryRequirements mem_reqs;
11671 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011672 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060011673 if (!pass) {
11674 vkDestroyBuffer(m_device->device(), buffer, NULL);
11675 return;
11676 }
11677
11678 VkDeviceMemory mem;
11679 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
11680 ASSERT_VK_SUCCESS(err);
11681 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
11682 ASSERT_VK_SUCCESS(err);
11683
11684 VkDescriptorBufferInfo buff_info = {};
11685 buff_info.buffer = buffer;
11686 // First make offset 1 larger than buffer size
11687 buff_info.offset = 257;
11688 buff_info.range = VK_WHOLE_SIZE;
11689 VkWriteDescriptorSet descriptor_write = {};
11690 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11691 descriptor_write.dstBinding = 0;
11692 descriptor_write.descriptorCount = 1;
11693 descriptor_write.pTexelBufferView = nullptr;
11694 descriptor_write.pBufferInfo = &buff_info;
11695 descriptor_write.pImageInfo = nullptr;
11696
11697 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11698 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011699 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " offset of 257 is greater than buffer ");
Tobin Ehlis585f66d2016-07-01 18:23:58 -060011700
11701 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11702
11703 m_errorMonitor->VerifyFound();
11704 // Now cause error due to range of 0
11705 buff_info.offset = 0;
11706 buff_info.range = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11708 " range is not VK_WHOLE_SIZE and is zero, which is not allowed.");
Tobin Ehlis585f66d2016-07-01 18:23:58 -060011709
11710 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11711
11712 m_errorMonitor->VerifyFound();
11713 // Now cause error due to range exceeding buffer size - offset
11714 buff_info.offset = 128;
11715 buff_info.range = 200;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011716 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " range is 200 which is greater than buffer size ");
Tobin Ehlis585f66d2016-07-01 18:23:58 -060011717
11718 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11719
11720 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -060011721 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060011722 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11723 vkDestroyBuffer(m_device->device(), buffer, NULL);
11724 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
11725 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11726}
11727
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060011728TEST_F(VkLayerTest, DSAspectBitsErrors) {
11729 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
11730 // are set, but could expand this test to hit more cases.
11731 TEST_DESCRIPTION("Attempt to update descriptor sets for images "
11732 "that do not have correct aspect bits sets.");
11733 VkResult err;
11734
11735 ASSERT_NO_FATAL_FAILURE(InitState());
11736 VkDescriptorPoolSize ds_type_count = {};
11737 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
11738 ds_type_count.descriptorCount = 1;
11739
11740 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11741 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11742 ds_pool_ci.pNext = NULL;
11743 ds_pool_ci.maxSets = 5;
11744 ds_pool_ci.poolSizeCount = 1;
11745 ds_pool_ci.pPoolSizes = &ds_type_count;
11746
11747 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011748 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060011749 ASSERT_VK_SUCCESS(err);
11750
11751 VkDescriptorSetLayoutBinding dsl_binding = {};
11752 dsl_binding.binding = 0;
11753 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
11754 dsl_binding.descriptorCount = 1;
11755 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11756 dsl_binding.pImmutableSamplers = NULL;
11757
11758 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11759 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11760 ds_layout_ci.pNext = NULL;
11761 ds_layout_ci.bindingCount = 1;
11762 ds_layout_ci.pBindings = &dsl_binding;
11763 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011764 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060011765 ASSERT_VK_SUCCESS(err);
11766
11767 VkDescriptorSet descriptor_set = {};
11768 VkDescriptorSetAllocateInfo alloc_info = {};
11769 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11770 alloc_info.descriptorSetCount = 1;
11771 alloc_info.descriptorPool = ds_pool;
11772 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011773 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060011774 ASSERT_VK_SUCCESS(err);
11775
11776 // Create an image to be used for invalid updates
11777 VkImageCreateInfo image_ci = {};
11778 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11779 image_ci.imageType = VK_IMAGE_TYPE_2D;
11780 image_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
11781 image_ci.extent.width = 64;
11782 image_ci.extent.height = 64;
11783 image_ci.extent.depth = 1;
11784 image_ci.mipLevels = 1;
11785 image_ci.arrayLayers = 1;
11786 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
11787 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
11788 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
11789 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
11790 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
11791 VkImage image;
11792 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
11793 ASSERT_VK_SUCCESS(err);
11794 // Bind memory to image
11795 VkMemoryRequirements mem_reqs;
11796 VkDeviceMemory image_mem;
11797 bool pass;
11798 VkMemoryAllocateInfo mem_alloc = {};
11799 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11800 mem_alloc.pNext = NULL;
11801 mem_alloc.allocationSize = 0;
11802 mem_alloc.memoryTypeIndex = 0;
11803 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
11804 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011805 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060011806 ASSERT_TRUE(pass);
11807 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
11808 ASSERT_VK_SUCCESS(err);
11809 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
11810 ASSERT_VK_SUCCESS(err);
11811 // Now create view for image
11812 VkImageViewCreateInfo image_view_ci = {};
11813 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
11814 image_view_ci.image = image;
11815 image_view_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
11816 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
11817 image_view_ci.subresourceRange.layerCount = 1;
11818 image_view_ci.subresourceRange.baseArrayLayer = 0;
11819 image_view_ci.subresourceRange.levelCount = 1;
11820 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011821 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060011822
11823 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011824 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060011825 ASSERT_VK_SUCCESS(err);
11826
11827 VkDescriptorImageInfo img_info = {};
11828 img_info.imageView = image_view;
11829 VkWriteDescriptorSet descriptor_write = {};
11830 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11831 descriptor_write.dstBinding = 0;
11832 descriptor_write.descriptorCount = 1;
11833 descriptor_write.pTexelBufferView = NULL;
11834 descriptor_write.pBufferInfo = NULL;
11835 descriptor_write.pImageInfo = &img_info;
11836 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
11837 descriptor_write.dstSet = descriptor_set;
11838 const char *error_msg = " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
11839 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011840 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060011841
11842 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11843
11844 m_errorMonitor->VerifyFound();
11845 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11846 vkDestroyImage(m_device->device(), image, NULL);
11847 vkFreeMemory(m_device->device(), image_mem, NULL);
11848 vkDestroyImageView(m_device->device(), image_view, NULL);
11849 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
11850 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11851}
11852
Karl Schultz6addd812016-02-02 17:17:23 -070011853TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011854 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070011855 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011856
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11858 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
11859 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011860
Tobin Ehlis3b780662015-05-28 12:11:26 -060011861 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011862 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011863 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011864 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11865 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011866
11867 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011868 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11869 ds_pool_ci.pNext = NULL;
11870 ds_pool_ci.maxSets = 1;
11871 ds_pool_ci.poolSizeCount = 1;
11872 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011873
Tobin Ehlis3b780662015-05-28 12:11:26 -060011874 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011875 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011876 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060011877 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011878 dsl_binding.binding = 0;
11879 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11880 dsl_binding.descriptorCount = 1;
11881 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11882 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011883
Tony Barboureb254902015-07-15 12:50:33 -060011884 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011885 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11886 ds_layout_ci.pNext = NULL;
11887 ds_layout_ci.bindingCount = 1;
11888 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011889
Tobin Ehlis3b780662015-05-28 12:11:26 -060011890 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011891 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011892 ASSERT_VK_SUCCESS(err);
11893
11894 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011895 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011896 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011897 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011898 alloc_info.descriptorPool = ds_pool;
11899 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011900 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011901 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011902
Tobin Ehlis30db8f82016-05-05 08:19:48 -060011903 VkSamplerCreateInfo sampler_ci = {};
11904 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11905 sampler_ci.pNext = NULL;
11906 sampler_ci.magFilter = VK_FILTER_NEAREST;
11907 sampler_ci.minFilter = VK_FILTER_NEAREST;
11908 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11909 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11910 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11911 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11912 sampler_ci.mipLodBias = 1.0;
11913 sampler_ci.anisotropyEnable = VK_FALSE;
11914 sampler_ci.maxAnisotropy = 1;
11915 sampler_ci.compareEnable = VK_FALSE;
11916 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11917 sampler_ci.minLod = 1.0;
11918 sampler_ci.maxLod = 1.0;
11919 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11920 sampler_ci.unnormalizedCoordinates = VK_FALSE;
11921 VkSampler sampler;
11922 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
11923 ASSERT_VK_SUCCESS(err);
11924
11925 VkDescriptorImageInfo info = {};
11926 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011927
11928 VkWriteDescriptorSet descriptor_write;
11929 memset(&descriptor_write, 0, sizeof(descriptor_write));
11930 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011931 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011932 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011933 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011934 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011935 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011936
11937 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11938
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011939 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011940
Chia-I Wuf7458c52015-10-26 21:10:41 +080011941 vkDestroySampler(m_device->device(), sampler, NULL);
11942 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11943 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011944}
11945
Karl Schultz6addd812016-02-02 17:17:23 -070011946TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011947 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070011948 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011949
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011950 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11951 " binding #0 with 1 total descriptors but update of 1 descriptors "
11952 "starting at binding offset of 0 combined with update array element "
11953 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011954
Tobin Ehlis3b780662015-05-28 12:11:26 -060011955 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011956 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011957 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011958 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11959 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011960
11961 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011962 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11963 ds_pool_ci.pNext = NULL;
11964 ds_pool_ci.maxSets = 1;
11965 ds_pool_ci.poolSizeCount = 1;
11966 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011967
Tobin Ehlis3b780662015-05-28 12:11:26 -060011968 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011969 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011970 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011971
Tony Barboureb254902015-07-15 12:50:33 -060011972 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011973 dsl_binding.binding = 0;
11974 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11975 dsl_binding.descriptorCount = 1;
11976 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11977 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060011978
11979 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011980 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11981 ds_layout_ci.pNext = NULL;
11982 ds_layout_ci.bindingCount = 1;
11983 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011984
Tobin Ehlis3b780662015-05-28 12:11:26 -060011985 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011986 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011987 ASSERT_VK_SUCCESS(err);
11988
11989 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011990 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011991 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011992 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011993 alloc_info.descriptorPool = ds_pool;
11994 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011995 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011996 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011997
Tobin Ehlis30db8f82016-05-05 08:19:48 -060011998 // Correctly update descriptor to avoid "NOT_UPDATED" error
11999 VkDescriptorBufferInfo buff_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012000 buff_info.buffer = VkBuffer(0); // Don't care about buffer handle for this test
Tobin Ehlis30db8f82016-05-05 08:19:48 -060012001 buff_info.offset = 0;
12002 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080012003
12004 VkWriteDescriptorSet descriptor_write;
12005 memset(&descriptor_write, 0, sizeof(descriptor_write));
12006 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012007 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012008 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080012009 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060012010 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12011 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080012012
12013 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12014
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012015 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060012016
Chia-I Wuf7458c52015-10-26 21:10:41 +080012017 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12018 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060012019}
12020
Karl Schultz6addd812016-02-02 17:17:23 -070012021TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
12022 // Create layout w/ count of 1 and attempt update to that layout w/ binding
12023 // index 2
12024 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060012025
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012026 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012027
Tobin Ehlis3b780662015-05-28 12:11:26 -060012028 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070012029 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080012030 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012031 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12032 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060012033
12034 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012035 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12036 ds_pool_ci.pNext = NULL;
12037 ds_pool_ci.maxSets = 1;
12038 ds_pool_ci.poolSizeCount = 1;
12039 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060012040
Tobin Ehlis3b780662015-05-28 12:11:26 -060012041 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012042 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060012043 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060012044
Tony Barboureb254902015-07-15 12:50:33 -060012045 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012046 dsl_binding.binding = 0;
12047 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12048 dsl_binding.descriptorCount = 1;
12049 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
12050 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060012051
12052 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012053 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12054 ds_layout_ci.pNext = NULL;
12055 ds_layout_ci.bindingCount = 1;
12056 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060012057 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012058 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060012059 ASSERT_VK_SUCCESS(err);
12060
12061 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012062 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080012063 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070012064 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060012065 alloc_info.descriptorPool = ds_pool;
12066 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012067 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060012068 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060012069
Tony Barboureb254902015-07-15 12:50:33 -060012070 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012071 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12072 sampler_ci.pNext = NULL;
12073 sampler_ci.magFilter = VK_FILTER_NEAREST;
12074 sampler_ci.minFilter = VK_FILTER_NEAREST;
12075 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12076 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12077 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12078 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12079 sampler_ci.mipLodBias = 1.0;
12080 sampler_ci.anisotropyEnable = VK_FALSE;
12081 sampler_ci.maxAnisotropy = 1;
12082 sampler_ci.compareEnable = VK_FALSE;
12083 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12084 sampler_ci.minLod = 1.0;
12085 sampler_ci.maxLod = 1.0;
12086 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12087 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060012088
Tobin Ehlis3b780662015-05-28 12:11:26 -060012089 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012090 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060012091 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080012092
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060012093 VkDescriptorImageInfo info = {};
12094 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080012095
12096 VkWriteDescriptorSet descriptor_write;
12097 memset(&descriptor_write, 0, sizeof(descriptor_write));
12098 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012099 descriptor_write.dstSet = descriptorSet;
12100 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080012101 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060012102 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080012103 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060012104 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080012105
12106 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12107
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012108 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060012109
Chia-I Wuf7458c52015-10-26 21:10:41 +080012110 vkDestroySampler(m_device->device(), sampler, NULL);
12111 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12112 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060012113}
12114
Karl Schultz6addd812016-02-02 17:17:23 -070012115TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
12116 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
12117 // types
12118 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060012119
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012120 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 -060012121
Tobin Ehlis3b780662015-05-28 12:11:26 -060012122 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012123
Chia-I Wu1b99bb22015-10-27 19:25:11 +080012124 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012125 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12126 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060012127
12128 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012129 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12130 ds_pool_ci.pNext = NULL;
12131 ds_pool_ci.maxSets = 1;
12132 ds_pool_ci.poolSizeCount = 1;
12133 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060012134
Tobin Ehlis3b780662015-05-28 12:11:26 -060012135 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012136 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060012137 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060012138 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012139 dsl_binding.binding = 0;
12140 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12141 dsl_binding.descriptorCount = 1;
12142 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
12143 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060012144
Tony Barboureb254902015-07-15 12:50:33 -060012145 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012146 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12147 ds_layout_ci.pNext = NULL;
12148 ds_layout_ci.bindingCount = 1;
12149 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060012150
Tobin Ehlis3b780662015-05-28 12:11:26 -060012151 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012152 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060012153 ASSERT_VK_SUCCESS(err);
12154
12155 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012156 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080012157 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070012158 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060012159 alloc_info.descriptorPool = ds_pool;
12160 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012161 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060012162 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060012163
Tony Barboureb254902015-07-15 12:50:33 -060012164 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012165 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12166 sampler_ci.pNext = NULL;
12167 sampler_ci.magFilter = VK_FILTER_NEAREST;
12168 sampler_ci.minFilter = VK_FILTER_NEAREST;
12169 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12170 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12171 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12172 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12173 sampler_ci.mipLodBias = 1.0;
12174 sampler_ci.anisotropyEnable = VK_FALSE;
12175 sampler_ci.maxAnisotropy = 1;
12176 sampler_ci.compareEnable = VK_FALSE;
12177 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12178 sampler_ci.minLod = 1.0;
12179 sampler_ci.maxLod = 1.0;
12180 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12181 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060012182 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012183 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060012184 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080012185
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060012186 VkDescriptorImageInfo info = {};
12187 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080012188
12189 VkWriteDescriptorSet descriptor_write;
12190 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012191 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012192 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080012193 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060012194 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080012195 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060012196 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080012197
12198 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12199
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012200 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060012201
Chia-I Wuf7458c52015-10-26 21:10:41 +080012202 vkDestroySampler(m_device->device(), sampler, NULL);
12203 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12204 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060012205}
12206
Karl Schultz6addd812016-02-02 17:17:23 -070012207TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012208 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070012209 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012210
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12212 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012213
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012214 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070012215 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
12216 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080012217 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012218 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
12219 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012220
12221 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012222 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12223 ds_pool_ci.pNext = NULL;
12224 ds_pool_ci.maxSets = 1;
12225 ds_pool_ci.poolSizeCount = 1;
12226 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012227
12228 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012229 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012230 ASSERT_VK_SUCCESS(err);
12231
12232 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012233 dsl_binding.binding = 0;
12234 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
12235 dsl_binding.descriptorCount = 1;
12236 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
12237 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012238
12239 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012240 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12241 ds_layout_ci.pNext = NULL;
12242 ds_layout_ci.bindingCount = 1;
12243 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012244 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012245 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012246 ASSERT_VK_SUCCESS(err);
12247
12248 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012249 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080012250 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070012251 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012252 alloc_info.descriptorPool = ds_pool;
12253 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012254 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012255 ASSERT_VK_SUCCESS(err);
12256
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012257 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012258
12259 VkDescriptorImageInfo descriptor_info;
12260 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
12261 descriptor_info.sampler = sampler;
12262
12263 VkWriteDescriptorSet descriptor_write;
12264 memset(&descriptor_write, 0, sizeof(descriptor_write));
12265 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012266 descriptor_write.dstSet = descriptorSet;
12267 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080012268 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012269 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
12270 descriptor_write.pImageInfo = &descriptor_info;
12271
12272 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12273
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012274 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012275
Chia-I Wuf7458c52015-10-26 21:10:41 +080012276 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12277 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012278}
12279
Karl Schultz6addd812016-02-02 17:17:23 -070012280TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
12281 // Create a single combined Image/Sampler descriptor and send it an invalid
12282 // imageView
12283 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012284
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012285 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to combined "
12286 "image sampler descriptor failed due "
12287 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012288
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012289 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080012290 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012291 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12292 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012293
12294 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012295 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12296 ds_pool_ci.pNext = NULL;
12297 ds_pool_ci.maxSets = 1;
12298 ds_pool_ci.poolSizeCount = 1;
12299 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012300
12301 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012302 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012303 ASSERT_VK_SUCCESS(err);
12304
12305 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012306 dsl_binding.binding = 0;
12307 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12308 dsl_binding.descriptorCount = 1;
12309 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
12310 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012311
12312 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012313 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12314 ds_layout_ci.pNext = NULL;
12315 ds_layout_ci.bindingCount = 1;
12316 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012317 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012318 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012319 ASSERT_VK_SUCCESS(err);
12320
12321 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012322 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080012323 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070012324 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012325 alloc_info.descriptorPool = ds_pool;
12326 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012327 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012328 ASSERT_VK_SUCCESS(err);
12329
12330 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012331 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12332 sampler_ci.pNext = NULL;
12333 sampler_ci.magFilter = VK_FILTER_NEAREST;
12334 sampler_ci.minFilter = VK_FILTER_NEAREST;
12335 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12336 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12337 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12338 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12339 sampler_ci.mipLodBias = 1.0;
12340 sampler_ci.anisotropyEnable = VK_FALSE;
12341 sampler_ci.maxAnisotropy = 1;
12342 sampler_ci.compareEnable = VK_FALSE;
12343 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12344 sampler_ci.minLod = 1.0;
12345 sampler_ci.maxLod = 1.0;
12346 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12347 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012348
12349 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012350 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012351 ASSERT_VK_SUCCESS(err);
12352
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012353 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012354
12355 VkDescriptorImageInfo descriptor_info;
12356 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
12357 descriptor_info.sampler = sampler;
12358 descriptor_info.imageView = view;
12359
12360 VkWriteDescriptorSet descriptor_write;
12361 memset(&descriptor_write, 0, sizeof(descriptor_write));
12362 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012363 descriptor_write.dstSet = descriptorSet;
12364 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080012365 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012366 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12367 descriptor_write.pImageInfo = &descriptor_info;
12368
12369 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12370
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012371 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012372
Chia-I Wuf7458c52015-10-26 21:10:41 +080012373 vkDestroySampler(m_device->device(), sampler, NULL);
12374 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12375 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060012376}
12377
Karl Schultz6addd812016-02-02 17:17:23 -070012378TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
12379 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
12380 // into the other
12381 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060012382
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012383 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding #1 with type "
12384 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
12385 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012386
Tobin Ehlis04356f92015-10-27 16:35:27 -060012387 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070012388 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080012389 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012390 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12391 ds_type_count[0].descriptorCount = 1;
12392 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
12393 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060012394
12395 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012396 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12397 ds_pool_ci.pNext = NULL;
12398 ds_pool_ci.maxSets = 1;
12399 ds_pool_ci.poolSizeCount = 2;
12400 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060012401
12402 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012403 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060012404 ASSERT_VK_SUCCESS(err);
12405 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012406 dsl_binding[0].binding = 0;
12407 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12408 dsl_binding[0].descriptorCount = 1;
12409 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
12410 dsl_binding[0].pImmutableSamplers = NULL;
12411 dsl_binding[1].binding = 1;
12412 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
12413 dsl_binding[1].descriptorCount = 1;
12414 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
12415 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060012416
12417 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012418 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12419 ds_layout_ci.pNext = NULL;
12420 ds_layout_ci.bindingCount = 2;
12421 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060012422
12423 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012424 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060012425 ASSERT_VK_SUCCESS(err);
12426
12427 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012428 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080012429 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070012430 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060012431 alloc_info.descriptorPool = ds_pool;
12432 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012433 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060012434 ASSERT_VK_SUCCESS(err);
12435
12436 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012437 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12438 sampler_ci.pNext = NULL;
12439 sampler_ci.magFilter = VK_FILTER_NEAREST;
12440 sampler_ci.minFilter = VK_FILTER_NEAREST;
12441 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12442 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12443 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12444 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12445 sampler_ci.mipLodBias = 1.0;
12446 sampler_ci.anisotropyEnable = VK_FALSE;
12447 sampler_ci.maxAnisotropy = 1;
12448 sampler_ci.compareEnable = VK_FALSE;
12449 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12450 sampler_ci.minLod = 1.0;
12451 sampler_ci.maxLod = 1.0;
12452 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12453 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060012454
12455 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012456 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060012457 ASSERT_VK_SUCCESS(err);
12458
12459 VkDescriptorImageInfo info = {};
12460 info.sampler = sampler;
12461
12462 VkWriteDescriptorSet descriptor_write;
12463 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
12464 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012465 descriptor_write.dstSet = descriptorSet;
12466 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080012467 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060012468 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
12469 descriptor_write.pImageInfo = &info;
12470 // This write update should succeed
12471 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12472 // Now perform a copy update that fails due to type mismatch
12473 VkCopyDescriptorSet copy_ds_update;
12474 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
12475 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
12476 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -060012477 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012478 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070012479 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +080012480 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060012481 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
12482
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012483 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060012484 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012485 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 -060012486 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
12487 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
12488 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012489 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012490 copy_ds_update.dstSet = descriptorSet;
12491 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -060012492 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060012493 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
12494
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012495 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012496
Tobin Ehlis04356f92015-10-27 16:35:27 -060012497 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012498 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
12499 "update array offset of 0 and update of "
12500 "5 descriptors oversteps total number "
12501 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012502
Tobin Ehlis04356f92015-10-27 16:35:27 -060012503 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
12504 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
12505 copy_ds_update.srcSet = descriptorSet;
12506 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012507 copy_ds_update.dstSet = descriptorSet;
12508 copy_ds_update.dstBinding = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012509 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060012510 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
12511
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012512 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060012513
Chia-I Wuf7458c52015-10-26 21:10:41 +080012514 vkDestroySampler(m_device->device(), sampler, NULL);
12515 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12516 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060012517}
12518
Karl Schultz6addd812016-02-02 17:17:23 -070012519TEST_F(VkLayerTest, NumSamplesMismatch) {
12520 // Create CommandBuffer where MSAA samples doesn't match RenderPass
12521 // sampleCount
12522 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060012523
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012524 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012525
Tobin Ehlis3b780662015-05-28 12:11:26 -060012526 ASSERT_NO_FATAL_FAILURE(InitState());
12527 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080012528 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060012529 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080012530 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060012531
12532 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012533 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12534 ds_pool_ci.pNext = NULL;
12535 ds_pool_ci.maxSets = 1;
12536 ds_pool_ci.poolSizeCount = 1;
12537 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060012538
Tobin Ehlis3b780662015-05-28 12:11:26 -060012539 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012540 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060012541 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060012542
Tony Barboureb254902015-07-15 12:50:33 -060012543 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080012544 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060012545 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080012546 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060012547 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
12548 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060012549
Tony Barboureb254902015-07-15 12:50:33 -060012550 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12551 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12552 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080012553 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070012554 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060012555
Tobin Ehlis3b780662015-05-28 12:11:26 -060012556 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012557 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060012558 ASSERT_VK_SUCCESS(err);
12559
12560 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012561 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080012562 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070012563 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060012564 alloc_info.descriptorPool = ds_pool;
12565 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012566 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060012567 ASSERT_VK_SUCCESS(err);
12568
Tony Barboureb254902015-07-15 12:50:33 -060012569 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012570 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070012571 pipe_ms_state_ci.pNext = NULL;
12572 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
12573 pipe_ms_state_ci.sampleShadingEnable = 0;
12574 pipe_ms_state_ci.minSampleShading = 1.0;
12575 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060012576
Tony Barboureb254902015-07-15 12:50:33 -060012577 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012578 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12579 pipeline_layout_ci.pNext = NULL;
12580 pipeline_layout_ci.setLayoutCount = 1;
12581 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060012582
12583 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012584 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060012585 ASSERT_VK_SUCCESS(err);
12586
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012587 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12588 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
12589 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012590 VkPipelineObj pipe(m_device);
12591 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060012592 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060012593 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012594 pipe.SetMSAA(&pipe_ms_state_ci);
12595 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060012596
Tony Barbourfe3351b2015-07-28 10:17:20 -060012597 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012598 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060012599
Mark Young29927482016-05-04 14:38:51 -060012600 // Render triangle (the error should trigger on the attempt to draw).
12601 Draw(3, 1, 0, 0);
12602
12603 // Finalize recording of the command buffer
12604 EndCommandBuffer();
12605
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012606 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060012607
Chia-I Wuf7458c52015-10-26 21:10:41 +080012608 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12609 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12610 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060012611}
Mark Young29927482016-05-04 14:38:51 -060012612
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060012613TEST_F(VkLayerTest, RenderPassIncompatible) {
12614 TEST_DESCRIPTION("Hit RenderPass incompatible cases. "
12615 "Initial case is drawing with an active renderpass that's "
Mike Weiblencce7ec72016-10-17 19:33:05 -060012616 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060012617 VkResult err;
12618
12619 ASSERT_NO_FATAL_FAILURE(InitState());
12620 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12621
12622 VkDescriptorSetLayoutBinding dsl_binding = {};
12623 dsl_binding.binding = 0;
12624 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12625 dsl_binding.descriptorCount = 1;
12626 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
12627 dsl_binding.pImmutableSamplers = NULL;
12628
12629 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12630 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12631 ds_layout_ci.pNext = NULL;
12632 ds_layout_ci.bindingCount = 1;
12633 ds_layout_ci.pBindings = &dsl_binding;
12634
12635 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012636 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060012637 ASSERT_VK_SUCCESS(err);
12638
12639 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12640 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12641 pipeline_layout_ci.pNext = NULL;
12642 pipeline_layout_ci.setLayoutCount = 1;
12643 pipeline_layout_ci.pSetLayouts = &ds_layout;
12644
12645 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012646 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060012647 ASSERT_VK_SUCCESS(err);
12648
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012649 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12650 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
12651 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060012652 // Create a renderpass that will be incompatible with default renderpass
12653 VkAttachmentReference attach = {};
12654 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12655 VkAttachmentReference color_att = {};
12656 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12657 VkSubpassDescription subpass = {};
12658 subpass.inputAttachmentCount = 1;
12659 subpass.pInputAttachments = &attach;
12660 subpass.colorAttachmentCount = 1;
12661 subpass.pColorAttachments = &color_att;
12662 VkRenderPassCreateInfo rpci = {};
12663 rpci.subpassCount = 1;
12664 rpci.pSubpasses = &subpass;
12665 rpci.attachmentCount = 1;
12666 VkAttachmentDescription attach_desc = {};
12667 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060012668 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
12669 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060012670 rpci.pAttachments = &attach_desc;
12671 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
12672 VkRenderPass rp;
12673 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12674 VkPipelineObj pipe(m_device);
12675 pipe.AddShader(&vs);
12676 pipe.AddShader(&fs);
12677 pipe.AddColorAttachment();
12678 VkViewport view_port = {};
12679 m_viewports.push_back(view_port);
12680 pipe.SetViewport(m_viewports);
12681 VkRect2D rect = {};
12682 m_scissors.push_back(rect);
12683 pipe.SetScissor(m_scissors);
12684 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12685
12686 VkCommandBufferInheritanceInfo cbii = {};
12687 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
12688 cbii.renderPass = rp;
12689 cbii.subpass = 0;
12690 VkCommandBufferBeginInfo cbbi = {};
12691 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12692 cbbi.pInheritanceInfo = &cbii;
12693 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
12694 VkRenderPassBeginInfo rpbi = {};
12695 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
12696 rpbi.framebuffer = m_framebuffer;
12697 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012698 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
12699 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060012700
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012701 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060012702 // Render triangle (the error should trigger on the attempt to draw).
12703 Draw(3, 1, 0, 0);
12704
12705 // Finalize recording of the command buffer
12706 EndCommandBuffer();
12707
12708 m_errorMonitor->VerifyFound();
12709
12710 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12711 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12712 vkDestroyRenderPass(m_device->device(), rp, NULL);
12713}
12714
Mark Youngc89c6312016-03-31 16:03:20 -060012715TEST_F(VkLayerTest, NumBlendAttachMismatch) {
12716 // Create Pipeline where the number of blend attachments doesn't match the
12717 // number of color attachments. In this case, we don't add any color
12718 // blend attachments even though we have a color attachment.
12719 VkResult err;
12720
12721 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012722 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -060012723
12724 ASSERT_NO_FATAL_FAILURE(InitState());
12725 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12726 VkDescriptorPoolSize ds_type_count = {};
12727 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12728 ds_type_count.descriptorCount = 1;
12729
12730 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12731 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12732 ds_pool_ci.pNext = NULL;
12733 ds_pool_ci.maxSets = 1;
12734 ds_pool_ci.poolSizeCount = 1;
12735 ds_pool_ci.pPoolSizes = &ds_type_count;
12736
12737 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012738 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060012739 ASSERT_VK_SUCCESS(err);
12740
12741 VkDescriptorSetLayoutBinding dsl_binding = {};
12742 dsl_binding.binding = 0;
12743 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12744 dsl_binding.descriptorCount = 1;
12745 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
12746 dsl_binding.pImmutableSamplers = NULL;
12747
12748 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12749 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12750 ds_layout_ci.pNext = NULL;
12751 ds_layout_ci.bindingCount = 1;
12752 ds_layout_ci.pBindings = &dsl_binding;
12753
12754 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012755 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060012756 ASSERT_VK_SUCCESS(err);
12757
12758 VkDescriptorSet descriptorSet;
12759 VkDescriptorSetAllocateInfo alloc_info = {};
12760 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12761 alloc_info.descriptorSetCount = 1;
12762 alloc_info.descriptorPool = ds_pool;
12763 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012764 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060012765 ASSERT_VK_SUCCESS(err);
12766
12767 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012768 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060012769 pipe_ms_state_ci.pNext = NULL;
12770 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12771 pipe_ms_state_ci.sampleShadingEnable = 0;
12772 pipe_ms_state_ci.minSampleShading = 1.0;
12773 pipe_ms_state_ci.pSampleMask = NULL;
12774
12775 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12776 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12777 pipeline_layout_ci.pNext = NULL;
12778 pipeline_layout_ci.setLayoutCount = 1;
12779 pipeline_layout_ci.pSetLayouts = &ds_layout;
12780
12781 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012782 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060012783 ASSERT_VK_SUCCESS(err);
12784
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012785 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12786 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
12787 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060012788 VkPipelineObj pipe(m_device);
12789 pipe.AddShader(&vs);
12790 pipe.AddShader(&fs);
12791 pipe.SetMSAA(&pipe_ms_state_ci);
12792 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12793
12794 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012795 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Youngc89c6312016-03-31 16:03:20 -060012796
Mark Young29927482016-05-04 14:38:51 -060012797 // Render triangle (the error should trigger on the attempt to draw).
12798 Draw(3, 1, 0, 0);
12799
12800 // Finalize recording of the command buffer
12801 EndCommandBuffer();
12802
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012803 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060012804
12805 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12806 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12807 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12808}
Mark Young29927482016-05-04 14:38:51 -060012809
Mark Muellerd4914412016-06-13 17:52:06 -060012810TEST_F(VkLayerTest, MissingClearAttachment) {
12811 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment "
12812 "structure passed to vkCmdClearAttachments");
Cody Northropc31a84f2016-08-22 10:41:47 -060012813 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesda6ae6f2016-09-09 14:36:33 +120012814 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesef5e2842016-09-08 15:25:24 +120012815 "vkCmdClearAttachments() color attachment index 1 out of range for active subpass 0; ignored");
Mark Muellerd4914412016-06-13 17:52:06 -060012816
12817 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
12818 m_errorMonitor->VerifyFound();
12819}
12820
Karl Schultz6addd812016-02-02 17:17:23 -070012821TEST_F(VkLayerTest, ClearCmdNoDraw) {
12822 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
12823 // to issuing a Draw
12824 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012825
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012826 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060012827 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012828
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012829 ASSERT_NO_FATAL_FAILURE(InitState());
12830 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060012831
Chia-I Wu1b99bb22015-10-27 19:25:11 +080012832 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012833 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12834 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060012835
12836 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012837 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12838 ds_pool_ci.pNext = NULL;
12839 ds_pool_ci.maxSets = 1;
12840 ds_pool_ci.poolSizeCount = 1;
12841 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060012842
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012843 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012844 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012845 ASSERT_VK_SUCCESS(err);
12846
Tony Barboureb254902015-07-15 12:50:33 -060012847 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012848 dsl_binding.binding = 0;
12849 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12850 dsl_binding.descriptorCount = 1;
12851 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
12852 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012853
Tony Barboureb254902015-07-15 12:50:33 -060012854 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012855 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12856 ds_layout_ci.pNext = NULL;
12857 ds_layout_ci.bindingCount = 1;
12858 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012859
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012860 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012861 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012862 ASSERT_VK_SUCCESS(err);
12863
12864 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012865 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080012866 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070012867 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060012868 alloc_info.descriptorPool = ds_pool;
12869 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012870 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012871 ASSERT_VK_SUCCESS(err);
12872
Tony Barboureb254902015-07-15 12:50:33 -060012873 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012874 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070012875 pipe_ms_state_ci.pNext = NULL;
12876 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
12877 pipe_ms_state_ci.sampleShadingEnable = 0;
12878 pipe_ms_state_ci.minSampleShading = 1.0;
12879 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012880
Tony Barboureb254902015-07-15 12:50:33 -060012881 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012882 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12883 pipeline_layout_ci.pNext = NULL;
12884 pipeline_layout_ci.setLayoutCount = 1;
12885 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012886
12887 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012888 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012889 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012890
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012891 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060012892 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070012893 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012894 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012895
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012896 VkPipelineObj pipe(m_device);
12897 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060012898 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012899 pipe.SetMSAA(&pipe_ms_state_ci);
12900 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060012901
12902 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012903
Karl Schultz6addd812016-02-02 17:17:23 -070012904 // Main thing we care about for this test is that the VkImage obj we're
12905 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012906 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060012907 VkClearAttachment color_attachment;
12908 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12909 color_attachment.clearValue.color.float32[0] = 1.0;
12910 color_attachment.clearValue.color.float32[1] = 1.0;
12911 color_attachment.clearValue.color.float32[2] = 1.0;
12912 color_attachment.clearValue.color.float32[3] = 1.0;
12913 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012914 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012915
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012916 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012917
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012918 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060012919
Chia-I Wuf7458c52015-10-26 21:10:41 +080012920 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12921 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12922 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012923}
12924
Karl Schultz6addd812016-02-02 17:17:23 -070012925TEST_F(VkLayerTest, VtxBufferBadIndex) {
12926 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012927
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12929 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012930
Tobin Ehlis502480b2015-06-24 15:53:07 -060012931 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -060012932 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060012933 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060012934
Chia-I Wu1b99bb22015-10-27 19:25:11 +080012935 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012936 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12937 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060012938
12939 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012940 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12941 ds_pool_ci.pNext = NULL;
12942 ds_pool_ci.maxSets = 1;
12943 ds_pool_ci.poolSizeCount = 1;
12944 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060012945
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060012946 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012947 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012948 ASSERT_VK_SUCCESS(err);
12949
Tony Barboureb254902015-07-15 12:50:33 -060012950 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012951 dsl_binding.binding = 0;
12952 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12953 dsl_binding.descriptorCount = 1;
12954 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
12955 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012956
Tony Barboureb254902015-07-15 12:50:33 -060012957 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012958 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12959 ds_layout_ci.pNext = NULL;
12960 ds_layout_ci.bindingCount = 1;
12961 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060012962
Tobin Ehlis502480b2015-06-24 15:53:07 -060012963 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012964 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012965 ASSERT_VK_SUCCESS(err);
12966
12967 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012968 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080012969 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070012970 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060012971 alloc_info.descriptorPool = ds_pool;
12972 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012973 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012974 ASSERT_VK_SUCCESS(err);
12975
Tony Barboureb254902015-07-15 12:50:33 -060012976 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012977 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070012978 pipe_ms_state_ci.pNext = NULL;
12979 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12980 pipe_ms_state_ci.sampleShadingEnable = 0;
12981 pipe_ms_state_ci.minSampleShading = 1.0;
12982 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012983
Tony Barboureb254902015-07-15 12:50:33 -060012984 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012985 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12986 pipeline_layout_ci.pNext = NULL;
12987 pipeline_layout_ci.setLayoutCount = 1;
12988 pipeline_layout_ci.pSetLayouts = &ds_layout;
12989 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012990
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012991 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012992 ASSERT_VK_SUCCESS(err);
12993
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012994 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12995 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
12996 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012997 VkPipelineObj pipe(m_device);
12998 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060012999 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060013000 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060013001 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060013002 pipe.SetViewport(m_viewports);
13003 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060013004 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060013005
13006 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013007 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060013008 // Don't care about actual data, just need to get to draw to flag error
13009 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013010 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060013011 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060013012 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060013013
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013014 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060013015
Chia-I Wuf7458c52015-10-26 21:10:41 +080013016 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13017 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13018 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060013019}
Mark Muellerdfe37552016-07-07 14:47:42 -060013020
Mark Mueller2ee294f2016-08-04 12:59:48 -060013021TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
13022 TEST_DESCRIPTION("Use an invalid count in a vkEnumeratePhysicalDevices call."
13023 "Use invalid Queue Family Index in vkCreateDevice");
Cody Northropc31a84f2016-08-22 10:41:47 -060013024 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Mueller2ee294f2016-08-04 12:59:48 -060013025
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013026 const char *mismatch_count_message = "Call to vkEnumeratePhysicalDevices() "
13027 "w/ pPhysicalDeviceCount value ";
Mark Mueller2ee294f2016-08-04 12:59:48 -060013028
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013029 const char *invalid_queueFamilyIndex_message = "Invalid queue create request in vkCreateDevice(). Invalid "
13030 "queueFamilyIndex ";
Mark Mueller2ee294f2016-08-04 12:59:48 -060013031
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013032 const char *unavailable_feature_message = "While calling vkCreateDevice(), requesting feature #";
Mark Mueller2ee294f2016-08-04 12:59:48 -060013033
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013034 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, mismatch_count_message);
Mark Mueller880fce52016-08-17 15:23:23 -060013035 // The following test fails with recent NVidia drivers.
13036 // By the time core_validation is reached, the NVidia
13037 // driver has sanitized the invalid condition and core_validation
13038 // is not introduced to the failure condition. This is not the case
13039 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013040 // uint32_t count = static_cast<uint32_t>(~0);
13041 // VkPhysicalDevice physical_device;
13042 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
13043 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060013044
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013045 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queueFamilyIndex_message);
Mark Mueller2ee294f2016-08-04 12:59:48 -060013046 float queue_priority = 0.0;
13047
13048 VkDeviceQueueCreateInfo queue_create_info = {};
13049 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
13050 queue_create_info.queueCount = 1;
13051 queue_create_info.pQueuePriorities = &queue_priority;
13052 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
13053
13054 VkPhysicalDeviceFeatures features = m_device->phy().features();
13055 VkDevice testDevice;
13056 VkDeviceCreateInfo device_create_info = {};
13057 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
13058 device_create_info.queueCreateInfoCount = 1;
13059 device_create_info.pQueueCreateInfos = &queue_create_info;
13060 device_create_info.pEnabledFeatures = &features;
13061 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
13062 m_errorMonitor->VerifyFound();
13063
13064 queue_create_info.queueFamilyIndex = 1;
13065
13066 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
13067 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
13068 for (unsigned i = 0; i < feature_count; i++) {
13069 if (VK_FALSE == feature_array[i]) {
13070 feature_array[i] = VK_TRUE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013071 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, unavailable_feature_message);
Mark Mueller2ee294f2016-08-04 12:59:48 -060013072 device_create_info.pEnabledFeatures = &features;
13073 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
13074 m_errorMonitor->VerifyFound();
13075 break;
13076 }
13077 }
13078}
13079
13080TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
13081 TEST_DESCRIPTION("Use an invalid queue index in a vkCmdWaitEvents call."
13082 "End a command buffer with a query still in progress.");
13083
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013084 const char *invalid_queue_index = "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
13085 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
13086 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060013087
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013088 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060013089
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013090 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060013091
13092 ASSERT_NO_FATAL_FAILURE(InitState());
13093
13094 VkEvent event;
13095 VkEventCreateInfo event_create_info{};
13096 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13097 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
13098
Mark Mueller2ee294f2016-08-04 12:59:48 -060013099 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013100 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060013101
13102 BeginCommandBuffer();
13103
13104 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013105 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 -060013106 ASSERT_TRUE(image.initialized());
13107 VkImageMemoryBarrier img_barrier = {};
13108 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
13109 img_barrier.pNext = NULL;
13110 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
13111 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
13112 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
13113 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
13114 img_barrier.image = image.handle();
13115 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060013116
13117 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
13118 // that layer validation catches the case when it is not.
13119 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060013120 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13121 img_barrier.subresourceRange.baseArrayLayer = 0;
13122 img_barrier.subresourceRange.baseMipLevel = 0;
13123 img_barrier.subresourceRange.layerCount = 1;
13124 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013125 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
13126 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060013127 m_errorMonitor->VerifyFound();
13128
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013129 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060013130
13131 VkQueryPool query_pool;
13132 VkQueryPoolCreateInfo query_pool_create_info = {};
13133 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
13134 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
13135 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013136 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060013137
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013138 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060013139 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
13140
13141 vkEndCommandBuffer(m_commandBuffer->handle());
13142 m_errorMonitor->VerifyFound();
13143
13144 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
13145 vkDestroyEvent(m_device->device(), event, nullptr);
13146}
13147
Mark Muellerdfe37552016-07-07 14:47:42 -060013148TEST_F(VkLayerTest, VertexBufferInvalid) {
13149 TEST_DESCRIPTION("Submit a command buffer using deleted vertex buffer, "
13150 "delete a buffer twice, use an invalid offset for each "
13151 "buffer type, and attempt to bind a null buffer");
13152
13153 const char *deleted_buffer_in_command_buffer = "Cannot submit cmd buffer "
13154 "using deleted buffer ";
13155 const char *double_destroy_message = "Cannot free buffer 0x";
13156 const char *invalid_offset_message = "vkBindBufferMemory(): "
13157 "memoryOffset is 0x";
13158 const char *invalid_storage_buffer_offset_message = "vkBindBufferMemory(): "
13159 "storage memoryOffset "
13160 "is 0x";
13161 const char *invalid_texel_buffer_offset_message = "vkBindBufferMemory(): "
13162 "texel memoryOffset "
13163 "is 0x";
13164 const char *invalid_uniform_buffer_offset_message = "vkBindBufferMemory(): "
13165 "uniform memoryOffset "
13166 "is 0x";
13167 const char *bind_null_buffer_message = "In vkBindBufferMemory, attempting"
13168 " to Bind Obj(0x";
13169 const char *free_invalid_buffer_message = "Request to delete memory "
13170 "object 0x";
13171
13172 ASSERT_NO_FATAL_FAILURE(InitState());
13173 ASSERT_NO_FATAL_FAILURE(InitViewport());
13174 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13175
13176 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013177 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060013178 pipe_ms_state_ci.pNext = NULL;
13179 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
13180 pipe_ms_state_ci.sampleShadingEnable = 0;
13181 pipe_ms_state_ci.minSampleShading = 1.0;
13182 pipe_ms_state_ci.pSampleMask = nullptr;
13183
13184 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13185 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13186 VkPipelineLayout pipeline_layout;
13187
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013188 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060013189 ASSERT_VK_SUCCESS(err);
13190
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013191 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13192 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060013193 VkPipelineObj pipe(m_device);
13194 pipe.AddShader(&vs);
13195 pipe.AddShader(&fs);
13196 pipe.AddColorAttachment();
13197 pipe.SetMSAA(&pipe_ms_state_ci);
13198 pipe.SetViewport(m_viewports);
13199 pipe.SetScissor(m_scissors);
13200 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13201
13202 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013203 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060013204
13205 {
13206 // Create and bind a vertex buffer in a reduced scope, which will cause
13207 // it to be deleted upon leaving this scope
13208 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013209 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060013210 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
13211 draw_verticies.AddVertexInputToPipe(pipe);
13212 }
13213
13214 Draw(1, 0, 0, 0);
13215
13216 EndCommandBuffer();
13217
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013218 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060013219 QueueCommandBuffer(false);
13220 m_errorMonitor->VerifyFound();
13221
13222 {
13223 // Create and bind a vertex buffer in a reduced scope, and delete it
13224 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013225 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
13226 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, double_destroy_message);
Mark Muellerdfe37552016-07-07 14:47:42 -060013227 buffer_test.TestDoubleDestroy();
13228 }
13229 m_errorMonitor->VerifyFound();
13230
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013231 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060013232 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
13234 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
13235 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060013236 m_errorMonitor->VerifyFound();
13237 }
13238
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013239 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
13240 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060013241 // Create and bind a memory buffer with an invalid offset again,
13242 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013243 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
13244 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
13245 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060013246 m_errorMonitor->VerifyFound();
13247 }
13248
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013249 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060013250 // Create and bind a memory buffer with an invalid offset again, but
13251 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013252 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
13253 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
13254 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060013255 m_errorMonitor->VerifyFound();
13256 }
13257
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013258 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060013259 // Create and bind a memory buffer with an invalid offset again, but
13260 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013261 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
13262 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
13263 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060013264 m_errorMonitor->VerifyFound();
13265 }
13266
13267 {
13268 // Attempt to bind a null buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013269 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bind_null_buffer_message);
13270 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
13271 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060013272 m_errorMonitor->VerifyFound();
13273 }
13274
13275 {
13276 // Attempt to use an invalid handle to delete a buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013277 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, free_invalid_buffer_message);
13278 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
13279 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060013280 }
13281 m_errorMonitor->VerifyFound();
13282
13283 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13284}
13285
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060013286// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
13287TEST_F(VkLayerTest, InvalidImageLayout) {
13288 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013289 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
13290 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060013291 // 3 in ValidateCmdBufImageLayouts
13292 // * -1 Attempt to submit cmd buf w/ deleted image
13293 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
13294 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013295 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
13296 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060013297
13298 ASSERT_NO_FATAL_FAILURE(InitState());
13299 // Create src & dst images to use for copy operations
13300 VkImage src_image;
13301 VkImage dst_image;
13302
13303 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
13304 const int32_t tex_width = 32;
13305 const int32_t tex_height = 32;
13306
13307 VkImageCreateInfo image_create_info = {};
13308 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13309 image_create_info.pNext = NULL;
13310 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13311 image_create_info.format = tex_format;
13312 image_create_info.extent.width = tex_width;
13313 image_create_info.extent.height = tex_height;
13314 image_create_info.extent.depth = 1;
13315 image_create_info.mipLevels = 1;
13316 image_create_info.arrayLayers = 4;
13317 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13318 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
13319 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
13320 image_create_info.flags = 0;
13321
13322 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
13323 ASSERT_VK_SUCCESS(err);
13324 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
13325 ASSERT_VK_SUCCESS(err);
13326
13327 BeginCommandBuffer();
13328 VkImageCopy copyRegion;
13329 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13330 copyRegion.srcSubresource.mipLevel = 0;
13331 copyRegion.srcSubresource.baseArrayLayer = 0;
13332 copyRegion.srcSubresource.layerCount = 1;
13333 copyRegion.srcOffset.x = 0;
13334 copyRegion.srcOffset.y = 0;
13335 copyRegion.srcOffset.z = 0;
13336 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13337 copyRegion.dstSubresource.mipLevel = 0;
13338 copyRegion.dstSubresource.baseArrayLayer = 0;
13339 copyRegion.dstSubresource.layerCount = 1;
13340 copyRegion.dstOffset.x = 0;
13341 copyRegion.dstOffset.y = 0;
13342 copyRegion.dstOffset.z = 0;
13343 copyRegion.extent.width = 1;
13344 copyRegion.extent.height = 1;
13345 copyRegion.extent.depth = 1;
13346 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
13347 m_errorMonitor->VerifyFound();
13348 // Now cause error due to src image layout changing
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013349 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot copy from an image whose source layout is "
13350 "VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current "
13351 "layout VK_IMAGE_LAYOUT_GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060013352 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
13353 m_errorMonitor->VerifyFound();
13354 // Final src error is due to bad layout type
13355 m_errorMonitor->SetDesiredFailureMsg(
13356 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13357 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
13358 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
13359 m_errorMonitor->VerifyFound();
13360 // Now verify same checks for dst
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013361 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
13362 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060013363 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
13364 m_errorMonitor->VerifyFound();
13365 // Now cause error due to src image layout changing
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot copy from an image whose dest layout is "
13367 "VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current "
13368 "layout VK_IMAGE_LAYOUT_GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060013369 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
13370 m_errorMonitor->VerifyFound();
13371 m_errorMonitor->SetDesiredFailureMsg(
13372 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13373 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
13374 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
13375 m_errorMonitor->VerifyFound();
13376 // Now cause error due to bad image layout transition in PipelineBarrier
13377 VkImageMemoryBarrier image_barrier[1] = {};
13378 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
13379 image_barrier[0].image = src_image;
13380 image_barrier[0].subresourceRange.layerCount = 2;
13381 image_barrier[0].subresourceRange.levelCount = 2;
13382 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013383 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "You cannot transition the layout from "
13384 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when "
13385 "current layout is VK_IMAGE_LAYOUT_GENERAL.");
13386 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
13387 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060013388 m_errorMonitor->VerifyFound();
13389
13390 // Finally some layout errors at RenderPass create time
13391 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
13392 VkAttachmentReference attach = {};
13393 // perf warning for GENERAL layout w/ non-DS input attachment
13394 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
13395 VkSubpassDescription subpass = {};
13396 subpass.inputAttachmentCount = 1;
13397 subpass.pInputAttachments = &attach;
13398 VkRenderPassCreateInfo rpci = {};
13399 rpci.subpassCount = 1;
13400 rpci.pSubpasses = &subpass;
13401 rpci.attachmentCount = 1;
13402 VkAttachmentDescription attach_desc = {};
13403 attach_desc.format = VK_FORMAT_UNDEFINED;
13404 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060013405 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060013406 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013407 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
13408 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060013409 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
13410 m_errorMonitor->VerifyFound();
13411 // error w/ non-general layout
13412 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
13413
13414 m_errorMonitor->SetDesiredFailureMsg(
13415 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13416 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
13417 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
13418 m_errorMonitor->VerifyFound();
13419 subpass.inputAttachmentCount = 0;
13420 subpass.colorAttachmentCount = 1;
13421 subpass.pColorAttachments = &attach;
13422 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
13423 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013424 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
13425 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060013426 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
13427 m_errorMonitor->VerifyFound();
13428 // error w/ non-color opt or GENERAL layout for color attachment
13429 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
13430 m_errorMonitor->SetDesiredFailureMsg(
13431 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13432 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
13433 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
13434 m_errorMonitor->VerifyFound();
13435 subpass.colorAttachmentCount = 0;
13436 subpass.pDepthStencilAttachment = &attach;
13437 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
13438 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013439 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
13440 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060013441 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
13442 m_errorMonitor->VerifyFound();
13443 // error w/ non-ds opt or GENERAL layout for color attachment
13444 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013445 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13446 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
13447 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060013448 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
13449 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060013450 // For this error we need a valid renderpass so create default one
13451 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
13452 attach.attachment = 0;
13453 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
13454 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
13455 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
13456 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
13457 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
13458 // Can't do a CLEAR load on READ_ONLY initialLayout
13459 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
13460 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
13461 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013462 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " with invalid first layout "
13463 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
13464 "ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060013465 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
13466 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060013467
13468 vkDestroyImage(m_device->device(), src_image, NULL);
13469 vkDestroyImage(m_device->device(), dst_image, NULL);
13470}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060013471
Tobin Ehlise0936662016-10-11 08:10:51 -060013472TEST_F(VkLayerTest, InvalidStorageImageLayout) {
13473 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
13474 VkResult err;
13475
13476 ASSERT_NO_FATAL_FAILURE(InitState());
13477
13478 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
13479 VkImageTiling tiling;
13480 VkFormatProperties format_properties;
13481 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
13482 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
13483 tiling = VK_IMAGE_TILING_LINEAR;
13484 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
13485 tiling = VK_IMAGE_TILING_OPTIMAL;
13486 } else {
13487 printf("Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
13488 "skipped.\n");
13489 return;
13490 }
13491
13492 VkDescriptorPoolSize ds_type = {};
13493 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
13494 ds_type.descriptorCount = 1;
13495
13496 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13497 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13498 ds_pool_ci.maxSets = 1;
13499 ds_pool_ci.poolSizeCount = 1;
13500 ds_pool_ci.pPoolSizes = &ds_type;
13501 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13502
13503 VkDescriptorPool ds_pool;
13504 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
13505 ASSERT_VK_SUCCESS(err);
13506
13507 VkDescriptorSetLayoutBinding dsl_binding = {};
13508 dsl_binding.binding = 0;
13509 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
13510 dsl_binding.descriptorCount = 1;
13511 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13512 dsl_binding.pImmutableSamplers = NULL;
13513
13514 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13515 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13516 ds_layout_ci.pNext = NULL;
13517 ds_layout_ci.bindingCount = 1;
13518 ds_layout_ci.pBindings = &dsl_binding;
13519
13520 VkDescriptorSetLayout ds_layout;
13521 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
13522 ASSERT_VK_SUCCESS(err);
13523
13524 VkDescriptorSetAllocateInfo alloc_info = {};
13525 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13526 alloc_info.descriptorSetCount = 1;
13527 alloc_info.descriptorPool = ds_pool;
13528 alloc_info.pSetLayouts = &ds_layout;
13529 VkDescriptorSet descriptor_set;
13530 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
13531 ASSERT_VK_SUCCESS(err);
13532
13533 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13534 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13535 pipeline_layout_ci.pNext = NULL;
13536 pipeline_layout_ci.setLayoutCount = 1;
13537 pipeline_layout_ci.pSetLayouts = &ds_layout;
13538 VkPipelineLayout pipeline_layout;
13539 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
13540 ASSERT_VK_SUCCESS(err);
13541
13542 VkImageObj image(m_device);
13543 image.init(32, 32, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
13544 ASSERT_TRUE(image.initialized());
13545 VkImageView view = image.targetView(tex_format);
13546
13547 VkDescriptorImageInfo image_info = {};
13548 image_info.imageView = view;
13549 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
13550
13551 VkWriteDescriptorSet descriptor_write = {};
13552 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13553 descriptor_write.dstSet = descriptor_set;
13554 descriptor_write.dstBinding = 0;
13555 descriptor_write.descriptorCount = 1;
13556 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
13557 descriptor_write.pImageInfo = &image_info;
13558
13559 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13560 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
13561 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
13562 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13563 m_errorMonitor->VerifyFound();
13564
13565 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13566 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13567 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
13568 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13569}
13570
Tobin Ehlisd8d89182016-07-18 20:13:11 -060013571TEST_F(VkLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
13572 TEST_DESCRIPTION("Positive test where we create a renderpass with an "
13573 "attachment that uses LOAD_OP_CLEAR, the first subpass "
13574 "has a valid layout, and a second subpass then uses a "
13575 "valid *READ_ONLY* layout.");
13576 m_errorMonitor->ExpectSuccess();
13577 ASSERT_NO_FATAL_FAILURE(InitState());
13578
13579 VkAttachmentReference attach[2] = {};
13580 attach[0].attachment = 0;
13581 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
13582 attach[1].attachment = 0;
13583 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
13584 VkSubpassDescription subpasses[2] = {};
13585 // First subpass clears DS attach on load
13586 subpasses[0].pDepthStencilAttachment = &attach[0];
13587 // 2nd subpass reads in DS as input attachment
13588 subpasses[1].inputAttachmentCount = 1;
13589 subpasses[1].pInputAttachments = &attach[1];
13590 VkAttachmentDescription attach_desc = {};
13591 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
13592 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
13593 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
13594 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
13595 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
13596 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013597 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlisd8d89182016-07-18 20:13:11 -060013598 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
13599 VkRenderPassCreateInfo rpci = {};
13600 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
13601 rpci.attachmentCount = 1;
13602 rpci.pAttachments = &attach_desc;
13603 rpci.subpassCount = 2;
13604 rpci.pSubpasses = subpasses;
13605
13606 // Now create RenderPass and verify no errors
13607 VkRenderPass rp;
13608 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
13609 m_errorMonitor->VerifyNotFound();
13610
13611 vkDestroyRenderPass(m_device->device(), rp, NULL);
13612}
Tobin Ehlis4af23302016-07-19 10:50:30 -060013613
Mark Mueller93b938f2016-08-18 10:27:40 -060013614TEST_F(VkLayerTest, SimultaneousUse) {
13615 TEST_DESCRIPTION("Use vkCmdExecuteCommands with invalid state "
13616 "in primary and secondary command buffers.");
13617
13618 ASSERT_NO_FATAL_FAILURE(InitState());
13619 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13620
Mike Weiblen95dd0f92016-10-19 12:28:27 -060013621 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013622 const char *simultaneous_use_message2 = "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
13623 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060013624
13625 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013626 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060013627 command_buffer_allocate_info.commandPool = m_commandPool;
13628 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13629 command_buffer_allocate_info.commandBufferCount = 1;
13630
13631 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013632 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060013633 VkCommandBufferBeginInfo command_buffer_begin_info = {};
13634 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013635 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060013636 command_buffer_inheritance_info.renderPass = m_renderPass;
13637 command_buffer_inheritance_info.framebuffer = m_framebuffer;
13638 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013639 command_buffer_begin_info.flags =
13640 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060013641 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
13642
13643 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013644 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
13645 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller4042b652016-09-05 22:52:21 -060013646 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
Mark Mueller93b938f2016-08-18 10:27:40 -060013647 vkEndCommandBuffer(secondary_command_buffer);
13648
Mark Mueller93b938f2016-08-18 10:27:40 -060013649 VkSubmitInfo submit_info = {};
13650 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13651 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013652 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller4042b652016-09-05 22:52:21 -060013653 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Mueller93b938f2016-08-18 10:27:40 -060013654
Mark Mueller4042b652016-09-05 22:52:21 -060013655 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013656 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
13657 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
13658 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060013659 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060013660 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
13661 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060013662
13663 m_errorMonitor->SetDesiredFailureMsg(0, "");
Mark Mueller93b938f2016-08-18 10:27:40 -060013664 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13665
Mark Mueller4042b652016-09-05 22:52:21 -060013666 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060013667 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013668 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060013669
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013670 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
13671 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060013672 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060013673 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
13674 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060013675}
13676
Mark Mueller917f6bc2016-08-30 10:57:19 -060013677TEST_F(VkLayerTest, InUseDestroyedSignaled) {
13678 TEST_DESCRIPTION("Use vkCmdExecuteCommands with invalid state "
13679 "in primary and secondary command buffers. "
Mark Muellerc8d441e2016-08-23 17:36:00 -060013680 "Delete objects that are inuse. Call VkQueueSubmit "
13681 "with an event that has been deleted.");
Mark Mueller917f6bc2016-08-30 10:57:19 -060013682
13683 ASSERT_NO_FATAL_FAILURE(InitState());
13684 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13685
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013686 const char *submit_with_deleted_event_message = "Cannot submit cmd buffer using deleted event 0x";
13687 const char *cannot_delete_event_message = "Cannot delete event 0x";
13688 const char *cannot_delete_semaphore_message = "Cannot delete semaphore 0x";
13689 const char *cannot_destroy_fence_message = "Fence 0x";
Mark Mueller917f6bc2016-08-30 10:57:19 -060013690
13691 BeginCommandBuffer();
13692
13693 VkEvent event;
13694 VkEventCreateInfo event_create_info = {};
13695 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13696 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013697 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013698
Mark Muellerc8d441e2016-08-23 17:36:00 -060013699 EndCommandBuffer();
13700 vkDestroyEvent(m_device->device(), event, nullptr);
13701
13702 VkSubmitInfo submit_info = {};
13703 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13704 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013705 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13706 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, submit_with_deleted_event_message);
Mark Muellerc8d441e2016-08-23 17:36:00 -060013707 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13708 m_errorMonitor->VerifyFound();
13709
13710 m_errorMonitor->SetDesiredFailureMsg(0, "");
13711 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
13712
13713 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
13714
Mark Mueller917f6bc2016-08-30 10:57:19 -060013715 VkSemaphoreCreateInfo semaphore_create_info = {};
13716 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13717 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013718 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013719 VkFenceCreateInfo fence_create_info = {};
13720 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13721 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013722 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013723
13724 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060013725 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013726 descriptor_pool_type_count.descriptorCount = 1;
13727
13728 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13729 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13730 descriptor_pool_create_info.maxSets = 1;
13731 descriptor_pool_create_info.poolSizeCount = 1;
13732 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013733 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013734
13735 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013736 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013737
13738 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060013739 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013740 descriptorset_layout_binding.descriptorCount = 1;
13741 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
13742
13743 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013744 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013745 descriptorset_layout_create_info.bindingCount = 1;
13746 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13747
13748 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013749 ASSERT_VK_SUCCESS(
13750 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013751
13752 VkDescriptorSet descriptorset;
13753 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013754 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013755 descriptorset_allocate_info.descriptorSetCount = 1;
13756 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13757 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013758 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013759
Mark Mueller4042b652016-09-05 22:52:21 -060013760 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13761
13762 VkDescriptorBufferInfo buffer_info = {};
13763 buffer_info.buffer = buffer_test.GetBuffer();
13764 buffer_info.offset = 0;
13765 buffer_info.range = 1024;
13766
13767 VkWriteDescriptorSet write_descriptor_set = {};
13768 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13769 write_descriptor_set.dstSet = descriptorset;
13770 write_descriptor_set.descriptorCount = 1;
13771 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13772 write_descriptor_set.pBufferInfo = &buffer_info;
13773
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013774 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060013775
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013776 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13777 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013778
13779 VkPipelineObj pipe(m_device);
13780 pipe.AddColorAttachment();
13781 pipe.AddShader(&vs);
13782 pipe.AddShader(&fs);
13783
13784 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013785 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013786 pipeline_layout_create_info.setLayoutCount = 1;
13787 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13788
13789 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013790 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013791
13792 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
13793
Mark Muellerc8d441e2016-08-23 17:36:00 -060013794 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013795 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060013796
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013797 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13798 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13799 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013800
Mark Muellerc8d441e2016-08-23 17:36:00 -060013801 EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060013802
Mark Mueller917f6bc2016-08-30 10:57:19 -060013803 submit_info.signalSemaphoreCount = 1;
13804 submit_info.pSignalSemaphores = &semaphore;
13805 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Muellerc8d441e2016-08-23 17:36:00 -060013806
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013807 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, cannot_delete_event_message);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013808 vkDestroyEvent(m_device->device(), event, nullptr);
13809 m_errorMonitor->VerifyFound();
13810
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013811 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, cannot_delete_semaphore_message);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013812 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13813 m_errorMonitor->VerifyFound();
13814
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013815 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, cannot_destroy_fence_message);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013816 vkDestroyFence(m_device->device(), fence, nullptr);
13817 m_errorMonitor->VerifyFound();
13818
Tobin Ehlis122207b2016-09-01 08:50:06 -070013819 vkQueueWaitIdle(m_device->m_queue);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013820 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13821 vkDestroyFence(m_device->device(), fence, nullptr);
13822 vkDestroyEvent(m_device->device(), event, nullptr);
13823 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013824 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013825 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13826}
13827
Tobin Ehlis2adda372016-09-01 08:51:06 -070013828TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
13829 TEST_DESCRIPTION("Delete in-use query pool.");
13830
13831 ASSERT_NO_FATAL_FAILURE(InitState());
13832 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13833
13834 VkQueryPool query_pool;
13835 VkQueryPoolCreateInfo query_pool_ci{};
13836 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
13837 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
13838 query_pool_ci.queryCount = 1;
13839 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
13840 BeginCommandBuffer();
13841 // Reset query pool to create binding with cmd buffer
13842 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
13843
13844 EndCommandBuffer();
13845
13846 VkSubmitInfo submit_info = {};
13847 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13848 submit_info.commandBufferCount = 1;
13849 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13850 // Submit cmd buffer and then destroy query pool while in-flight
13851 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13852
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013853 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete query pool 0x");
Tobin Ehlis2adda372016-09-01 08:51:06 -070013854 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
13855 m_errorMonitor->VerifyFound();
13856
13857 vkQueueWaitIdle(m_device->m_queue);
13858 // Now that cmd buffer done we can safely destroy query_pool
13859 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
13860}
13861
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013862TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
13863 TEST_DESCRIPTION("Delete in-use pipeline.");
13864
13865 ASSERT_NO_FATAL_FAILURE(InitState());
13866 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13867
13868 // Empty pipeline layout used for binding PSO
13869 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13870 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13871 pipeline_layout_ci.setLayoutCount = 0;
13872 pipeline_layout_ci.pSetLayouts = NULL;
13873
13874 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013875 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013876 ASSERT_VK_SUCCESS(err);
13877
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013878 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete pipeline 0x");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013879 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013880 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13881 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013882 // Store pipeline handle so we can actually delete it before test finishes
13883 VkPipeline delete_this_pipeline;
13884 { // Scope pipeline so it will be auto-deleted
13885 VkPipelineObj pipe(m_device);
13886 pipe.AddShader(&vs);
13887 pipe.AddShader(&fs);
13888 pipe.AddColorAttachment();
13889 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13890 delete_this_pipeline = pipe.handle();
13891
13892 BeginCommandBuffer();
13893 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013894 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013895
13896 EndCommandBuffer();
13897
13898 VkSubmitInfo submit_info = {};
13899 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13900 submit_info.commandBufferCount = 1;
13901 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13902 // Submit cmd buffer and then pipeline destroyed while in-flight
13903 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13904 } // Pipeline deletion triggered here
13905 m_errorMonitor->VerifyFound();
13906 // Make sure queue finished and then actually delete pipeline
13907 vkQueueWaitIdle(m_device->m_queue);
13908 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
13909 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
13910}
13911
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013912TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
13913 TEST_DESCRIPTION("Delete in-use imageView.");
13914
13915 ASSERT_NO_FATAL_FAILURE(InitState());
13916 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13917
13918 VkDescriptorPoolSize ds_type_count;
13919 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13920 ds_type_count.descriptorCount = 1;
13921
13922 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13923 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13924 ds_pool_ci.maxSets = 1;
13925 ds_pool_ci.poolSizeCount = 1;
13926 ds_pool_ci.pPoolSizes = &ds_type_count;
13927
13928 VkDescriptorPool ds_pool;
13929 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
13930 ASSERT_VK_SUCCESS(err);
13931
13932 VkSamplerCreateInfo sampler_ci = {};
13933 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
13934 sampler_ci.pNext = NULL;
13935 sampler_ci.magFilter = VK_FILTER_NEAREST;
13936 sampler_ci.minFilter = VK_FILTER_NEAREST;
13937 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
13938 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13939 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13940 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13941 sampler_ci.mipLodBias = 1.0;
13942 sampler_ci.anisotropyEnable = VK_FALSE;
13943 sampler_ci.maxAnisotropy = 1;
13944 sampler_ci.compareEnable = VK_FALSE;
13945 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
13946 sampler_ci.minLod = 1.0;
13947 sampler_ci.maxLod = 1.0;
13948 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
13949 sampler_ci.unnormalizedCoordinates = VK_FALSE;
13950 VkSampler sampler;
13951
13952 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
13953 ASSERT_VK_SUCCESS(err);
13954
13955 VkDescriptorSetLayoutBinding layout_binding;
13956 layout_binding.binding = 0;
13957 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13958 layout_binding.descriptorCount = 1;
13959 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13960 layout_binding.pImmutableSamplers = NULL;
13961
13962 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13963 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13964 ds_layout_ci.bindingCount = 1;
13965 ds_layout_ci.pBindings = &layout_binding;
13966 VkDescriptorSetLayout ds_layout;
13967 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
13968 ASSERT_VK_SUCCESS(err);
13969
13970 VkDescriptorSetAllocateInfo alloc_info = {};
13971 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13972 alloc_info.descriptorSetCount = 1;
13973 alloc_info.descriptorPool = ds_pool;
13974 alloc_info.pSetLayouts = &ds_layout;
13975 VkDescriptorSet descriptor_set;
13976 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
13977 ASSERT_VK_SUCCESS(err);
13978
13979 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13980 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13981 pipeline_layout_ci.pNext = NULL;
13982 pipeline_layout_ci.setLayoutCount = 1;
13983 pipeline_layout_ci.pSetLayouts = &ds_layout;
13984
13985 VkPipelineLayout pipeline_layout;
13986 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
13987 ASSERT_VK_SUCCESS(err);
13988
13989 VkImageObj image(m_device);
13990 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
13991 ASSERT_TRUE(image.initialized());
13992
13993 VkImageView view;
13994 VkImageViewCreateInfo ivci = {};
13995 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13996 ivci.image = image.handle();
13997 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
13998 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
13999 ivci.subresourceRange.layerCount = 1;
14000 ivci.subresourceRange.baseMipLevel = 0;
14001 ivci.subresourceRange.levelCount = 1;
14002 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14003
14004 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
14005 ASSERT_VK_SUCCESS(err);
14006
14007 VkDescriptorImageInfo image_info{};
14008 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
14009 image_info.imageView = view;
14010 image_info.sampler = sampler;
14011
14012 VkWriteDescriptorSet descriptor_write = {};
14013 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
14014 descriptor_write.dstSet = descriptor_set;
14015 descriptor_write.dstBinding = 0;
14016 descriptor_write.descriptorCount = 1;
14017 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
14018 descriptor_write.pImageInfo = &image_info;
14019
14020 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
14021
14022 // Create PSO to use the sampler
14023 char const *vsSource = "#version 450\n"
14024 "\n"
14025 "out gl_PerVertex { \n"
14026 " vec4 gl_Position;\n"
14027 "};\n"
14028 "void main(){\n"
14029 " gl_Position = vec4(1);\n"
14030 "}\n";
14031 char const *fsSource = "#version 450\n"
14032 "\n"
14033 "layout(set=0, binding=0) uniform sampler2D s;\n"
14034 "layout(location=0) out vec4 x;\n"
14035 "void main(){\n"
14036 " x = texture(s, vec2(1));\n"
14037 "}\n";
14038 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14039 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14040 VkPipelineObj pipe(m_device);
14041 pipe.AddShader(&vs);
14042 pipe.AddShader(&fs);
14043 pipe.AddColorAttachment();
14044 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14045
14046 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete image view 0x");
14047
14048 BeginCommandBuffer();
14049 // Bind pipeline to cmd buffer
14050 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
14051 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
14052 &descriptor_set, 0, nullptr);
14053 Draw(1, 0, 0, 0);
14054 EndCommandBuffer();
14055 // Submit cmd buffer then destroy sampler
14056 VkSubmitInfo submit_info = {};
14057 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
14058 submit_info.commandBufferCount = 1;
14059 submit_info.pCommandBuffers = &m_commandBuffer->handle();
14060 // Submit cmd buffer and then destroy imageView while in-flight
14061 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
14062
14063 vkDestroyImageView(m_device->device(), view, nullptr);
14064 m_errorMonitor->VerifyFound();
14065 vkQueueWaitIdle(m_device->m_queue);
14066 // Now we can actually destroy imageView
14067 vkDestroyImageView(m_device->device(), view, NULL);
14068 vkDestroySampler(m_device->device(), sampler, nullptr);
14069 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
14070 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
14071 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
14072}
14073
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060014074TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
14075 TEST_DESCRIPTION("Delete in-use bufferView.");
14076
14077 ASSERT_NO_FATAL_FAILURE(InitState());
14078 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14079
14080 VkDescriptorPoolSize ds_type_count;
14081 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
14082 ds_type_count.descriptorCount = 1;
14083
14084 VkDescriptorPoolCreateInfo ds_pool_ci = {};
14085 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
14086 ds_pool_ci.maxSets = 1;
14087 ds_pool_ci.poolSizeCount = 1;
14088 ds_pool_ci.pPoolSizes = &ds_type_count;
14089
14090 VkDescriptorPool ds_pool;
14091 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
14092 ASSERT_VK_SUCCESS(err);
14093
14094 VkDescriptorSetLayoutBinding layout_binding;
14095 layout_binding.binding = 0;
14096 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
14097 layout_binding.descriptorCount = 1;
14098 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
14099 layout_binding.pImmutableSamplers = NULL;
14100
14101 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
14102 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
14103 ds_layout_ci.bindingCount = 1;
14104 ds_layout_ci.pBindings = &layout_binding;
14105 VkDescriptorSetLayout ds_layout;
14106 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
14107 ASSERT_VK_SUCCESS(err);
14108
14109 VkDescriptorSetAllocateInfo alloc_info = {};
14110 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
14111 alloc_info.descriptorSetCount = 1;
14112 alloc_info.descriptorPool = ds_pool;
14113 alloc_info.pSetLayouts = &ds_layout;
14114 VkDescriptorSet descriptor_set;
14115 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
14116 ASSERT_VK_SUCCESS(err);
14117
14118 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
14119 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14120 pipeline_layout_ci.pNext = NULL;
14121 pipeline_layout_ci.setLayoutCount = 1;
14122 pipeline_layout_ci.pSetLayouts = &ds_layout;
14123
14124 VkPipelineLayout pipeline_layout;
14125 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
14126 ASSERT_VK_SUCCESS(err);
14127
14128 VkBuffer buffer;
14129 uint32_t queue_family_index = 0;
14130 VkBufferCreateInfo buffer_create_info = {};
14131 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
14132 buffer_create_info.size = 1024;
14133 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
14134 buffer_create_info.queueFamilyIndexCount = 1;
14135 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
14136
14137 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
14138 ASSERT_VK_SUCCESS(err);
14139
14140 VkMemoryRequirements memory_reqs;
14141 VkDeviceMemory buffer_memory;
14142
14143 VkMemoryAllocateInfo memory_info = {};
14144 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14145 memory_info.allocationSize = 0;
14146 memory_info.memoryTypeIndex = 0;
14147
14148 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
14149 memory_info.allocationSize = memory_reqs.size;
14150 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
14151 ASSERT_TRUE(pass);
14152
14153 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
14154 ASSERT_VK_SUCCESS(err);
14155 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
14156 ASSERT_VK_SUCCESS(err);
14157
14158 VkBufferView view;
14159 VkBufferViewCreateInfo bvci = {};
14160 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
14161 bvci.buffer = buffer;
14162 bvci.format = VK_FORMAT_R8_UNORM;
14163 bvci.range = VK_WHOLE_SIZE;
14164
14165 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
14166 ASSERT_VK_SUCCESS(err);
14167
14168 VkWriteDescriptorSet descriptor_write = {};
14169 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
14170 descriptor_write.dstSet = descriptor_set;
14171 descriptor_write.dstBinding = 0;
14172 descriptor_write.descriptorCount = 1;
14173 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
14174 descriptor_write.pTexelBufferView = &view;
14175
14176 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
14177
14178 char const *vsSource = "#version 450\n"
14179 "\n"
14180 "out gl_PerVertex { \n"
14181 " vec4 gl_Position;\n"
14182 "};\n"
14183 "void main(){\n"
14184 " gl_Position = vec4(1);\n"
14185 "}\n";
14186 char const *fsSource = "#version 450\n"
14187 "\n"
14188 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
14189 "layout(location=0) out vec4 x;\n"
14190 "void main(){\n"
14191 " x = imageLoad(s, 0);\n"
14192 "}\n";
14193 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14194 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14195 VkPipelineObj pipe(m_device);
14196 pipe.AddShader(&vs);
14197 pipe.AddShader(&fs);
14198 pipe.AddColorAttachment();
14199 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14200
14201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete buffer view 0x");
14202
14203 BeginCommandBuffer();
14204 VkViewport viewport = {0, 0, 16, 16, 0, 1};
14205 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
14206 VkRect2D scissor = {{0, 0}, {16, 16}};
14207 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
14208 // Bind pipeline to cmd buffer
14209 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
14210 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
14211 &descriptor_set, 0, nullptr);
14212 Draw(1, 0, 0, 0);
14213 EndCommandBuffer();
14214
14215 VkSubmitInfo submit_info = {};
14216 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
14217 submit_info.commandBufferCount = 1;
14218 submit_info.pCommandBuffers = &m_commandBuffer->handle();
14219 // Submit cmd buffer and then destroy bufferView while in-flight
14220 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
14221
14222 vkDestroyBufferView(m_device->device(), view, nullptr);
14223 m_errorMonitor->VerifyFound();
14224 vkQueueWaitIdle(m_device->m_queue);
14225 // Now we can actually destroy bufferView
14226 vkDestroyBufferView(m_device->device(), view, NULL);
14227 vkDestroyBuffer(m_device->device(), buffer, NULL);
14228 vkFreeMemory(m_device->device(), buffer_memory, NULL);
14229 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
14230 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
14231 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
14232}
14233
Tobin Ehlis209532e2016-09-07 13:52:18 -060014234TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
14235 TEST_DESCRIPTION("Delete in-use sampler.");
14236
14237 ASSERT_NO_FATAL_FAILURE(InitState());
14238 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14239
14240 VkDescriptorPoolSize ds_type_count;
14241 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
14242 ds_type_count.descriptorCount = 1;
14243
14244 VkDescriptorPoolCreateInfo ds_pool_ci = {};
14245 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
14246 ds_pool_ci.maxSets = 1;
14247 ds_pool_ci.poolSizeCount = 1;
14248 ds_pool_ci.pPoolSizes = &ds_type_count;
14249
14250 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014251 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060014252 ASSERT_VK_SUCCESS(err);
14253
14254 VkSamplerCreateInfo sampler_ci = {};
14255 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
14256 sampler_ci.pNext = NULL;
14257 sampler_ci.magFilter = VK_FILTER_NEAREST;
14258 sampler_ci.minFilter = VK_FILTER_NEAREST;
14259 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
14260 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
14261 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
14262 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
14263 sampler_ci.mipLodBias = 1.0;
14264 sampler_ci.anisotropyEnable = VK_FALSE;
14265 sampler_ci.maxAnisotropy = 1;
14266 sampler_ci.compareEnable = VK_FALSE;
14267 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
14268 sampler_ci.minLod = 1.0;
14269 sampler_ci.maxLod = 1.0;
14270 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
14271 sampler_ci.unnormalizedCoordinates = VK_FALSE;
14272 VkSampler sampler;
14273
14274 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
14275 ASSERT_VK_SUCCESS(err);
14276
14277 VkDescriptorSetLayoutBinding layout_binding;
14278 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060014279 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060014280 layout_binding.descriptorCount = 1;
14281 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
14282 layout_binding.pImmutableSamplers = NULL;
14283
14284 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
14285 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
14286 ds_layout_ci.bindingCount = 1;
14287 ds_layout_ci.pBindings = &layout_binding;
14288 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014289 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060014290 ASSERT_VK_SUCCESS(err);
14291
14292 VkDescriptorSetAllocateInfo alloc_info = {};
14293 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
14294 alloc_info.descriptorSetCount = 1;
14295 alloc_info.descriptorPool = ds_pool;
14296 alloc_info.pSetLayouts = &ds_layout;
14297 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014298 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060014299 ASSERT_VK_SUCCESS(err);
14300
14301 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
14302 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14303 pipeline_layout_ci.pNext = NULL;
14304 pipeline_layout_ci.setLayoutCount = 1;
14305 pipeline_layout_ci.pSetLayouts = &ds_layout;
14306
14307 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014308 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060014309 ASSERT_VK_SUCCESS(err);
14310
14311 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014312 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 -060014313 ASSERT_TRUE(image.initialized());
14314
14315 VkImageView view;
14316 VkImageViewCreateInfo ivci = {};
14317 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
14318 ivci.image = image.handle();
14319 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
14320 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
14321 ivci.subresourceRange.layerCount = 1;
14322 ivci.subresourceRange.baseMipLevel = 0;
14323 ivci.subresourceRange.levelCount = 1;
14324 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14325
14326 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
14327 ASSERT_VK_SUCCESS(err);
14328
14329 VkDescriptorImageInfo image_info{};
14330 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
14331 image_info.imageView = view;
14332 image_info.sampler = sampler;
14333
14334 VkWriteDescriptorSet descriptor_write = {};
14335 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
14336 descriptor_write.dstSet = descriptor_set;
14337 descriptor_write.dstBinding = 0;
14338 descriptor_write.descriptorCount = 1;
14339 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
14340 descriptor_write.pImageInfo = &image_info;
14341
14342 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
14343
14344 // Create PSO to use the sampler
14345 char const *vsSource = "#version 450\n"
14346 "\n"
14347 "out gl_PerVertex { \n"
14348 " vec4 gl_Position;\n"
14349 "};\n"
14350 "void main(){\n"
14351 " gl_Position = vec4(1);\n"
14352 "}\n";
14353 char const *fsSource = "#version 450\n"
14354 "\n"
14355 "layout(set=0, binding=0) uniform sampler2D s;\n"
14356 "layout(location=0) out vec4 x;\n"
14357 "void main(){\n"
14358 " x = texture(s, vec2(1));\n"
14359 "}\n";
14360 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14361 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14362 VkPipelineObj pipe(m_device);
14363 pipe.AddShader(&vs);
14364 pipe.AddShader(&fs);
14365 pipe.AddColorAttachment();
14366 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14367
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014368 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete sampler 0x");
Tobin Ehlis209532e2016-09-07 13:52:18 -060014369
14370 BeginCommandBuffer();
14371 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014372 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
14373 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
14374 &descriptor_set, 0, nullptr);
Tobin Ehlis209532e2016-09-07 13:52:18 -060014375 Draw(1, 0, 0, 0);
14376 EndCommandBuffer();
14377 // Submit cmd buffer then destroy sampler
14378 VkSubmitInfo submit_info = {};
14379 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
14380 submit_info.commandBufferCount = 1;
14381 submit_info.pCommandBuffers = &m_commandBuffer->handle();
14382 // Submit cmd buffer and then destroy sampler while in-flight
14383 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
14384
14385 vkDestroySampler(m_device->device(), sampler, nullptr);
14386 m_errorMonitor->VerifyFound();
14387 vkQueueWaitIdle(m_device->m_queue);
14388 // Now we can actually destroy sampler
14389 vkDestroySampler(m_device->device(), sampler, nullptr);
14390 vkDestroyImageView(m_device->device(), view, NULL);
14391 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
14392 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
14393 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
14394}
14395
Mark Mueller1cd9f412016-08-25 13:23:52 -060014396TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Mueller96a56d52016-08-24 10:28:05 -060014397 TEST_DESCRIPTION("Call VkQueueSubmit with a semaphore that is already "
Mark Mueller1cd9f412016-08-25 13:23:52 -060014398 "signaled but not waited on by the queue. Wait on a "
14399 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060014400
14401 ASSERT_NO_FATAL_FAILURE(InitState());
14402 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14403
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014404 const char *queue_forward_progress_message = " that has already been signaled but not waited on by queue 0x";
14405 const char *invalid_fence_wait_message = " which has not been submitted on a Queue or during "
14406 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060014407
14408 BeginCommandBuffer();
14409 EndCommandBuffer();
14410
14411 VkSemaphoreCreateInfo semaphore_create_info = {};
14412 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
14413 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014414 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060014415 VkSubmitInfo submit_info = {};
14416 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
14417 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014418 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060014419 submit_info.signalSemaphoreCount = 1;
14420 submit_info.pSignalSemaphores = &semaphore;
14421 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
14422 m_errorMonitor->SetDesiredFailureMsg(0, "");
14423 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
14424 BeginCommandBuffer();
14425 EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060014427 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
14428 m_errorMonitor->VerifyFound();
14429
Mark Mueller1cd9f412016-08-25 13:23:52 -060014430 VkFenceCreateInfo fence_create_info = {};
14431 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
14432 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014433 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060014434
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014435 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060014436 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
14437 m_errorMonitor->VerifyFound();
14438
Mark Mueller4042b652016-09-05 22:52:21 -060014439 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060014440 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060014441 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
14442}
14443
Tobin Ehlis4af23302016-07-19 10:50:30 -060014444TEST_F(VkLayerTest, FramebufferIncompatible) {
14445 TEST_DESCRIPTION("Bind a secondary command buffer with with a framebuffer "
14446 "that does not match the framebuffer for the active "
14447 "renderpass.");
14448 ASSERT_NO_FATAL_FAILURE(InitState());
14449 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14450
14451 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014452 VkAttachmentDescription attachment = {0,
14453 VK_FORMAT_B8G8R8A8_UNORM,
14454 VK_SAMPLE_COUNT_1_BIT,
14455 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
14456 VK_ATTACHMENT_STORE_OP_STORE,
14457 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
14458 VK_ATTACHMENT_STORE_OP_DONT_CARE,
14459 VK_IMAGE_LAYOUT_UNDEFINED,
14460 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060014461
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014462 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060014463
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014464 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060014465
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014466 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060014467
14468 VkRenderPass rp;
14469 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14470 ASSERT_VK_SUCCESS(err);
14471
14472 // A compatible framebuffer.
14473 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014474 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 -060014475 ASSERT_TRUE(image.initialized());
14476
14477 VkImageViewCreateInfo ivci = {
14478 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
14479 nullptr,
14480 0,
14481 image.handle(),
14482 VK_IMAGE_VIEW_TYPE_2D,
14483 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014484 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
14485 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060014486 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
14487 };
14488 VkImageView view;
14489 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
14490 ASSERT_VK_SUCCESS(err);
14491
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014492 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060014493 VkFramebuffer fb;
14494 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
14495 ASSERT_VK_SUCCESS(err);
14496
14497 VkCommandBufferAllocateInfo cbai = {};
14498 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
14499 cbai.commandPool = m_commandPool;
14500 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
14501 cbai.commandBufferCount = 1;
14502
14503 VkCommandBuffer sec_cb;
14504 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
14505 ASSERT_VK_SUCCESS(err);
14506 VkCommandBufferBeginInfo cbbi = {};
14507 VkCommandBufferInheritanceInfo cbii = {};
14508 cbii.renderPass = renderPass();
14509 cbii.framebuffer = fb;
14510 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
14511 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014512 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 -060014513 cbbi.pInheritanceInfo = &cbii;
14514 vkBeginCommandBuffer(sec_cb, &cbbi);
14515 vkEndCommandBuffer(sec_cb);
14516
Chris Forbes3400bc52016-09-13 18:10:34 +120014517 VkCommandBufferBeginInfo cbbi2 = {
14518 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
14519 0, nullptr
14520 };
14521 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
14522 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060014523
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014524 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060014525 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060014526 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
14527 m_errorMonitor->VerifyFound();
14528 // Cleanup
14529 vkDestroyImageView(m_device->device(), view, NULL);
14530 vkDestroyRenderPass(m_device->device(), rp, NULL);
14531 vkDestroyFramebuffer(m_device->device(), fb, NULL);
14532}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014533
14534TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
14535 TEST_DESCRIPTION("If logicOp is available on the device, set it to an "
14536 "invalid value. If logicOp is not available, attempt to "
14537 "use it and verify that we see the correct error.");
14538 ASSERT_NO_FATAL_FAILURE(InitState());
14539 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14540
14541 auto features = m_device->phy().features();
14542 // Set the expected error depending on whether or not logicOp available
14543 if (VK_FALSE == features.logicOp) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014544 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "If logic operations feature not "
14545 "enabled, logicOpEnable must be "
14546 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014547 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130014548 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014549 }
14550 // Create a pipeline using logicOp
14551 VkResult err;
14552
14553 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
14554 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14555
14556 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014557 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014558 ASSERT_VK_SUCCESS(err);
14559
14560 VkPipelineViewportStateCreateInfo vp_state_ci = {};
14561 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
14562 vp_state_ci.viewportCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014563 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014564 vp_state_ci.pViewports = &vp;
14565 vp_state_ci.scissorCount = 1;
14566 VkRect2D scissors = {}; // Dummy scissors to point to
14567 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014568
14569 VkPipelineShaderStageCreateInfo shaderStages[2];
14570 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
14571
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014572 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
14573 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014574 shaderStages[0] = vs.GetStageCreateInfo();
14575 shaderStages[1] = fs.GetStageCreateInfo();
14576
14577 VkPipelineVertexInputStateCreateInfo vi_ci = {};
14578 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
14579
14580 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
14581 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
14582 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
14583
14584 VkPipelineRasterizationStateCreateInfo rs_ci = {};
14585 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130014586 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014587
14588 VkPipelineColorBlendAttachmentState att = {};
14589 att.blendEnable = VK_FALSE;
14590 att.colorWriteMask = 0xf;
14591
14592 VkPipelineColorBlendStateCreateInfo cb_ci = {};
14593 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
14594 // Enable logicOp & set logicOp to value 1 beyond allowed entries
14595 cb_ci.logicOpEnable = VK_TRUE;
14596 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
14597 cb_ci.attachmentCount = 1;
14598 cb_ci.pAttachments = &att;
14599
Chris Forbes8aeacbf2016-10-03 14:25:08 +130014600 VkPipelineMultisampleStateCreateInfo ms_ci = {};
14601 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
14602 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
14603
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014604 VkGraphicsPipelineCreateInfo gp_ci = {};
14605 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
14606 gp_ci.stageCount = 2;
14607 gp_ci.pStages = shaderStages;
14608 gp_ci.pVertexInputState = &vi_ci;
14609 gp_ci.pInputAssemblyState = &ia_ci;
14610 gp_ci.pViewportState = &vp_state_ci;
14611 gp_ci.pRasterizationState = &rs_ci;
14612 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130014613 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014614 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
14615 gp_ci.layout = pipeline_layout;
14616 gp_ci.renderPass = renderPass();
14617
14618 VkPipelineCacheCreateInfo pc_ci = {};
14619 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
14620
14621 VkPipeline pipeline;
14622 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014623 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014624 ASSERT_VK_SUCCESS(err);
14625
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014626 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014627 m_errorMonitor->VerifyFound();
14628 if (VK_SUCCESS == err) {
14629 vkDestroyPipeline(m_device->device(), pipeline, NULL);
14630 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014631 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
14632 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
14633}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014634#endif // DRAW_STATE_TESTS
14635
Tobin Ehlis0788f522015-05-26 16:11:58 -060014636#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -060014637#if GTEST_IS_THREADSAFE
14638struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014639 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014640 VkEvent event;
14641 bool bailout;
14642};
14643
Karl Schultz6addd812016-02-02 17:17:23 -070014644extern "C" void *AddToCommandBuffer(void *arg) {
14645 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014646
Mike Stroyana6d14942016-07-13 15:10:05 -060014647 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014648 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014649 if (data->bailout) {
14650 break;
14651 }
14652 }
14653 return NULL;
14654}
14655
Karl Schultz6addd812016-02-02 17:17:23 -070014656TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060014657 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014658
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014659 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014660
Mike Stroyanaccf7692015-05-12 16:00:45 -060014661 ASSERT_NO_FATAL_FAILURE(InitState());
14662 ASSERT_NO_FATAL_FAILURE(InitViewport());
14663 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14664
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014665 // Calls AllocateCommandBuffers
14666 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060014667
14668 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014669 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014670
14671 VkEventCreateInfo event_info;
14672 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014673 VkResult err;
14674
14675 memset(&event_info, 0, sizeof(event_info));
14676 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
14677
Chia-I Wuf7458c52015-10-26 21:10:41 +080014678 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014679 ASSERT_VK_SUCCESS(err);
14680
Mike Stroyanaccf7692015-05-12 16:00:45 -060014681 err = vkResetEvent(device(), event);
14682 ASSERT_VK_SUCCESS(err);
14683
14684 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014685 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014686 data.event = event;
14687 data.bailout = false;
14688 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060014689
14690 // First do some correct operations using multiple threads.
14691 // Add many entries to command buffer from another thread.
14692 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
14693 // Make non-conflicting calls from this thread at the same time.
14694 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060014695 uint32_t count;
14696 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060014697 }
14698 test_platform_thread_join(thread, NULL);
14699
14700 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060014701 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060014702 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014703 // Add many entries to command buffer from this thread at the same time.
14704 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060014705
Mike Stroyan4268d1f2015-07-13 14:45:35 -060014706 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014707 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014708
Mike Stroyan10b8cb72016-01-22 15:22:03 -070014709 m_errorMonitor->SetBailout(NULL);
14710
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014711 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014712
Chia-I Wuf7458c52015-10-26 21:10:41 +080014713 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014714}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014715#endif // GTEST_IS_THREADSAFE
14716#endif // THREADING_TESTS
14717
Chris Forbes9f7ff632015-05-25 11:13:08 +120014718#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070014719TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014720 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
14721 "with an impossible code size");
14722
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014724
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014725 ASSERT_NO_FATAL_FAILURE(InitState());
14726 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14727
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014728 VkShaderModule module;
14729 VkShaderModuleCreateInfo moduleCreateInfo;
14730 struct icd_spv_header spv;
14731
14732 spv.magic = ICD_SPV_MAGIC;
14733 spv.version = ICD_SPV_VERSION;
14734 spv.gen_magic = 0;
14735
14736 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14737 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070014738 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014739 moduleCreateInfo.codeSize = 4;
14740 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014741 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014742
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014743 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014744}
14745
Karl Schultz6addd812016-02-02 17:17:23 -070014746TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014747 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
14748 "with a bad magic number");
14749
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014750 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014751
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014752 ASSERT_NO_FATAL_FAILURE(InitState());
14753 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14754
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014755 VkShaderModule module;
14756 VkShaderModuleCreateInfo moduleCreateInfo;
14757 struct icd_spv_header spv;
14758
14759 spv.magic = ~ICD_SPV_MAGIC;
14760 spv.version = ICD_SPV_VERSION;
14761 spv.gen_magic = 0;
14762
14763 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14764 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070014765 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014766 moduleCreateInfo.codeSize = sizeof(spv) + 10;
14767 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014768 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014769
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014770 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014771}
14772
Chris Forbesb4afd0f2016-04-04 10:48:35 +120014773#if 0
14774// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070014775TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014776 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120014777 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014778
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014779 ASSERT_NO_FATAL_FAILURE(InitState());
14780 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14781
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014782 VkShaderModule module;
14783 VkShaderModuleCreateInfo moduleCreateInfo;
14784 struct icd_spv_header spv;
14785
14786 spv.magic = ICD_SPV_MAGIC;
14787 spv.version = ~ICD_SPV_VERSION;
14788 spv.gen_magic = 0;
14789
14790 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14791 moduleCreateInfo.pNext = NULL;
14792
Karl Schultz6addd812016-02-02 17:17:23 -070014793 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014794 moduleCreateInfo.codeSize = sizeof(spv) + 10;
14795 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014796 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014797
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014798 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014799}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120014800#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014801
Karl Schultz6addd812016-02-02 17:17:23 -070014802TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014803 TEST_DESCRIPTION("Test that a warning is produced for a vertex output that "
14804 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014806
Chris Forbes9f7ff632015-05-25 11:13:08 +120014807 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014808 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120014809
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014810 char const *vsSource = "#version 450\n"
14811 "\n"
14812 "layout(location=0) out float x;\n"
14813 "out gl_PerVertex {\n"
14814 " vec4 gl_Position;\n"
14815 "};\n"
14816 "void main(){\n"
14817 " gl_Position = vec4(1);\n"
14818 " x = 0;\n"
14819 "}\n";
14820 char const *fsSource = "#version 450\n"
14821 "\n"
14822 "layout(location=0) out vec4 color;\n"
14823 "void main(){\n"
14824 " color = vec4(1);\n"
14825 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120014826
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014827 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14828 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120014829
14830 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014831 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120014832 pipe.AddShader(&vs);
14833 pipe.AddShader(&fs);
14834
Chris Forbes9f7ff632015-05-25 11:13:08 +120014835 VkDescriptorSetObj descriptorSet(m_device);
14836 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014837 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120014838
Tony Barbour5781e8f2015-08-04 16:23:11 -060014839 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120014840
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014841 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120014842}
Chris Forbes9f7ff632015-05-25 11:13:08 +120014843
Mark Mueller098c9cb2016-09-08 09:01:57 -060014844TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
14845 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
14846
14847 ASSERT_NO_FATAL_FAILURE(InitState());
14848 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14849
14850 const char *bad_specialization_message =
14851 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
14852
14853 char const *vsSource =
14854 "#version 450\n"
14855 "\n"
14856 "out gl_PerVertex {\n"
14857 " vec4 gl_Position;\n"
14858 "};\n"
14859 "void main(){\n"
14860 " gl_Position = vec4(1);\n"
14861 "}\n";
14862
14863 char const *fsSource =
14864 "#version 450\n"
14865 "\n"
14866 "layout (constant_id = 0) const float r = 0.0f;\n"
14867 "layout(location = 0) out vec4 uFragColor;\n"
14868 "void main(){\n"
14869 " uFragColor = vec4(r,1,0,1);\n"
14870 "}\n";
14871
14872 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14873 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14874
14875 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14876 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14877
14878 VkPipelineLayout pipeline_layout;
14879 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14880
14881 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
14882 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
14883 vp_state_create_info.viewportCount = 1;
14884 VkViewport viewport = {};
14885 vp_state_create_info.pViewports = &viewport;
14886 vp_state_create_info.scissorCount = 1;
14887 VkRect2D scissors = {};
14888 vp_state_create_info.pScissors = &scissors;
14889
14890 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
14891
14892 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
14893 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
14894 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
14895 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
14896
14897 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {
14898 vs.GetStageCreateInfo(),
14899 fs.GetStageCreateInfo()
14900 };
14901
14902 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
14903 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
14904
14905 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
14906 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
14907 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
14908
14909 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
14910 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
14911 rasterization_state_create_info.pNext = nullptr;
14912 rasterization_state_create_info.lineWidth = 1.0f;
14913 rasterization_state_create_info.rasterizerDiscardEnable = true;
14914
14915 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
14916 color_blend_attachment_state.blendEnable = VK_FALSE;
14917 color_blend_attachment_state.colorWriteMask = 0xf;
14918
14919 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
14920 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
14921 color_blend_state_create_info.attachmentCount = 1;
14922 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
14923
14924 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
14925 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
14926 graphicspipe_create_info.stageCount = 2;
14927 graphicspipe_create_info.pStages = shader_stage_create_info;
14928 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
14929 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
14930 graphicspipe_create_info.pViewportState = &vp_state_create_info;
14931 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
14932 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
14933 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
14934 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
14935 graphicspipe_create_info.layout = pipeline_layout;
14936 graphicspipe_create_info.renderPass = renderPass();
14937
14938 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
14939 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
14940
14941 VkPipelineCache pipelineCache;
14942 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
14943
14944 // This structure maps constant ids to data locations.
14945 const VkSpecializationMapEntry entry =
14946 // id, offset, size
14947 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
14948
14949 uint32_t data = 1;
14950
14951 // Set up the info describing spec map and data
14952 const VkSpecializationInfo specialization_info = {
14953 1,
14954 &entry,
14955 1 * sizeof(float),
14956 &data,
14957 };
14958 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
14959
14960 VkPipeline pipeline;
14961 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
14962 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
14963 m_errorMonitor->VerifyFound();
14964
14965 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
14966 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14967}
14968
14969TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
14970 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
14971
14972 ASSERT_NO_FATAL_FAILURE(InitState());
14973 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14974
14975 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
14976
14977 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
14978 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
14979 descriptor_pool_type_count[0].descriptorCount = 1;
14980 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
14981 descriptor_pool_type_count[1].descriptorCount = 1;
14982
14983 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
14984 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
14985 descriptor_pool_create_info.maxSets = 1;
14986 descriptor_pool_create_info.poolSizeCount = 2;
14987 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
14988 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
14989
14990 VkDescriptorPool descriptorset_pool;
14991 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
14992
14993 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
14994 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
14995 descriptorset_layout_binding.descriptorCount = 1;
14996 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
14997
14998 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
14999 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
15000 descriptorset_layout_create_info.bindingCount = 1;
15001 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
15002
15003 VkDescriptorSetLayout descriptorset_layout;
15004 ASSERT_VK_SUCCESS(vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
15005
15006 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
15007 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
15008 descriptorset_allocate_info.descriptorSetCount = 1;
15009 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
15010 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
15011 VkDescriptorSet descriptorset;
15012 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
15013
15014 // Challenge core_validation with a non uniform buffer type.
15015 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
15016
Mark Mueller098c9cb2016-09-08 09:01:57 -060015017 char const *vsSource =
15018 "#version 450\n"
15019 "\n"
15020 "layout (std140, set = 0, binding = 0) uniform buf {\n"
15021 " mat4 mvp;\n"
15022 "} ubuf;\n"
15023 "out gl_PerVertex {\n"
15024 " vec4 gl_Position;\n"
15025 "};\n"
15026 "void main(){\n"
15027 " gl_Position = ubuf.mvp * vec4(1);\n"
15028 "}\n";
15029
15030 char const *fsSource =
15031 "#version 450\n"
15032 "\n"
15033 "layout(location = 0) out vec4 uFragColor;\n"
15034 "void main(){\n"
15035 " uFragColor = vec4(0,1,0,1);\n"
15036 "}\n";
15037
15038 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15039 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15040
15041 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
15042 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
15043 pipeline_layout_create_info.setLayoutCount = 1;
15044 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
15045
15046 VkPipelineLayout pipeline_layout;
15047 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
15048
15049 VkPipelineObj pipe(m_device);
15050 pipe.AddColorAttachment();
15051 pipe.AddShader(&vs);
15052 pipe.AddShader(&fs);
15053
15054 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
15055 pipe.CreateVKPipeline(pipeline_layout, renderPass());
15056 m_errorMonitor->VerifyFound();
15057
15058 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
15059 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
15060 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
15061}
15062
15063TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
15064 TEST_DESCRIPTION(
15065 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
15066
15067 ASSERT_NO_FATAL_FAILURE(InitState());
15068 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15069
15070 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
15071
15072 VkDescriptorPoolSize descriptor_pool_type_count = {};
15073 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
15074 descriptor_pool_type_count.descriptorCount = 1;
15075
15076 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
15077 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
15078 descriptor_pool_create_info.maxSets = 1;
15079 descriptor_pool_create_info.poolSizeCount = 1;
15080 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
15081 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
15082
15083 VkDescriptorPool descriptorset_pool;
15084 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
15085
15086 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
15087 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
15088 descriptorset_layout_binding.descriptorCount = 1;
15089 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
15090 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
15091
15092 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
15093 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
15094 descriptorset_layout_create_info.bindingCount = 1;
15095 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
15096
15097 VkDescriptorSetLayout descriptorset_layout;
15098 ASSERT_VK_SUCCESS(vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info,
15099 nullptr, &descriptorset_layout));
15100
15101 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
15102 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
15103 descriptorset_allocate_info.descriptorSetCount = 1;
15104 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
15105 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
15106 VkDescriptorSet descriptorset;
15107 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
15108
15109 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
15110
Mark Mueller098c9cb2016-09-08 09:01:57 -060015111 char const *vsSource =
15112 "#version 450\n"
15113 "\n"
15114 "layout (std140, set = 0, binding = 0) uniform buf {\n"
15115 " mat4 mvp;\n"
15116 "} ubuf;\n"
15117 "out gl_PerVertex {\n"
15118 " vec4 gl_Position;\n"
15119 "};\n"
15120 "void main(){\n"
15121 " gl_Position = ubuf.mvp * vec4(1);\n"
15122 "}\n";
15123
15124 char const *fsSource =
15125 "#version 450\n"
15126 "\n"
15127 "layout(location = 0) out vec4 uFragColor;\n"
15128 "void main(){\n"
15129 " uFragColor = vec4(0,1,0,1);\n"
15130 "}\n";
15131
15132 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15133 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15134
15135 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
15136 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
15137 pipeline_layout_create_info.setLayoutCount = 1;
15138 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
15139
15140 VkPipelineLayout pipeline_layout;
15141 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
15142
15143 VkPipelineObj pipe(m_device);
15144 pipe.AddColorAttachment();
15145 pipe.AddShader(&vs);
15146 pipe.AddShader(&fs);
15147
15148 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
15149 pipe.CreateVKPipeline(pipeline_layout, renderPass());
15150 m_errorMonitor->VerifyFound();
15151
15152 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
15153 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
15154 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
15155}
15156
15157TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
15158 TEST_DESCRIPTION("Create a graphics pipleine in which a push constant range containing a push constant block member is not "
15159 "accessible from the current shader stage.");
15160
15161 ASSERT_NO_FATAL_FAILURE(InitState());
15162 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15163
15164 const char *push_constant_not_accessible_message =
15165 "Push constant range covering variable starting at offset 0 not accessible from stage VK_SHADER_STAGE_VERTEX_BIT";
15166
15167 char const *vsSource =
15168 "#version 450\n"
15169 "\n"
15170 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
15171 "out gl_PerVertex {\n"
15172 " vec4 gl_Position;\n"
15173 "};\n"
15174 "void main(){\n"
15175 " gl_Position = vec4(consts.x);\n"
15176 "}\n";
15177
15178 char const *fsSource =
15179 "#version 450\n"
15180 "\n"
15181 "layout(location = 0) out vec4 uFragColor;\n"
15182 "void main(){\n"
15183 " uFragColor = vec4(0,1,0,1);\n"
15184 "}\n";
15185
15186 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15187 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15188
15189 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
15190 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
15191
15192 // Set up a push constant range
15193 VkPushConstantRange push_constant_ranges = {};
15194 // Set to the wrong stage to challenge core_validation
15195 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
15196 push_constant_ranges.size = 4;
15197
15198 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
15199 pipeline_layout_create_info.pushConstantRangeCount = 1;
15200
15201 VkPipelineLayout pipeline_layout;
15202 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
15203
15204 VkPipelineObj pipe(m_device);
15205 pipe.AddColorAttachment();
15206 pipe.AddShader(&vs);
15207 pipe.AddShader(&fs);
15208
15209 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
15210 pipe.CreateVKPipeline(pipeline_layout, renderPass());
15211 m_errorMonitor->VerifyFound();
15212
15213 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
15214}
15215
15216TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
15217 TEST_DESCRIPTION(
15218 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
15219
15220 ASSERT_NO_FATAL_FAILURE(InitState());
15221 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15222
15223 const char *feature_not_enabled_message =
15224 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
15225
15226 // Some awkward steps are required to test with custom device features.
15227 std::vector<const char *> device_extension_names;
15228 auto features = m_device->phy().features();
15229 // Disable support for 64 bit floats
15230 features.shaderFloat64 = false;
15231 // The sacrificial device object
15232 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
15233
15234 char const *vsSource = "#version 450\n"
15235 "\n"
15236 "out gl_PerVertex {\n"
15237 " vec4 gl_Position;\n"
15238 "};\n"
15239 "void main(){\n"
15240 " gl_Position = vec4(1);\n"
15241 "}\n";
15242 char const *fsSource = "#version 450\n"
15243 "\n"
15244 "layout(location=0) out vec4 color;\n"
15245 "void main(){\n"
15246 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
15247 " color = vec4(green);\n"
15248 "}\n";
15249
15250 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15251 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15252
15253 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060015254
15255 VkPipelineObj pipe(&test_device);
15256 pipe.AddColorAttachment();
15257 pipe.AddShader(&vs);
15258 pipe.AddShader(&fs);
15259
15260 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
15261 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
15262 VkPipelineLayout pipeline_layout;
15263 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
15264
15265 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
15266 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
15267 m_errorMonitor->VerifyFound();
15268
15269 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
15270}
15271
15272TEST_F(VkLayerTest, CreatePipelineCheckShaderBadCapability) {
15273 TEST_DESCRIPTION("Create a graphics pipeline in which a capability declared by the shader is not supported by Vulkan shaders.");
15274
15275 ASSERT_NO_FATAL_FAILURE(InitState());
15276 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15277
15278 const char *bad_capability_message = "Shader declares capability 53, not supported in Vulkan.";
15279
15280 char const *vsSource = "#version 450\n"
15281 "\n"
15282 "out gl_PerVertex {\n"
15283 " vec4 gl_Position;\n"
15284 "};\n"
15285 "layout(xfb_buffer = 1) out;"
15286 "void main(){\n"
15287 " gl_Position = vec4(1);\n"
15288 "}\n";
15289 char const *fsSource = "#version 450\n"
15290 "\n"
15291 "layout(location=0) out vec4 color;\n"
15292 "void main(){\n"
15293 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
15294 " color = vec4(green);\n"
15295 "}\n";
15296
15297 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15298 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15299
15300 VkPipelineObj pipe(m_device);
15301 pipe.AddColorAttachment();
15302 pipe.AddShader(&vs);
15303 pipe.AddShader(&fs);
15304
15305 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
15306 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
15307 VkPipelineLayout pipeline_layout;
15308 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
15309
15310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_capability_message);
15311 pipe.CreateVKPipeline(pipeline_layout, renderPass());
15312 m_errorMonitor->VerifyFound();
15313
15314 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
15315}
15316
Karl Schultz6addd812016-02-02 17:17:23 -070015317TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120015318 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
15319 "which is not present in the outputs of the previous stage");
15320
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015321 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015322
Chris Forbes59cb88d2015-05-25 11:13:13 +120015323 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015324 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120015325
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015326 char const *vsSource = "#version 450\n"
15327 "\n"
15328 "out gl_PerVertex {\n"
15329 " vec4 gl_Position;\n"
15330 "};\n"
15331 "void main(){\n"
15332 " gl_Position = vec4(1);\n"
15333 "}\n";
15334 char const *fsSource = "#version 450\n"
15335 "\n"
15336 "layout(location=0) in float x;\n"
15337 "layout(location=0) out vec4 color;\n"
15338 "void main(){\n"
15339 " color = vec4(x);\n"
15340 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120015341
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015342 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15343 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120015344
15345 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015346 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120015347 pipe.AddShader(&vs);
15348 pipe.AddShader(&fs);
15349
Chris Forbes59cb88d2015-05-25 11:13:13 +120015350 VkDescriptorSetObj descriptorSet(m_device);
15351 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015352 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120015353
Tony Barbour5781e8f2015-08-04 16:23:11 -060015354 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120015355
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015356 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120015357}
15358
Karl Schultz6addd812016-02-02 17:17:23 -070015359TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120015360 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
15361 "within an interace block, which is not present in the outputs "
15362 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015363 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130015364
15365 ASSERT_NO_FATAL_FAILURE(InitState());
15366 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15367
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015368 char const *vsSource = "#version 450\n"
15369 "\n"
15370 "out gl_PerVertex {\n"
15371 " vec4 gl_Position;\n"
15372 "};\n"
15373 "void main(){\n"
15374 " gl_Position = vec4(1);\n"
15375 "}\n";
15376 char const *fsSource = "#version 450\n"
15377 "\n"
15378 "in block { layout(location=0) float x; } ins;\n"
15379 "layout(location=0) out vec4 color;\n"
15380 "void main(){\n"
15381 " color = vec4(ins.x);\n"
15382 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130015383
15384 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15385 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15386
15387 VkPipelineObj pipe(m_device);
15388 pipe.AddColorAttachment();
15389 pipe.AddShader(&vs);
15390 pipe.AddShader(&fs);
15391
15392 VkDescriptorSetObj descriptorSet(m_device);
15393 descriptorSet.AppendDummy();
15394 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15395
15396 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15397
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015398 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130015399}
15400
Karl Schultz6addd812016-02-02 17:17:23 -070015401TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120015402 TEST_DESCRIPTION("Test that an error is produced for mismatched array sizes "
Mike Weiblencce7ec72016-10-17 19:33:05 -060015403 "across the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015404 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0.0: 'ptr to "
15405 "output arr[2] of float32' vs 'ptr to "
15406 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130015407
15408 ASSERT_NO_FATAL_FAILURE(InitState());
15409 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15410
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015411 char const *vsSource = "#version 450\n"
15412 "\n"
15413 "layout(location=0) out float x[2];\n"
15414 "out gl_PerVertex {\n"
15415 " vec4 gl_Position;\n"
15416 "};\n"
15417 "void main(){\n"
15418 " x[0] = 0; x[1] = 0;\n"
15419 " gl_Position = vec4(1);\n"
15420 "}\n";
15421 char const *fsSource = "#version 450\n"
15422 "\n"
15423 "layout(location=0) in float x[3];\n"
15424 "layout(location=0) out vec4 color;\n"
15425 "void main(){\n"
15426 " color = vec4(x[0] + x[1] + x[2]);\n"
15427 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130015428
15429 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15430 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15431
15432 VkPipelineObj pipe(m_device);
15433 pipe.AddColorAttachment();
15434 pipe.AddShader(&vs);
15435 pipe.AddShader(&fs);
15436
15437 VkDescriptorSetObj descriptorSet(m_device);
15438 descriptorSet.AppendDummy();
15439 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15440
15441 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15442
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015443 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130015444}
15445
Karl Schultz6addd812016-02-02 17:17:23 -070015446TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120015447 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
Mike Weiblencce7ec72016-10-17 19:33:05 -060015448 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015449 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015450
Chris Forbesb56af562015-05-25 11:13:17 +120015451 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015452 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120015453
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015454 char const *vsSource = "#version 450\n"
15455 "\n"
15456 "layout(location=0) out int x;\n"
15457 "out gl_PerVertex {\n"
15458 " vec4 gl_Position;\n"
15459 "};\n"
15460 "void main(){\n"
15461 " x = 0;\n"
15462 " gl_Position = vec4(1);\n"
15463 "}\n";
15464 char const *fsSource = "#version 450\n"
15465 "\n"
15466 "layout(location=0) in float x;\n" /* VS writes int */
15467 "layout(location=0) out vec4 color;\n"
15468 "void main(){\n"
15469 " color = vec4(x);\n"
15470 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120015471
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015472 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15473 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120015474
15475 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015476 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120015477 pipe.AddShader(&vs);
15478 pipe.AddShader(&fs);
15479
Chris Forbesb56af562015-05-25 11:13:17 +120015480 VkDescriptorSetObj descriptorSet(m_device);
15481 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015482 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120015483
Tony Barbour5781e8f2015-08-04 16:23:11 -060015484 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120015485
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015486 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120015487}
15488
Karl Schultz6addd812016-02-02 17:17:23 -070015489TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120015490 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
Mike Weiblencce7ec72016-10-17 19:33:05 -060015491 "the vertex->fragment shader interface, when the variable is contained within "
Chris Forbes1cc79542016-07-20 11:13:44 +120015492 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015493 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130015494
15495 ASSERT_NO_FATAL_FAILURE(InitState());
15496 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15497
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015498 char const *vsSource = "#version 450\n"
15499 "\n"
15500 "out block { layout(location=0) int x; } outs;\n"
15501 "out gl_PerVertex {\n"
15502 " vec4 gl_Position;\n"
15503 "};\n"
15504 "void main(){\n"
15505 " outs.x = 0;\n"
15506 " gl_Position = vec4(1);\n"
15507 "}\n";
15508 char const *fsSource = "#version 450\n"
15509 "\n"
15510 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
15511 "layout(location=0) out vec4 color;\n"
15512 "void main(){\n"
15513 " color = vec4(ins.x);\n"
15514 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130015515
15516 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15517 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15518
15519 VkPipelineObj pipe(m_device);
15520 pipe.AddColorAttachment();
15521 pipe.AddShader(&vs);
15522 pipe.AddShader(&fs);
15523
15524 VkDescriptorSetObj descriptorSet(m_device);
15525 descriptorSet.AppendDummy();
15526 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15527
15528 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15529
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015530 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130015531}
15532
15533TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Chris Forbes1cc79542016-07-20 11:13:44 +120015534 TEST_DESCRIPTION("Test that an error is produced for location mismatches across "
Mike Weiblencce7ec72016-10-17 19:33:05 -060015535 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
Chris Forbes1cc79542016-07-20 11:13:44 +120015536 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015537 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 +130015538
15539 ASSERT_NO_FATAL_FAILURE(InitState());
15540 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15541
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015542 char const *vsSource = "#version 450\n"
15543 "\n"
15544 "out block { layout(location=1) float x; } outs;\n"
15545 "out gl_PerVertex {\n"
15546 " vec4 gl_Position;\n"
15547 "};\n"
15548 "void main(){\n"
15549 " outs.x = 0;\n"
15550 " gl_Position = vec4(1);\n"
15551 "}\n";
15552 char const *fsSource = "#version 450\n"
15553 "\n"
15554 "in block { layout(location=0) float x; } ins;\n"
15555 "layout(location=0) out vec4 color;\n"
15556 "void main(){\n"
15557 " color = vec4(ins.x);\n"
15558 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130015559
15560 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15561 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15562
15563 VkPipelineObj pipe(m_device);
15564 pipe.AddColorAttachment();
15565 pipe.AddShader(&vs);
15566 pipe.AddShader(&fs);
15567
15568 VkDescriptorSetObj descriptorSet(m_device);
15569 descriptorSet.AppendDummy();
15570 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15571
15572 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15573
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015574 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130015575}
15576
15577TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Chris Forbes1cc79542016-07-20 11:13:44 +120015578 TEST_DESCRIPTION("Test that an error is produced for component mismatches across the "
Mike Weiblencce7ec72016-10-17 19:33:05 -060015579 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
Chris Forbes1cc79542016-07-20 11:13:44 +120015580 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015581 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 +130015582
15583 ASSERT_NO_FATAL_FAILURE(InitState());
15584 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15585
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015586 char const *vsSource = "#version 450\n"
15587 "\n"
15588 "out block { layout(location=0, component=0) float x; } outs;\n"
15589 "out gl_PerVertex {\n"
15590 " vec4 gl_Position;\n"
15591 "};\n"
15592 "void main(){\n"
15593 " outs.x = 0;\n"
15594 " gl_Position = vec4(1);\n"
15595 "}\n";
15596 char const *fsSource = "#version 450\n"
15597 "\n"
15598 "in block { layout(location=0, component=1) float x; } ins;\n"
15599 "layout(location=0) out vec4 color;\n"
15600 "void main(){\n"
15601 " color = vec4(ins.x);\n"
15602 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130015603
15604 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15605 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15606
15607 VkPipelineObj pipe(m_device);
15608 pipe.AddColorAttachment();
15609 pipe.AddShader(&vs);
15610 pipe.AddShader(&fs);
15611
15612 VkDescriptorSetObj descriptorSet(m_device);
15613 descriptorSet.AppendDummy();
15614 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15615
15616 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15617
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015618 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130015619}
15620
Karl Schultz6addd812016-02-02 17:17:23 -070015621TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120015622 TEST_DESCRIPTION("Test that a warning is produced for a vertex attribute which is "
15623 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015624 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015625
Chris Forbesde136e02015-05-25 11:13:28 +120015626 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015627 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120015628
15629 VkVertexInputBindingDescription input_binding;
15630 memset(&input_binding, 0, sizeof(input_binding));
15631
15632 VkVertexInputAttributeDescription input_attrib;
15633 memset(&input_attrib, 0, sizeof(input_attrib));
15634 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15635
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015636 char const *vsSource = "#version 450\n"
15637 "\n"
15638 "out gl_PerVertex {\n"
15639 " vec4 gl_Position;\n"
15640 "};\n"
15641 "void main(){\n"
15642 " gl_Position = vec4(1);\n"
15643 "}\n";
15644 char const *fsSource = "#version 450\n"
15645 "\n"
15646 "layout(location=0) out vec4 color;\n"
15647 "void main(){\n"
15648 " color = vec4(1);\n"
15649 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120015650
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015651 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15652 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120015653
15654 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015655 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120015656 pipe.AddShader(&vs);
15657 pipe.AddShader(&fs);
15658
15659 pipe.AddVertexInputBindings(&input_binding, 1);
15660 pipe.AddVertexInputAttribs(&input_attrib, 1);
15661
Chris Forbesde136e02015-05-25 11:13:28 +120015662 VkDescriptorSetObj descriptorSet(m_device);
15663 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015664 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120015665
Tony Barbour5781e8f2015-08-04 16:23:11 -060015666 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120015667
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015668 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120015669}
15670
Karl Schultz6addd812016-02-02 17:17:23 -070015671TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120015672 TEST_DESCRIPTION("Test that a warning is produced for a location mismatch on "
15673 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130015675
15676 ASSERT_NO_FATAL_FAILURE(InitState());
15677 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15678
15679 VkVertexInputBindingDescription input_binding;
15680 memset(&input_binding, 0, sizeof(input_binding));
15681
15682 VkVertexInputAttributeDescription input_attrib;
15683 memset(&input_attrib, 0, sizeof(input_attrib));
15684 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15685
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015686 char const *vsSource = "#version 450\n"
15687 "\n"
15688 "layout(location=1) in float x;\n"
15689 "out gl_PerVertex {\n"
15690 " vec4 gl_Position;\n"
15691 "};\n"
15692 "void main(){\n"
15693 " gl_Position = vec4(x);\n"
15694 "}\n";
15695 char const *fsSource = "#version 450\n"
15696 "\n"
15697 "layout(location=0) out vec4 color;\n"
15698 "void main(){\n"
15699 " color = vec4(1);\n"
15700 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130015701
15702 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15703 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15704
15705 VkPipelineObj pipe(m_device);
15706 pipe.AddColorAttachment();
15707 pipe.AddShader(&vs);
15708 pipe.AddShader(&fs);
15709
15710 pipe.AddVertexInputBindings(&input_binding, 1);
15711 pipe.AddVertexInputAttribs(&input_attrib, 1);
15712
15713 VkDescriptorSetObj descriptorSet(m_device);
15714 descriptorSet.AppendDummy();
15715 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15716
15717 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15718
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015719 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130015720}
15721
Karl Schultz6addd812016-02-02 17:17:23 -070015722TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mike Weiblen15bd38e2016-10-03 19:19:41 -060015723 TEST_DESCRIPTION("Test that an error is produced for a vertex shader input which is not "
Chris Forbes1cc79542016-07-20 11:13:44 +120015724 "provided by a vertex attribute");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060015725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015726
Chris Forbes62e8e502015-05-25 11:13:29 +120015727 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015728 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120015729
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015730 char const *vsSource = "#version 450\n"
15731 "\n"
15732 "layout(location=0) in vec4 x;\n" /* not provided */
15733 "out gl_PerVertex {\n"
15734 " vec4 gl_Position;\n"
15735 "};\n"
15736 "void main(){\n"
15737 " gl_Position = x;\n"
15738 "}\n";
15739 char const *fsSource = "#version 450\n"
15740 "\n"
15741 "layout(location=0) out vec4 color;\n"
15742 "void main(){\n"
15743 " color = vec4(1);\n"
15744 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120015745
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015746 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15747 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120015748
15749 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015750 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120015751 pipe.AddShader(&vs);
15752 pipe.AddShader(&fs);
15753
Chris Forbes62e8e502015-05-25 11:13:29 +120015754 VkDescriptorSetObj descriptorSet(m_device);
15755 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015756 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120015757
Tony Barbour5781e8f2015-08-04 16:23:11 -060015758 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120015759
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015760 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120015761}
15762
Karl Schultz6addd812016-02-02 17:17:23 -070015763TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120015764 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the "
15765 "fundamental type (float/int/uint) of an attribute and the "
Mike Weiblen15bd38e2016-10-03 19:19:41 -060015766 "vertex shader input that consumes it");
15767 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 -060015768
Chris Forbesc97d98e2015-05-25 11:13:31 +120015769 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015770 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120015771
15772 VkVertexInputBindingDescription input_binding;
15773 memset(&input_binding, 0, sizeof(input_binding));
15774
15775 VkVertexInputAttributeDescription input_attrib;
15776 memset(&input_attrib, 0, sizeof(input_attrib));
15777 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15778
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015779 char const *vsSource = "#version 450\n"
15780 "\n"
15781 "layout(location=0) in int x;\n" /* attrib provided float */
15782 "out gl_PerVertex {\n"
15783 " vec4 gl_Position;\n"
15784 "};\n"
15785 "void main(){\n"
15786 " gl_Position = vec4(x);\n"
15787 "}\n";
15788 char const *fsSource = "#version 450\n"
15789 "\n"
15790 "layout(location=0) out vec4 color;\n"
15791 "void main(){\n"
15792 " color = vec4(1);\n"
15793 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120015794
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015795 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15796 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120015797
15798 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015799 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120015800 pipe.AddShader(&vs);
15801 pipe.AddShader(&fs);
15802
15803 pipe.AddVertexInputBindings(&input_binding, 1);
15804 pipe.AddVertexInputAttribs(&input_attrib, 1);
15805
Chris Forbesc97d98e2015-05-25 11:13:31 +120015806 VkDescriptorSetObj descriptorSet(m_device);
15807 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015808 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120015809
Tony Barbour5781e8f2015-08-04 16:23:11 -060015810 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120015811
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015812 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120015813}
15814
Chris Forbesc68b43c2016-04-06 11:18:47 +120015815TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Chris Forbes1cc79542016-07-20 11:13:44 +120015816 TEST_DESCRIPTION("Test that an error is produced for a pipeline containing multiple "
15817 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015818 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15819 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120015820
15821 ASSERT_NO_FATAL_FAILURE(InitState());
15822 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15823
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015824 char const *vsSource = "#version 450\n"
15825 "\n"
15826 "out gl_PerVertex {\n"
15827 " vec4 gl_Position;\n"
15828 "};\n"
15829 "void main(){\n"
15830 " gl_Position = vec4(1);\n"
15831 "}\n";
15832 char const *fsSource = "#version 450\n"
15833 "\n"
15834 "layout(location=0) out vec4 color;\n"
15835 "void main(){\n"
15836 " color = vec4(1);\n"
15837 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120015838
15839 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15840 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15841
15842 VkPipelineObj pipe(m_device);
15843 pipe.AddColorAttachment();
15844 pipe.AddShader(&vs);
Mike Weiblencce7ec72016-10-17 19:33:05 -060015845 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120015846 pipe.AddShader(&fs);
15847
15848 VkDescriptorSetObj descriptorSet(m_device);
15849 descriptorSet.AppendDummy();
15850 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15851
15852 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15853
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015854 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120015855}
15856
Karl Schultz6addd812016-02-02 17:17:23 -070015857TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes1cc79542016-07-20 11:13:44 +120015858 TEST_DESCRIPTION("Test that pipeline validation accepts matrices passed "
15859 "as vertex attributes");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015860 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130015861
15862 ASSERT_NO_FATAL_FAILURE(InitState());
15863 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15864
15865 VkVertexInputBindingDescription input_binding;
15866 memset(&input_binding, 0, sizeof(input_binding));
15867
15868 VkVertexInputAttributeDescription input_attribs[2];
15869 memset(input_attribs, 0, sizeof(input_attribs));
15870
15871 for (int i = 0; i < 2; i++) {
15872 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
15873 input_attribs[i].location = i;
15874 }
15875
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015876 char const *vsSource = "#version 450\n"
15877 "\n"
15878 "layout(location=0) in mat2x4 x;\n"
15879 "out gl_PerVertex {\n"
15880 " vec4 gl_Position;\n"
15881 "};\n"
15882 "void main(){\n"
15883 " gl_Position = x[0] + x[1];\n"
15884 "}\n";
15885 char const *fsSource = "#version 450\n"
15886 "\n"
15887 "layout(location=0) out vec4 color;\n"
15888 "void main(){\n"
15889 " color = vec4(1);\n"
15890 "}\n";
Chris Forbes2682b242015-11-24 11:13:14 +130015891
15892 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15893 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15894
15895 VkPipelineObj pipe(m_device);
15896 pipe.AddColorAttachment();
15897 pipe.AddShader(&vs);
15898 pipe.AddShader(&fs);
15899
15900 pipe.AddVertexInputBindings(&input_binding, 1);
15901 pipe.AddVertexInputAttribs(input_attribs, 2);
15902
15903 VkDescriptorSetObj descriptorSet(m_device);
15904 descriptorSet.AppendDummy();
15905 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15906
15907 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15908
15909 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015910 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130015911}
15912
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015913TEST_F(VkLayerTest, CreatePipelineAttribArrayType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015914 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130015915
15916 ASSERT_NO_FATAL_FAILURE(InitState());
15917 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15918
15919 VkVertexInputBindingDescription input_binding;
15920 memset(&input_binding, 0, sizeof(input_binding));
15921
15922 VkVertexInputAttributeDescription input_attribs[2];
15923 memset(input_attribs, 0, sizeof(input_attribs));
15924
15925 for (int i = 0; i < 2; i++) {
15926 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
15927 input_attribs[i].location = i;
15928 }
15929
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015930 char const *vsSource = "#version 450\n"
15931 "\n"
15932 "layout(location=0) in vec4 x[2];\n"
15933 "out gl_PerVertex {\n"
15934 " vec4 gl_Position;\n"
15935 "};\n"
15936 "void main(){\n"
15937 " gl_Position = x[0] + x[1];\n"
15938 "}\n";
15939 char const *fsSource = "#version 450\n"
15940 "\n"
15941 "layout(location=0) out vec4 color;\n"
15942 "void main(){\n"
15943 " color = vec4(1);\n"
15944 "}\n";
Chris Forbes2682b242015-11-24 11:13:14 +130015945
15946 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15947 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15948
15949 VkPipelineObj pipe(m_device);
15950 pipe.AddColorAttachment();
15951 pipe.AddShader(&vs);
15952 pipe.AddShader(&fs);
15953
15954 pipe.AddVertexInputBindings(&input_binding, 1);
15955 pipe.AddVertexInputAttribs(input_attribs, 2);
15956
15957 VkDescriptorSetObj descriptorSet(m_device);
15958 descriptorSet.AppendDummy();
15959 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15960
15961 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15962
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015963 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130015964}
Chris Forbes2682b242015-11-24 11:13:14 +130015965
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015966TEST_F(VkLayerTest, CreatePipelineAttribComponents) {
Chris Forbes1cc79542016-07-20 11:13:44 +120015967 TEST_DESCRIPTION("Test that pipeline validation accepts consuming a vertex attribute "
Mike Weiblen15bd38e2016-10-03 19:19:41 -060015968 "through multiple vertex shader inputs, each consuming a different "
15969 "subset of the components.");
Chris Forbesbc290ce2016-07-06 12:01:49 +120015970 m_errorMonitor->ExpectSuccess();
15971
15972 ASSERT_NO_FATAL_FAILURE(InitState());
15973 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15974
15975 VkVertexInputBindingDescription input_binding;
15976 memset(&input_binding, 0, sizeof(input_binding));
15977
15978 VkVertexInputAttributeDescription input_attribs[3];
15979 memset(input_attribs, 0, sizeof(input_attribs));
15980
15981 for (int i = 0; i < 3; i++) {
15982 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
15983 input_attribs[i].location = i;
15984 }
15985
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015986 char const *vsSource = "#version 450\n"
15987 "\n"
15988 "layout(location=0) in vec4 x;\n"
15989 "layout(location=1) in vec3 y1;\n"
15990 "layout(location=1, component=3) in float y2;\n"
15991 "layout(location=2) in vec4 z;\n"
15992 "out gl_PerVertex {\n"
15993 " vec4 gl_Position;\n"
15994 "};\n"
15995 "void main(){\n"
15996 " gl_Position = x + vec4(y1, y2) + z;\n"
15997 "}\n";
15998 char const *fsSource = "#version 450\n"
15999 "\n"
16000 "layout(location=0) out vec4 color;\n"
16001 "void main(){\n"
16002 " color = vec4(1);\n"
16003 "}\n";
Chris Forbesbc290ce2016-07-06 12:01:49 +120016004
16005 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16006 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16007
16008 VkPipelineObj pipe(m_device);
16009 pipe.AddColorAttachment();
16010 pipe.AddShader(&vs);
16011 pipe.AddShader(&fs);
16012
16013 pipe.AddVertexInputBindings(&input_binding, 1);
16014 pipe.AddVertexInputAttribs(input_attribs, 3);
16015
16016 VkDescriptorSetObj descriptorSet(m_device);
16017 descriptorSet.AppendDummy();
16018 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16019
16020 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
16021
16022 m_errorMonitor->VerifyNotFound();
16023}
16024
Chris Forbes82ff92a2016-09-09 10:50:24 +120016025TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
16026 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16027 "No entrypoint found named `foo`");
16028
16029 ASSERT_NO_FATAL_FAILURE(InitState());
16030 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16031
16032 char const *vsSource = "#version 450\n"
16033 "out gl_PerVertex {\n"
16034 " vec4 gl_Position;\n"
16035 "};\n"
16036 "void main(){\n"
16037 " gl_Position = vec4(0);\n"
16038 "}\n";
16039 char const *fsSource = "#version 450\n"
16040 "\n"
16041 "layout(location=0) out vec4 color;\n"
16042 "void main(){\n"
16043 " color = vec4(1);\n"
16044 "}\n";
16045
16046 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16047 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
16048
16049 VkPipelineObj pipe(m_device);
16050 pipe.AddColorAttachment();
16051 pipe.AddShader(&vs);
16052 pipe.AddShader(&fs);
16053
16054 VkDescriptorSetObj descriptorSet(m_device);
16055 descriptorSet.AppendDummy();
16056 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16057
16058 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
16059
16060 m_errorMonitor->VerifyFound();
16061}
16062
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016063TEST_F(VkLayerTest, CreatePipelineSimplePositive) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016064 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120016065
16066 ASSERT_NO_FATAL_FAILURE(InitState());
16067 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16068
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016069 char const *vsSource = "#version 450\n"
16070 "out gl_PerVertex {\n"
16071 " vec4 gl_Position;\n"
16072 "};\n"
16073 "void main(){\n"
16074 " gl_Position = vec4(0);\n"
16075 "}\n";
16076 char const *fsSource = "#version 450\n"
16077 "\n"
16078 "layout(location=0) out vec4 color;\n"
16079 "void main(){\n"
16080 " color = vec4(1);\n"
16081 "}\n";
Chris Forbes4ea14fc2016-04-04 18:52:54 +120016082
16083 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16084 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16085
16086 VkPipelineObj pipe(m_device);
16087 pipe.AddColorAttachment();
16088 pipe.AddShader(&vs);
16089 pipe.AddShader(&fs);
16090
16091 VkDescriptorSetObj descriptorSet(m_device);
16092 descriptorSet.AppendDummy();
16093 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16094
16095 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
16096
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016097 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120016098}
16099
Chris Forbesae9d8cd2016-09-13 16:32:57 +120016100TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
16101 m_errorMonitor->SetDesiredFailureMsg(
16102 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16103 "pDepthStencilState is NULL when rasterization is enabled and subpass "
16104 "uses a depth/stencil attachment");
16105
16106 ASSERT_NO_FATAL_FAILURE(InitState());
16107 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16108
16109 char const *vsSource = "#version 450\n"
16110 "void main(){ gl_Position = vec4(0); }\n";
16111 char const *fsSource = "#version 450\n"
16112 "\n"
16113 "layout(location=0) out vec4 color;\n"
16114 "void main(){\n"
16115 " color = vec4(1);\n"
16116 "}\n";
16117
16118 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16119 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16120
16121 VkPipelineObj pipe(m_device);
16122 pipe.AddColorAttachment();
16123 pipe.AddShader(&vs);
16124 pipe.AddShader(&fs);
16125
16126 VkDescriptorSetObj descriptorSet(m_device);
16127 descriptorSet.AppendDummy();
16128 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16129
16130 VkAttachmentDescription attachments[] = {
16131 { 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
16132 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
16133 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
16134 VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
16135 },
16136 { 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT,
16137 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
16138 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
16139 VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
16140 },
16141 };
16142 VkAttachmentReference refs[] = {
16143 { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL },
16144 { 1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL },
16145 };
16146 VkSubpassDescription subpass = {
16147 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
16148 1, &refs[0], nullptr, &refs[1],
16149 0, nullptr
16150 };
16151 VkRenderPassCreateInfo rpci = {
16152 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
16153 0, 2, attachments, 1, &subpass, 0, nullptr
16154 };
16155 VkRenderPass rp;
16156 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
16157 ASSERT_VK_SUCCESS(err);
16158
16159 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
16160
16161 m_errorMonitor->VerifyFound();
16162
16163 vkDestroyRenderPass(m_device->device(), rp, nullptr);
16164}
16165
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016166TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120016167 TEST_DESCRIPTION("Test that pipeline validation accepts the relaxed type matching rules "
16168 "set out in 14.1.3: fundamental type must match, and producer side must "
16169 "have at least as many components");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016170 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +120016171
16172 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
16173
16174 ASSERT_NO_FATAL_FAILURE(InitState());
16175 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16176
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016177 char const *vsSource = "#version 450\n"
16178 "out gl_PerVertex {\n"
16179 " vec4 gl_Position;\n"
16180 "};\n"
16181 "layout(location=0) out vec3 x;\n"
16182 "layout(location=1) out ivec3 y;\n"
16183 "layout(location=2) out vec3 z;\n"
16184 "void main(){\n"
16185 " gl_Position = vec4(0);\n"
16186 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
16187 "}\n";
16188 char const *fsSource = "#version 450\n"
16189 "\n"
16190 "layout(location=0) out vec4 color;\n"
16191 "layout(location=0) in float x;\n"
16192 "layout(location=1) flat in int y;\n"
16193 "layout(location=2) in vec2 z;\n"
16194 "void main(){\n"
16195 " color = vec4(1 + x + y + z.x);\n"
16196 "}\n";
Chris Forbes912c9192016-04-05 17:50:35 +120016197
16198 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16199 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16200
16201 VkPipelineObj pipe(m_device);
16202 pipe.AddColorAttachment();
16203 pipe.AddShader(&vs);
16204 pipe.AddShader(&fs);
16205
16206 VkDescriptorSetObj descriptorSet(m_device);
16207 descriptorSet.AppendDummy();
16208 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16209
Mike Stroyan255e9582016-06-24 09:49:32 -060016210 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016211 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Mike Stroyan255e9582016-06-24 09:49:32 -060016212 ASSERT_VK_SUCCESS(err);
16213
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016214 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +120016215}
16216
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016217TEST_F(VkLayerTest, CreatePipelineTessPerVertex) {
Chris Forbes1cc79542016-07-20 11:13:44 +120016218 TEST_DESCRIPTION("Test that pipeline validation accepts per-vertex variables "
16219 "passed between the TCS and TES stages");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016220 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120016221
16222 ASSERT_NO_FATAL_FAILURE(InitState());
16223 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16224
Chris Forbesc1e852d2016-04-04 19:26:42 +120016225 if (!m_device->phy().features().tessellationShader) {
16226 printf("Device does not support tessellation shaders; skipped.\n");
16227 return;
16228 }
16229
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016230 char const *vsSource = "#version 450\n"
16231 "void main(){}\n";
16232 char const *tcsSource = "#version 450\n"
16233 "layout(location=0) out int x[];\n"
16234 "layout(vertices=3) out;\n"
16235 "void main(){\n"
16236 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
16237 " gl_TessLevelInner[0] = 1;\n"
16238 " x[gl_InvocationID] = gl_InvocationID;\n"
16239 "}\n";
16240 char const *tesSource = "#version 450\n"
16241 "layout(triangles, equal_spacing, cw) in;\n"
16242 "layout(location=0) in int x[];\n"
16243 "out gl_PerVertex { vec4 gl_Position; };\n"
16244 "void main(){\n"
16245 " gl_Position.xyz = gl_TessCoord;\n"
16246 " gl_Position.w = x[0] + x[1] + x[2];\n"
16247 "}\n";
16248 char const *fsSource = "#version 450\n"
16249 "layout(location=0) out vec4 color;\n"
16250 "void main(){\n"
16251 " color = vec4(1);\n"
16252 "}\n";
Chris Forbes4ea14fc2016-04-04 18:52:54 +120016253
16254 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16255 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
16256 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
16257 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16258
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016259 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
16260 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbes4ea14fc2016-04-04 18:52:54 +120016261
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016262 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesb4cacb62016-04-04 19:15:00 +120016263
Chris Forbes4ea14fc2016-04-04 18:52:54 +120016264 VkPipelineObj pipe(m_device);
16265 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +120016266 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +120016267 pipe.AddColorAttachment();
16268 pipe.AddShader(&vs);
16269 pipe.AddShader(&tcs);
16270 pipe.AddShader(&tes);
16271 pipe.AddShader(&fs);
16272
16273 VkDescriptorSetObj descriptorSet(m_device);
16274 descriptorSet.AppendDummy();
16275 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16276
16277 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
16278
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016279 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120016280}
16281
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016282TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive) {
Chris Forbes1cc79542016-07-20 11:13:44 +120016283 TEST_DESCRIPTION("Test that pipeline validation accepts a user-defined "
16284 "interface block passed into the geometry shader. This "
16285 "is interesting because the 'extra' array level is not "
16286 "present on the member type, but on the block instance.");
Chris Forbesa0ab8152016-04-20 13:34:27 +120016287 m_errorMonitor->ExpectSuccess();
16288
16289 ASSERT_NO_FATAL_FAILURE(InitState());
16290 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16291
16292 if (!m_device->phy().features().geometryShader) {
16293 printf("Device does not support geometry shaders; skipped.\n");
16294 return;
16295 }
16296
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016297 char const *vsSource = "#version 450\n"
16298 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
16299 "void main(){\n"
16300 " vs_out.x = vec4(1);\n"
16301 "}\n";
16302 char const *gsSource = "#version 450\n"
16303 "layout(triangles) in;\n"
16304 "layout(triangle_strip, max_vertices=3) out;\n"
16305 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
16306 "out gl_PerVertex { vec4 gl_Position; };\n"
16307 "void main() {\n"
16308 " gl_Position = gs_in[0].x;\n"
16309 " EmitVertex();\n"
16310 "}\n";
16311 char const *fsSource = "#version 450\n"
16312 "layout(location=0) out vec4 color;\n"
16313 "void main(){\n"
16314 " color = vec4(1);\n"
16315 "}\n";
Chris Forbesa0ab8152016-04-20 13:34:27 +120016316
16317 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16318 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
16319 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16320
16321 VkPipelineObj pipe(m_device);
16322 pipe.AddColorAttachment();
16323 pipe.AddShader(&vs);
16324 pipe.AddShader(&gs);
16325 pipe.AddShader(&fs);
16326
16327 VkDescriptorSetObj descriptorSet(m_device);
16328 descriptorSet.AppendDummy();
16329 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16330
16331 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
16332
16333 m_errorMonitor->VerifyNotFound();
16334}
16335
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016336TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120016337 TEST_DESCRIPTION("Test that an error is produced for a variable output from "
16338 "the TCS without the patch decoration, but consumed in the TES "
16339 "with the decoration.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016340 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is per-vertex in tessellation control shader stage "
16341 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120016342
16343 ASSERT_NO_FATAL_FAILURE(InitState());
16344 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16345
Chris Forbesc1e852d2016-04-04 19:26:42 +120016346 if (!m_device->phy().features().tessellationShader) {
16347 printf("Device does not support tessellation shaders; skipped.\n");
16348 return;
16349 }
16350
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016351 char const *vsSource = "#version 450\n"
16352 "void main(){}\n";
16353 char const *tcsSource = "#version 450\n"
16354 "layout(location=0) out int x[];\n"
16355 "layout(vertices=3) out;\n"
16356 "void main(){\n"
16357 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
16358 " gl_TessLevelInner[0] = 1;\n"
16359 " x[gl_InvocationID] = gl_InvocationID;\n"
16360 "}\n";
16361 char const *tesSource = "#version 450\n"
16362 "layout(triangles, equal_spacing, cw) in;\n"
16363 "layout(location=0) patch in int x;\n"
16364 "out gl_PerVertex { vec4 gl_Position; };\n"
16365 "void main(){\n"
16366 " gl_Position.xyz = gl_TessCoord;\n"
16367 " gl_Position.w = x;\n"
16368 "}\n";
16369 char const *fsSource = "#version 450\n"
16370 "layout(location=0) out vec4 color;\n"
16371 "void main(){\n"
16372 " color = vec4(1);\n"
16373 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120016374
16375 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16376 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
16377 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
16378 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16379
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016380 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
16381 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120016382
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016383 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120016384
16385 VkPipelineObj pipe(m_device);
16386 pipe.SetInputAssembly(&iasci);
16387 pipe.SetTessellation(&tsci);
16388 pipe.AddColorAttachment();
16389 pipe.AddShader(&vs);
16390 pipe.AddShader(&tcs);
16391 pipe.AddShader(&tes);
16392 pipe.AddShader(&fs);
16393
16394 VkDescriptorSetObj descriptorSet(m_device);
16395 descriptorSet.AppendDummy();
16396 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16397
16398 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
16399
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016400 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120016401}
16402
Karl Schultz6addd812016-02-02 17:17:23 -070016403TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Chris Forbes1cc79542016-07-20 11:13:44 +120016404 TEST_DESCRIPTION("Test that an error is produced for a vertex attribute setup where multiple "
16405 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016406 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16407 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016408
Chris Forbes280ba2c2015-06-12 11:16:41 +120016409 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060016410 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120016411
16412 /* Two binding descriptions for binding 0 */
16413 VkVertexInputBindingDescription input_bindings[2];
16414 memset(input_bindings, 0, sizeof(input_bindings));
16415
16416 VkVertexInputAttributeDescription input_attrib;
16417 memset(&input_attrib, 0, sizeof(input_attrib));
16418 input_attrib.format = VK_FORMAT_R32_SFLOAT;
16419
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016420 char const *vsSource = "#version 450\n"
16421 "\n"
16422 "layout(location=0) in float x;\n" /* attrib provided float */
16423 "out gl_PerVertex {\n"
16424 " vec4 gl_Position;\n"
16425 "};\n"
16426 "void main(){\n"
16427 " gl_Position = vec4(x);\n"
16428 "}\n";
16429 char const *fsSource = "#version 450\n"
16430 "\n"
16431 "layout(location=0) out vec4 color;\n"
16432 "void main(){\n"
16433 " color = vec4(1);\n"
16434 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120016435
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060016436 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16437 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120016438
16439 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080016440 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120016441 pipe.AddShader(&vs);
16442 pipe.AddShader(&fs);
16443
16444 pipe.AddVertexInputBindings(input_bindings, 2);
16445 pipe.AddVertexInputAttribs(&input_attrib, 1);
16446
Chris Forbes280ba2c2015-06-12 11:16:41 +120016447 VkDescriptorSetObj descriptorSet(m_device);
16448 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016449 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120016450
Tony Barbour5781e8f2015-08-04 16:23:11 -060016451 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120016452
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016453 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120016454}
Chris Forbes8f68b562015-05-25 11:13:32 +120016455
Chris Forbes35efec72016-04-21 14:32:08 +120016456TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
Chris Forbes1cc79542016-07-20 11:13:44 +120016457 TEST_DESCRIPTION("Test that pipeline validation accepts basic use of 64bit vertex "
16458 "attributes. This is interesting because they consume multiple "
16459 "locations.");
Chris Forbes35efec72016-04-21 14:32:08 +120016460 m_errorMonitor->ExpectSuccess();
16461
16462 ASSERT_NO_FATAL_FAILURE(InitState());
16463 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16464
Chris Forbes91cf3a82016-06-28 17:51:35 +120016465 if (!m_device->phy().features().shaderFloat64) {
Chris Forbes35efec72016-04-21 14:32:08 +120016466 printf("Device does not support 64bit vertex attributes; skipped.\n");
16467 return;
16468 }
16469
16470 VkVertexInputBindingDescription input_bindings[1];
16471 memset(input_bindings, 0, sizeof(input_bindings));
16472
16473 VkVertexInputAttributeDescription input_attribs[4];
16474 memset(input_attribs, 0, sizeof(input_attribs));
16475 input_attribs[0].location = 0;
16476 input_attribs[0].offset = 0;
16477 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
16478 input_attribs[1].location = 2;
16479 input_attribs[1].offset = 32;
16480 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
16481 input_attribs[2].location = 4;
16482 input_attribs[2].offset = 64;
16483 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
16484 input_attribs[3].location = 6;
16485 input_attribs[3].offset = 96;
16486 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
16487
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016488 char const *vsSource = "#version 450\n"
16489 "\n"
16490 "layout(location=0) in dmat4 x;\n"
16491 "out gl_PerVertex {\n"
16492 " vec4 gl_Position;\n"
16493 "};\n"
16494 "void main(){\n"
16495 " gl_Position = vec4(x[0][0]);\n"
16496 "}\n";
16497 char const *fsSource = "#version 450\n"
16498 "\n"
16499 "layout(location=0) out vec4 color;\n"
16500 "void main(){\n"
16501 " color = vec4(1);\n"
16502 "}\n";
Chris Forbes35efec72016-04-21 14:32:08 +120016503
16504 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16505 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16506
16507 VkPipelineObj pipe(m_device);
16508 pipe.AddColorAttachment();
16509 pipe.AddShader(&vs);
16510 pipe.AddShader(&fs);
16511
16512 pipe.AddVertexInputBindings(input_bindings, 1);
16513 pipe.AddVertexInputAttribs(input_attribs, 4);
16514
16515 VkDescriptorSetObj descriptorSet(m_device);
16516 descriptorSet.AppendDummy();
16517 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16518
16519 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
16520
16521 m_errorMonitor->VerifyNotFound();
16522}
16523
Karl Schultz6addd812016-02-02 17:17:23 -070016524TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mike Weiblencce7ec72016-10-17 19:33:05 -060016525 TEST_DESCRIPTION("Test that an error is produced for a fragment shader which does not "
Chris Forbes1cc79542016-07-20 11:13:44 +120016526 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060016527 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016528
Chris Forbes4d6d1e52015-05-25 11:13:40 +120016529 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120016530
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016531 char const *vsSource = "#version 450\n"
16532 "\n"
16533 "out gl_PerVertex {\n"
16534 " vec4 gl_Position;\n"
16535 "};\n"
16536 "void main(){\n"
16537 " gl_Position = vec4(1);\n"
16538 "}\n";
16539 char const *fsSource = "#version 450\n"
16540 "\n"
16541 "void main(){\n"
16542 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120016543
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060016544 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16545 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120016546
16547 VkPipelineObj pipe(m_device);
16548 pipe.AddShader(&vs);
16549 pipe.AddShader(&fs);
16550
Chia-I Wu08accc62015-07-07 11:50:03 +080016551 /* set up CB 0, not written */
16552 pipe.AddColorAttachment();
16553 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120016554
Chris Forbes4d6d1e52015-05-25 11:13:40 +120016555 VkDescriptorSetObj descriptorSet(m_device);
16556 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016557 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120016558
Tony Barbour5781e8f2015-08-04 16:23:11 -060016559 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120016560
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016561 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120016562}
16563
Karl Schultz6addd812016-02-02 17:17:23 -070016564TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mike Weiblencce7ec72016-10-17 19:33:05 -060016565 TEST_DESCRIPTION("Test that a warning is produced for a fragment shader which provides a spurious "
Chris Forbes1cc79542016-07-20 11:13:44 +120016566 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016567 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060016568 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016569
Chris Forbesf3fffaa2015-05-25 11:13:43 +120016570 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120016571
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016572 char const *vsSource = "#version 450\n"
16573 "\n"
16574 "out gl_PerVertex {\n"
16575 " vec4 gl_Position;\n"
16576 "};\n"
16577 "void main(){\n"
16578 " gl_Position = vec4(1);\n"
16579 "}\n";
16580 char const *fsSource = "#version 450\n"
16581 "\n"
16582 "layout(location=0) out vec4 x;\n"
16583 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
16584 "void main(){\n"
16585 " x = vec4(1);\n"
16586 " y = vec4(1);\n"
16587 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120016588
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060016589 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16590 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120016591
16592 VkPipelineObj pipe(m_device);
16593 pipe.AddShader(&vs);
16594 pipe.AddShader(&fs);
16595
Chia-I Wu08accc62015-07-07 11:50:03 +080016596 /* set up CB 0, not written */
16597 pipe.AddColorAttachment();
16598 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120016599 /* FS writes CB 1, but we don't configure it */
16600
Chris Forbesf3fffaa2015-05-25 11:13:43 +120016601 VkDescriptorSetObj descriptorSet(m_device);
16602 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016603 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120016604
Tony Barbour5781e8f2015-08-04 16:23:11 -060016605 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120016606
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016607 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120016608}
16609
Karl Schultz6addd812016-02-02 17:17:23 -070016610TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120016611 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the fundamental "
Mike Weiblencce7ec72016-10-17 19:33:05 -060016612 "type of an fragment shader output variable, and the format of the corresponding attachment");
16613 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016614
Chris Forbesa36d69e2015-05-25 11:13:44 +120016615 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120016616
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016617 char const *vsSource = "#version 450\n"
16618 "\n"
16619 "out gl_PerVertex {\n"
16620 " vec4 gl_Position;\n"
16621 "};\n"
16622 "void main(){\n"
16623 " gl_Position = vec4(1);\n"
16624 "}\n";
16625 char const *fsSource = "#version 450\n"
16626 "\n"
16627 "layout(location=0) out ivec4 x;\n" /* not UNORM */
16628 "void main(){\n"
16629 " x = ivec4(1);\n"
16630 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120016631
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060016632 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16633 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120016634
16635 VkPipelineObj pipe(m_device);
16636 pipe.AddShader(&vs);
16637 pipe.AddShader(&fs);
16638
Chia-I Wu08accc62015-07-07 11:50:03 +080016639 /* set up CB 0; type is UNORM by default */
16640 pipe.AddColorAttachment();
16641 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120016642
Chris Forbesa36d69e2015-05-25 11:13:44 +120016643 VkDescriptorSetObj descriptorSet(m_device);
16644 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016645 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120016646
Tony Barbour5781e8f2015-08-04 16:23:11 -060016647 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120016648
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016649 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120016650}
Chris Forbes7b1b8932015-06-05 14:43:36 +120016651
Karl Schultz6addd812016-02-02 17:17:23 -070016652TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120016653 TEST_DESCRIPTION("Test that an error is produced for a shader consuming a uniform "
16654 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016655 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016656
Chris Forbes556c76c2015-08-14 12:04:59 +120016657 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120016658
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016659 char const *vsSource = "#version 450\n"
16660 "\n"
16661 "out gl_PerVertex {\n"
16662 " vec4 gl_Position;\n"
16663 "};\n"
16664 "void main(){\n"
16665 " gl_Position = vec4(1);\n"
16666 "}\n";
16667 char const *fsSource = "#version 450\n"
16668 "\n"
16669 "layout(location=0) out vec4 x;\n"
16670 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
16671 "void main(){\n"
16672 " x = vec4(bar.y);\n"
16673 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120016674
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060016675 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16676 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120016677
Chris Forbes556c76c2015-08-14 12:04:59 +120016678 VkPipelineObj pipe(m_device);
16679 pipe.AddShader(&vs);
16680 pipe.AddShader(&fs);
16681
16682 /* set up CB 0; type is UNORM by default */
16683 pipe.AddColorAttachment();
16684 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16685
16686 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016687 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120016688
16689 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
16690
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016691 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120016692}
16693
Chris Forbes5c59e902016-02-26 16:56:09 +130016694TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Chris Forbes1cc79542016-07-20 11:13:44 +120016695 TEST_DESCRIPTION("Test that an error is produced for a shader consuming push constants "
16696 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016697 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130016698
16699 ASSERT_NO_FATAL_FAILURE(InitState());
16700
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016701 char const *vsSource = "#version 450\n"
16702 "\n"
16703 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
16704 "out gl_PerVertex {\n"
16705 " vec4 gl_Position;\n"
16706 "};\n"
16707 "void main(){\n"
16708 " gl_Position = vec4(consts.x);\n"
16709 "}\n";
16710 char const *fsSource = "#version 450\n"
16711 "\n"
16712 "layout(location=0) out vec4 x;\n"
16713 "void main(){\n"
16714 " x = vec4(1);\n"
16715 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130016716
16717 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16718 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16719
16720 VkPipelineObj pipe(m_device);
16721 pipe.AddShader(&vs);
16722 pipe.AddShader(&fs);
16723
16724 /* set up CB 0; type is UNORM by default */
16725 pipe.AddColorAttachment();
16726 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16727
16728 VkDescriptorSetObj descriptorSet(m_device);
16729 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16730
16731 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
16732
16733 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016734 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130016735}
16736
Chris Forbes3fb17902016-08-22 14:57:55 +120016737TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
16738 TEST_DESCRIPTION("Test that an error is produced for a shader consuming an input attachment "
16739 "which is not included in the subpass description");
16740 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16741 "consumes input attachment index 0 but not provided in subpass");
16742
16743 ASSERT_NO_FATAL_FAILURE(InitState());
16744
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016745 char const *vsSource = "#version 450\n"
16746 "\n"
16747 "out gl_PerVertex {\n"
16748 " vec4 gl_Position;\n"
16749 "};\n"
16750 "void main(){\n"
16751 " gl_Position = vec4(1);\n"
16752 "}\n";
16753 char const *fsSource = "#version 450\n"
16754 "\n"
16755 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
16756 "layout(location=0) out vec4 color;\n"
16757 "void main() {\n"
16758 " color = subpassLoad(x);\n"
16759 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120016760
16761 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16762 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16763
16764 VkPipelineObj pipe(m_device);
16765 pipe.AddShader(&vs);
16766 pipe.AddShader(&fs);
16767 pipe.AddColorAttachment();
16768 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16769
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016770 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
16771 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120016772 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016773 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120016774 ASSERT_VK_SUCCESS(err);
16775
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016776 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120016777 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016778 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120016779 ASSERT_VK_SUCCESS(err);
16780
16781 // error here.
16782 pipe.CreateVKPipeline(pl, renderPass());
16783
16784 m_errorMonitor->VerifyFound();
16785
16786 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16787 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16788}
16789
Chris Forbes663b5a82016-08-22 16:14:06 +120016790TEST_F(VkLayerTest, CreatePipelineInputAttachmentPositive) {
16791 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
16792 m_errorMonitor->ExpectSuccess();
16793
16794 ASSERT_NO_FATAL_FAILURE(InitState());
16795
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016796 char const *vsSource = "#version 450\n"
16797 "\n"
16798 "out gl_PerVertex {\n"
16799 " vec4 gl_Position;\n"
16800 "};\n"
16801 "void main(){\n"
16802 " gl_Position = vec4(1);\n"
16803 "}\n";
16804 char const *fsSource = "#version 450\n"
16805 "\n"
16806 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
16807 "layout(location=0) out vec4 color;\n"
16808 "void main() {\n"
16809 " color = subpassLoad(x);\n"
16810 "}\n";
Chris Forbes663b5a82016-08-22 16:14:06 +120016811
16812 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16813 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16814
16815 VkPipelineObj pipe(m_device);
16816 pipe.AddShader(&vs);
16817 pipe.AddShader(&fs);
16818 pipe.AddColorAttachment();
16819 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16820
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016821 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
16822 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes663b5a82016-08-22 16:14:06 +120016823 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016824 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes663b5a82016-08-22 16:14:06 +120016825 ASSERT_VK_SUCCESS(err);
16826
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016827 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes663b5a82016-08-22 16:14:06 +120016828 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016829 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes663b5a82016-08-22 16:14:06 +120016830 ASSERT_VK_SUCCESS(err);
16831
16832 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016833 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
16834 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
16835 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
16836 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
16837 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL},
Chris Forbes663b5a82016-08-22 16:14:06 +120016838 };
16839 VkAttachmentReference color = {
16840 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
16841 };
16842 VkAttachmentReference input = {
16843 1, VK_IMAGE_LAYOUT_GENERAL,
16844 };
16845
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016846 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes663b5a82016-08-22 16:14:06 +120016847
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016848 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes663b5a82016-08-22 16:14:06 +120016849 VkRenderPass rp;
16850 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
16851 ASSERT_VK_SUCCESS(err);
16852
16853 // should be OK. would go wrong here if it's going to...
16854 pipe.CreateVKPipeline(pl, rp);
16855
16856 m_errorMonitor->VerifyNotFound();
16857
16858 vkDestroyRenderPass(m_device->device(), rp, nullptr);
16859 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16860 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16861}
16862
Chris Forbes5a9a0472016-08-22 16:02:09 +120016863TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
16864 TEST_DESCRIPTION("Test that an error is produced for a shader consuming an input attachment "
16865 "with a format having a different fundamental type");
16866 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16867 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
16868
16869 ASSERT_NO_FATAL_FAILURE(InitState());
16870
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016871 char const *vsSource = "#version 450\n"
16872 "\n"
16873 "out gl_PerVertex {\n"
16874 " vec4 gl_Position;\n"
16875 "};\n"
16876 "void main(){\n"
16877 " gl_Position = vec4(1);\n"
16878 "}\n";
16879 char const *fsSource = "#version 450\n"
16880 "\n"
16881 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
16882 "layout(location=0) out vec4 color;\n"
16883 "void main() {\n"
16884 " color = subpassLoad(x);\n"
16885 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120016886
16887 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16888 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16889
16890 VkPipelineObj pipe(m_device);
16891 pipe.AddShader(&vs);
16892 pipe.AddShader(&fs);
16893 pipe.AddColorAttachment();
16894 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16895
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016896 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
16897 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120016898 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016899 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120016900 ASSERT_VK_SUCCESS(err);
16901
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016902 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120016903 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016904 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120016905 ASSERT_VK_SUCCESS(err);
16906
16907 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016908 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
16909 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
16910 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
16911 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
16912 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 +120016913 };
16914 VkAttachmentReference color = {
16915 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
16916 };
16917 VkAttachmentReference input = {
16918 1, VK_IMAGE_LAYOUT_GENERAL,
16919 };
16920
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016921 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120016922
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016923 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120016924 VkRenderPass rp;
16925 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
16926 ASSERT_VK_SUCCESS(err);
16927
16928 // error here.
16929 pipe.CreateVKPipeline(pl, rp);
16930
16931 m_errorMonitor->VerifyFound();
16932
16933 vkDestroyRenderPass(m_device->device(), rp, nullptr);
16934 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16935 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16936}
16937
Chris Forbes541f7b02016-08-22 15:30:27 +120016938TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
16939 TEST_DESCRIPTION("Test that an error is produced for a shader consuming an input attachment "
16940 "which is not included in the subpass description -- array case");
16941 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16942 "consumes input attachment index 1 but not provided in subpass");
16943
16944 ASSERT_NO_FATAL_FAILURE(InitState());
16945
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016946 char const *vsSource = "#version 450\n"
16947 "\n"
16948 "out gl_PerVertex {\n"
16949 " vec4 gl_Position;\n"
16950 "};\n"
16951 "void main(){\n"
16952 " gl_Position = vec4(1);\n"
16953 "}\n";
16954 char const *fsSource = "#version 450\n"
16955 "\n"
16956 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[2];\n"
16957 "layout(location=0) out vec4 color;\n"
16958 "void main() {\n"
16959 " color = subpassLoad(xs[1]);\n"
16960 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120016961
16962 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16963 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16964
16965 VkPipelineObj pipe(m_device);
16966 pipe.AddShader(&vs);
16967 pipe.AddShader(&fs);
16968 pipe.AddColorAttachment();
16969 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16970
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016971 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
16972 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120016973 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016974 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120016975 ASSERT_VK_SUCCESS(err);
16976
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016977 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120016978 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016979 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120016980 ASSERT_VK_SUCCESS(err);
16981
16982 // error here.
16983 pipe.CreateVKPipeline(pl, renderPass());
16984
16985 m_errorMonitor->VerifyFound();
16986
16987 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16988 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16989}
16990
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016991TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Chris Forbes1cc79542016-07-20 11:13:44 +120016992 TEST_DESCRIPTION("Test that an error is produced for a compute pipeline consuming a "
16993 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016994 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016995
16996 ASSERT_NO_FATAL_FAILURE(InitState());
16997
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016998 char const *csSource = "#version 450\n"
16999 "\n"
17000 "layout(local_size_x=1) in;\n"
17001 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
17002 "void main(){\n"
17003 " x = vec4(1);\n"
17004 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120017005
17006 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
17007
17008 VkDescriptorSetObj descriptorSet(m_device);
17009 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
17010
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017011 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
17012 nullptr,
17013 0,
17014 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
17015 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
17016 descriptorSet.GetPipelineLayout(),
17017 VK_NULL_HANDLE,
17018 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120017019
17020 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017021 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120017022
17023 m_errorMonitor->VerifyFound();
17024
17025 if (err == VK_SUCCESS) {
17026 vkDestroyPipeline(m_device->device(), pipe, nullptr);
17027 }
17028}
17029
17030TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Chris Forbes1cc79542016-07-20 11:13:44 +120017031 TEST_DESCRIPTION("Test that pipeline validation accepts a compute pipeline which declares a "
17032 "descriptor-backed resource which is not provided, but the shader does not "
17033 "statically use it. This is interesting because it requires compute pipelines "
17034 "to have a proper descriptor use walk, which they didn't for some time.");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120017035 m_errorMonitor->ExpectSuccess();
17036
17037 ASSERT_NO_FATAL_FAILURE(InitState());
17038
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017039 char const *csSource = "#version 450\n"
17040 "\n"
17041 "layout(local_size_x=1) in;\n"
17042 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
17043 "void main(){\n"
17044 " // x is not used.\n"
17045 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120017046
17047 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
17048
17049 VkDescriptorSetObj descriptorSet(m_device);
17050 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
17051
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017052 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
17053 nullptr,
17054 0,
17055 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
17056 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
17057 descriptorSet.GetPipelineLayout(),
17058 VK_NULL_HANDLE,
17059 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120017060
17061 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017062 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120017063
17064 m_errorMonitor->VerifyNotFound();
17065
17066 if (err == VK_SUCCESS) {
17067 vkDestroyPipeline(m_device->device(), pipe, nullptr);
17068 }
17069}
17070
Chris Forbes22a9b092016-07-19 14:34:05 +120017071TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120017072 TEST_DESCRIPTION("Test that an error is produced for a pipeline consuming a "
17073 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017074 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17075 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120017076
17077 ASSERT_NO_FATAL_FAILURE(InitState());
17078
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017079 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
17080 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120017081 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017082 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120017083 ASSERT_VK_SUCCESS(err);
17084
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017085 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120017086 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017087 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120017088 ASSERT_VK_SUCCESS(err);
17089
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017090 char const *csSource = "#version 450\n"
17091 "\n"
17092 "layout(local_size_x=1) in;\n"
17093 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
17094 "void main() {\n"
17095 " x.x = 1.0f;\n"
17096 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120017097 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
17098
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017099 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
17100 nullptr,
17101 0,
17102 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
17103 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
17104 pl,
17105 VK_NULL_HANDLE,
17106 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120017107
17108 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017109 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120017110
17111 m_errorMonitor->VerifyFound();
17112
17113 if (err == VK_SUCCESS) {
17114 vkDestroyPipeline(m_device->device(), pipe, nullptr);
17115 }
17116
17117 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
17118 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
17119}
17120
Chris Forbese10a51f2016-07-19 14:42:51 +120017121TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Chris Forbes1cc79542016-07-20 11:13:44 +120017122 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
17123 "sampler portion of a combined image + sampler");
Chris Forbese10a51f2016-07-19 14:42:51 +120017124 m_errorMonitor->ExpectSuccess();
17125
17126 ASSERT_NO_FATAL_FAILURE(InitState());
17127
17128 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017129 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
17130 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
17131 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Chris Forbese10a51f2016-07-19 14:42:51 +120017132 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017133 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Chris Forbese10a51f2016-07-19 14:42:51 +120017134 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017135 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbese10a51f2016-07-19 14:42:51 +120017136 ASSERT_VK_SUCCESS(err);
17137
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017138 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbese10a51f2016-07-19 14:42:51 +120017139 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017140 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbese10a51f2016-07-19 14:42:51 +120017141 ASSERT_VK_SUCCESS(err);
17142
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017143 char const *csSource = "#version 450\n"
17144 "\n"
17145 "layout(local_size_x=1) in;\n"
17146 "layout(set=0, binding=0) uniform sampler s;\n"
17147 "layout(set=0, binding=1) uniform texture2D t;\n"
17148 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
17149 "void main() {\n"
17150 " x = texture(sampler2D(t, s), vec2(0));\n"
17151 "}\n";
Chris Forbese10a51f2016-07-19 14:42:51 +120017152 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
17153
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017154 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
17155 nullptr,
17156 0,
17157 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
17158 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
17159 pl,
17160 VK_NULL_HANDLE,
17161 -1};
Chris Forbese10a51f2016-07-19 14:42:51 +120017162
17163 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017164 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbese10a51f2016-07-19 14:42:51 +120017165
17166 m_errorMonitor->VerifyNotFound();
17167
17168 if (err == VK_SUCCESS) {
17169 vkDestroyPipeline(m_device->device(), pipe, nullptr);
17170 }
17171
17172 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
17173 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
17174}
17175
Chris Forbes91c3b2a2016-07-19 14:46:38 +120017176TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Chris Forbes1cc79542016-07-20 11:13:44 +120017177 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
17178 "image portion of a combined image + sampler");
Chris Forbes91c3b2a2016-07-19 14:46:38 +120017179 m_errorMonitor->ExpectSuccess();
17180
17181 ASSERT_NO_FATAL_FAILURE(InitState());
17182
17183 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017184 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
17185 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
17186 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Chris Forbes91c3b2a2016-07-19 14:46:38 +120017187 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017188 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Chris Forbes91c3b2a2016-07-19 14:46:38 +120017189 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017190 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes91c3b2a2016-07-19 14:46:38 +120017191 ASSERT_VK_SUCCESS(err);
17192
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017193 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes91c3b2a2016-07-19 14:46:38 +120017194 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017195 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes91c3b2a2016-07-19 14:46:38 +120017196 ASSERT_VK_SUCCESS(err);
17197
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017198 char const *csSource = "#version 450\n"
17199 "\n"
17200 "layout(local_size_x=1) in;\n"
17201 "layout(set=0, binding=0) uniform texture2D t;\n"
17202 "layout(set=0, binding=1) uniform sampler s;\n"
17203 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
17204 "void main() {\n"
17205 " x = texture(sampler2D(t, s), vec2(0));\n"
17206 "}\n";
Chris Forbes91c3b2a2016-07-19 14:46:38 +120017207 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
17208
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017209 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
17210 nullptr,
17211 0,
17212 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
17213 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
17214 pl,
17215 VK_NULL_HANDLE,
17216 -1};
Chris Forbes91c3b2a2016-07-19 14:46:38 +120017217
17218 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017219 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes91c3b2a2016-07-19 14:46:38 +120017220
17221 m_errorMonitor->VerifyNotFound();
17222
17223 if (err == VK_SUCCESS) {
17224 vkDestroyPipeline(m_device->device(), pipe, nullptr);
17225 }
17226
17227 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
17228 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
17229}
17230
Chris Forbes6a4991a2016-07-19 15:07:32 +120017231TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Chris Forbes1cc79542016-07-20 11:13:44 +120017232 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming "
17233 "both the sampler and the image of a combined image+sampler "
17234 "but via separate variables");
Chris Forbes6a4991a2016-07-19 15:07:32 +120017235 m_errorMonitor->ExpectSuccess();
17236
17237 ASSERT_NO_FATAL_FAILURE(InitState());
17238
17239 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017240 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
17241 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Chris Forbes6a4991a2016-07-19 15:07:32 +120017242 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017243 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Chris Forbes6a4991a2016-07-19 15:07:32 +120017244 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017245 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes6a4991a2016-07-19 15:07:32 +120017246 ASSERT_VK_SUCCESS(err);
17247
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017248 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes6a4991a2016-07-19 15:07:32 +120017249 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017250 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes6a4991a2016-07-19 15:07:32 +120017251 ASSERT_VK_SUCCESS(err);
17252
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017253 char const *csSource = "#version 450\n"
17254 "\n"
17255 "layout(local_size_x=1) in;\n"
17256 "layout(set=0, binding=0) uniform texture2D t;\n"
17257 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
17258 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
17259 "void main() {\n"
17260 " x = texture(sampler2D(t, s), vec2(0));\n"
17261 "}\n";
Chris Forbes6a4991a2016-07-19 15:07:32 +120017262 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
17263
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017264 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
17265 nullptr,
17266 0,
17267 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
17268 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
17269 pl,
17270 VK_NULL_HANDLE,
17271 -1};
Chris Forbes6a4991a2016-07-19 15:07:32 +120017272
17273 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017274 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes6a4991a2016-07-19 15:07:32 +120017275
17276 m_errorMonitor->VerifyNotFound();
17277
17278 if (err == VK_SUCCESS) {
17279 vkDestroyPipeline(m_device->device(), pipe, nullptr);
17280 }
17281
17282 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
17283 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
17284}
17285
Chris Forbes50020592016-07-27 13:52:41 +120017286TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
17287 TEST_DESCRIPTION("Test that an error is produced when an image view type "
17288 "does not match the dimensionality declared in the shader");
17289
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017290 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 +120017291
17292 ASSERT_NO_FATAL_FAILURE(InitState());
17293 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
17294
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017295 char const *vsSource = "#version 450\n"
17296 "\n"
17297 "out gl_PerVertex { vec4 gl_Position; };\n"
17298 "void main() { gl_Position = vec4(0); }\n";
17299 char const *fsSource = "#version 450\n"
17300 "\n"
17301 "layout(set=0, binding=0) uniform sampler3D s;\n"
17302 "layout(location=0) out vec4 color;\n"
17303 "void main() {\n"
17304 " color = texture(s, vec3(0));\n"
17305 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120017306 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
17307 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
17308
17309 VkPipelineObj pipe(m_device);
17310 pipe.AddShader(&vs);
17311 pipe.AddShader(&fs);
17312 pipe.AddColorAttachment();
17313
17314 VkTextureObj texture(m_device, nullptr);
17315 VkSamplerObj sampler(m_device);
17316
17317 VkDescriptorSetObj descriptorSet(m_device);
17318 descriptorSet.AppendSamplerTexture(&sampler, &texture);
17319 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
17320
17321 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
17322 ASSERT_VK_SUCCESS(err);
17323
17324 BeginCommandBuffer();
17325
17326 m_commandBuffer->BindPipeline(pipe);
17327 m_commandBuffer->BindDescriptorSet(descriptorSet);
17328
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017329 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120017330 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017331 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120017332 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
17333
17334 // error produced here.
17335 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
17336
17337 m_errorMonitor->VerifyFound();
17338
17339 EndCommandBuffer();
17340}
17341
Chris Forbes5533bfc2016-07-27 14:12:34 +120017342TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
17343 TEST_DESCRIPTION("Test that an error is produced when a multisampled images "
17344 "are consumed via singlesample images types in the shader, or vice versa.");
17345
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017346 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120017347
17348 ASSERT_NO_FATAL_FAILURE(InitState());
17349 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
17350
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017351 char const *vsSource = "#version 450\n"
17352 "\n"
17353 "out gl_PerVertex { vec4 gl_Position; };\n"
17354 "void main() { gl_Position = vec4(0); }\n";
17355 char const *fsSource = "#version 450\n"
17356 "\n"
17357 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
17358 "layout(location=0) out vec4 color;\n"
17359 "void main() {\n"
17360 " color = texelFetch(s, ivec2(0), 0);\n"
17361 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120017362 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
17363 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
17364
17365 VkPipelineObj pipe(m_device);
17366 pipe.AddShader(&vs);
17367 pipe.AddShader(&fs);
17368 pipe.AddColorAttachment();
17369
17370 VkTextureObj texture(m_device, nullptr);
17371 VkSamplerObj sampler(m_device);
17372
17373 VkDescriptorSetObj descriptorSet(m_device);
17374 descriptorSet.AppendSamplerTexture(&sampler, &texture);
17375 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
17376
17377 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
17378 ASSERT_VK_SUCCESS(err);
17379
17380 BeginCommandBuffer();
17381
17382 m_commandBuffer->BindPipeline(pipe);
17383 m_commandBuffer->BindDescriptorSet(descriptorSet);
17384
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017385 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120017386 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017387 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120017388 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
17389
17390 // error produced here.
17391 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
17392
17393 m_errorMonitor->VerifyFound();
17394
17395 EndCommandBuffer();
17396}
17397
Mark Lobodzinski209b5292015-09-17 09:44:05 -060017398#endif // SHADER_CHECKER_TESTS
17399
17400#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -060017401TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017402 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060017403
17404 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060017405
17406 // Create an image
17407 VkImage image;
17408
Karl Schultz6addd812016-02-02 17:17:23 -070017409 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
17410 const int32_t tex_width = 32;
17411 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060017412
17413 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017414 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17415 image_create_info.pNext = NULL;
17416 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17417 image_create_info.format = tex_format;
17418 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060017419 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070017420 image_create_info.extent.depth = 1;
17421 image_create_info.mipLevels = 1;
17422 image_create_info.arrayLayers = 1;
17423 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17424 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17425 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
17426 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060017427
17428 // Introduce error by sending down a bogus width extent
17429 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080017430 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060017431
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017432 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060017433}
17434
Mark Youngc48c4c12016-04-11 14:26:49 -060017435TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017436 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17437 "CreateImage extents is 0 for at least one required dimension");
Mark Youngc48c4c12016-04-11 14:26:49 -060017438
17439 ASSERT_NO_FATAL_FAILURE(InitState());
17440
17441 // Create an image
17442 VkImage image;
17443
17444 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
17445 const int32_t tex_width = 32;
17446 const int32_t tex_height = 32;
17447
17448 VkImageCreateInfo image_create_info = {};
17449 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17450 image_create_info.pNext = NULL;
17451 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17452 image_create_info.format = tex_format;
17453 image_create_info.extent.width = tex_width;
17454 image_create_info.extent.height = tex_height;
17455 image_create_info.extent.depth = 1;
17456 image_create_info.mipLevels = 1;
17457 image_create_info.arrayLayers = 1;
17458 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17459 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17460 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
17461 image_create_info.flags = 0;
17462
17463 // Introduce error by sending down a bogus width extent
17464 image_create_info.extent.width = 0;
17465 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
17466
17467 m_errorMonitor->VerifyFound();
17468}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060017469#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +120017470
Tobin Ehliscde08892015-09-22 10:11:37 -060017471#if IMAGE_TESTS
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060017472TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
17473 TEST_DESCRIPTION("Create a render pass with an attachment description "
17474 "format set to VK_FORMAT_UNDEFINED");
17475
17476 ASSERT_NO_FATAL_FAILURE(InitState());
17477 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
17478
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060017480
17481 VkAttachmentReference color_attach = {};
17482 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
17483 color_attach.attachment = 0;
17484 VkSubpassDescription subpass = {};
17485 subpass.colorAttachmentCount = 1;
17486 subpass.pColorAttachments = &color_attach;
17487
17488 VkRenderPassCreateInfo rpci = {};
17489 rpci.subpassCount = 1;
17490 rpci.pSubpasses = &subpass;
17491 rpci.attachmentCount = 1;
17492 VkAttachmentDescription attach_desc = {};
17493 attach_desc.format = VK_FORMAT_UNDEFINED;
17494 rpci.pAttachments = &attach_desc;
17495 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
17496 VkRenderPass rp;
17497 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
17498
17499 m_errorMonitor->VerifyFound();
17500
17501 if (result == VK_SUCCESS) {
17502 vkDestroyRenderPass(m_device->device(), rp, NULL);
17503 }
17504}
17505
Karl Schultz6addd812016-02-02 17:17:23 -070017506TEST_F(VkLayerTest, InvalidImageView) {
17507 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060017508
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017509 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with baseMipLevel 10 ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017510
Tobin Ehliscde08892015-09-22 10:11:37 -060017511 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060017512
Mike Stroyana3082432015-09-25 13:39:21 -060017513 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070017514 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060017515
Karl Schultz6addd812016-02-02 17:17:23 -070017516 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
17517 const int32_t tex_width = 32;
17518 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060017519
17520 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017521 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17522 image_create_info.pNext = NULL;
17523 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17524 image_create_info.format = tex_format;
17525 image_create_info.extent.width = tex_width;
17526 image_create_info.extent.height = tex_height;
17527 image_create_info.extent.depth = 1;
17528 image_create_info.mipLevels = 1;
17529 image_create_info.arrayLayers = 1;
17530 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17531 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17532 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
17533 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060017534
Chia-I Wuf7458c52015-10-26 21:10:41 +080017535 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060017536 ASSERT_VK_SUCCESS(err);
17537
17538 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017539 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17540 image_view_create_info.image = image;
17541 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
17542 image_view_create_info.format = tex_format;
17543 image_view_create_info.subresourceRange.layerCount = 1;
17544 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
17545 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017546 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060017547
17548 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017549 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060017550
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017551 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060017552 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060017553}
Mike Stroyana3082432015-09-25 13:39:21 -060017554
Mark Youngd339ba32016-05-30 13:28:35 -060017555TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
17556 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060017557 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060017558 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060017559
17560 ASSERT_NO_FATAL_FAILURE(InitState());
17561
17562 // Create an image and try to create a view with no memory backing the image
17563 VkImage image;
17564
17565 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
17566 const int32_t tex_width = 32;
17567 const int32_t tex_height = 32;
17568
17569 VkImageCreateInfo image_create_info = {};
17570 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17571 image_create_info.pNext = NULL;
17572 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17573 image_create_info.format = tex_format;
17574 image_create_info.extent.width = tex_width;
17575 image_create_info.extent.height = tex_height;
17576 image_create_info.extent.depth = 1;
17577 image_create_info.mipLevels = 1;
17578 image_create_info.arrayLayers = 1;
17579 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17580 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17581 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
17582 image_create_info.flags = 0;
17583
17584 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
17585 ASSERT_VK_SUCCESS(err);
17586
17587 VkImageViewCreateInfo image_view_create_info = {};
17588 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17589 image_view_create_info.image = image;
17590 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
17591 image_view_create_info.format = tex_format;
17592 image_view_create_info.subresourceRange.layerCount = 1;
17593 image_view_create_info.subresourceRange.baseMipLevel = 0;
17594 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017595 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060017596
17597 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017598 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060017599
17600 m_errorMonitor->VerifyFound();
17601 vkDestroyImage(m_device->device(), image, NULL);
17602 // If last error is success, it still created the view, so delete it.
17603 if (err == VK_SUCCESS) {
17604 vkDestroyImageView(m_device->device(), view, NULL);
17605 }
Mark Youngd339ba32016-05-30 13:28:35 -060017606}
17607
Karl Schultz6addd812016-02-02 17:17:23 -070017608TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017609 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
17610 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView: Color image "
17611 "formats must have ONLY the "
17612 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017613
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060017614 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060017615
Karl Schultz6addd812016-02-02 17:17:23 -070017616 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060017617 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017618 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060017619 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060017620
17621 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017622 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060017623 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070017624 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
17625 image_view_create_info.format = tex_format;
17626 image_view_create_info.subresourceRange.baseMipLevel = 0;
17627 image_view_create_info.subresourceRange.levelCount = 1;
17628 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017629 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060017630
17631 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060017632 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060017633
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017634 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060017635}
17636
Mark Lobodzinskidb117632016-03-31 10:45:56 -060017637TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070017638 VkResult err;
17639 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017640
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017641 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17642 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017643
Mike Stroyana3082432015-09-25 13:39:21 -060017644 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060017645
17646 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017647 VkImage srcImage;
17648 VkImage dstImage;
17649 VkDeviceMemory srcMem;
17650 VkDeviceMemory destMem;
17651 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017652
17653 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017654 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17655 image_create_info.pNext = NULL;
17656 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17657 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17658 image_create_info.extent.width = 32;
17659 image_create_info.extent.height = 32;
17660 image_create_info.extent.depth = 1;
17661 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060017662 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070017663 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17664 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17665 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17666 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017667
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017668 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017669 ASSERT_VK_SUCCESS(err);
17670
Mark Lobodzinski867787a2016-10-14 11:49:55 -060017671 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017672 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017673 ASSERT_VK_SUCCESS(err);
17674
17675 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017676 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017677 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17678 memAlloc.pNext = NULL;
17679 memAlloc.allocationSize = 0;
17680 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017681
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017682 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017683 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017684 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017685 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017686 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017687 ASSERT_VK_SUCCESS(err);
17688
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017689 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017690 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017691 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017692 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017693 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017694 ASSERT_VK_SUCCESS(err);
17695
17696 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17697 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017698 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017699 ASSERT_VK_SUCCESS(err);
17700
17701 BeginCommandBuffer();
17702 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017703 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017704 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017705 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060017706 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017707 copyRegion.srcOffset.x = 0;
17708 copyRegion.srcOffset.y = 0;
17709 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017710 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017711 copyRegion.dstSubresource.mipLevel = 0;
17712 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060017713 // Introduce failure by forcing the dst layerCount to differ from src
17714 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017715 copyRegion.dstOffset.x = 0;
17716 copyRegion.dstOffset.y = 0;
17717 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017718 copyRegion.extent.width = 1;
17719 copyRegion.extent.height = 1;
17720 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017721 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060017722 EndCommandBuffer();
17723
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017724 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017725
Chia-I Wuf7458c52015-10-26 21:10:41 +080017726 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017727 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017728 vkFreeMemory(m_device->device(), srcMem, NULL);
17729 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017730}
17731
Tony Barbourd6673642016-05-05 14:46:39 -060017732TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
17733
17734 TEST_DESCRIPTION("Creating images with unsuported formats ");
17735
17736 ASSERT_NO_FATAL_FAILURE(InitState());
17737 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
17738 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017739 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 -060017740 VK_IMAGE_TILING_OPTIMAL, 0);
17741 ASSERT_TRUE(image.initialized());
17742
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060017743 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
17744 VkImageCreateInfo image_create_info;
17745 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17746 image_create_info.pNext = NULL;
17747 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17748 image_create_info.format = VK_FORMAT_UNDEFINED;
17749 image_create_info.extent.width = 32;
17750 image_create_info.extent.height = 32;
17751 image_create_info.extent.depth = 1;
17752 image_create_info.mipLevels = 1;
17753 image_create_info.arrayLayers = 1;
17754 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17755 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17756 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17757 image_create_info.flags = 0;
17758
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017759 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17760 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060017761
17762 VkImage localImage;
17763 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
17764 m_errorMonitor->VerifyFound();
17765
Tony Barbourd6673642016-05-05 14:46:39 -060017766 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060017767 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060017768 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
17769 VkFormat format = static_cast<VkFormat>(f);
17770 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017771 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060017772 unsupported = format;
17773 break;
17774 }
17775 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060017776
Tony Barbourd6673642016-05-05 14:46:39 -060017777 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060017778 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017779 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060017780
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060017781 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060017782 m_errorMonitor->VerifyFound();
17783 }
17784}
17785
17786TEST_F(VkLayerTest, ImageLayerViewTests) {
17787 VkResult ret;
17788 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
17789
17790 ASSERT_NO_FATAL_FAILURE(InitState());
17791
17792 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017793 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 -060017794 VK_IMAGE_TILING_OPTIMAL, 0);
17795 ASSERT_TRUE(image.initialized());
17796
17797 VkImageView imgView;
17798 VkImageViewCreateInfo imgViewInfo = {};
17799 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
17800 imgViewInfo.image = image.handle();
17801 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
17802 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
17803 imgViewInfo.subresourceRange.layerCount = 1;
17804 imgViewInfo.subresourceRange.baseMipLevel = 0;
17805 imgViewInfo.subresourceRange.levelCount = 1;
17806 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17807
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017808 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with baseMipLevel");
Tony Barbourd6673642016-05-05 14:46:39 -060017809 // View can't have baseMipLevel >= image's mipLevels - Expect
17810 // VIEW_CREATE_ERROR
17811 imgViewInfo.subresourceRange.baseMipLevel = 1;
17812 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
17813 m_errorMonitor->VerifyFound();
17814 imgViewInfo.subresourceRange.baseMipLevel = 0;
17815
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017816 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with baseArrayLayer");
Tony Barbourd6673642016-05-05 14:46:39 -060017817 // View can't have baseArrayLayer >= image's arraySize - Expect
17818 // VIEW_CREATE_ERROR
17819 imgViewInfo.subresourceRange.baseArrayLayer = 1;
17820 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
17821 m_errorMonitor->VerifyFound();
17822 imgViewInfo.subresourceRange.baseArrayLayer = 0;
17823
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017824 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with 0 in "
17825 "pCreateInfo->subresourceRange."
17826 "levelCount");
Tony Barbourd6673642016-05-05 14:46:39 -060017827 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
17828 imgViewInfo.subresourceRange.levelCount = 0;
17829 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
17830 m_errorMonitor->VerifyFound();
17831 imgViewInfo.subresourceRange.levelCount = 1;
17832
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017833 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with 0 in "
17834 "pCreateInfo->subresourceRange."
17835 "layerCount");
Tony Barbourd6673642016-05-05 14:46:39 -060017836 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
17837 imgViewInfo.subresourceRange.layerCount = 0;
17838 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
17839 m_errorMonitor->VerifyFound();
17840 imgViewInfo.subresourceRange.layerCount = 1;
17841
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017842 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "but both must be color formats");
Tony Barbourd6673642016-05-05 14:46:39 -060017843 // Can't use depth format for view into color image - Expect INVALID_FORMAT
17844 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
17845 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
17846 m_errorMonitor->VerifyFound();
17847 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
17848
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017849 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Formats MUST be IDENTICAL unless "
17850 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
17851 "was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060017852 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
17853 // VIEW_CREATE_ERROR
17854 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
17855 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
17856 m_errorMonitor->VerifyFound();
17857 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
17858
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017859 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "can support ImageViews with "
17860 "differing formats but they must be "
17861 "in the same compatibility class.");
Tony Barbourd6673642016-05-05 14:46:39 -060017862 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
17863 // VIEW_CREATE_ERROR
17864 VkImageCreateInfo mutImgInfo = image.create_info();
17865 VkImage mutImage;
17866 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017867 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060017868 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
17869 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
17870 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
17871 ASSERT_VK_SUCCESS(ret);
17872 imgViewInfo.image = mutImage;
17873 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
17874 m_errorMonitor->VerifyFound();
17875 imgViewInfo.image = image.handle();
17876 vkDestroyImage(m_device->handle(), mutImage, NULL);
17877}
17878
17879TEST_F(VkLayerTest, MiscImageLayerTests) {
17880
17881 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
17882
17883 ASSERT_NO_FATAL_FAILURE(InitState());
17884
17885 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017886 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 -060017887 VK_IMAGE_TILING_OPTIMAL, 0);
17888 ASSERT_TRUE(image.initialized());
17889
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017890 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "number of layers in image subresource is zero");
Tony Barbourd6673642016-05-05 14:46:39 -060017891 vk_testing::Buffer buffer;
17892 VkMemoryPropertyFlags reqs = 0;
17893 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
17894 VkBufferImageCopy region = {};
17895 region.bufferRowLength = 128;
17896 region.bufferImageHeight = 128;
17897 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17898 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
17899 region.imageSubresource.layerCount = 0;
17900 region.imageExtent.height = 4;
17901 region.imageExtent.width = 4;
17902 region.imageExtent.depth = 1;
17903 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017904 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
17905 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourd6673642016-05-05 14:46:39 -060017906 m_errorMonitor->VerifyFound();
17907 region.imageSubresource.layerCount = 1;
17908
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017909 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
17910 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
17911 region.bufferOffset = 6;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017912 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be a multiple of this format's texel size");
17913 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
17914 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017915 m_errorMonitor->VerifyFound();
17916
17917 // BufferOffset must be a multiple of 4
17918 // Introduce failure by setting bufferOffset to a value not divisible by 4
17919 region.bufferOffset = 6;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017920 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be a multiple of 4");
17921 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
17922 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017923 m_errorMonitor->VerifyFound();
17924
17925 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
17926 region.bufferOffset = 0;
17927 region.imageExtent.height = 128;
17928 region.imageExtent.width = 128;
17929 // Introduce failure by setting bufferRowLength > 0 but less than width
17930 region.bufferRowLength = 64;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17932 "must be zero or greater-than-or-equal-to imageExtent.width");
17933 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
17934 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017935 m_errorMonitor->VerifyFound();
17936
17937 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
17938 region.bufferRowLength = 128;
17939 // Introduce failure by setting bufferRowHeight > 0 but less than height
17940 region.bufferImageHeight = 64;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017941 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17942 "must be zero or greater-than-or-equal-to imageExtent.height");
17943 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
17944 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017945 m_errorMonitor->VerifyFound();
17946
17947 region.bufferImageHeight = 128;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017948 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "aspectMasks for each region must "
17949 "specify only COLOR or DEPTH or "
17950 "STENCIL");
Tony Barbourd6673642016-05-05 14:46:39 -060017951 // Expect MISMATCHED_IMAGE_ASPECT
17952 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017953 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
17954 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourd6673642016-05-05 14:46:39 -060017955 m_errorMonitor->VerifyFound();
17956 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17957
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017958 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17959 "If the format of srcImage is a depth, stencil, depth stencil or "
17960 "integer-based format then filter must be VK_FILTER_NEAREST");
Tony Barbourd6673642016-05-05 14:46:39 -060017961 // Expect INVALID_FILTER
17962 VkImageObj intImage1(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017963 intImage1.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060017964 VkImageObj intImage2(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017965 intImage2.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060017966 VkImageBlit blitRegion = {};
17967 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17968 blitRegion.srcSubresource.baseArrayLayer = 0;
17969 blitRegion.srcSubresource.layerCount = 1;
17970 blitRegion.srcSubresource.mipLevel = 0;
17971 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17972 blitRegion.dstSubresource.baseArrayLayer = 0;
17973 blitRegion.dstSubresource.layerCount = 1;
17974 blitRegion.dstSubresource.mipLevel = 0;
17975
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017976 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
17977 intImage2.layout(), 16, &blitRegion, VK_FILTER_LINEAR);
Tony Barbourd6673642016-05-05 14:46:39 -060017978 m_errorMonitor->VerifyFound();
17979
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017980 // Look for NULL-blit warning
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017981 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "Offsets specify a zero-volume area.");
17982 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
17983 intImage2.layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017984 m_errorMonitor->VerifyFound();
17985
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017986 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with 0 in ppMemoryBarriers");
Tony Barbourd6673642016-05-05 14:46:39 -060017987 VkImageMemoryBarrier img_barrier;
17988 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17989 img_barrier.pNext = NULL;
17990 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
17991 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
17992 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17993 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17994 img_barrier.image = image.handle();
17995 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17996 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17997 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17998 img_barrier.subresourceRange.baseArrayLayer = 0;
17999 img_barrier.subresourceRange.baseMipLevel = 0;
18000 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
18001 img_barrier.subresourceRange.layerCount = 0;
18002 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018003 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
18004 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060018005 m_errorMonitor->VerifyFound();
18006 img_barrier.subresourceRange.layerCount = 1;
18007}
18008
18009TEST_F(VkLayerTest, ImageFormatLimits) {
18010
18011 TEST_DESCRIPTION("Exceed the limits of image format ");
18012
Cody Northropc31a84f2016-08-22 10:41:47 -060018013 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018014 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060018015 VkImageCreateInfo image_create_info = {};
18016 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18017 image_create_info.pNext = NULL;
18018 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18019 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18020 image_create_info.extent.width = 32;
18021 image_create_info.extent.height = 32;
18022 image_create_info.extent.depth = 1;
18023 image_create_info.mipLevels = 1;
18024 image_create_info.arrayLayers = 1;
18025 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18026 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
18027 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
18028 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18029 image_create_info.flags = 0;
18030
18031 VkImage nullImg;
18032 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018033 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
18034 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Tony Barbourd6673642016-05-05 14:46:39 -060018035 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
18036 // Expect INVALID_FORMAT_LIMITS_VIOLATION
18037 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
18038 m_errorMonitor->VerifyFound();
18039 image_create_info.extent.depth = 1;
18040
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060018042 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
18043 // Expect INVALID_FORMAT_LIMITS_VIOLATION
18044 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
18045 m_errorMonitor->VerifyFound();
18046 image_create_info.mipLevels = 1;
18047
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018048 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060018049 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
18050 // Expect INVALID_FORMAT_LIMITS_VIOLATION
18051 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
18052 m_errorMonitor->VerifyFound();
18053 image_create_info.arrayLayers = 1;
18054
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018055 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060018056 int samples = imgFmtProps.sampleCounts >> 1;
18057 image_create_info.samples = (VkSampleCountFlagBits)samples;
18058 // Expect INVALID_FORMAT_LIMITS_VIOLATION
18059 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
18060 m_errorMonitor->VerifyFound();
18061 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18062
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018063 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pCreateInfo->initialLayout, must be "
18064 "VK_IMAGE_LAYOUT_UNDEFINED or "
18065 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060018066 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
18067 // Expect INVALID_LAYOUT
18068 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
18069 m_errorMonitor->VerifyFound();
18070 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18071}
18072
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018073TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
18074
18075 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060018076 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018077
18078 ASSERT_NO_FATAL_FAILURE(InitState());
18079
18080 VkImageObj src_image(m_device);
18081 src_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
18082 VkImageObj dst_image(m_device);
18083 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
18084
18085 BeginCommandBuffer();
18086 VkImageCopy copy_region;
18087 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18088 copy_region.srcSubresource.mipLevel = 0;
18089 copy_region.srcSubresource.baseArrayLayer = 0;
18090 copy_region.srcSubresource.layerCount = 0;
18091 copy_region.srcOffset.x = 0;
18092 copy_region.srcOffset.y = 0;
18093 copy_region.srcOffset.z = 0;
18094 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18095 copy_region.dstSubresource.mipLevel = 0;
18096 copy_region.dstSubresource.baseArrayLayer = 0;
18097 copy_region.dstSubresource.layerCount = 0;
18098 copy_region.dstOffset.x = 0;
18099 copy_region.dstOffset.y = 0;
18100 copy_region.dstOffset.z = 0;
18101 copy_region.extent.width = 64;
18102 copy_region.extent.height = 64;
18103 copy_region.extent.depth = 1;
18104 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
18105 &copy_region);
18106 EndCommandBuffer();
18107
18108 m_errorMonitor->VerifyFound();
18109}
18110
18111TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
18112
18113 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060018114 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060018115
18116 ASSERT_NO_FATAL_FAILURE(InitState());
18117
18118 VkImageObj src_image(m_device);
18119 src_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
18120 VkImageObj dst_image(m_device);
18121 dst_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
18122
18123 BeginCommandBuffer();
18124 VkImageCopy copy_region;
18125 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18126 copy_region.srcSubresource.mipLevel = 0;
18127 copy_region.srcSubresource.baseArrayLayer = 0;
18128 copy_region.srcSubresource.layerCount = 0;
18129 copy_region.srcOffset.x = 0;
18130 copy_region.srcOffset.y = 0;
18131 copy_region.srcOffset.z = 0;
18132 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18133 copy_region.dstSubresource.mipLevel = 0;
18134 copy_region.dstSubresource.baseArrayLayer = 0;
18135 copy_region.dstSubresource.layerCount = 0;
18136 copy_region.dstOffset.x = 0;
18137 copy_region.dstOffset.y = 0;
18138 copy_region.dstOffset.z = 0;
18139 copy_region.extent.width = 64;
18140 copy_region.extent.height = 64;
18141 copy_region.extent.depth = 1;
18142 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
18143 &copy_region);
18144 EndCommandBuffer();
18145
18146 m_errorMonitor->VerifyFound();
18147}
18148
Karl Schultz6addd812016-02-02 17:17:23 -070018149TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060018150 VkResult err;
18151 bool pass;
18152
18153 // Create color images with different format sizes and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018154 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18155 "vkCmdCopyImage called with unmatched source and dest image format sizes");
Karl Schultzbdb75952016-04-19 11:36:49 -060018156
18157 ASSERT_NO_FATAL_FAILURE(InitState());
18158
18159 // Create two images of different types and try to copy between them
18160 VkImage srcImage;
18161 VkImage dstImage;
18162 VkDeviceMemory srcMem;
18163 VkDeviceMemory destMem;
18164 VkMemoryRequirements memReqs;
18165
18166 VkImageCreateInfo image_create_info = {};
18167 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18168 image_create_info.pNext = NULL;
18169 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18170 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18171 image_create_info.extent.width = 32;
18172 image_create_info.extent.height = 32;
18173 image_create_info.extent.depth = 1;
18174 image_create_info.mipLevels = 1;
18175 image_create_info.arrayLayers = 1;
18176 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18177 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
18178 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
18179 image_create_info.flags = 0;
18180
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018181 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060018182 ASSERT_VK_SUCCESS(err);
18183
18184 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
18185 // Introduce failure by creating second image with a different-sized format.
18186 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
18187
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018188 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060018189 ASSERT_VK_SUCCESS(err);
18190
18191 // Allocate memory
18192 VkMemoryAllocateInfo memAlloc = {};
18193 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18194 memAlloc.pNext = NULL;
18195 memAlloc.allocationSize = 0;
18196 memAlloc.memoryTypeIndex = 0;
18197
18198 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
18199 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018200 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060018201 ASSERT_TRUE(pass);
18202 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
18203 ASSERT_VK_SUCCESS(err);
18204
18205 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
18206 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018207 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060018208 ASSERT_TRUE(pass);
18209 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
18210 ASSERT_VK_SUCCESS(err);
18211
18212 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18213 ASSERT_VK_SUCCESS(err);
18214 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
18215 ASSERT_VK_SUCCESS(err);
18216
18217 BeginCommandBuffer();
18218 VkImageCopy copyRegion;
18219 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18220 copyRegion.srcSubresource.mipLevel = 0;
18221 copyRegion.srcSubresource.baseArrayLayer = 0;
18222 copyRegion.srcSubresource.layerCount = 0;
18223 copyRegion.srcOffset.x = 0;
18224 copyRegion.srcOffset.y = 0;
18225 copyRegion.srcOffset.z = 0;
18226 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18227 copyRegion.dstSubresource.mipLevel = 0;
18228 copyRegion.dstSubresource.baseArrayLayer = 0;
18229 copyRegion.dstSubresource.layerCount = 0;
18230 copyRegion.dstOffset.x = 0;
18231 copyRegion.dstOffset.y = 0;
18232 copyRegion.dstOffset.z = 0;
18233 copyRegion.extent.width = 1;
18234 copyRegion.extent.height = 1;
18235 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018236 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Karl Schultzbdb75952016-04-19 11:36:49 -060018237 EndCommandBuffer();
18238
18239 m_errorMonitor->VerifyFound();
18240
18241 vkDestroyImage(m_device->device(), srcImage, NULL);
18242 vkDestroyImage(m_device->device(), dstImage, NULL);
18243 vkFreeMemory(m_device->device(), srcMem, NULL);
18244 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018245}
18246
Karl Schultz6addd812016-02-02 17:17:23 -070018247TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
18248 VkResult err;
18249 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018250
Mark Lobodzinskidb117632016-03-31 10:45:56 -060018251 // Create a color image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018252 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18253 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018254
Mike Stroyana3082432015-09-25 13:39:21 -060018255 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060018256
18257 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070018258 VkImage srcImage;
18259 VkImage dstImage;
18260 VkDeviceMemory srcMem;
18261 VkDeviceMemory destMem;
18262 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018263
18264 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018265 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18266 image_create_info.pNext = NULL;
18267 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18268 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18269 image_create_info.extent.width = 32;
18270 image_create_info.extent.height = 32;
18271 image_create_info.extent.depth = 1;
18272 image_create_info.mipLevels = 1;
18273 image_create_info.arrayLayers = 1;
18274 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18275 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
18276 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
18277 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018278
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018279 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018280 ASSERT_VK_SUCCESS(err);
18281
Karl Schultzbdb75952016-04-19 11:36:49 -060018282 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
18283
Mark Lobodzinskidb117632016-03-31 10:45:56 -060018284 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070018285 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060018286 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060018287 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018288
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018289 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018290 ASSERT_VK_SUCCESS(err);
18291
18292 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018293 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018294 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18295 memAlloc.pNext = NULL;
18296 memAlloc.allocationSize = 0;
18297 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018298
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018299 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018300 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018301 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018302 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018303 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018304 ASSERT_VK_SUCCESS(err);
18305
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018306 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018307 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018308 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018309 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018310 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018311 ASSERT_VK_SUCCESS(err);
18312
18313 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18314 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018315 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018316 ASSERT_VK_SUCCESS(err);
18317
18318 BeginCommandBuffer();
18319 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018320 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018321 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018322 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018323 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018324 copyRegion.srcOffset.x = 0;
18325 copyRegion.srcOffset.y = 0;
18326 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018327 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018328 copyRegion.dstSubresource.mipLevel = 0;
18329 copyRegion.dstSubresource.baseArrayLayer = 0;
18330 copyRegion.dstSubresource.layerCount = 0;
18331 copyRegion.dstOffset.x = 0;
18332 copyRegion.dstOffset.y = 0;
18333 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018334 copyRegion.extent.width = 1;
18335 copyRegion.extent.height = 1;
18336 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018337 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060018338 EndCommandBuffer();
18339
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018340 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018341
Chia-I Wuf7458c52015-10-26 21:10:41 +080018342 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018343 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018344 vkFreeMemory(m_device->device(), srcMem, NULL);
18345 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018346}
18347
Karl Schultz6addd812016-02-02 17:17:23 -070018348TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
18349 VkResult err;
18350 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018351
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018352 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18353 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018354
Mike Stroyana3082432015-09-25 13:39:21 -060018355 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060018356
18357 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070018358 VkImage srcImage;
18359 VkImage dstImage;
18360 VkDeviceMemory srcMem;
18361 VkDeviceMemory destMem;
18362 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018363
18364 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018365 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18366 image_create_info.pNext = NULL;
18367 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18368 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18369 image_create_info.extent.width = 32;
18370 image_create_info.extent.height = 1;
18371 image_create_info.extent.depth = 1;
18372 image_create_info.mipLevels = 1;
18373 image_create_info.arrayLayers = 1;
18374 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18375 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18376 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
18377 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018378
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018379 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018380 ASSERT_VK_SUCCESS(err);
18381
Karl Schultz6addd812016-02-02 17:17:23 -070018382 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018383
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018384 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018385 ASSERT_VK_SUCCESS(err);
18386
18387 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018388 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018389 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18390 memAlloc.pNext = NULL;
18391 memAlloc.allocationSize = 0;
18392 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018393
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018394 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018395 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018396 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018397 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018398 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018399 ASSERT_VK_SUCCESS(err);
18400
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018401 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018402 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018403 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018404 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018405 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018406 ASSERT_VK_SUCCESS(err);
18407
18408 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18409 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018410 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018411 ASSERT_VK_SUCCESS(err);
18412
18413 BeginCommandBuffer();
18414 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070018415 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
18416 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060018417 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018418 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018419 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018420 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018421 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060018422 resolveRegion.srcOffset.x = 0;
18423 resolveRegion.srcOffset.y = 0;
18424 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018425 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018426 resolveRegion.dstSubresource.mipLevel = 0;
18427 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018428 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018429 resolveRegion.dstOffset.x = 0;
18430 resolveRegion.dstOffset.y = 0;
18431 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018432 resolveRegion.extent.width = 1;
18433 resolveRegion.extent.height = 1;
18434 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018435 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060018436 EndCommandBuffer();
18437
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018438 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018439
Chia-I Wuf7458c52015-10-26 21:10:41 +080018440 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018441 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018442 vkFreeMemory(m_device->device(), srcMem, NULL);
18443 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018444}
18445
Karl Schultz6addd812016-02-02 17:17:23 -070018446TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
18447 VkResult err;
18448 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018449
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018450 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18451 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018452
Mike Stroyana3082432015-09-25 13:39:21 -060018453 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060018454
Chris Forbesa7530692016-05-08 12:35:39 +120018455 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070018456 VkImage srcImage;
18457 VkImage dstImage;
18458 VkDeviceMemory srcMem;
18459 VkDeviceMemory destMem;
18460 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018461
18462 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018463 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18464 image_create_info.pNext = NULL;
18465 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18466 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18467 image_create_info.extent.width = 32;
18468 image_create_info.extent.height = 1;
18469 image_create_info.extent.depth = 1;
18470 image_create_info.mipLevels = 1;
18471 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120018472 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018473 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18474 // Note: Some implementations expect color attachment usage for any
18475 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018476 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018477 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018478
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018479 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018480 ASSERT_VK_SUCCESS(err);
18481
Karl Schultz6addd812016-02-02 17:17:23 -070018482 // Note: Some implementations expect color attachment usage for any
18483 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018484 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018485
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018486 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018487 ASSERT_VK_SUCCESS(err);
18488
18489 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018490 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018491 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18492 memAlloc.pNext = NULL;
18493 memAlloc.allocationSize = 0;
18494 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018495
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018496 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018497 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018498 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018499 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018500 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018501 ASSERT_VK_SUCCESS(err);
18502
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018503 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018504 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018505 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018506 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018507 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018508 ASSERT_VK_SUCCESS(err);
18509
18510 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18511 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018512 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018513 ASSERT_VK_SUCCESS(err);
18514
18515 BeginCommandBuffer();
18516 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070018517 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
18518 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060018519 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018520 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018521 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018522 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018523 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060018524 resolveRegion.srcOffset.x = 0;
18525 resolveRegion.srcOffset.y = 0;
18526 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018527 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018528 resolveRegion.dstSubresource.mipLevel = 0;
18529 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018530 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018531 resolveRegion.dstOffset.x = 0;
18532 resolveRegion.dstOffset.y = 0;
18533 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018534 resolveRegion.extent.width = 1;
18535 resolveRegion.extent.height = 1;
18536 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018537 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060018538 EndCommandBuffer();
18539
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018540 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018541
Chia-I Wuf7458c52015-10-26 21:10:41 +080018542 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018543 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018544 vkFreeMemory(m_device->device(), srcMem, NULL);
18545 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018546}
18547
Karl Schultz6addd812016-02-02 17:17:23 -070018548TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
18549 VkResult err;
18550 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018551
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018552 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18553 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018554
Mike Stroyana3082432015-09-25 13:39:21 -060018555 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060018556
18557 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070018558 VkImage srcImage;
18559 VkImage dstImage;
18560 VkDeviceMemory srcMem;
18561 VkDeviceMemory destMem;
18562 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018563
18564 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018565 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18566 image_create_info.pNext = NULL;
18567 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18568 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18569 image_create_info.extent.width = 32;
18570 image_create_info.extent.height = 1;
18571 image_create_info.extent.depth = 1;
18572 image_create_info.mipLevels = 1;
18573 image_create_info.arrayLayers = 1;
18574 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
18575 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18576 // Note: Some implementations expect color attachment usage for any
18577 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018578 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018579 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018580
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018581 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018582 ASSERT_VK_SUCCESS(err);
18583
Karl Schultz6addd812016-02-02 17:17:23 -070018584 // Set format to something other than source image
18585 image_create_info.format = VK_FORMAT_R32_SFLOAT;
18586 // Note: Some implementations expect color attachment usage for any
18587 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018588 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018589 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018590
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018591 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018592 ASSERT_VK_SUCCESS(err);
18593
18594 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018595 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018596 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18597 memAlloc.pNext = NULL;
18598 memAlloc.allocationSize = 0;
18599 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018600
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018601 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018602 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018603 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018604 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018605 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018606 ASSERT_VK_SUCCESS(err);
18607
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018608 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018609 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018610 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018611 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018612 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018613 ASSERT_VK_SUCCESS(err);
18614
18615 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18616 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018617 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018618 ASSERT_VK_SUCCESS(err);
18619
18620 BeginCommandBuffer();
18621 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070018622 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
18623 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060018624 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018625 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018626 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018627 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018628 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060018629 resolveRegion.srcOffset.x = 0;
18630 resolveRegion.srcOffset.y = 0;
18631 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018632 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018633 resolveRegion.dstSubresource.mipLevel = 0;
18634 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018635 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018636 resolveRegion.dstOffset.x = 0;
18637 resolveRegion.dstOffset.y = 0;
18638 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018639 resolveRegion.extent.width = 1;
18640 resolveRegion.extent.height = 1;
18641 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018642 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060018643 EndCommandBuffer();
18644
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018645 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018646
Chia-I Wuf7458c52015-10-26 21:10:41 +080018647 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018648 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018649 vkFreeMemory(m_device->device(), srcMem, NULL);
18650 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018651}
18652
Karl Schultz6addd812016-02-02 17:17:23 -070018653TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
18654 VkResult err;
18655 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018656
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018657 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18658 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018659
Mike Stroyana3082432015-09-25 13:39:21 -060018660 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060018661
18662 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070018663 VkImage srcImage;
18664 VkImage dstImage;
18665 VkDeviceMemory srcMem;
18666 VkDeviceMemory destMem;
18667 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018668
18669 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018670 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18671 image_create_info.pNext = NULL;
18672 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18673 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18674 image_create_info.extent.width = 32;
18675 image_create_info.extent.height = 1;
18676 image_create_info.extent.depth = 1;
18677 image_create_info.mipLevels = 1;
18678 image_create_info.arrayLayers = 1;
18679 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
18680 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18681 // Note: Some implementations expect color attachment usage for any
18682 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018683 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018684 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018685
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018686 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018687 ASSERT_VK_SUCCESS(err);
18688
Karl Schultz6addd812016-02-02 17:17:23 -070018689 image_create_info.imageType = VK_IMAGE_TYPE_1D;
18690 // Note: Some implementations expect color attachment usage for any
18691 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018692 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018693 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018694
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018695 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018696 ASSERT_VK_SUCCESS(err);
18697
18698 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018699 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018700 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18701 memAlloc.pNext = NULL;
18702 memAlloc.allocationSize = 0;
18703 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018704
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018705 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018706 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018707 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018708 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018709 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018710 ASSERT_VK_SUCCESS(err);
18711
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018712 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018713 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018714 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018715 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018716 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018717 ASSERT_VK_SUCCESS(err);
18718
18719 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18720 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018721 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018722 ASSERT_VK_SUCCESS(err);
18723
18724 BeginCommandBuffer();
18725 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070018726 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
18727 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060018728 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018729 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018730 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018731 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018732 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060018733 resolveRegion.srcOffset.x = 0;
18734 resolveRegion.srcOffset.y = 0;
18735 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018736 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018737 resolveRegion.dstSubresource.mipLevel = 0;
18738 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018739 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018740 resolveRegion.dstOffset.x = 0;
18741 resolveRegion.dstOffset.y = 0;
18742 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018743 resolveRegion.extent.width = 1;
18744 resolveRegion.extent.height = 1;
18745 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018746 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060018747 EndCommandBuffer();
18748
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018749 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018750
Chia-I Wuf7458c52015-10-26 21:10:41 +080018751 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018752 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018753 vkFreeMemory(m_device->device(), srcMem, NULL);
18754 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018755}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018756
Karl Schultz6addd812016-02-02 17:17:23 -070018757TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018758 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070018759 // to using a DS format, then cause it to hit error due to COLOR_BIT not
18760 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018761 // The image format check comes 2nd in validation so we trigger it first,
18762 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070018763 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018764
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018765 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18766 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018767
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018768 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018769
Chia-I Wu1b99bb22015-10-27 19:25:11 +080018770 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018771 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18772 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018773
18774 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018775 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18776 ds_pool_ci.pNext = NULL;
18777 ds_pool_ci.maxSets = 1;
18778 ds_pool_ci.poolSizeCount = 1;
18779 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018780
18781 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018782 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018783 ASSERT_VK_SUCCESS(err);
18784
18785 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018786 dsl_binding.binding = 0;
18787 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18788 dsl_binding.descriptorCount = 1;
18789 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18790 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018791
18792 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018793 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18794 ds_layout_ci.pNext = NULL;
18795 ds_layout_ci.bindingCount = 1;
18796 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018797 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018798 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018799 ASSERT_VK_SUCCESS(err);
18800
18801 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018802 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080018803 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070018804 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018805 alloc_info.descriptorPool = ds_pool;
18806 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018807 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018808 ASSERT_VK_SUCCESS(err);
18809
Karl Schultz6addd812016-02-02 17:17:23 -070018810 VkImage image_bad;
18811 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018812 // One bad format and one good format for Color attachment
Tobin Ehlis269f0322016-05-25 16:24:21 -060018813 const VkFormat tex_format_bad = VK_FORMAT_D24_UNORM_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018814 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070018815 const int32_t tex_width = 32;
18816 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018817
18818 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018819 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18820 image_create_info.pNext = NULL;
18821 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18822 image_create_info.format = tex_format_bad;
18823 image_create_info.extent.width = tex_width;
18824 image_create_info.extent.height = tex_height;
18825 image_create_info.extent.depth = 1;
18826 image_create_info.mipLevels = 1;
18827 image_create_info.arrayLayers = 1;
18828 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18829 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018830 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018831 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018832
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018833 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018834 ASSERT_VK_SUCCESS(err);
18835 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018836 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18837 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018838 ASSERT_VK_SUCCESS(err);
18839
18840 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018841 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18842 image_view_create_info.image = image_bad;
18843 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18844 image_view_create_info.format = tex_format_bad;
18845 image_view_create_info.subresourceRange.baseArrayLayer = 0;
18846 image_view_create_info.subresourceRange.baseMipLevel = 0;
18847 image_view_create_info.subresourceRange.layerCount = 1;
18848 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018849 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018850
18851 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018852 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018853
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018854 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018855
Chia-I Wuf7458c52015-10-26 21:10:41 +080018856 vkDestroyImage(m_device->device(), image_bad, NULL);
18857 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018858 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18859 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018860}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018861
18862TEST_F(VkLayerTest, ClearImageErrors) {
18863 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and "
18864 "ClearDepthStencilImage with a color image.");
18865
18866 ASSERT_NO_FATAL_FAILURE(InitState());
18867 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18868
18869 // Renderpass is started here so end it as Clear cmds can't be in renderpass
18870 BeginCommandBuffer();
18871 m_commandBuffer->EndRenderPass();
18872
18873 // Color image
18874 VkClearColorValue clear_color;
18875 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
18876 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
18877 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
18878 const int32_t img_width = 32;
18879 const int32_t img_height = 32;
18880 VkImageCreateInfo image_create_info = {};
18881 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18882 image_create_info.pNext = NULL;
18883 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18884 image_create_info.format = color_format;
18885 image_create_info.extent.width = img_width;
18886 image_create_info.extent.height = img_height;
18887 image_create_info.extent.depth = 1;
18888 image_create_info.mipLevels = 1;
18889 image_create_info.arrayLayers = 1;
18890 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18891 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
18892 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18893
18894 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018895 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018896
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018897 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018898
18899 // Depth/Stencil image
18900 VkClearDepthStencilValue clear_value = {0};
18901 reqs = 0; // don't need HOST_VISIBLE DS image
18902 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
18903 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
18904 ds_image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
18905 ds_image_create_info.extent.width = 64;
18906 ds_image_create_info.extent.height = 64;
18907 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18908 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
18909
18910 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018911 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018912
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018913 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 -060018914
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018915 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018916
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018917 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018918 &color_range);
18919
18920 m_errorMonitor->VerifyFound();
18921
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018922 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with "
18923 "image created without "
18924 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060018925
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018926 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060018927 &color_range);
18928
18929 m_errorMonitor->VerifyFound();
18930
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018931 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018932 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18933 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018934
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018935 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(),
18936 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018937
18938 m_errorMonitor->VerifyFound();
18939}
Tobin Ehliscde08892015-09-22 10:11:37 -060018940#endif // IMAGE_TESTS
18941
Cody Northrop1242dfd2016-07-13 17:24:59 -060018942#if defined(ANDROID) && defined(VALIDATION_APK)
18943static bool initialized = false;
18944static bool active = false;
18945
18946// Convert Intents to argv
18947// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018948std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060018949 std::vector<std::string> args;
18950 JavaVM &vm = *app.activity->vm;
18951 JNIEnv *p_env;
18952 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK)
18953 return args;
18954
18955 JNIEnv &env = *p_env;
18956 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018957 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060018958 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018959 jmethodID get_string_extra_method =
18960 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060018961 jvalue get_string_extra_args;
18962 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018963 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060018964
18965 std::string args_str;
18966 if (extra_str) {
18967 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
18968 args_str = extra_utf;
18969 env.ReleaseStringUTFChars(extra_str, extra_utf);
18970 env.DeleteLocalRef(extra_str);
18971 }
18972
18973 env.DeleteLocalRef(get_string_extra_args.l);
18974 env.DeleteLocalRef(intent);
18975 vm.DetachCurrentThread();
18976
18977 // split args_str
18978 std::stringstream ss(args_str);
18979 std::string arg;
18980 while (std::getline(ss, arg, ' ')) {
18981 if (!arg.empty())
18982 args.push_back(arg);
18983 }
18984
18985 return args;
18986}
18987
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018988static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060018989
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018990static void processCommand(struct android_app *app, int32_t cmd) {
18991 switch (cmd) {
18992 case APP_CMD_INIT_WINDOW: {
18993 if (app->window) {
18994 initialized = true;
Cody Northrop1242dfd2016-07-13 17:24:59 -060018995 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018996 break;
18997 }
18998 case APP_CMD_GAINED_FOCUS: {
18999 active = true;
19000 break;
19001 }
19002 case APP_CMD_LOST_FOCUS: {
19003 active = false;
19004 break;
19005 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060019006 }
19007}
19008
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019009void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060019010 app_dummy();
19011
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019012 const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060019013
19014 int vulkanSupport = InitVulkan();
19015 if (vulkanSupport == 0) {
19016 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
19017 return;
19018 }
19019
19020 app->onAppCmd = processCommand;
19021 app->onInputEvent = processInput;
19022
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019023 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060019024 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019025 struct android_poll_source *source;
19026 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060019027 if (source) {
19028 source->process(app, source);
19029 }
19030
19031 if (app->destroyRequested != 0) {
19032 VkTestFramework::Finish();
19033 return;
19034 }
19035 }
19036
19037 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019038 // Use the following key to send arguments to gtest, i.e.
19039 // --es args "--gtest_filter=-VkLayerTest.foo"
19040 const char key[] = "args";
19041 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060019042
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019043 std::string filter = "";
19044 if (args.size() > 0) {
19045 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
19046 filter += args[0];
19047 } else {
19048 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
19049 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060019050
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019051 int argc = 2;
19052 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
19053 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060019054
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019055 // Route output to files until we can override the gtest output
19056 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
19057 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060019058
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019059 ::testing::InitGoogleTest(&argc, argv);
19060 VkTestFramework::InitArgs(&argc, argv);
19061 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060019062
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019063 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060019064
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019065 if (result != 0) {
19066 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
19067 } else {
19068 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
19069 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060019070
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019071 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060019072
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019073 fclose(stdout);
19074 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060019075
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019076 ANativeActivity_finish(app->activity);
Cody Northrop1242dfd2016-07-13 17:24:59 -060019077
Mark Lobodzinskice751c62016-09-08 10:45:35 -060019078 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060019079 }
19080 }
19081}
19082#endif
19083
Tony Barbour300a6082015-04-07 13:44:53 -060019084int main(int argc, char **argv) {
19085 int result;
19086
Cody Northrop8e54a402016-03-08 22:25:52 -070019087#ifdef ANDROID
19088 int vulkanSupport = InitVulkan();
19089 if (vulkanSupport == 0)
19090 return 1;
19091#endif
19092
Tony Barbour300a6082015-04-07 13:44:53 -060019093 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060019094 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060019095
19096 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
19097
19098 result = RUN_ALL_TESTS();
19099
Tony Barbour6918cd52015-04-09 12:58:51 -060019100 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060019101 return result;
19102}