blob: 6c77b74ea648ab7597a6e9c07e21b53ec6c0c38a [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
2 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
Michael Lentine0a369f62016-02-03 16:51:46 -06005 * Copyright (c) 2015-2016 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Cody Northrop1242dfd2016-07-13 17:24:59 -060020 * Author: Cody Northrop <cnorthrop@google.com>
Karl Schultz6addd812016-02-02 17:17:23 -070021 */
Tony Barbour65c48b32015-11-17 10:02:56 -070022
Cody Northrop8e54a402016-03-08 22:25:52 -070023#ifdef ANDROID
24#include "vulkan_wrapper.h"
25#else
David Pinedo9316d3b2015-11-06 12:54:48 -070026#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070027#endif
Cody Northrop1242dfd2016-07-13 17:24:59 -060028
29#if defined(ANDROID) && defined(VALIDATION_APK)
30#include <android/log.h>
31#include <android_native_app_glue.h>
32#endif
33
Jon Ashburn7fa7e222016-02-02 12:08:10 -070034#include "icd-spv.h"
Mark Lobodzinskice751c62016-09-08 10:45:35 -060035#include "test_common.h"
36#include "vk_layer_config.h"
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060037#include "vk_validation_error_messages.h"
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060038#include "vkrenderframework.h"
39#include <limits.h>
40#include <unordered_set>
Tony Barbour300a6082015-04-07 13:44:53 -060041
Mark Lobodzinski3780e142015-05-14 15:08:13 -050042#define GLM_FORCE_RADIANS
43#include "glm/glm.hpp"
44#include <glm/gtc/matrix_transform.hpp>
45
Dustin Gravesffa90fa2016-05-06 11:20:38 -060046#define PARAMETER_VALIDATION_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060047#define MEM_TRACKER_TESTS 1
48#define OBJ_TRACKER_TESTS 1
49#define DRAW_STATE_TESTS 1
50#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120051#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060052#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060053#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060054
Mark Lobodzinski3780e142015-05-14 15:08:13 -050055//--------------------------------------------------------------------------------------
56// Mesh and VertexFormat Data
57//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070058struct Vertex {
59 float posX, posY, posZ, posW; // Position data
60 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050061};
62
Karl Schultz6addd812016-02-02 17:17:23 -070063#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050064
65typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070066 BsoFailNone = 0x00000000,
67 BsoFailLineWidth = 0x00000001,
68 BsoFailDepthBias = 0x00000002,
69 BsoFailViewport = 0x00000004,
70 BsoFailScissor = 0x00000008,
71 BsoFailBlend = 0x00000010,
72 BsoFailDepthBounds = 0x00000020,
73 BsoFailStencilReadMask = 0x00000040,
74 BsoFailStencilWriteMask = 0x00000080,
75 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060076 BsoFailCmdClearAttachments = 0x00000200,
Tobin Ehlis379ba3b2016-07-19 11:22:29 -060077 BsoFailIndexBuffer = 0x00000400,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050078} BsoFailSelect;
79
80struct vktriangle_vs_uniform {
81 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070082 float mvp[4][4];
83 float position[3][4];
84 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050085};
86
Mark Lobodzinskice751c62016-09-08 10:45:35 -060087static const char bindStateVertShaderText[] = "#version 450\n"
88 "vec2 vertices[3];\n"
89 "out gl_PerVertex {\n"
90 " vec4 gl_Position;\n"
91 "};\n"
92 "void main() {\n"
93 " vertices[0] = vec2(-1.0, -1.0);\n"
94 " vertices[1] = vec2( 1.0, -1.0);\n"
95 " vertices[2] = vec2( 0.0, 1.0);\n"
96 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
97 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050098
Mark Lobodzinskice751c62016-09-08 10:45:35 -060099static const char bindStateFragShaderText[] = "#version 450\n"
100 "\n"
101 "layout(location = 0) out vec4 uFragColor;\n"
102 "void main(){\n"
103 " uFragColor = vec4(0,1,0,1);\n"
104 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500105
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600106static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
107 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
108 void *pUserData);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600109
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600110// ErrorMonitor Usage:
111//
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600112// Call SetDesiredFailureMsg with: a string to be compared against all
113// encountered log messages, or a validation error enum identifying
114// desired error message. Passing NULL or VALIDATION_ERROR_MAX_ENUM
115// will match all log messages. logMsg will return true for skipCall
116// only if msg is matched or NULL.
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600117//
118// Call DesiredMsgFound to determine if the desired failure message
119// was encountered.
Tony Barbour300a6082015-04-07 13:44:53 -0600120class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700121 public:
122 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600123 test_platform_thread_create_mutex(&m_mutex);
124 test_platform_thread_lock_mutex(&m_mutex);
Chris Forbes17756132016-09-16 14:36:39 +1200125 m_msgFlags = VK_DEBUG_REPORT_ERROR_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700126 m_bailout = NULL;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600127 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600128 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600129
Dustin Graves48458142016-04-29 16:11:55 -0600130 ~ErrorMonitor() { test_platform_thread_delete_mutex(&m_mutex); }
131
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600132 // ErrorMonitor will look for an error message containing the specified string
Karl Schultz6addd812016-02-02 17:17:23 -0700133 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600134 // Also discard all collected messages to this point
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600135 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600136 m_failure_message_strings.clear();
137 // If we are looking for a matching string, ignore any IDs
138 m_desired_message_ids.clear();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600139 m_otherMsgs.clear();
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600140 m_desired_message_strings.insert(msgString);
Karl Schultz6addd812016-02-02 17:17:23 -0700141 m_msgFound = VK_FALSE;
142 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600143 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600144 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600145
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600146 // ErrorMonitor will look for a message ID matching the specified one
147 void SetDesiredFailureMsg(VkFlags msgFlags, UNIQUE_VALIDATION_ERROR_CODE msg_id) {
148 // Also discard all collected messages to this point
149 test_platform_thread_lock_mutex(&m_mutex);
150 m_failure_message_strings.clear();
151 // If we are looking for IDs don't look for strings
152 m_desired_message_strings.clear();
153 m_otherMsgs.clear();
154 m_desired_message_ids.insert(msg_id);
155 m_msgFound = VK_FALSE;
156 m_msgFlags = msgFlags;
157 test_platform_thread_unlock_mutex(&m_mutex);
158 }
159
160 VkBool32 CheckForDesiredMsg(uint32_t message_code, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600161 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600162 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600163 if (m_bailout != NULL) {
164 *m_bailout = true;
165 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600166 string errorString(msgString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600167 bool found_expected = false;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600168
169 for (auto desired_msg : m_desired_message_strings) {
Karl Schultz05cc4e32016-10-12 13:25:23 -0600170 if (desired_msg.length() == 0) {
171 // An empty desired_msg string "" indicates a positive test - not expecting an error.
172 // Return true to avoid calling layers/driver with this error.
173 // And don't erase the "" string, so it remains if another error is found.
174 result = VK_TRUE;
Tony Barbourae58dba2016-12-13 16:30:36 -0700175 found_expected = true;
176 m_msgFound = VK_TRUE;
177 m_failure_message_strings.insert(errorString);
Karl Schultz05cc4e32016-10-12 13:25:23 -0600178 } else if (errorString.find(desired_msg) != string::npos) {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600179 found_expected = true;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600180 m_failure_message_strings.insert(errorString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600181 m_msgFound = VK_TRUE;
182 result = VK_TRUE;
183 // We only want one match for each expected error so remove from set here
184 // 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 -0600185 m_desired_message_strings.erase(desired_msg);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600186 break;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600187 }
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600188 }
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600189 for (auto desired_id : m_desired_message_ids) {
190 if (desired_id == VALIDATION_ERROR_MAX_ENUM) {
191 // A message ID set to MAX_ENUM indicates a positive test - not expecting an error.
192 // Return true to avoid calling layers/driver with this error.
193 result = VK_TRUE;
194 } else if (desired_id == message_code) {
195 // Double-check that the string matches the error enum
196 if (errorString.find(validation_error_map[desired_id]) != string::npos) {
197 found_expected = true;
198 result = VK_TRUE;
199 m_msgFound = VK_TRUE;
200 m_desired_message_ids.erase(desired_id);
201 break;
202 } else {
203 // Treat this message as a regular unexpected error, but print a warning jic
204 printf("Message (%s) from MessageID %d does not correspond to expected message from error Database (%s)\n",
205 errorString.c_str(), desired_id, validation_error_map[desired_id]);
206 }
207 }
208 }
209
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600210 if (!found_expected) {
Chris Forbes5b9442b2016-09-13 16:49:57 +1200211 printf("Unexpected: %s\n", msgString);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600212 m_otherMsgs.push_back(errorString);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600213 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600214 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600215 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600216 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600217
Karl Schultz6addd812016-02-02 17:17:23 -0700218 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600219
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600220 VkDebugReportFlagsEXT GetMessageFlags(void) { return m_msgFlags; }
221
Karl Schultz6addd812016-02-02 17:17:23 -0700222 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600223
Karl Schultz6addd812016-02-02 17:17:23 -0700224 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600225
Karl Schultz6addd812016-02-02 17:17:23 -0700226 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600227 vector<string> otherMsgs = GetOtherFailureMsgs();
Tony Barbour59b42282016-11-03 13:31:28 -0600228 if (otherMsgs.size()) {
229 cout << "Other error messages logged for this test were:" << endl;
230 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
231 cout << " " << *iter << endl;
232 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600233 }
234 }
235
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600236 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200237
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600238 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
239 void ExpectSuccess(VkDebugReportFlagsEXT message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
240 m_msgFlags = message_flag_mask;
241 // Match ANY message matching specified type
242 SetDesiredFailureMsg(message_flag_mask, "");
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200243 }
244
245 void VerifyFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600246 // Not seeing the desired message is a failure. /Before/ throwing, dump any other messages.
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200247 if (!DesiredMsgFound()) {
248 DumpFailureMsgs();
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600249 for (auto desired_msg : m_desired_message_strings) {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600250 FAIL() << "Did not receive expected error '" << desired_msg << "'";
251 }
Tony Barbour59b42282016-11-03 13:31:28 -0600252 for (auto desired_id : m_desired_message_ids) {
253 FAIL() << "Did not receive expected error '" << desired_id << "'";
254 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200255 }
256 }
257
258 void VerifyNotFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600259 // ExpectSuccess() configured us to match anything. Any error is a failure.
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200260 if (DesiredMsgFound()) {
261 DumpFailureMsgs();
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600262 for (auto msg : m_failure_message_strings) {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600263 FAIL() << "Expected to succeed but got error: " << msg;
264 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200265 }
266 }
267
Karl Schultz6addd812016-02-02 17:17:23 -0700268 private:
269 VkFlags m_msgFlags;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600270 std::unordered_set<uint32_t>m_desired_message_ids;
271 std::unordered_set<string> m_desired_message_strings;
272 std::unordered_set<string> m_failure_message_strings;
Karl Schultz6addd812016-02-02 17:17:23 -0700273 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600274 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700275 bool *m_bailout;
276 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600277};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500278
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600279static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
280 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
281 void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600282 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
283 if (msgFlags & errMonitor->GetMessageFlags()) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600284 return errMonitor->CheckForDesiredMsg(msgCode, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600285 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600286 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600287}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500288
Karl Schultz6addd812016-02-02 17:17:23 -0700289class VkLayerTest : public VkRenderFramework {
290 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800291 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
292 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600293 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
294 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
Karl Schultz6addd812016-02-02 17:17:23 -0700295 BsoFailSelect failMask);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600296 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
297 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, failMask);
Karl Schultz6addd812016-02-02 17:17:23 -0700298 }
Tony Barbour300a6082015-04-07 13:44:53 -0600299
Tony Barbourfe3351b2015-07-28 10:17:20 -0600300 /* Convenience functions that use built-in command buffer */
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600301 VkResult BeginCommandBuffer() { return BeginCommandBuffer(*m_commandBuffer); }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800302 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600303 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
304 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700305 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600306 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
Karl Schultz6addd812016-02-02 17:17:23 -0700307 uint32_t firstInstance) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600308 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700309 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600310 void QueueCommandBuffer(bool checkSuccess = true) { m_commandBuffer->QueueCommandBuffer(checkSuccess); }
311 void QueueCommandBuffer(const VkFence &fence) { m_commandBuffer->QueueCommandBuffer(fence); }
312 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding) {
Karl Schultz6addd812016-02-02 17:17:23 -0700313 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
314 }
315 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
316 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
317 }
318
319 protected:
320 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600321 bool m_enableWSI;
Tony Barbour300a6082015-04-07 13:44:53 -0600322
323 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600324 std::vector<const char *> instance_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600325 std::vector<const char *> instance_extension_names;
326 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600327
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700328 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600329 /*
330 * Since CreateDbgMsgCallback is an instance level extension call
331 * any extension / layer that utilizes that feature also needs
332 * to be enabled at create instance time.
333 */
Karl Schultz6addd812016-02-02 17:17:23 -0700334 // Use Threading layer first to protect others from
335 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700336 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600337 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800338 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700339 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800340 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600341 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700342 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600343
Ian Elliott2c1daf52016-05-12 09:41:46 -0600344 if (m_enableWSI) {
345 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
346 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
347#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
348#if defined(VK_USE_PLATFORM_ANDROID_KHR)
349 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
350#endif // VK_USE_PLATFORM_ANDROID_KHR
351#if defined(VK_USE_PLATFORM_MIR_KHR)
352 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
353#endif // VK_USE_PLATFORM_MIR_KHR
354#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
355 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
356#endif // VK_USE_PLATFORM_WAYLAND_KHR
357#if defined(VK_USE_PLATFORM_WIN32_KHR)
358 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
359#endif // VK_USE_PLATFORM_WIN32_KHR
360#endif // NEED_TO_TEST_THIS_ON_PLATFORM
361#if defined(VK_USE_PLATFORM_XCB_KHR)
362 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
363#elif defined(VK_USE_PLATFORM_XLIB_KHR)
364 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
365#endif // VK_USE_PLATFORM_XLIB_KHR
366 }
367
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600368 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600369 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800370 this->app_info.pApplicationName = "layer_tests";
371 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600372 this->app_info.pEngineName = "unittest";
373 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600374 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600375
Tony Barbour15524c32015-04-29 17:34:29 -0600376 m_errorMonitor = new ErrorMonitor;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600377 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600378 }
379
380 virtual void TearDown() {
381 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600382 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600383 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600384 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600385
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600386 VkLayerTest() { m_enableWSI = false; }
Tony Barbour300a6082015-04-07 13:44:53 -0600387};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500388
Karl Schultz6addd812016-02-02 17:17:23 -0700389VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600390 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600391
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800392 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600393
394 /*
395 * For render test all drawing happens in a single render pass
396 * on a single command buffer.
397 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200398 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800399 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600400 }
401
402 return result;
403}
404
Karl Schultz6addd812016-02-02 17:17:23 -0700405VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600406 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600407
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200408 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800409 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200410 }
Tony Barbour300a6082015-04-07 13:44:53 -0600411
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800412 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600413
414 return result;
415}
416
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600417void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500418 // Create identity matrix
419 int i;
420 struct vktriangle_vs_uniform data;
421
422 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700423 glm::mat4 View = glm::mat4(1.0f);
424 glm::mat4 Model = glm::mat4(1.0f);
425 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500426 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700427 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500428
429 memcpy(&data.mvp, &MVP[0][0], matrixSize);
430
Karl Schultz6addd812016-02-02 17:17:23 -0700431 static const Vertex tri_data[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600432 {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 -0500433 };
434
Karl Schultz6addd812016-02-02 17:17:23 -0700435 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500436 data.position[i][0] = tri_data[i].posX;
437 data.position[i][1] = tri_data[i].posY;
438 data.position[i][2] = tri_data[i].posZ;
439 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700440 data.color[i][0] = tri_data[i].r;
441 data.color[i][1] = tri_data[i].g;
442 data.color[i][2] = tri_data[i].b;
443 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500444 }
445
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500446 ASSERT_NO_FATAL_FAILURE(InitViewport());
447
Chris Forbesbcfaadd2016-09-16 14:13:53 +1200448 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), (const void *)&data,
449 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500450
Karl Schultz6addd812016-02-02 17:17:23 -0700451 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600452 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500453
454 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800455 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500456 pipelineobj.AddShader(&vs);
457 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600458 if (failMask & BsoFailLineWidth) {
459 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600460 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600461 ia_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600462 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
463 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600464 }
465 if (failMask & BsoFailDepthBias) {
466 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600467 VkPipelineRasterizationStateCreateInfo rs_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600468 rs_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600469 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600470 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600471 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600472 }
Rene Lindsayacbf5e62016-12-15 18:47:11 -0700473 // Viewport and scissors must stay in sync or other errors will occur than
Karl Schultz6addd812016-02-02 17:17:23 -0700474 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600475 if (failMask & BsoFailViewport) {
476 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
477 }
478 if (failMask & BsoFailScissor) {
479 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
480 }
481 if (failMask & BsoFailBlend) {
482 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600483 VkPipelineColorBlendAttachmentState att_state = {};
484 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
485 att_state.blendEnable = VK_TRUE;
486 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600487 }
488 if (failMask & BsoFailDepthBounds) {
489 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
490 }
491 if (failMask & BsoFailStencilReadMask) {
492 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
493 }
494 if (failMask & BsoFailStencilWriteMask) {
495 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
496 }
497 if (failMask & BsoFailStencilReference) {
498 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
499 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500500
501 VkDescriptorSetObj descriptorSet(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600502 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500503
504 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600505 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500506
Tony Barbourfe3351b2015-07-28 10:17:20 -0600507 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500508
509 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600510 if (failMask & BsoFailIndexBuffer) {
511 // Use DrawIndexed w/o an index buffer bound
512 DrawIndexed(3, 1, 0, 0, 0);
513 } else {
514 Draw(3, 1, 0, 0);
515 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500516
Mark Muellerd4914412016-06-13 17:52:06 -0600517 if (failMask & BsoFailCmdClearAttachments) {
518 VkClearAttachment color_attachment = {};
519 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
520 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
521 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
522
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600523 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Muellerd4914412016-06-13 17:52:06 -0600524 }
525
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500526 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600527 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500528
Tony Barbourfe3351b2015-07-28 10:17:20 -0600529 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500530}
531
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600532void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj,
533 VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500534 if (m_depthStencil->Initialized()) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600535 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500536 } else {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600537 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500538 }
539
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800540 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700541 // Make sure depthWriteEnable is set so that Depth fail test will work
542 // correctly
543 // Make sure stencilTestEnable is set so that Stencil fail test will work
544 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600545 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800546 stencil.failOp = VK_STENCIL_OP_KEEP;
547 stencil.passOp = VK_STENCIL_OP_KEEP;
548 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
549 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600550
551 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
552 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600553 ds_ci.pNext = NULL;
554 ds_ci.depthTestEnable = VK_FALSE;
555 ds_ci.depthWriteEnable = VK_TRUE;
556 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
557 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600558 if (failMask & BsoFailDepthBounds) {
559 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600560 ds_ci.maxDepthBounds = 0.0f;
561 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600562 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600563 ds_ci.stencilTestEnable = VK_TRUE;
564 ds_ci.front = stencil;
565 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600566
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600567 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600568 pipelineobj.SetViewport(m_viewports);
569 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800570 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600571 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600572 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800573 commandBuffer->BindPipeline(pipelineobj);
574 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500575}
576
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600577class VkPositiveLayerTest : public VkLayerTest {
578 public:
579 protected:
580};
581
Ian Elliott2c1daf52016-05-12 09:41:46 -0600582class VkWsiEnabledLayerTest : public VkLayerTest {
583 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600584 protected:
585 VkWsiEnabledLayerTest() { m_enableWSI = true; }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600586};
587
Mark Muellerdfe37552016-07-07 14:47:42 -0600588class VkBufferTest {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600589 public:
Mark Muellerdfe37552016-07-07 14:47:42 -0600590 enum eTestEnFlags {
591 eDoubleDelete,
592 eInvalidDeviceOffset,
593 eInvalidMemoryOffset,
594 eBindNullBuffer,
595 eFreeInvalidHandle,
Mark Mueller4042b652016-09-05 22:52:21 -0600596 eNone,
Mark Muellerdfe37552016-07-07 14:47:42 -0600597 };
598
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600599 enum eTestConditions { eOffsetAlignment = 1 };
Mark Muellerdfe37552016-07-07 14:47:42 -0600600
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600601 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage = 0) {
602 if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600603 return true;
604 }
605 VkDeviceSize offset_limit = 0;
606 if (eInvalidMemoryOffset == aTestFlag) {
607 VkBuffer vulkanBuffer;
608 VkBufferCreateInfo buffer_create_info = {};
609 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
610 buffer_create_info.size = 32;
611 buffer_create_info.usage = aBufferUsage;
612
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600613 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr, &vulkanBuffer);
Mark Mueller4042b652016-09-05 22:52:21 -0600614 VkMemoryRequirements memory_reqs = {};
Mark Muellerdfe37552016-07-07 14:47:42 -0600615
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600616 vkGetBufferMemoryRequirements(aVulkanDevice->device(), vulkanBuffer, &memory_reqs);
Mark Muellerdfe37552016-07-07 14:47:42 -0600617 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
618 offset_limit = memory_reqs.alignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600619 } else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
620 offset_limit = aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600621 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600622 offset_limit = aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600623 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600624 offset_limit = aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600625 }
626 if (eOffsetAlignment < offset_limit) {
627 return true;
628 }
629 return false;
630 }
631
632 // A constructor which performs validation tests within construction.
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600633 VkBufferTest(VkDeviceObj *aVulkanDevice, VkBufferUsageFlags aBufferUsage, eTestEnFlags aTestFlag = eNone)
634 : AllocateCurrent(false), BoundCurrent(false), CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600635
636 if (eBindNullBuffer == aTestFlag) {
637 VulkanMemory = 0;
638 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
639 } else {
640 VkBufferCreateInfo buffer_create_info = {};
641 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
642 buffer_create_info.size = 32;
643 buffer_create_info.usage = aBufferUsage;
644
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600645 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr, &VulkanBuffer);
Mark Muellerdfe37552016-07-07 14:47:42 -0600646
647 CreateCurrent = true;
648
649 VkMemoryRequirements memory_requirements;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600650 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer, &memory_requirements);
Mark Muellerdfe37552016-07-07 14:47:42 -0600651
652 VkMemoryAllocateInfo memory_allocate_info = {};
653 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
654 memory_allocate_info.allocationSize = memory_requirements.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600655 bool pass = aVulkanDevice->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info,
656 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Muellerdfe37552016-07-07 14:47:42 -0600657 if (!pass) {
658 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
659 return;
660 }
661
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600662 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL, &VulkanMemory);
Mark Muellerdfe37552016-07-07 14:47:42 -0600663 AllocateCurrent = true;
664 // NB: 1 is intentionally an invalid offset value
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600665 const bool offset_en = eInvalidDeviceOffset == aTestFlag || eInvalidMemoryOffset == aTestFlag;
666 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, offset_en ? eOffsetAlignment : 0);
Mark Muellerdfe37552016-07-07 14:47:42 -0600667 BoundCurrent = true;
668
669 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
670 }
671 }
672
673 ~VkBufferTest() {
674 if (CreateCurrent) {
675 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
676 }
677 if (AllocateCurrent) {
678 if (InvalidDeleteEn) {
679 union {
680 VkDeviceMemory device_memory;
681 unsigned long long index_access;
682 } bad_index;
683
684 bad_index.device_memory = VulkanMemory;
685 bad_index.index_access++;
686
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600687 vkFreeMemory(VulkanDevice, bad_index.device_memory, nullptr);
Mark Muellerdfe37552016-07-07 14:47:42 -0600688 }
689 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
690 }
691 }
692
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600693 bool GetBufferCurrent() { return AllocateCurrent && BoundCurrent && CreateCurrent; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600694
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600695 const VkBuffer &GetBuffer() { return VulkanBuffer; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600696
697 void TestDoubleDestroy() {
698 // Destroy the buffer but leave the flag set, which will cause
699 // the buffer to be destroyed again in the destructor.
700 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
701 }
702
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600703 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600704 bool AllocateCurrent;
705 bool BoundCurrent;
706 bool CreateCurrent;
707 bool InvalidDeleteEn;
708
709 VkBuffer VulkanBuffer;
710 VkDevice VulkanDevice;
711 VkDeviceMemory VulkanMemory;
Mark Muellerdfe37552016-07-07 14:47:42 -0600712};
713
714class VkVerticesObj {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600715 public:
716 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount, unsigned aBindingCount, unsigned aByteStride,
Mark Muellerdfe37552016-07-07 14:47:42 -0600717 VkDeviceSize aVertexCount, const float *aVerticies)
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600718 : BoundCurrent(false), AttributeCount(aAttributeCount), BindingCount(aBindingCount), BindId(BindIdGenerator),
Mark Muellerdfe37552016-07-07 14:47:42 -0600719 PipelineVertexInputStateCreateInfo(),
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600720 VulkanMemoryBuffer(aVulkanDevice, 1, static_cast<int>(aByteStride * aVertexCount),
721 reinterpret_cast<const void *>(aVerticies), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600722 BindIdGenerator++; // NB: This can wrap w/misuse
723
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600724 VertexInputAttributeDescription = new VkVertexInputAttributeDescription[AttributeCount];
725 VertexInputBindingDescription = new VkVertexInputBindingDescription[BindingCount];
Mark Muellerdfe37552016-07-07 14:47:42 -0600726
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600727 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = VertexInputAttributeDescription;
728 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = AttributeCount;
729 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = VertexInputBindingDescription;
730 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = BindingCount;
731 PipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -0600732
733 unsigned i = 0;
734 do {
735 VertexInputAttributeDescription[i].binding = BindId;
736 VertexInputAttributeDescription[i].location = i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600737 VertexInputAttributeDescription[i].format = VK_FORMAT_R32G32B32_SFLOAT;
738 VertexInputAttributeDescription[i].offset = sizeof(float) * aByteStride;
Mark Muellerdfe37552016-07-07 14:47:42 -0600739 i++;
740 } while (AttributeCount < i);
741
742 i = 0;
743 do {
744 VertexInputBindingDescription[i].binding = BindId;
745 VertexInputBindingDescription[i].stride = aByteStride;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600746 VertexInputBindingDescription[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
Mark Muellerdfe37552016-07-07 14:47:42 -0600747 i++;
748 } while (BindingCount < i);
749 }
750
751 ~VkVerticesObj() {
752 if (VertexInputAttributeDescription) {
753 delete[] VertexInputAttributeDescription;
754 }
755 if (VertexInputBindingDescription) {
756 delete[] VertexInputBindingDescription;
757 }
758 }
759
760 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600761 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription, AttributeCount);
762 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription, BindingCount);
Mark Muellerdfe37552016-07-07 14:47:42 -0600763 return true;
764 }
765
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600766 void BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount = 0, VkDeviceSize *aOffsetList = nullptr) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600767 VkDeviceSize *offsetList;
768 unsigned offsetCount;
769
770 if (aOffsetCount) {
771 offsetList = aOffsetList;
772 offsetCount = aOffsetCount;
773 } else {
774 offsetList = new VkDeviceSize[1]();
775 offsetCount = 1;
776 }
777
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600778 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount, &VulkanMemoryBuffer.handle(), offsetList);
Mark Muellerdfe37552016-07-07 14:47:42 -0600779 BoundCurrent = true;
780
781 if (!aOffsetCount) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600782 delete[] offsetList;
Mark Muellerdfe37552016-07-07 14:47:42 -0600783 }
784 }
785
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600786 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600787 static uint32_t BindIdGenerator;
788
789 bool BoundCurrent;
790 unsigned AttributeCount;
791 unsigned BindingCount;
792 uint32_t BindId;
793
794 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
795 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
796 VkVertexInputBindingDescription *VertexInputBindingDescription;
797 VkConstantBufferObj VulkanMemoryBuffer;
798};
799
800uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500801// ********************************************************************************************************************
802// ********************************************************************************************************************
803// ********************************************************************************************************************
804// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600805#if PARAMETER_VALIDATION_TESTS
806TEST_F(VkLayerTest, RequiredParameter) {
807 TEST_DESCRIPTION("Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
808 "pointer, array, and array count parameters");
809
810 ASSERT_NO_FATAL_FAILURE(InitState());
811
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600812 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600813 // Specify NULL for a pointer to a handle
814 // Expected to trigger an error with
815 // parameter_validation::validate_required_pointer
816 vkGetPhysicalDeviceFeatures(gpu(), NULL);
817 m_errorMonitor->VerifyFound();
818
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
820 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600821 // Specify NULL for pointer to array count
822 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600823 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600824 m_errorMonitor->VerifyFound();
825
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600826 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter viewportCount must be greater than 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600827 // Specify 0 for a required array count
828 // Expected to trigger an error with parameter_validation::validate_array
829 VkViewport view_port = {};
830 m_commandBuffer->SetViewport(0, 0, &view_port);
831 m_errorMonitor->VerifyFound();
832
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600833 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pViewports specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600834 // Specify NULL for a required array
835 // Expected to trigger an error with parameter_validation::validate_array
836 m_commandBuffer->SetViewport(0, 1, NULL);
837 m_errorMonitor->VerifyFound();
838
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600839 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600840 // Specify VK_NULL_HANDLE for a required handle
841 // Expected to trigger an error with
842 // parameter_validation::validate_required_handle
843 vkUnmapMemory(device(), VK_NULL_HANDLE);
844 m_errorMonitor->VerifyFound();
845
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
847 "required parameter pFences[0] specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600848 // Specify VK_NULL_HANDLE for a required handle array entry
849 // Expected to trigger an error with
850 // parameter_validation::validate_required_handle_array
851 VkFence fence = VK_NULL_HANDLE;
852 vkResetFences(device(), 1, &fence);
853 m_errorMonitor->VerifyFound();
854
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600855 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600856 // Specify NULL for a required struct pointer
857 // Expected to trigger an error with
858 // parameter_validation::validate_struct_type
859 VkDeviceMemory memory = VK_NULL_HANDLE;
860 vkAllocateMemory(device(), NULL, NULL, &memory);
861 m_errorMonitor->VerifyFound();
862
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600864 // Specify 0 for a required VkFlags parameter
865 // Expected to trigger an error with parameter_validation::validate_flags
866 m_commandBuffer->SetStencilReference(0, 0);
867 m_errorMonitor->VerifyFound();
868
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600869 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 -0600870 // Specify 0 for a required VkFlags array entry
871 // Expected to trigger an error with
872 // parameter_validation::validate_flags_array
873 VkSemaphore semaphore = VK_NULL_HANDLE;
874 VkPipelineStageFlags stageFlags = 0;
875 VkSubmitInfo submitInfo = {};
876 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
877 submitInfo.waitSemaphoreCount = 1;
878 submitInfo.pWaitSemaphores = &semaphore;
879 submitInfo.pWaitDstStageMask = &stageFlags;
880 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
881 m_errorMonitor->VerifyFound();
882}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600883
Dustin Gravesfce74c02016-05-10 11:42:58 -0600884TEST_F(VkLayerTest, ReservedParameter) {
885 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
886
887 ASSERT_NO_FATAL_FAILURE(InitState());
888
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
Dustin Gravesfce74c02016-05-10 11:42:58 -0600890 // Specify 0 for a reserved VkFlags parameter
891 // Expected to trigger an error with
892 // parameter_validation::validate_reserved_flags
893 VkEvent event_handle = VK_NULL_HANDLE;
894 VkEventCreateInfo event_info = {};
895 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
896 event_info.flags = 1;
897 vkCreateEvent(device(), &event_info, NULL, &event_handle);
898 m_errorMonitor->VerifyFound();
899}
900
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600901TEST_F(VkLayerTest, InvalidStructSType) {
902 TEST_DESCRIPTION("Specify an invalid VkStructureType for a Vulkan "
903 "structure's sType field");
904
905 ASSERT_NO_FATAL_FAILURE(InitState());
906
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600907 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600908 // Zero struct memory, effectively setting sType to
909 // VK_STRUCTURE_TYPE_APPLICATION_INFO
910 // Expected to trigger an error with
911 // parameter_validation::validate_struct_type
912 VkMemoryAllocateInfo alloc_info = {};
913 VkDeviceMemory memory = VK_NULL_HANDLE;
914 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
915 m_errorMonitor->VerifyFound();
916
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600917 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600918 // Zero struct memory, effectively setting sType to
919 // VK_STRUCTURE_TYPE_APPLICATION_INFO
920 // Expected to trigger an error with
921 // parameter_validation::validate_struct_type_array
922 VkSubmitInfo submit_info = {};
923 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
924 m_errorMonitor->VerifyFound();
925}
926
927TEST_F(VkLayerTest, InvalidStructPNext) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600928 TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600929
930 ASSERT_NO_FATAL_FAILURE(InitState());
931
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600932 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600933 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be NULL.
Karl Schultz38b50992016-07-11 16:09:09 -0600934 // Need to pick a function that has no allowed pNext structure types.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600935 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Karl Schultz38b50992016-07-11 16:09:09 -0600936 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600937 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600938 // Zero-initialization will provide the correct sType
939 VkApplicationInfo app_info = {};
940 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
941 event_alloc_info.pNext = &app_info;
942 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
943 m_errorMonitor->VerifyFound();
944
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
946 " chain includes a structure with unexpected VkStructureType ");
Karl Schultz38b50992016-07-11 16:09:09 -0600947 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
948 // a function that has allowed pNext structure types and specify
949 // a structure type that is not allowed.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600950 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600951 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -0600952 VkMemoryAllocateInfo memory_alloc_info = {};
953 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
954 memory_alloc_info.pNext = &app_info;
955 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600956 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600957}
Dustin Graves5d33d532016-05-09 16:21:12 -0600958
959TEST_F(VkLayerTest, UnrecognizedValue) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600960 TEST_DESCRIPTION("Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
Dustin Graves5d33d532016-05-09 16:21:12 -0600961
962 ASSERT_NO_FATAL_FAILURE(InitState());
963
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600964 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not fall within the begin..end "
965 "range of the core VkFormat "
966 "enumeration tokens");
Dustin Graves5d33d532016-05-09 16:21:12 -0600967 // Specify an invalid VkFormat value
968 // Expected to trigger an error with
969 // parameter_validation::validate_ranged_enum
970 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600971 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -0600972 m_errorMonitor->VerifyFound();
973
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600974 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 -0600975 // Specify an invalid VkFlags bitmask value
976 // Expected to trigger an error with parameter_validation::validate_flags
977 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600978 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
979 static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -0600980 m_errorMonitor->VerifyFound();
981
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600982 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 -0600983 // Specify an invalid VkFlags array entry
984 // Expected to trigger an error with
985 // parameter_validation::validate_flags_array
986 VkSemaphore semaphore = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600987 VkPipelineStageFlags stage_flags = static_cast<VkPipelineStageFlags>(1 << 25);
Dustin Graves5d33d532016-05-09 16:21:12 -0600988 VkSubmitInfo submit_info = {};
989 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
990 submit_info.waitSemaphoreCount = 1;
991 submit_info.pWaitSemaphores = &semaphore;
992 submit_info.pWaitDstStageMask = &stage_flags;
993 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
994 m_errorMonitor->VerifyFound();
995
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600996 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
Dustin Graves5d33d532016-05-09 16:21:12 -0600997 // Specify an invalid VkBool32 value
998 // Expected to trigger a warning with
999 // parameter_validation::validate_bool32
1000 VkSampler sampler = VK_NULL_HANDLE;
1001 VkSamplerCreateInfo sampler_info = {};
1002 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1003 sampler_info.pNext = NULL;
1004 sampler_info.magFilter = VK_FILTER_NEAREST;
1005 sampler_info.minFilter = VK_FILTER_NEAREST;
1006 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1007 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1008 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1009 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1010 sampler_info.mipLodBias = 1.0;
1011 sampler_info.maxAnisotropy = 1;
1012 sampler_info.compareEnable = VK_FALSE;
1013 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1014 sampler_info.minLod = 1.0;
1015 sampler_info.maxLod = 1.0;
1016 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1017 sampler_info.unnormalizedCoordinates = VK_FALSE;
1018 // Not VK_TRUE or VK_FALSE
1019 sampler_info.anisotropyEnable = 3;
1020 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1021 m_errorMonitor->VerifyFound();
1022}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001023
1024TEST_F(VkLayerTest, FailedReturnValue) {
1025 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1026
1027 ASSERT_NO_FATAL_FAILURE(InitState());
1028
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001029 // Find an unsupported image format
1030 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1031 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1032 VkFormat format = static_cast<VkFormat>(f);
1033 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001034 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001035 unsupported = format;
1036 break;
1037 }
1038 }
1039
1040 if (unsupported != VK_FORMAT_UNDEFINED) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1042 "the requested format is not supported on this device");
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001043 // Specify an unsupported VkFormat value to generate a
1044 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1045 // Expected to trigger a warning from
1046 // parameter_validation::validate_result
1047 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001048 VkResult err = vkGetPhysicalDeviceImageFormatProperties(gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1049 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001050 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1051 m_errorMonitor->VerifyFound();
1052 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001053}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001054
1055TEST_F(VkLayerTest, UpdateBufferAlignment) {
1056 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001057 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001058
1059 ASSERT_NO_FATAL_FAILURE(InitState());
1060
1061 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1062 vk_testing::Buffer buffer;
1063 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1064
1065 BeginCommandBuffer();
1066 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001067 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001068 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1069 m_errorMonitor->VerifyFound();
1070
1071 // Introduce failure by using dataSize that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001073 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1074 m_errorMonitor->VerifyFound();
1075
1076 // Introduce failure by using dataSize that is < 0
1077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001078 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001079 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1080 m_errorMonitor->VerifyFound();
1081
1082 // Introduce failure by using dataSize that is > 65536
1083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001084 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001085 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1086 m_errorMonitor->VerifyFound();
1087
1088 EndCommandBuffer();
1089}
1090
1091TEST_F(VkLayerTest, FillBufferAlignment) {
1092 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1093
1094 ASSERT_NO_FATAL_FAILURE(InitState());
1095
1096 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1097 vk_testing::Buffer buffer;
1098 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1099
1100 BeginCommandBuffer();
1101
1102 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001103 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001104 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1105 m_errorMonitor->VerifyFound();
1106
1107 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001109 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1110 m_errorMonitor->VerifyFound();
1111
1112 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001114 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1115 m_errorMonitor->VerifyFound();
1116
1117 EndCommandBuffer();
1118}
Dustin Graves40f35822016-06-23 11:12:53 -06001119
Cortd889ff92016-07-27 09:51:27 -07001120TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1121 VkResult err;
1122
1123 TEST_DESCRIPTION("Attempt to use a non-solid polygon fill mode in a "
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001124 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001125
1126 ASSERT_NO_FATAL_FAILURE(InitState());
1127 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1128
1129 std::vector<const char *> device_extension_names;
1130 auto features = m_device->phy().features();
1131 // Artificially disable support for non-solid fill modes
1132 features.fillModeNonSolid = false;
1133 // The sacrificial device object
1134 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1135
1136 VkRenderpassObj render_pass(&test_device);
1137
1138 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1139 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1140 pipeline_layout_ci.setLayoutCount = 0;
1141 pipeline_layout_ci.pSetLayouts = NULL;
1142
1143 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001144 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001145 ASSERT_VK_SUCCESS(err);
1146
1147 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1148 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1149 rs_ci.pNext = nullptr;
1150 rs_ci.lineWidth = 1.0f;
1151 rs_ci.rasterizerDiscardEnable = true;
1152
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001153 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1154 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001155
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001156 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001157 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1158 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001159 {
1160 VkPipelineObj pipe(&test_device);
1161 pipe.AddShader(&vs);
1162 pipe.AddShader(&fs);
1163 pipe.AddColorAttachment();
1164 // Introduce failure by setting unsupported polygon mode
1165 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1166 pipe.SetRasterization(&rs_ci);
1167 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1168 }
1169 m_errorMonitor->VerifyFound();
1170
1171 // Try again with polygonMode=LINE, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1173 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001174 {
1175 VkPipelineObj pipe(&test_device);
1176 pipe.AddShader(&vs);
1177 pipe.AddShader(&fs);
1178 pipe.AddColorAttachment();
1179 // Introduce failure by setting unsupported polygon mode
1180 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1181 pipe.SetRasterization(&rs_ci);
1182 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1183 }
1184 m_errorMonitor->VerifyFound();
1185
Cortd889ff92016-07-27 09:51:27 -07001186 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1187}
1188
Dustin Gravesffa90fa2016-05-06 11:20:38 -06001189#endif // PARAMETER_VALIDATION_TESTS
1190
Tobin Ehlis0788f522015-05-26 16:11:58 -06001191#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001192#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001193TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001194{
1195 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001196 VkFenceCreateInfo fenceInfo = {};
1197 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1198 fenceInfo.pNext = NULL;
1199 fenceInfo.flags = 0;
1200
Mike Weiblencce7ec72016-10-17 19:33:05 -06001201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001202
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001203 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001204
1205 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1206 vk_testing::Buffer buffer;
1207 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001208
Tony Barbourfe3351b2015-07-28 10:17:20 -06001209 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001210 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001211 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001212
1213 testFence.init(*m_device, fenceInfo);
1214
1215 // Bypass framework since it does the waits automatically
1216 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001217 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001218 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1219 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001220 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001221 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001222 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001223 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001224 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001225 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001226 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001227
1228 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001229 ASSERT_VK_SUCCESS( err );
1230
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001231 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001232 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001233
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001234 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001235}
1236
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001237TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001238{
1239 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001240 VkFenceCreateInfo fenceInfo = {};
1241 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1242 fenceInfo.pNext = NULL;
1243 fenceInfo.flags = 0;
1244
Mike Weiblencce7ec72016-10-17 19:33:05 -06001245 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001246
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001247 ASSERT_NO_FATAL_FAILURE(InitState());
1248 ASSERT_NO_FATAL_FAILURE(InitViewport());
1249 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1250
Tony Barbourfe3351b2015-07-28 10:17:20 -06001251 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001252 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001253 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001254
1255 testFence.init(*m_device, fenceInfo);
1256
1257 // Bypass framework since it does the waits automatically
1258 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001259 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001260 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1261 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001262 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001263 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001264 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001265 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001266 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001267 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001268 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001269
1270 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001271 ASSERT_VK_SUCCESS( err );
1272
Jon Ashburnf19916e2016-01-11 13:12:43 -07001273 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001274 VkCommandBufferBeginInfo info = {};
1275 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1276 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001277 info.renderPass = VK_NULL_HANDLE;
1278 info.subpass = 0;
1279 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001280 info.occlusionQueryEnable = VK_FALSE;
1281 info.queryFlags = 0;
1282 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001283
1284 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001285 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001286
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001287 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001288}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001289#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001290
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001291TEST_F(VkLayerTest, SparseBindingImageBufferCreate) {
1292 TEST_DESCRIPTION("Create buffer/image with sparse attributes but without the sparse_binding bit set");
1293
1294 ASSERT_NO_FATAL_FAILURE(InitState());
1295
1296 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00669);
1297 VkBuffer buffer;
1298 VkBufferCreateInfo buf_info = {};
1299 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1300 buf_info.pNext = NULL;
1301 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
1302 buf_info.size = 2048;
1303 buf_info.queueFamilyIndexCount = 0;
1304 buf_info.pQueueFamilyIndices = NULL;
1305 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1306 buf_info.flags = VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
1307 vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1308 m_errorMonitor->VerifyFound();
1309
1310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02160);
1311 VkImage image;
1312 VkImageCreateInfo image_create_info = {};
1313 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1314 image_create_info.pNext = NULL;
1315 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1316 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1317 image_create_info.extent.width = 512;
1318 image_create_info.extent.height = 64;
1319 image_create_info.extent.depth = 1;
1320 image_create_info.mipLevels = 1;
1321 image_create_info.arrayLayers = 1;
1322 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1323 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1324 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1325 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1326 image_create_info.queueFamilyIndexCount = 0;
1327 image_create_info.pQueueFamilyIndices = NULL;
1328 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1329 image_create_info.flags = VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
1330 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1331 m_errorMonitor->VerifyFound();
1332}
1333
Tobin Ehlisf11be982016-05-11 13:52:53 -06001334TEST_F(VkLayerTest, InvalidMemoryAliasing) {
1335 TEST_DESCRIPTION("Create a buffer and image, allocate memory, and bind the "
1336 "buffer and image to memory such that they will alias.");
1337 VkResult err;
1338 bool pass;
1339 ASSERT_NO_FATAL_FAILURE(InitState());
1340
Tobin Ehlis077ded32016-05-12 17:39:13 -06001341 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001342 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001343 VkImage image2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001344 VkDeviceMemory mem; // buffer will be bound first
1345 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001346 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001347
1348 VkBufferCreateInfo buf_info = {};
1349 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1350 buf_info.pNext = NULL;
1351 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1352 buf_info.size = 256;
1353 buf_info.queueFamilyIndexCount = 0;
1354 buf_info.pQueueFamilyIndices = NULL;
1355 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1356 buf_info.flags = 0;
1357 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1358 ASSERT_VK_SUCCESS(err);
1359
Tobin Ehlis077ded32016-05-12 17:39:13 -06001360 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001361
1362 VkImageCreateInfo image_create_info = {};
1363 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1364 image_create_info.pNext = NULL;
1365 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1366 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1367 image_create_info.extent.width = 64;
1368 image_create_info.extent.height = 64;
1369 image_create_info.extent.depth = 1;
1370 image_create_info.mipLevels = 1;
1371 image_create_info.arrayLayers = 1;
1372 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001373 // Image tiling must be optimal to trigger error when aliasing linear buffer
1374 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001375 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1376 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1377 image_create_info.queueFamilyIndexCount = 0;
1378 image_create_info.pQueueFamilyIndices = NULL;
1379 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1380 image_create_info.flags = 0;
1381
Tobin Ehlisf11be982016-05-11 13:52:53 -06001382 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1383 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001384 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1385 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001386
Tobin Ehlis077ded32016-05-12 17:39:13 -06001387 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1388
1389 VkMemoryAllocateInfo alloc_info = {};
1390 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1391 alloc_info.pNext = NULL;
1392 alloc_info.memoryTypeIndex = 0;
1393 // Ensure memory is big enough for both bindings
1394 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001395 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1396 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001397 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001398 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001399 vkDestroyImage(m_device->device(), image, NULL);
1400 return;
1401 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001402 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1403 ASSERT_VK_SUCCESS(err);
1404 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1405 ASSERT_VK_SUCCESS(err);
1406
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001407 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001408 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001409 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1410 m_errorMonitor->VerifyFound();
1411
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001412 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001413 // aliasing buffer2
1414 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1415 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001416 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1417 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001418 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001419 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001420 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001421 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001422 m_errorMonitor->VerifyFound();
1423
1424 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001425 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001426 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001427 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001428 vkFreeMemory(m_device->device(), mem, NULL);
1429 vkFreeMemory(m_device->device(), mem_img, NULL);
1430}
1431
Tobin Ehlis35372522016-05-12 08:32:31 -06001432TEST_F(VkLayerTest, InvalidMemoryMapping) {
1433 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1434 VkResult err;
1435 bool pass;
1436 ASSERT_NO_FATAL_FAILURE(InitState());
1437
1438 VkBuffer buffer;
1439 VkDeviceMemory mem;
1440 VkMemoryRequirements mem_reqs;
1441
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001442 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1443
Tobin Ehlis35372522016-05-12 08:32:31 -06001444 VkBufferCreateInfo buf_info = {};
1445 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1446 buf_info.pNext = NULL;
1447 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1448 buf_info.size = 256;
1449 buf_info.queueFamilyIndexCount = 0;
1450 buf_info.pQueueFamilyIndices = NULL;
1451 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1452 buf_info.flags = 0;
1453 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1454 ASSERT_VK_SUCCESS(err);
1455
1456 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1457 VkMemoryAllocateInfo alloc_info = {};
1458 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1459 alloc_info.pNext = NULL;
1460 alloc_info.memoryTypeIndex = 0;
1461
1462 // Ensure memory is big enough for both bindings
1463 static const VkDeviceSize allocation_size = 0x10000;
1464 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001465 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 -06001466 if (!pass) {
1467 vkDestroyBuffer(m_device->device(), buffer, NULL);
1468 return;
1469 }
1470 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1471 ASSERT_VK_SUCCESS(err);
1472
1473 uint8_t *pData;
1474 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001475 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 -06001476 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1477 m_errorMonitor->VerifyFound();
1478 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001479 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001480 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001481 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1482 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1483 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001484 m_errorMonitor->VerifyFound();
1485
1486 // Unmap the memory to avoid re-map error
1487 vkUnmapMemory(m_device->device(), mem);
1488 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001489 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1490 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1491 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001492 m_errorMonitor->VerifyFound();
1493 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001494 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1495 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001496 m_errorMonitor->VerifyFound();
1497 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001498 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001499 vkUnmapMemory(m_device->device(), mem);
1500 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001501
Tobin Ehlis35372522016-05-12 08:32:31 -06001502 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001503 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001504 ASSERT_VK_SUCCESS(err);
1505 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001506 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001507 mmr.memory = mem;
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001508 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001509 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001510 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1511 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001512
Tobin Ehlis35372522016-05-12 08:32:31 -06001513 // Now flush range that oversteps mapped range
1514 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001515 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001516 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001517 mmr.offset = atom_size;
1518 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001519 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1520 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1521 m_errorMonitor->VerifyFound();
1522
1523 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1524 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001525 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001526 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001527 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001528 mmr.size = VK_WHOLE_SIZE;
1529 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001530 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1531 m_errorMonitor->VerifyFound();
1532
Tony Barboure3975eb2016-12-15 14:52:44 -07001533#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001534 // Some platforms have an atomsize of 1 which makes the test meaningless
1535 if (atom_size > 3) {
1536 // Now with an offset NOT a multiple of the device limit
1537 vkUnmapMemory(m_device->device(), mem);
1538 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1539 ASSERT_VK_SUCCESS(err);
1540 mmr.offset = 3; // Not a multiple of atom_size
1541 mmr.size = VK_WHOLE_SIZE;
1542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1543 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1544 m_errorMonitor->VerifyFound();
1545
1546 // Now with a size NOT a multiple of the device limit
1547 vkUnmapMemory(m_device->device(), mem);
1548 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1549 ASSERT_VK_SUCCESS(err);
1550 mmr.offset = atom_size;
1551 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1552 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1553 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1554 m_errorMonitor->VerifyFound();
1555 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001556#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001557 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1558 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001559 if (!pass) {
1560 vkFreeMemory(m_device->device(), mem, NULL);
1561 vkDestroyBuffer(m_device->device(), buffer, NULL);
1562 return;
1563 }
1564 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1565 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1566
1567 vkDestroyBuffer(m_device->device(), buffer, NULL);
1568 vkFreeMemory(m_device->device(), mem, NULL);
1569}
1570
Chris Forbes09368e42016-10-13 11:59:22 +13001571#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001572TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1573 VkResult err;
1574 bool pass;
1575
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001576 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1577 // following declaration (which is temporarily being moved below):
1578 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001579 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001580 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001581 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001582 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001583 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001584 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001585
1586 ASSERT_NO_FATAL_FAILURE(InitState());
1587
Ian Elliott3f06ce52016-04-29 14:46:21 -06001588#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1589#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1590 // Use the functions from the VK_KHR_android_surface extension without
1591 // enabling that extension:
1592
1593 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001594 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001595 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1596 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001597 pass = (err != VK_SUCCESS);
1598 ASSERT_TRUE(pass);
1599 m_errorMonitor->VerifyFound();
1600#endif // VK_USE_PLATFORM_ANDROID_KHR
1601
Ian Elliott3f06ce52016-04-29 14:46:21 -06001602#if defined(VK_USE_PLATFORM_MIR_KHR)
1603 // Use the functions from the VK_KHR_mir_surface extension without enabling
1604 // that extension:
1605
1606 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001607 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001608 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001609 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1610 pass = (err != VK_SUCCESS);
1611 ASSERT_TRUE(pass);
1612 m_errorMonitor->VerifyFound();
1613
1614 // Tell whether an mir_connection supports presentation:
1615 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001616 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1617 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001618 m_errorMonitor->VerifyFound();
1619#endif // VK_USE_PLATFORM_MIR_KHR
1620
Ian Elliott3f06ce52016-04-29 14:46:21 -06001621#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1622 // Use the functions from the VK_KHR_wayland_surface extension without
1623 // enabling that extension:
1624
1625 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001626 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001627 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1628 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001629 pass = (err != VK_SUCCESS);
1630 ASSERT_TRUE(pass);
1631 m_errorMonitor->VerifyFound();
1632
1633 // Tell whether an wayland_display supports presentation:
1634 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001635 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1636 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001637 m_errorMonitor->VerifyFound();
1638#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -06001639#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001640
Ian Elliott3f06ce52016-04-29 14:46:21 -06001641#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001642 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1643 // TO NON-LINUX PLATFORMS:
1644 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001645 // Use the functions from the VK_KHR_win32_surface extension without
1646 // enabling that extension:
1647
1648 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001649 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001650 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1651 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001652 pass = (err != VK_SUCCESS);
1653 ASSERT_TRUE(pass);
1654 m_errorMonitor->VerifyFound();
1655
1656 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001657 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001658 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001659 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001660// Set this (for now, until all platforms are supported and tested):
1661#define NEED_TO_TEST_THIS_ON_PLATFORM
1662#endif // VK_USE_PLATFORM_WIN32_KHR
Tony Barbour2e7bd402016-11-14 14:46:33 -07001663#if defined(VK_USE_PLATFORM_XCB_KHR) || defined (VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001664 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1665 // TO NON-LINUX PLATFORMS:
1666 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001667#endif
1668#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001669 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1670 // that extension:
1671
1672 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001673 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001675 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1676 pass = (err != VK_SUCCESS);
1677 ASSERT_TRUE(pass);
1678 m_errorMonitor->VerifyFound();
1679
1680 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001681 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001682 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1684 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001685 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001686// Set this (for now, until all platforms are supported and tested):
1687#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001688#endif // VK_USE_PLATFORM_XCB_KHR
1689
Ian Elliott12630812016-04-29 14:35:43 -06001690#if defined(VK_USE_PLATFORM_XLIB_KHR)
1691 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1692 // that extension:
1693
1694 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001695 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001696 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001697 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1698 pass = (err != VK_SUCCESS);
1699 ASSERT_TRUE(pass);
1700 m_errorMonitor->VerifyFound();
1701
1702 // Tell whether an Xlib VisualID supports presentation:
1703 Display *dpy = NULL;
1704 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001705 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001706 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1707 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001708// Set this (for now, until all platforms are supported and tested):
1709#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06001710#endif // VK_USE_PLATFORM_XLIB_KHR
1711
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001712// Use the functions from the VK_KHR_surface extension without enabling
1713// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001714
Ian Elliott489eec02016-05-05 14:12:44 -06001715#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001716 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001717 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001718 vkDestroySurfaceKHR(instance(), surface, NULL);
1719 m_errorMonitor->VerifyFound();
1720
1721 // Check if surface supports presentation:
1722 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001724 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1725 pass = (err != VK_SUCCESS);
1726 ASSERT_TRUE(pass);
1727 m_errorMonitor->VerifyFound();
1728
1729 // Check surface capabilities:
1730 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1732 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001733 pass = (err != VK_SUCCESS);
1734 ASSERT_TRUE(pass);
1735 m_errorMonitor->VerifyFound();
1736
1737 // Check surface formats:
1738 uint32_t format_count = 0;
1739 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001740 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1741 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001742 pass = (err != VK_SUCCESS);
1743 ASSERT_TRUE(pass);
1744 m_errorMonitor->VerifyFound();
1745
1746 // Check surface present modes:
1747 uint32_t present_mode_count = 0;
1748 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001749 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1750 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001751 pass = (err != VK_SUCCESS);
1752 ASSERT_TRUE(pass);
1753 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001754#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001755
Ian Elliott1c32c772016-04-28 14:47:13 -06001756 // Use the functions from the VK_KHR_swapchain extension without enabling
1757 // that extension:
1758
1759 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001760 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001761 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1762 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001763 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001764 pass = (err != VK_SUCCESS);
1765 ASSERT_TRUE(pass);
1766 m_errorMonitor->VerifyFound();
1767
1768 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001769 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1770 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001771 pass = (err != VK_SUCCESS);
1772 ASSERT_TRUE(pass);
1773 m_errorMonitor->VerifyFound();
1774
Chris Forbeseb7d5502016-09-13 18:19:21 +12001775 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1776 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
1777 VkFence fence;
1778 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
1779
Ian Elliott1c32c772016-04-28 14:47:13 -06001780 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001781 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12001782 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06001783 pass = (err != VK_SUCCESS);
1784 ASSERT_TRUE(pass);
1785 m_errorMonitor->VerifyFound();
1786
Chris Forbeseb7d5502016-09-13 18:19:21 +12001787 vkDestroyFence(m_device->device(), fence, nullptr);
1788
Ian Elliott1c32c772016-04-28 14:47:13 -06001789 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001790 //
1791 // NOTE: Currently can't test this because a real swapchain is needed (as
1792 // opposed to the fake one we created) in order for the layer to lookup the
1793 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001794
1795 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001796 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001797 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1798 m_errorMonitor->VerifyFound();
1799}
Chris Forbes09368e42016-10-13 11:59:22 +13001800#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06001801
Karl Schultz6addd812016-02-02 17:17:23 -07001802TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1803 VkResult err;
1804 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001805
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1807 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001808
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001809 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001810
1811 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001812 VkImage image;
1813 VkDeviceMemory mem;
1814 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001815
Karl Schultz6addd812016-02-02 17:17:23 -07001816 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1817 const int32_t tex_width = 32;
1818 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001819
Tony Barboureb254902015-07-15 12:50:33 -06001820 VkImageCreateInfo image_create_info = {};
1821 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001822 image_create_info.pNext = NULL;
1823 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1824 image_create_info.format = tex_format;
1825 image_create_info.extent.width = tex_width;
1826 image_create_info.extent.height = tex_height;
1827 image_create_info.extent.depth = 1;
1828 image_create_info.mipLevels = 1;
1829 image_create_info.arrayLayers = 1;
1830 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1831 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1832 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1833 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12001834 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001835
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001836 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08001837 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001838 mem_alloc.pNext = NULL;
1839 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001840
Chia-I Wuf7458c52015-10-26 21:10:41 +08001841 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001842 ASSERT_VK_SUCCESS(err);
1843
Karl Schultz6addd812016-02-02 17:17:23 -07001844 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001845
Mark Lobodzinski23065352015-05-29 09:32:35 -05001846 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001847
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001848 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 -07001849 if (!pass) { // If we can't find any unmappable memory this test doesn't
1850 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08001851 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06001852 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06001853 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06001854
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001855 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001856 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001857 ASSERT_VK_SUCCESS(err);
1858
1859 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06001860 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001861 ASSERT_VK_SUCCESS(err);
1862
1863 // Map memory as if to initialize the image
1864 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001865 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001866
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001867 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001868
Chia-I Wuf7458c52015-10-26 21:10:41 +08001869 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06001870 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001871}
1872
Karl Schultz6addd812016-02-02 17:17:23 -07001873TEST_F(VkLayerTest, RebindMemory) {
1874 VkResult err;
1875 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001876
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001878
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001879 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001880
1881 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001882 VkImage image;
1883 VkDeviceMemory mem1;
1884 VkDeviceMemory mem2;
1885 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001886
Karl Schultz6addd812016-02-02 17:17:23 -07001887 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1888 const int32_t tex_width = 32;
1889 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001890
Tony Barboureb254902015-07-15 12:50:33 -06001891 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001892 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1893 image_create_info.pNext = NULL;
1894 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1895 image_create_info.format = tex_format;
1896 image_create_info.extent.width = tex_width;
1897 image_create_info.extent.height = tex_height;
1898 image_create_info.extent.depth = 1;
1899 image_create_info.mipLevels = 1;
1900 image_create_info.arrayLayers = 1;
1901 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1902 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1903 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1904 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001905
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001906 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07001907 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1908 mem_alloc.pNext = NULL;
1909 mem_alloc.allocationSize = 0;
1910 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06001911
Karl Schultz6addd812016-02-02 17:17:23 -07001912 // Introduce failure, do NOT set memProps to
1913 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06001914 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08001915 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001916 ASSERT_VK_SUCCESS(err);
1917
Karl Schultz6addd812016-02-02 17:17:23 -07001918 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001919
1920 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001921 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06001922 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001923
1924 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001925 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001926 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001927 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001928 ASSERT_VK_SUCCESS(err);
1929
1930 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06001931 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001932 ASSERT_VK_SUCCESS(err);
1933
Karl Schultz6addd812016-02-02 17:17:23 -07001934 // Introduce validation failure, try to bind a different memory object to
1935 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06001936 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001937
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001938 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06001939
Chia-I Wuf7458c52015-10-26 21:10:41 +08001940 vkDestroyImage(m_device->device(), image, NULL);
1941 vkFreeMemory(m_device->device(), mem1, NULL);
1942 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05001943}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001944
Karl Schultz6addd812016-02-02 17:17:23 -07001945TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001946 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001947
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001948 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
1949 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06001950
1951 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06001952 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1953 fenceInfo.pNext = NULL;
1954 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06001955
Tony Barbour300a6082015-04-07 13:44:53 -06001956 ASSERT_NO_FATAL_FAILURE(InitState());
1957 ASSERT_NO_FATAL_FAILURE(InitViewport());
1958 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1959
Tony Barbourfe3351b2015-07-28 10:17:20 -06001960 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001961 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001962 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06001963
1964 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001965
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001966 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001967 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1968 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001969 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001970 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001971 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001972 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001973 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001974 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001975 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001976
1977 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07001978 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001979
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001980 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06001981}
Chris Forbes4e44c912016-06-16 10:20:00 +12001982
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001983TEST_F(VkLayerTest, InvalidUsageBits) {
1984 TEST_DESCRIPTION("Specify wrong usage for image then create conflicting view of image "
1985 "Initialize buffer with wrong usage then perform copy expecting errors "
1986 "from both the image and the buffer (2 calls)");
1987 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06001988
1989 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesd2b5fe42016-11-28 18:00:00 +13001990
1991 auto format = VK_FORMAT_D24_UNORM_S8_UINT;
1992
Tony Barbourf92621a2016-05-02 14:28:12 -06001993 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06001994 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Chris Forbesd2b5fe42016-11-28 18:00:00 +13001995 image.init(128, 128, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06001996 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06001997
Tony Barbourf92621a2016-05-02 14:28:12 -06001998 VkImageView dsv;
1999 VkImageViewCreateInfo dsvci = {};
2000 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2001 dsvci.image = image.handle();
2002 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002003 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06002004 dsvci.subresourceRange.layerCount = 1;
2005 dsvci.subresourceRange.baseMipLevel = 0;
2006 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002007 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002008
Tony Barbourf92621a2016-05-02 14:28:12 -06002009 // Create a view with depth / stencil aspect for image with different usage
2010 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002011
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002012 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002013
2014 // Initialize buffer with TRANSFER_DST usage
2015 vk_testing::Buffer buffer;
2016 VkMemoryPropertyFlags reqs = 0;
2017 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2018 VkBufferImageCopy region = {};
2019 region.bufferRowLength = 128;
2020 region.bufferImageHeight = 128;
2021 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2022 region.imageSubresource.layerCount = 1;
2023 region.imageExtent.height = 16;
2024 region.imageExtent.width = 16;
2025 region.imageExtent.depth = 1;
2026
Tony Barbourf92621a2016-05-02 14:28:12 -06002027 // Buffer usage not set to TRANSFER_SRC and image usage not set to
2028 // TRANSFER_DST
2029 BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002030
Chris Forbesda581202016-10-06 18:25:26 +13002031 // two separate errors from this call:
2032 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2033 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "buffer should have VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
2034
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002035 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2036 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002037 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002038}
Tony Barbour75d79f02016-08-30 09:39:07 -06002039
Tony Barbour75d79f02016-08-30 09:39:07 -06002040
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002041#endif // MEM_TRACKER_TESTS
2042
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06002043#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002044
2045TEST_F(VkLayerTest, LeakAnObject) {
2046 VkResult err;
2047
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002048 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002049
2050 // Note that we have to create a new device since destroying the
2051 // framework's device causes Teardown() to fail and just calling Teardown
2052 // will destroy the errorMonitor.
2053
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002054 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002055
2056 ASSERT_NO_FATAL_FAILURE(InitState());
2057
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002058 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002059 std::vector<VkDeviceQueueCreateInfo> queue_info;
2060 queue_info.reserve(queue_props.size());
2061 std::vector<std::vector<float>> queue_priorities;
2062 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2063 VkDeviceQueueCreateInfo qi = {};
2064 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2065 qi.pNext = NULL;
2066 qi.queueFamilyIndex = i;
2067 qi.queueCount = queue_props[i].queueCount;
2068 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2069 qi.pQueuePriorities = queue_priorities[i].data();
2070 queue_info.push_back(qi);
2071 }
2072
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002073 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002074
2075 // The sacrificial device object
2076 VkDevice testDevice;
2077 VkDeviceCreateInfo device_create_info = {};
2078 auto features = m_device->phy().features();
2079 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2080 device_create_info.pNext = NULL;
2081 device_create_info.queueCreateInfoCount = queue_info.size();
2082 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002083 device_create_info.enabledLayerCount = 0;
2084 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002085 device_create_info.pEnabledFeatures = &features;
2086 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2087 ASSERT_VK_SUCCESS(err);
2088
2089 VkFence fence;
2090 VkFenceCreateInfo fence_create_info = {};
2091 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2092 fence_create_info.pNext = NULL;
2093 fence_create_info.flags = 0;
2094 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2095 ASSERT_VK_SUCCESS(err);
2096
2097 // Induce failure by not calling vkDestroyFence
2098 vkDestroyDevice(testDevice, NULL);
2099 m_errorMonitor->VerifyFound();
2100}
2101
2102TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
2103
2104 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
2105 "attempt to delete them from another.");
2106
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002107 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002108
Cody Northropc31a84f2016-08-22 10:41:47 -06002109 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002110 VkCommandPool command_pool_one;
2111 VkCommandPool command_pool_two;
2112
2113 VkCommandPoolCreateInfo pool_create_info{};
2114 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2115 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2116 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2117
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002118 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002119
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002120 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002121
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002122 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002123 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002124 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002125 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002126 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002127 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002128 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002129
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002130 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002131
2132 m_errorMonitor->VerifyFound();
2133
2134 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2135 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2136}
2137
2138TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2139 VkResult err;
2140
2141 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002142 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002143
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002144 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002145
2146 ASSERT_NO_FATAL_FAILURE(InitState());
2147 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2148
2149 VkDescriptorPoolSize ds_type_count = {};
2150 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2151 ds_type_count.descriptorCount = 1;
2152
2153 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2154 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2155 ds_pool_ci.pNext = NULL;
2156 ds_pool_ci.flags = 0;
2157 ds_pool_ci.maxSets = 1;
2158 ds_pool_ci.poolSizeCount = 1;
2159 ds_pool_ci.pPoolSizes = &ds_type_count;
2160
2161 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002162 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002163 ASSERT_VK_SUCCESS(err);
2164
2165 // Create a second descriptor pool
2166 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002167 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002168 ASSERT_VK_SUCCESS(err);
2169
2170 VkDescriptorSetLayoutBinding dsl_binding = {};
2171 dsl_binding.binding = 0;
2172 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2173 dsl_binding.descriptorCount = 1;
2174 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2175 dsl_binding.pImmutableSamplers = NULL;
2176
2177 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2178 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2179 ds_layout_ci.pNext = NULL;
2180 ds_layout_ci.bindingCount = 1;
2181 ds_layout_ci.pBindings = &dsl_binding;
2182
2183 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002184 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002185 ASSERT_VK_SUCCESS(err);
2186
2187 VkDescriptorSet descriptorSet;
2188 VkDescriptorSetAllocateInfo alloc_info = {};
2189 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2190 alloc_info.descriptorSetCount = 1;
2191 alloc_info.descriptorPool = ds_pool_one;
2192 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002193 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002194 ASSERT_VK_SUCCESS(err);
2195
2196 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2197
2198 m_errorMonitor->VerifyFound();
2199
2200 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2201 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2202 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2203}
2204
2205TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002207
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002208 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002209
2210 ASSERT_NO_FATAL_FAILURE(InitState());
2211
2212 // Pass bogus handle into GetImageMemoryRequirements
2213 VkMemoryRequirements mem_reqs;
2214 uint64_t fakeImageHandle = 0xCADECADE;
2215 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2216
2217 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2218
2219 m_errorMonitor->VerifyFound();
2220}
2221
Karl Schultz6addd812016-02-02 17:17:23 -07002222TEST_F(VkLayerTest, PipelineNotBound) {
2223 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002224
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002225 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002226
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002228
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002229 ASSERT_NO_FATAL_FAILURE(InitState());
2230 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002231
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002232 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002233 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2234 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002235
2236 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002237 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2238 ds_pool_ci.pNext = NULL;
2239 ds_pool_ci.maxSets = 1;
2240 ds_pool_ci.poolSizeCount = 1;
2241 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002242
2243 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002244 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002245 ASSERT_VK_SUCCESS(err);
2246
2247 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002248 dsl_binding.binding = 0;
2249 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2250 dsl_binding.descriptorCount = 1;
2251 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2252 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002253
2254 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002255 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2256 ds_layout_ci.pNext = NULL;
2257 ds_layout_ci.bindingCount = 1;
2258 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002259
2260 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002261 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002262 ASSERT_VK_SUCCESS(err);
2263
2264 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002265 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002266 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002267 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002268 alloc_info.descriptorPool = ds_pool;
2269 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002270 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002271 ASSERT_VK_SUCCESS(err);
2272
2273 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002274 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2275 pipeline_layout_ci.pNext = NULL;
2276 pipeline_layout_ci.setLayoutCount = 1;
2277 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002278
2279 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002280 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002281 ASSERT_VK_SUCCESS(err);
2282
Mark Youngad779052016-01-06 14:26:04 -07002283 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002284
2285 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002286 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002287
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002288 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002289
Chia-I Wuf7458c52015-10-26 21:10:41 +08002290 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2291 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2292 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002293}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002294
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002295TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2296 VkResult err;
2297
2298 TEST_DESCRIPTION("Test validation check for an invalid memory type index "
2299 "during bind[Buffer|Image]Memory time");
2300
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002301 ASSERT_NO_FATAL_FAILURE(InitState());
2302
2303 // Create an image, allocate memory, set a bad typeIndex and then try to
2304 // bind it
2305 VkImage image;
2306 VkDeviceMemory mem;
2307 VkMemoryRequirements mem_reqs;
2308 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2309 const int32_t tex_width = 32;
2310 const int32_t tex_height = 32;
2311
2312 VkImageCreateInfo image_create_info = {};
2313 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2314 image_create_info.pNext = NULL;
2315 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2316 image_create_info.format = tex_format;
2317 image_create_info.extent.width = tex_width;
2318 image_create_info.extent.height = tex_height;
2319 image_create_info.extent.depth = 1;
2320 image_create_info.mipLevels = 1;
2321 image_create_info.arrayLayers = 1;
2322 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2323 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2324 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2325 image_create_info.flags = 0;
2326
2327 VkMemoryAllocateInfo mem_alloc = {};
2328 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2329 mem_alloc.pNext = NULL;
2330 mem_alloc.allocationSize = 0;
2331 mem_alloc.memoryTypeIndex = 0;
2332
2333 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2334 ASSERT_VK_SUCCESS(err);
2335
2336 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2337 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002338
2339 // Introduce Failure, select invalid TypeIndex
2340 VkPhysicalDeviceMemoryProperties memory_info;
2341
2342 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2343 unsigned int i;
2344 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2345 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2346 mem_alloc.memoryTypeIndex = i;
2347 break;
2348 }
2349 }
2350 if (i >= memory_info.memoryTypeCount) {
2351 printf("No invalid memory type index could be found; skipped.\n");
2352 vkDestroyImage(m_device->device(), image, NULL);
2353 return;
2354 }
2355
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002356 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 -06002357
2358 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2359 ASSERT_VK_SUCCESS(err);
2360
2361 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2362 (void)err;
2363
2364 m_errorMonitor->VerifyFound();
2365
2366 vkDestroyImage(m_device->device(), image, NULL);
2367 vkFreeMemory(m_device->device(), mem, NULL);
2368}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002369
Karl Schultz6addd812016-02-02 17:17:23 -07002370TEST_F(VkLayerTest, BindInvalidMemory) {
2371 VkResult err;
2372 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002373
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002374 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002375
Tobin Ehlisec598302015-09-15 15:02:17 -06002376 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06002377
2378 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002379 VkImage image;
2380 VkDeviceMemory mem;
2381 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002382
Karl Schultz6addd812016-02-02 17:17:23 -07002383 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2384 const int32_t tex_width = 32;
2385 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002386
2387 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002388 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2389 image_create_info.pNext = NULL;
2390 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2391 image_create_info.format = tex_format;
2392 image_create_info.extent.width = tex_width;
2393 image_create_info.extent.height = tex_height;
2394 image_create_info.extent.depth = 1;
2395 image_create_info.mipLevels = 1;
2396 image_create_info.arrayLayers = 1;
2397 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2398 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2399 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2400 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002401
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002402 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002403 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2404 mem_alloc.pNext = NULL;
2405 mem_alloc.allocationSize = 0;
2406 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002407
Chia-I Wuf7458c52015-10-26 21:10:41 +08002408 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002409 ASSERT_VK_SUCCESS(err);
2410
Karl Schultz6addd812016-02-02 17:17:23 -07002411 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002412
2413 mem_alloc.allocationSize = mem_reqs.size;
2414
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002415 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002416 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002417
2418 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002419 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002420 ASSERT_VK_SUCCESS(err);
2421
2422 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002423 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002424
2425 // Try to bind free memory that has been freed
2426 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2427 // This may very well return an error.
2428 (void)err;
2429
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002430 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002431
Chia-I Wuf7458c52015-10-26 21:10:41 +08002432 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002433}
2434
Karl Schultz6addd812016-02-02 17:17:23 -07002435TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2436 VkResult err;
2437 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002438
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002439 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002440
Tobin Ehlisec598302015-09-15 15:02:17 -06002441 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06002442
Karl Schultz6addd812016-02-02 17:17:23 -07002443 // Create an image object, allocate memory, destroy the object and then try
2444 // to bind it
2445 VkImage image;
2446 VkDeviceMemory mem;
2447 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002448
Karl Schultz6addd812016-02-02 17:17:23 -07002449 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2450 const int32_t tex_width = 32;
2451 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002452
2453 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002454 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2455 image_create_info.pNext = NULL;
2456 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2457 image_create_info.format = tex_format;
2458 image_create_info.extent.width = tex_width;
2459 image_create_info.extent.height = tex_height;
2460 image_create_info.extent.depth = 1;
2461 image_create_info.mipLevels = 1;
2462 image_create_info.arrayLayers = 1;
2463 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2464 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2465 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2466 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002467
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002468 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002469 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2470 mem_alloc.pNext = NULL;
2471 mem_alloc.allocationSize = 0;
2472 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002473
Chia-I Wuf7458c52015-10-26 21:10:41 +08002474 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002475 ASSERT_VK_SUCCESS(err);
2476
Karl Schultz6addd812016-02-02 17:17:23 -07002477 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002478
2479 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002480 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002481 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002482
2483 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002484 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002485 ASSERT_VK_SUCCESS(err);
2486
2487 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002488 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002489 ASSERT_VK_SUCCESS(err);
2490
2491 // Now Try to bind memory to this destroyed object
2492 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2493 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07002494 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06002495
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002496 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002497
Chia-I Wuf7458c52015-10-26 21:10:41 +08002498 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002499}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06002500
Mark Lobodzinski209b5292015-09-17 09:44:05 -06002501#endif // OBJ_TRACKER_TESTS
2502
Tobin Ehlis0788f522015-05-26 16:11:58 -06002503#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06002504
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07002505TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
2506 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
2507
2508 ASSERT_NO_FATAL_FAILURE(InitState());
2509 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2510
2511 VkVertexInputBindingDescription input_binding;
2512 memset(&input_binding, 0, sizeof(input_binding));
2513
2514 VkVertexInputAttributeDescription input_attribs;
2515 memset(&input_attribs, 0, sizeof(input_attribs));
2516
2517 // Pick a really bad format for this purpose and make sure it should fail
2518 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
2519 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
2520 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
2521 printf("Format unsuitable for test; skipped.\n");
2522 return;
2523 }
2524
2525 input_attribs.location = 0;
2526 char const *vsSource = "#version 450\n"
2527 "\n"
2528 "out gl_PerVertex {\n"
2529 " vec4 gl_Position;\n"
2530 "};\n"
2531 "void main(){\n"
2532 " gl_Position = vec4(1);\n"
2533 "}\n";
2534 char const *fsSource = "#version 450\n"
2535 "\n"
2536 "layout(location=0) out vec4 color;\n"
2537 "void main(){\n"
2538 " color = vec4(1);\n"
2539 "}\n";
2540
2541 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
2542 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
2543 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
2544
2545 VkPipelineObj pipe(m_device);
2546 pipe.AddColorAttachment();
2547 pipe.AddShader(&vs);
2548 pipe.AddShader(&fs);
2549
2550 pipe.AddVertexInputBindings(&input_binding, 1);
2551 pipe.AddVertexInputAttribs(&input_attribs, 1);
2552
2553 VkDescriptorSetObj descriptorSet(m_device);
2554 descriptorSet.AppendDummy();
2555 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
2556
2557 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
2558
2559 m_errorMonitor->VerifyFound();
2560}
2561
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002562TEST_F(VkLayerTest, ImageSampleCounts) {
2563
2564 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger "
2565 "validation errors.");
2566 ASSERT_NO_FATAL_FAILURE(InitState());
2567
2568 VkMemoryPropertyFlags reqs = 0;
2569 VkImageCreateInfo image_create_info = {};
2570 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2571 image_create_info.pNext = NULL;
2572 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2573 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
2574 image_create_info.extent.width = 256;
2575 image_create_info.extent.height = 256;
2576 image_create_info.extent.depth = 1;
2577 image_create_info.mipLevels = 1;
2578 image_create_info.arrayLayers = 1;
2579 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2580 image_create_info.flags = 0;
2581
2582 VkImageBlit blit_region = {};
2583 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2584 blit_region.srcSubresource.baseArrayLayer = 0;
2585 blit_region.srcSubresource.layerCount = 1;
2586 blit_region.srcSubresource.mipLevel = 0;
2587 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2588 blit_region.dstSubresource.baseArrayLayer = 0;
2589 blit_region.dstSubresource.layerCount = 1;
2590 blit_region.dstSubresource.mipLevel = 0;
2591
2592 // Create two images, the source with sampleCount = 2, and attempt to blit
2593 // between them
2594 {
2595 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002596 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002597 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002598 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002599 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002600 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002601 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002602 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002603 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002604 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was created with a sample count "
2605 "of VK_SAMPLE_COUNT_2_BIT but "
2606 "must be VK_SAMPLE_COUNT_1_BIT");
2607 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
2608 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002609 m_errorMonitor->VerifyFound();
2610 m_commandBuffer->EndCommandBuffer();
2611 }
2612
2613 // Create two images, the dest with sampleCount = 4, and attempt to blit
2614 // between them
2615 {
2616 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002617 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002618 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002619 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002620 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002621 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002622 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002623 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002624 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002625 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was created with a sample count "
2626 "of VK_SAMPLE_COUNT_4_BIT but "
2627 "must be VK_SAMPLE_COUNT_1_BIT");
2628 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
2629 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002630 m_errorMonitor->VerifyFound();
2631 m_commandBuffer->EndCommandBuffer();
2632 }
2633
2634 VkBufferImageCopy copy_region = {};
2635 copy_region.bufferRowLength = 128;
2636 copy_region.bufferImageHeight = 128;
2637 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2638 copy_region.imageSubresource.layerCount = 1;
2639 copy_region.imageExtent.height = 64;
2640 copy_region.imageExtent.width = 64;
2641 copy_region.imageExtent.depth = 1;
2642
2643 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
2644 // buffer to image
2645 {
2646 vk_testing::Buffer src_buffer;
2647 VkMemoryPropertyFlags reqs = 0;
2648 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
2649 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002650 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002651 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002652 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002653 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was created with a sample count "
2655 "of VK_SAMPLE_COUNT_8_BIT but "
2656 "must be VK_SAMPLE_COUNT_1_BIT");
2657 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
2658 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002659 m_errorMonitor->VerifyFound();
2660 m_commandBuffer->EndCommandBuffer();
2661 }
2662
2663 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
2664 // image to buffer
2665 {
2666 vk_testing::Buffer dst_buffer;
2667 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
2668 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002669 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002670 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002671 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002672 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was created with a sample count "
2674 "of VK_SAMPLE_COUNT_2_BIT but "
2675 "must be VK_SAMPLE_COUNT_1_BIT");
2676 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06002677 dst_buffer.handle(), 1, &copy_region);
2678 m_errorMonitor->VerifyFound();
2679 m_commandBuffer->EndCommandBuffer();
2680 }
2681}
2682
Mike Stroyanac5afeb2016-10-17 13:58:10 -06002683TEST_F(VkLayerTest, BlitImageFormats) {
2684
2685 // Image blit with mismatched formats
2686 const char * expected_message =
2687 "vkCmdBlitImage: If one of srcImage and dstImage images has signed/unsigned integer format,"
2688 " the other one must also have signed/unsigned integer format";
2689
2690 ASSERT_NO_FATAL_FAILURE(InitState());
2691
2692 VkImageObj src_image(m_device);
2693 src_image.init(64, 64, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
2694 VkImageObj dst_image(m_device);
2695 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
2696 VkImageObj dst_image2(m_device);
Mike Stroyan131f3e72016-10-18 11:10:23 -06002697 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 -06002698
2699 VkImageBlit blitRegion = {};
2700 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2701 blitRegion.srcSubresource.baseArrayLayer = 0;
2702 blitRegion.srcSubresource.layerCount = 1;
2703 blitRegion.srcSubresource.mipLevel = 0;
2704 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2705 blitRegion.dstSubresource.baseArrayLayer = 0;
2706 blitRegion.dstSubresource.layerCount = 1;
2707 blitRegion.dstSubresource.mipLevel = 0;
2708
2709 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, expected_message);
2710
2711 // Unsigned int vs not an int
2712 BeginCommandBuffer();
2713 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image.image(),
2714 dst_image.layout(), 1, &blitRegion, VK_FILTER_NEAREST);
2715
2716 m_errorMonitor->VerifyFound();
2717
2718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, expected_message);
2719
2720 // Unsigned int vs signed int
2721 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image2.image(),
2722 dst_image2.layout(), 1, &blitRegion, VK_FILTER_NEAREST);
2723
2724 m_errorMonitor->VerifyFound();
2725
2726 EndCommandBuffer();
2727}
2728
2729
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002730TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
2731 VkResult err;
2732 bool pass;
2733
2734 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
2735 ASSERT_NO_FATAL_FAILURE(InitState());
2736
2737 // If w/d/h granularity is 1, test is not meaningful
2738 // TODO: When virtual device limits are available, create a set of limits for this test that
2739 // will always have a granularity of > 1 for w, h, and d
2740 auto index = m_device->graphics_queue_node_index_;
2741 auto queue_family_properties = m_device->phy().queue_properties();
2742
2743 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
2744 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
2745 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
2746 return;
2747 }
2748
2749 // Create two images of different types and try to copy between them
2750 VkImage srcImage;
2751 VkImage dstImage;
2752 VkDeviceMemory srcMem;
2753 VkDeviceMemory destMem;
2754 VkMemoryRequirements memReqs;
2755
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002756 VkImageCreateInfo image_create_info = {};
2757 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2758 image_create_info.pNext = NULL;
2759 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2760 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
2761 image_create_info.extent.width = 32;
2762 image_create_info.extent.height = 32;
2763 image_create_info.extent.depth = 1;
2764 image_create_info.mipLevels = 1;
2765 image_create_info.arrayLayers = 4;
2766 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2767 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2768 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2769 image_create_info.flags = 0;
2770
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002771 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002772 ASSERT_VK_SUCCESS(err);
2773
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002774 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002775 ASSERT_VK_SUCCESS(err);
2776
2777 // Allocate memory
2778 VkMemoryAllocateInfo memAlloc = {};
2779 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2780 memAlloc.pNext = NULL;
2781 memAlloc.allocationSize = 0;
2782 memAlloc.memoryTypeIndex = 0;
2783
2784 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
2785 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002786 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002787 ASSERT_TRUE(pass);
2788 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
2789 ASSERT_VK_SUCCESS(err);
2790
2791 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
2792 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002793 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002794 ASSERT_VK_SUCCESS(err);
2795 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
2796 ASSERT_VK_SUCCESS(err);
2797
2798 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
2799 ASSERT_VK_SUCCESS(err);
2800 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
2801 ASSERT_VK_SUCCESS(err);
2802
2803 BeginCommandBuffer();
2804 VkImageCopy copyRegion;
2805 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2806 copyRegion.srcSubresource.mipLevel = 0;
2807 copyRegion.srcSubresource.baseArrayLayer = 0;
2808 copyRegion.srcSubresource.layerCount = 1;
2809 copyRegion.srcOffset.x = 0;
2810 copyRegion.srcOffset.y = 0;
2811 copyRegion.srcOffset.z = 0;
2812 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2813 copyRegion.dstSubresource.mipLevel = 0;
2814 copyRegion.dstSubresource.baseArrayLayer = 0;
2815 copyRegion.dstSubresource.layerCount = 1;
2816 copyRegion.dstOffset.x = 0;
2817 copyRegion.dstOffset.y = 0;
2818 copyRegion.dstOffset.z = 0;
2819 copyRegion.extent.width = 1;
2820 copyRegion.extent.height = 1;
2821 copyRegion.extent.depth = 1;
2822
2823 // Introduce failure by setting srcOffset to a bad granularity value
2824 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2826 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002827 m_errorMonitor->VerifyFound();
2828
2829 // Introduce failure by setting extent to a bad granularity value
2830 copyRegion.srcOffset.y = 0;
2831 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002832 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2833 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002834 m_errorMonitor->VerifyFound();
2835
2836 // Now do some buffer/image copies
2837 vk_testing::Buffer buffer;
2838 VkMemoryPropertyFlags reqs = 0;
2839 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2840 VkBufferImageCopy region = {};
2841 region.bufferOffset = 0;
2842 region.bufferRowLength = 3;
2843 region.bufferImageHeight = 128;
2844 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2845 region.imageSubresource.layerCount = 1;
2846 region.imageExtent.height = 16;
2847 region.imageExtent.width = 16;
2848 region.imageExtent.depth = 1;
2849 region.imageOffset.x = 0;
2850 region.imageOffset.y = 0;
2851 region.imageOffset.z = 0;
2852
2853 // Introduce failure by setting bufferRowLength to a bad granularity value
2854 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002855 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2856 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2857 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002858 m_errorMonitor->VerifyFound();
2859 region.bufferRowLength = 128;
2860
2861 // Introduce failure by setting bufferOffset to a bad granularity value
2862 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2864 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
2865 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002866 m_errorMonitor->VerifyFound();
2867 region.bufferOffset = 0;
2868
2869 // Introduce failure by setting bufferImageHeight to a bad granularity value
2870 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002871 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2872 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
2873 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002874 m_errorMonitor->VerifyFound();
2875 region.bufferImageHeight = 128;
2876
2877 // Introduce failure by setting imageExtent to a bad granularity value
2878 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002879 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2880 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
2881 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002882 m_errorMonitor->VerifyFound();
2883 region.imageExtent.width = 16;
2884
2885 // Introduce failure by setting imageOffset to a bad granularity value
2886 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002887 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
2888 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2889 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06002890 m_errorMonitor->VerifyFound();
2891
2892 EndCommandBuffer();
2893
2894 vkDestroyImage(m_device->device(), srcImage, NULL);
2895 vkDestroyImage(m_device->device(), dstImage, NULL);
2896 vkFreeMemory(m_device->device(), srcMem, NULL);
2897 vkFreeMemory(m_device->device(), destMem, NULL);
2898}
2899
Mark Lobodzinski570efc62016-08-09 16:43:19 -06002900TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski570efc62016-08-09 16:43:19 -06002901 TEST_DESCRIPTION("Submit command buffer created using one queue family and "
2902 "attempt to submit them on a queue created in a different "
2903 "queue family.");
2904
Cody Northropc31a84f2016-08-22 10:41:47 -06002905 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski570efc62016-08-09 16:43:19 -06002906 // This test is meaningless unless we have multiple queue families
2907 auto queue_family_properties = m_device->phy().queue_properties();
2908 if (queue_family_properties.size() < 2) {
2909 return;
2910 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002911 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06002912 // Get safe index of another queue family
2913 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
2914 ASSERT_NO_FATAL_FAILURE(InitState());
2915 // Create a second queue using a different queue family
2916 VkQueue other_queue;
2917 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
2918
2919 // Record an empty cmd buffer
2920 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
2921 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
2922 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
2923 vkEndCommandBuffer(m_commandBuffer->handle());
2924
2925 // And submit on the wrong queue
2926 VkSubmitInfo submit_info = {};
2927 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2928 submit_info.commandBufferCount = 1;
2929 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06002930 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06002931
2932 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06002933}
2934
Chris Forbes4c24a922016-11-16 08:59:10 +13002935TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
2936 ASSERT_NO_FATAL_FAILURE(InitState());
2937
Chris Forbes2d9b2a82016-11-21 10:45:39 +13002938 // There are no attachments, but refer to attachment 0.
2939 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13002940 VkSubpassDescription subpasses[] = {
Chris Forbes2d9b2a82016-11-21 10:45:39 +13002941 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr,
2942 nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13002943 };
2944
Chris Forbes2d9b2a82016-11-21 10:45:39 +13002945 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
2946 nullptr,
2947 0,
2948 0,
2949 nullptr,
2950 1,
2951 subpasses,
2952 0,
2953 nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13002954 VkRenderPass rp;
2955
Chris Forbes2d9b2a82016-11-21 10:45:39 +13002956 // "... must be less than the total number of attachments ..."
Chris Forbes4c24a922016-11-16 08:59:10 +13002957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbes2d9b2a82016-11-21 10:45:39 +13002958 VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13002959 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
2960 m_errorMonitor->VerifyFound();
2961}
2962
Chris Forbesa58c4522016-09-28 15:19:39 +13002963TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
2964 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
2965 ASSERT_NO_FATAL_FAILURE(InitState());
2966
2967 // A renderpass with two subpasses, both writing the same attachment.
2968 VkAttachmentDescription attach[] = {
2969 { 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
2970 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
2971 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
2972 VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
2973 },
2974 };
2975 VkAttachmentReference ref = { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
2976 VkSubpassDescription subpasses[] = {
2977 { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
2978 1, &ref, nullptr, nullptr, 0, nullptr },
2979 { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
2980 1, &ref, nullptr, nullptr, 0, nullptr },
2981 };
2982 VkSubpassDependency dep = {
2983 0, 1,
2984 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
2985 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
2986 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
2987 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
2988 VK_DEPENDENCY_BY_REGION_BIT
2989 };
2990 VkRenderPassCreateInfo rpci = {
2991 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
2992 0, 1, attach, 2, subpasses, 1, &dep
2993 };
2994 VkRenderPass rp;
2995 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
2996 ASSERT_VK_SUCCESS(err);
2997
2998 VkImageObj image(m_device);
2999 image.init_no_layout(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3000 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3001 VK_IMAGE_TILING_OPTIMAL, 0);
3002 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3003
3004 VkFramebufferCreateInfo fbci = {
3005 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3006 0, rp, 1, &imageView, 32, 32, 1
3007 };
3008 VkFramebuffer fb;
3009 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3010 ASSERT_VK_SUCCESS(err);
3011
3012 char const *vsSource =
3013 "#version 450\n"
3014 "void main() { gl_Position = vec4(1); }\n";
3015 char const *fsSource =
3016 "#version 450\n"
3017 "layout(location=0) out vec4 color;\n"
3018 "void main() { color = vec4(1); }\n";
3019
3020 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3021 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3022 VkPipelineObj pipe(m_device);
3023 pipe.AddColorAttachment();
3024 pipe.AddShader(&vs);
3025 pipe.AddShader(&fs);
3026 VkViewport view_port = {};
3027 m_viewports.push_back(view_port);
3028 pipe.SetViewport(m_viewports);
3029 VkRect2D rect = {};
3030 m_scissors.push_back(rect);
3031 pipe.SetScissor(m_scissors);
3032
3033 VkPipelineLayoutCreateInfo plci = {
3034 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
3035 0, 0, nullptr, 0, nullptr
3036 };
3037 VkPipelineLayout pl;
3038 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3039 ASSERT_VK_SUCCESS(err);
3040 pipe.CreateVKPipeline(pl, rp);
3041
3042 BeginCommandBuffer();
3043
3044 VkRenderPassBeginInfo rpbi = {
3045 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
3046 rp, fb, { { 0, 0, }, { 32, 32 } }, 0, nullptr
3047 };
3048
3049 // subtest 1: bind in the wrong subpass
3050 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3051 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
3052 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3053 "built for subpass 0 but used in subpass 1");
3054 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3055 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3056 m_errorMonitor->VerifyFound();
3057
3058 vkCmdEndRenderPass(m_commandBuffer->handle());
3059
3060 // subtest 2: bind in correct subpass, then transition to next subpass
3061 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3062 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3063 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
3064 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3065 "built for subpass 0 but used in subpass 1");
3066 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3067 m_errorMonitor->VerifyFound();
3068
3069 vkCmdEndRenderPass(m_commandBuffer->handle());
3070
3071 EndCommandBuffer();
3072
3073 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3074 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3075 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3076}
3077
Tony Barbour4e919972016-08-09 13:27:40 -06003078TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
3079 TEST_DESCRIPTION("Generate INVALID_RENDER_AREA error by beginning renderpass"
3080 "with extent outside of framebuffer");
3081 ASSERT_NO_FATAL_FAILURE(InitState());
3082 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3083
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003084 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot execute a render pass with renderArea "
3085 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003086
3087 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3088 m_renderPassBeginInfo.renderArea.extent.width = 257;
3089 m_renderPassBeginInfo.renderArea.extent.height = 257;
3090 BeginCommandBuffer();
3091 m_errorMonitor->VerifyFound();
3092}
3093
3094TEST_F(VkLayerTest, DisabledIndependentBlend) {
3095 TEST_DESCRIPTION("Generate INDEPENDENT_BLEND by disabling independent "
3096 "blend and then specifying different blend states for two "
3097 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003098 VkPhysicalDeviceFeatures features = {};
3099 features.independentBlend = VK_FALSE;
Cody Northropc31a84f2016-08-22 10:41:47 -06003100 ASSERT_NO_FATAL_FAILURE(InitState(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003101
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003102 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3103 "Invalid Pipeline CreateInfo: If independent blend feature not "
3104 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003105
Cody Northropc31a84f2016-08-22 10:41:47 -06003106 VkDescriptorSetObj descriptorSet(m_device);
3107 descriptorSet.AppendDummy();
3108 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003109
Cody Northropc31a84f2016-08-22 10:41:47 -06003110 VkPipelineObj pipeline(m_device);
3111 VkRenderpassObj renderpass(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003112 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003113 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003114
Cody Northropc31a84f2016-08-22 10:41:47 -06003115 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3116 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3117 att_state1.blendEnable = VK_TRUE;
3118 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3119 att_state2.blendEnable = VK_FALSE;
3120 pipeline.AddColorAttachment(0, &att_state1);
3121 pipeline.AddColorAttachment(1, &att_state2);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003122 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass.handle());
Cody Northropc31a84f2016-08-22 10:41:47 -06003123 m_errorMonitor->VerifyFound();
Tony Barbour4e919972016-08-09 13:27:40 -06003124}
3125
Chris Forbes26ec2122016-11-29 08:58:33 +13003126#if 0
Tony Barbour4e919972016-08-09 13:27:40 -06003127TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
3128 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
3129 "depth attachments in subpass");
Cody Northropc31a84f2016-08-22 10:41:47 -06003130 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbour4e919972016-08-09 13:27:40 -06003131
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003132 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3133 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
Tony Barbour4e919972016-08-09 13:27:40 -06003134
3135 // Create a renderPass with a single color attachment
3136 VkAttachmentReference attach = {};
3137 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3138 VkSubpassDescription subpass = {};
3139 VkRenderPassCreateInfo rpci = {};
3140 rpci.subpassCount = 1;
3141 rpci.pSubpasses = &subpass;
3142 rpci.attachmentCount = 1;
3143 VkAttachmentDescription attach_desc = {};
3144 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3145 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3146 rpci.pAttachments = &attach_desc;
3147 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3148 VkRenderPass rp;
3149 subpass.pDepthStencilAttachment = &attach;
3150 subpass.pColorAttachments = NULL;
3151 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3152 m_errorMonitor->VerifyFound();
3153}
Chris Forbes26ec2122016-11-29 08:58:33 +13003154#endif
Tony Barbour4e919972016-08-09 13:27:40 -06003155
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003156TEST_F(VkLayerTest, UnusedPreserveAttachment) {
3157 TEST_DESCRIPTION("Create a framebuffer where a subpass has a preserve "
3158 "attachment reference of VK_ATTACHMENT_UNUSED");
3159
3160 ASSERT_NO_FATAL_FAILURE(InitState());
3161 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3162
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must not be VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003164
3165 VkAttachmentReference color_attach = {};
3166 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3167 color_attach.attachment = 0;
3168 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
3169 VkSubpassDescription subpass = {};
3170 subpass.colorAttachmentCount = 1;
3171 subpass.pColorAttachments = &color_attach;
3172 subpass.preserveAttachmentCount = 1;
3173 subpass.pPreserveAttachments = &preserve_attachment;
3174
3175 VkRenderPassCreateInfo rpci = {};
3176 rpci.subpassCount = 1;
3177 rpci.pSubpasses = &subpass;
3178 rpci.attachmentCount = 1;
3179 VkAttachmentDescription attach_desc = {};
3180 attach_desc.format = VK_FORMAT_UNDEFINED;
3181 rpci.pAttachments = &attach_desc;
3182 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3183 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003184 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003185
3186 m_errorMonitor->VerifyFound();
3187
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003188 if (result == VK_SUCCESS) {
3189 vkDestroyRenderPass(m_device->device(), rp, NULL);
3190 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003191}
3192
Chris Forbesc5389742016-06-29 11:49:23 +12003193TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Chris Forbes6655bb32016-07-01 18:27:30 +12003194 TEST_DESCRIPTION("Ensure that CreateRenderPass produces a validation error "
3195 "when the source of a subpass multisample resolve "
3196 "does not have multiple samples.");
3197
Chris Forbesc5389742016-06-29 11:49:23 +12003198 ASSERT_NO_FATAL_FAILURE(InitState());
3199
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003200 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3201 "Subpass 0 requests multisample resolve from attachment 0 which has "
3202 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003203
3204 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003205 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3206 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3207 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3208 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3209 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3210 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003211 };
3212
3213 VkAttachmentReference color = {
3214 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3215 };
3216
3217 VkAttachmentReference resolve = {
3218 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3219 };
3220
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003221 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003222
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003223 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003224
3225 VkRenderPass rp;
3226 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3227
3228 m_errorMonitor->VerifyFound();
3229
3230 if (err == VK_SUCCESS)
3231 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3232}
3233
3234TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Chris Forbes6655bb32016-07-01 18:27:30 +12003235 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
3236 "when a subpass multisample resolve operation is "
3237 "requested, and the destination of that resolve has "
3238 "multiple samples.");
3239
Chris Forbesc5389742016-06-29 11:49:23 +12003240 ASSERT_NO_FATAL_FAILURE(InitState());
3241
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003242 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3243 "Subpass 0 requests multisample resolve into attachment 1, which "
3244 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003245
3246 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003247 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3248 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3249 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3250 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3251 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3252 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003253 };
3254
3255 VkAttachmentReference color = {
3256 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3257 };
3258
3259 VkAttachmentReference resolve = {
3260 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3261 };
3262
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003263 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003264
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003265 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003266
3267 VkRenderPass rp;
3268 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3269
3270 m_errorMonitor->VerifyFound();
3271
3272 if (err == VK_SUCCESS)
3273 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3274}
3275
Chris Forbes3f128ef2016-06-29 14:58:53 +12003276TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Chris Forbes6655bb32016-07-01 18:27:30 +12003277 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
3278 "when the color and depth attachments used by a subpass "
3279 "have inconsistent sample counts");
3280
Chris Forbes3f128ef2016-06-29 14:58:53 +12003281 ASSERT_NO_FATAL_FAILURE(InitState());
3282
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003283 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3284 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
Chris Forbes3f128ef2016-06-29 14:58:53 +12003285
3286 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003287 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3288 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3289 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3290 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3291 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3292 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbes3f128ef2016-06-29 14:58:53 +12003293 };
3294
3295 VkAttachmentReference color[] = {
3296 {
3297 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3298 },
3299 {
3300 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3301 },
3302 };
3303
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003304 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, color, nullptr, nullptr, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003305
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003306 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003307
3308 VkRenderPass rp;
3309 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3310
3311 m_errorMonitor->VerifyFound();
3312
3313 if (err == VK_SUCCESS)
3314 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3315}
3316
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003317TEST_F(VkLayerTest, FramebufferCreateErrors) {
3318 TEST_DESCRIPTION("Hit errors when attempting to create a framebuffer :\n"
Mike Weiblencce7ec72016-10-17 19:33:05 -06003319 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003320 " 2. Use a color image as depthStencil attachment\n"
Mike Weiblencce7ec72016-10-17 19:33:05 -06003321 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3322 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3323 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3324 " 6. Framebuffer attachment where dimensions don't match\n"
3325 " 7. Framebuffer attachment w/o identity swizzle\n"
3326 " 8. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003327
3328 ASSERT_NO_FATAL_FAILURE(InitState());
3329 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3330
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003331 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3332 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 "
3333 "does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003334
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003335 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003336 VkAttachmentReference attach = {};
3337 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3338 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003339 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003340 VkRenderPassCreateInfo rpci = {};
3341 rpci.subpassCount = 1;
3342 rpci.pSubpasses = &subpass;
3343 rpci.attachmentCount = 1;
3344 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003345 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003346 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003347 rpci.pAttachments = &attach_desc;
3348 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3349 VkRenderPass rp;
3350 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3351 ASSERT_VK_SUCCESS(err);
3352
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003353 VkImageView ivs[2];
3354 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3355 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003356 VkFramebufferCreateInfo fb_info = {};
3357 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3358 fb_info.pNext = NULL;
3359 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003360 // Set mis-matching attachmentCount
3361 fb_info.attachmentCount = 2;
3362 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003363 fb_info.width = 100;
3364 fb_info.height = 100;
3365 fb_info.layers = 1;
3366
3367 VkFramebuffer fb;
3368 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3369
3370 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003371 if (err == VK_SUCCESS) {
3372 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3373 }
3374 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003375
3376 // Create a renderPass with a depth-stencil attachment created with
3377 // IMAGE_USAGE_COLOR_ATTACHMENT
3378 // Add our color attachment to pDepthStencilAttachment
3379 subpass.pDepthStencilAttachment = &attach;
3380 subpass.pColorAttachments = NULL;
3381 VkRenderPass rp_ds;
3382 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3383 ASSERT_VK_SUCCESS(err);
3384 // Set correct attachment count, but attachment has COLOR usage bit set
3385 fb_info.attachmentCount = 1;
3386 fb_info.renderPass = rp_ds;
3387
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003388 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " conflicts with the image's IMAGE_USAGE flags ");
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003389 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3390
3391 m_errorMonitor->VerifyFound();
3392 if (err == VK_SUCCESS) {
3393 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3394 }
3395 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003396
3397 // Create new renderpass with alternate attachment format from fb
3398 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3399 subpass.pDepthStencilAttachment = NULL;
3400 subpass.pColorAttachments = &attach;
3401 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3402 ASSERT_VK_SUCCESS(err);
3403
3404 // Cause error due to mis-matched formats between rp & fb
3405 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3406 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003407 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3408 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003409 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3410
3411 m_errorMonitor->VerifyFound();
3412 if (err == VK_SUCCESS) {
3413 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3414 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003415 vkDestroyRenderPass(m_device->device(), rp, NULL);
3416
3417 // Create new renderpass with alternate sample count from fb
3418 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3419 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3420 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3421 ASSERT_VK_SUCCESS(err);
3422
3423 // Cause error due to mis-matched sample count between rp & fb
3424 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003425 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has VK_SAMPLE_COUNT_1_BIT samples "
3426 "that do not match the "
3427 "VK_SAMPLE_COUNT_4_BIT ");
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003428 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3429
3430 m_errorMonitor->VerifyFound();
3431 if (err == VK_SUCCESS) {
3432 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3433 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003434
3435 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003436
3437 // Create a custom imageView with non-1 mip levels
3438 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003439 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 -06003440 ASSERT_TRUE(image.initialized());
3441
3442 VkImageView view;
3443 VkImageViewCreateInfo ivci = {};
3444 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3445 ivci.image = image.handle();
3446 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3447 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3448 ivci.subresourceRange.layerCount = 1;
3449 ivci.subresourceRange.baseMipLevel = 0;
3450 // Set level count 2 (only 1 is allowed for FB attachment)
3451 ivci.subresourceRange.levelCount = 2;
3452 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3453 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3454 ASSERT_VK_SUCCESS(err);
3455 // Re-create renderpass to have matching sample count
3456 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3457 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3458 ASSERT_VK_SUCCESS(err);
3459
3460 fb_info.renderPass = rp;
3461 fb_info.pAttachments = &view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003462 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has mip levelCount of 2 but only ");
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003463 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3464
3465 m_errorMonitor->VerifyFound();
3466 if (err == VK_SUCCESS) {
3467 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3468 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003469 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003470 // Update view to original color buffer and grow FB dimensions too big
3471 fb_info.pAttachments = ivs;
3472 fb_info.height = 1024;
3473 fb_info.width = 1024;
3474 fb_info.layers = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003475 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " Attachment dimensions must be at "
3476 "least as large. ");
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003477 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3478
3479 m_errorMonitor->VerifyFound();
3480 if (err == VK_SUCCESS) {
3481 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3482 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06003483 // Create view attachment with non-identity swizzle
3484 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3485 ivci.image = image.handle();
3486 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3487 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3488 ivci.subresourceRange.layerCount = 1;
3489 ivci.subresourceRange.baseMipLevel = 0;
3490 ivci.subresourceRange.levelCount = 1;
3491 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3492 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
3493 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
3494 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
3495 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
3496 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3497 ASSERT_VK_SUCCESS(err);
3498
3499 fb_info.pAttachments = &view;
3500 fb_info.height = 100;
3501 fb_info.width = 100;
3502 fb_info.layers = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003503 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has non-identy swizzle. All "
3504 "framebuffer attachments must have "
3505 "been created with the identity "
3506 "swizzle. ");
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06003507 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3508
3509 m_errorMonitor->VerifyFound();
3510 if (err == VK_SUCCESS) {
3511 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3512 }
3513 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003514 // Request fb that exceeds max dimensions
3515 // reset attachment to color attachment
3516 fb_info.pAttachments = ivs;
3517 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
3518 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
3519 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003520 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " Requested VkFramebufferCreateInfo "
3521 "dimensions exceed physical device "
3522 "limits. ");
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06003523 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3524
3525 m_errorMonitor->VerifyFound();
3526 if (err == VK_SUCCESS) {
3527 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3528 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003529
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003530 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003531}
3532
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003533TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003534 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Depth Bias dynamic "
3535 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003536
Cody Northropc31a84f2016-08-22 10:41:47 -06003537 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003538 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003539 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
3540 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003541 m_errorMonitor->VerifyFound();
3542}
3543
3544TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003545 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Line Width dynamic "
3546 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003547
Cody Northropc31a84f2016-08-22 10:41:47 -06003548 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003549 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003550 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
3551 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003552 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003553}
3554
3555TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003556 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Viewport dynamic "
3557 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003558
Cody Northropc31a84f2016-08-22 10:41:47 -06003559 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003560 // Dynamic viewport state
Mike Weiblen95dd0f92016-10-19 12:28:27 -06003561 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 -06003562 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003563 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003564}
3565
3566TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003567 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Scissor dynamic "
3568 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003569
Cody Northropc31a84f2016-08-22 10:41:47 -06003570 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003571 // Dynamic scissor state
Mike Weiblen95dd0f92016-10-19 12:28:27 -06003572 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 -06003573 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003574 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003575}
3576
Cortd713fe82016-07-27 09:51:27 -07003577TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003578 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Blend Constants "
3579 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003580
3581 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis21c88352016-05-26 06:15:45 -06003582 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003583 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3584 "Dynamic blend constants state not set for this command buffer");
3585 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06003586 m_errorMonitor->VerifyFound();
3587}
3588
3589TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003590 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Depth Bounds dynamic "
3591 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003592
3593 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis21c88352016-05-26 06:15:45 -06003594 if (!m_device->phy().features().depthBounds) {
3595 printf("Device does not support depthBounds test; skipped.\n");
3596 return;
3597 }
3598 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003599 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3600 "Dynamic depth bounds state not set for this command buffer");
3601 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003602 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003603}
3604
3605TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003606 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Stencil Read dynamic "
3607 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003608
3609 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003610 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003611 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3612 "Dynamic stencil read mask state not set for this command buffer");
3613 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003614 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003615}
3616
3617TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003618 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Stencil Write dynamic"
3619 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003620
3621 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003622 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003623 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3624 "Dynamic stencil write mask state not set for this command buffer");
3625 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003626 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06003627}
3628
3629TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003630 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Stencil Ref dynamic "
3631 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003632
3633 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06003634 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003635 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3636 "Dynamic stencil reference state not set for this command buffer");
3637 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003638 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06003639}
3640
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06003641TEST_F(VkLayerTest, IndexBufferNotBound) {
3642 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06003643
3644 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003645 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3646 "Index buffer object not bound to this command buffer when Indexed ");
3647 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06003648 m_errorMonitor->VerifyFound();
3649}
3650
Karl Schultz6addd812016-02-02 17:17:23 -07003651TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3653 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
3654 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003655
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003656 ASSERT_NO_FATAL_FAILURE(InitState());
3657 ASSERT_NO_FATAL_FAILURE(InitViewport());
3658 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3659
Karl Schultz6addd812016-02-02 17:17:23 -07003660 // We luck out b/c by default the framework creates CB w/ the
3661 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003662 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003663 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003664 EndCommandBuffer();
3665
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003666 // Bypass framework since it does the waits automatically
3667 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003668 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08003669 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3670 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003671 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003672 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07003673 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003674 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003675 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08003676 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003677 submit_info.pSignalSemaphores = NULL;
3678
Chris Forbes40028e22016-06-13 09:59:34 +12003679 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07003680 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07003681 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003682
Karl Schultz6addd812016-02-02 17:17:23 -07003683 // Cause validation error by re-submitting cmd buffer that should only be
3684 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12003685 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07003686 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003687
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003688 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06003689}
3690
Karl Schultz6addd812016-02-02 17:17:23 -07003691TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003692 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07003693 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003694
3695 ASSERT_NO_FATAL_FAILURE(InitState());
3696 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003697
Karl Schultz6addd812016-02-02 17:17:23 -07003698 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
3699 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003700 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003701 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003702 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003703
3704 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003705 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3706 ds_pool_ci.pNext = NULL;
3707 ds_pool_ci.flags = 0;
3708 ds_pool_ci.maxSets = 1;
3709 ds_pool_ci.poolSizeCount = 1;
3710 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003711
3712 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003713 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003714 ASSERT_VK_SUCCESS(err);
3715
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003716 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
3717 dsl_binding_samp.binding = 0;
3718 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3719 dsl_binding_samp.descriptorCount = 1;
3720 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
3721 dsl_binding_samp.pImmutableSamplers = NULL;
3722
3723 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3724 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3725 ds_layout_ci.pNext = NULL;
3726 ds_layout_ci.bindingCount = 1;
3727 ds_layout_ci.pBindings = &dsl_binding_samp;
3728
3729 VkDescriptorSetLayout ds_layout_samp;
3730 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
3731 ASSERT_VK_SUCCESS(err);
3732
3733 // Try to allocate 2 sets when pool only has 1 set
3734 VkDescriptorSet descriptor_sets[2];
3735 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
3736 VkDescriptorSetAllocateInfo alloc_info = {};
3737 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3738 alloc_info.descriptorSetCount = 2;
3739 alloc_info.descriptorPool = ds_pool;
3740 alloc_info.pSetLayouts = set_layouts;
3741 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
3742 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
3743 m_errorMonitor->VerifyFound();
3744
3745 alloc_info.descriptorSetCount = 1;
3746 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003747 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003748 dsl_binding.binding = 0;
3749 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3750 dsl_binding.descriptorCount = 1;
3751 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3752 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003753
Karl Schultz6addd812016-02-02 17:17:23 -07003754 ds_layout_ci.bindingCount = 1;
3755 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003756
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003757 VkDescriptorSetLayout ds_layout_ub;
3758 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003759 ASSERT_VK_SUCCESS(err);
3760
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003761 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003762 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003763 alloc_info.pSetLayouts = &ds_layout_ub;
3764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
3765 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003766
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003767 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003768
Karl Schultz2825ab92016-12-02 08:23:14 -07003769 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07003770 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08003771 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06003772}
3773
Karl Schultz6addd812016-02-02 17:17:23 -07003774TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
3775 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06003776
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3778 "It is invalid to call vkFreeDescriptorSets() with a pool created "
3779 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003780
Tobin Ehlise735c692015-10-08 13:13:50 -06003781 ASSERT_NO_FATAL_FAILURE(InitState());
3782 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06003783
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003784 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003785 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3786 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06003787
3788 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003789 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3790 ds_pool_ci.pNext = NULL;
3791 ds_pool_ci.maxSets = 1;
3792 ds_pool_ci.poolSizeCount = 1;
3793 ds_pool_ci.flags = 0;
3794 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
3795 // app can only call vkResetDescriptorPool on this pool.;
3796 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06003797
3798 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003799 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06003800 ASSERT_VK_SUCCESS(err);
3801
3802 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003803 dsl_binding.binding = 0;
3804 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3805 dsl_binding.descriptorCount = 1;
3806 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3807 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06003808
3809 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003810 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3811 ds_layout_ci.pNext = NULL;
3812 ds_layout_ci.bindingCount = 1;
3813 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06003814
3815 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003816 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06003817 ASSERT_VK_SUCCESS(err);
3818
3819 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003820 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003821 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003822 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003823 alloc_info.descriptorPool = ds_pool;
3824 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003825 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06003826 ASSERT_VK_SUCCESS(err);
3827
3828 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003829 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06003830
Chia-I Wuf7458c52015-10-26 21:10:41 +08003831 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3832 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06003833}
3834
Karl Schultz6addd812016-02-02 17:17:23 -07003835TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003836 // Attempt to clear Descriptor Pool with bad object.
3837 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06003838
3839 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07003840 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003841 uint64_t fake_pool_handle = 0xbaad6001;
3842 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
3843 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06003844 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003845}
3846
Karl Schultzf78bcdd2016-11-30 12:36:01 -07003847TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003848 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
3849 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003850 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06003851 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003852
3853 uint64_t fake_set_handle = 0xbaad6001;
3854 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06003855 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07003856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06003857
3858 ASSERT_NO_FATAL_FAILURE(InitState());
3859
3860 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
3861 layout_bindings[0].binding = 0;
3862 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3863 layout_bindings[0].descriptorCount = 1;
3864 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
3865 layout_bindings[0].pImmutableSamplers = NULL;
3866
3867 VkDescriptorSetLayout descriptor_set_layout;
3868 VkDescriptorSetLayoutCreateInfo dslci = {};
3869 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3870 dslci.pNext = NULL;
3871 dslci.bindingCount = 1;
3872 dslci.pBindings = layout_bindings;
3873 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06003874 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06003875
3876 VkPipelineLayout pipeline_layout;
3877 VkPipelineLayoutCreateInfo plci = {};
3878 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3879 plci.pNext = NULL;
3880 plci.setLayoutCount = 1;
3881 plci.pSetLayouts = &descriptor_set_layout;
3882 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06003883 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06003884
3885 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003886 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
3887 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06003888 m_errorMonitor->VerifyFound();
3889 EndCommandBuffer();
3890 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
3891 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003892}
3893
Karl Schultz6addd812016-02-02 17:17:23 -07003894TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06003895 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
3896 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06003897 uint64_t fake_layout_handle = 0xbaad6001;
3898 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07003899 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Cody Northropc31a84f2016-08-22 10:41:47 -06003900 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultzbdb75952016-04-19 11:36:49 -06003901 VkPipelineLayout pipeline_layout;
3902 VkPipelineLayoutCreateInfo plci = {};
3903 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3904 plci.pNext = NULL;
3905 plci.setLayoutCount = 1;
3906 plci.pSetLayouts = &bad_layout;
3907 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
3908
3909 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06003910}
3911
Mark Muellerd4914412016-06-13 17:52:06 -06003912TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
3913 TEST_DESCRIPTION("This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
3914 "1) A uniform buffer update must have a valid buffer index."
3915 "2) When using an array of descriptors in a single WriteDescriptor,"
3916 " the descriptor types and stageflags must all be the same."
3917 "3) Immutable Sampler state must match across descriptors");
3918
3919 const char *invalid_BufferInfo_ErrorMessage =
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003920 "vkUpdateDescriptorSets: if pDescriptorWrites[0].descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, "
3921 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or "
3922 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pDescriptorWrites[0].pBufferInfo must not be NULL";
3923 const char *stateFlag_ErrorMessage = "Attempting write update to descriptor set ";
3924 const char *immutable_ErrorMessage = "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06003925
Mark Muellerd4914412016-06-13 17:52:06 -06003926 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_BufferInfo_ErrorMessage);
3927
3928 ASSERT_NO_FATAL_FAILURE(InitState());
3929 VkDescriptorPoolSize ds_type_count[4] = {};
3930 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3931 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07003932 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06003933 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07003934 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06003935 ds_type_count[2].descriptorCount = 1;
3936 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
3937 ds_type_count[3].descriptorCount = 1;
3938
3939 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3940 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3941 ds_pool_ci.maxSets = 1;
3942 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
3943 ds_pool_ci.pPoolSizes = ds_type_count;
3944
3945 VkDescriptorPool ds_pool;
3946 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
3947 ASSERT_VK_SUCCESS(err);
3948
Mark Muellerb9896722016-06-16 09:54:29 -06003949 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06003950 layout_binding[0].binding = 0;
3951 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3952 layout_binding[0].descriptorCount = 1;
3953 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
3954 layout_binding[0].pImmutableSamplers = NULL;
3955
3956 layout_binding[1].binding = 1;
3957 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3958 layout_binding[1].descriptorCount = 1;
3959 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
3960 layout_binding[1].pImmutableSamplers = NULL;
3961
3962 VkSamplerCreateInfo sampler_ci = {};
3963 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
3964 sampler_ci.pNext = NULL;
3965 sampler_ci.magFilter = VK_FILTER_NEAREST;
3966 sampler_ci.minFilter = VK_FILTER_NEAREST;
3967 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
3968 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3969 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3970 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
3971 sampler_ci.mipLodBias = 1.0;
3972 sampler_ci.anisotropyEnable = VK_FALSE;
3973 sampler_ci.maxAnisotropy = 1;
3974 sampler_ci.compareEnable = VK_FALSE;
3975 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
3976 sampler_ci.minLod = 1.0;
3977 sampler_ci.maxLod = 1.0;
3978 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
3979 sampler_ci.unnormalizedCoordinates = VK_FALSE;
3980 VkSampler sampler;
3981
3982 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
3983 ASSERT_VK_SUCCESS(err);
3984
3985 layout_binding[2].binding = 2;
3986 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3987 layout_binding[2].descriptorCount = 1;
3988 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
3989 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
3990
Mark Muellerd4914412016-06-13 17:52:06 -06003991 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3992 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3993 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
3994 ds_layout_ci.pBindings = layout_binding;
3995 VkDescriptorSetLayout ds_layout;
3996 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
3997 ASSERT_VK_SUCCESS(err);
3998
3999 VkDescriptorSetAllocateInfo alloc_info = {};
4000 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4001 alloc_info.descriptorSetCount = 1;
4002 alloc_info.descriptorPool = ds_pool;
4003 alloc_info.pSetLayouts = &ds_layout;
4004 VkDescriptorSet descriptorSet;
4005 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4006 ASSERT_VK_SUCCESS(err);
4007
4008 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4009 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4010 pipeline_layout_ci.pNext = NULL;
4011 pipeline_layout_ci.setLayoutCount = 1;
4012 pipeline_layout_ci.pSetLayouts = &ds_layout;
4013
4014 VkPipelineLayout pipeline_layout;
4015 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4016 ASSERT_VK_SUCCESS(err);
4017
Mark Mueller5c838ce2016-06-16 09:54:29 -06004018 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004019 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4020 descriptor_write.dstSet = descriptorSet;
4021 descriptor_write.dstBinding = 0;
4022 descriptor_write.descriptorCount = 1;
4023 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4024
Mark Mueller5c838ce2016-06-16 09:54:29 -06004025 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004026 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4027 m_errorMonitor->VerifyFound();
4028
4029 // Create a buffer to update the descriptor with
4030 uint32_t qfi = 0;
4031 VkBufferCreateInfo buffCI = {};
4032 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4033 buffCI.size = 1024;
4034 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4035 buffCI.queueFamilyIndexCount = 1;
4036 buffCI.pQueueFamilyIndices = &qfi;
4037
4038 VkBuffer dyub;
4039 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4040 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004041
Tony Barboure132c5f2016-12-12 11:50:20 -07004042 VkDeviceMemory mem;
4043 VkMemoryRequirements mem_reqs;
4044 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4045
4046 VkMemoryAllocateInfo mem_alloc_info = {};
4047 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4048 mem_alloc_info.allocationSize = mem_reqs.size;
4049 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4050 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4051 ASSERT_VK_SUCCESS(err);
4052
4053 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4054 ASSERT_VK_SUCCESS(err);
4055
4056 VkDescriptorBufferInfo buffInfo[2] = {};
4057 buffInfo[0].buffer = dyub;
4058 buffInfo[0].offset = 0;
4059 buffInfo[0].range = 1024;
4060 buffInfo[1].buffer = dyub;
4061 buffInfo[1].offset = 0;
4062 buffInfo[1].range = 1024;
4063 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004064 descriptor_write.descriptorCount = 2;
4065
Mark Mueller5c838ce2016-06-16 09:54:29 -06004066 // 2) The stateFlags don't match between the first and second descriptor
Mark Muellerd4914412016-06-13 17:52:06 -06004067 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, stateFlag_ErrorMessage);
4068 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4069 m_errorMonitor->VerifyFound();
4070
Mark Mueller5c838ce2016-06-16 09:54:29 -06004071 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4072 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004073 descriptor_write.dstBinding = 1;
4074 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004075
Mark Mueller5c838ce2016-06-16 09:54:29 -06004076 // Make pImageInfo index non-null to avoid complaints of it missing
4077 VkDescriptorImageInfo imageInfo = {};
4078 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4079 descriptor_write.pImageInfo = &imageInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004080 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, immutable_ErrorMessage);
4081 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4082 m_errorMonitor->VerifyFound();
4083
Mark Muellerd4914412016-06-13 17:52:06 -06004084 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004085 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004086 vkDestroySampler(m_device->device(), sampler, NULL);
4087 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4088 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4089 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4090}
4091
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004092TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
4093 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4094 "due to a buffer dependency being destroyed.");
4095 ASSERT_NO_FATAL_FAILURE(InitState());
4096
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004097 VkBuffer buffer;
4098 VkDeviceMemory mem;
4099 VkMemoryRequirements mem_reqs;
4100
4101 VkBufferCreateInfo buf_info = {};
4102 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004103 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004104 buf_info.size = 256;
4105 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4106 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4107 ASSERT_VK_SUCCESS(err);
4108
4109 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4110
4111 VkMemoryAllocateInfo alloc_info = {};
4112 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4113 alloc_info.allocationSize = 256;
4114 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004115 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 -06004116 if (!pass) {
4117 vkDestroyBuffer(m_device->device(), buffer, NULL);
4118 return;
4119 }
4120 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4121 ASSERT_VK_SUCCESS(err);
4122
4123 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4124 ASSERT_VK_SUCCESS(err);
4125
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004126 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004127 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004128 m_commandBuffer->EndCommandBuffer();
4129
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004131 // Destroy buffer dependency prior to submit to cause ERROR
4132 vkDestroyBuffer(m_device->device(), buffer, NULL);
4133
4134 VkSubmitInfo submit_info = {};
4135 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4136 submit_info.commandBufferCount = 1;
4137 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4138 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4139
4140 m_errorMonitor->VerifyFound();
4141 vkFreeMemory(m_device->handle(), mem, NULL);
4142}
4143
Tobin Ehlisea413442016-09-28 10:23:59 -06004144TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4145 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4146
4147 ASSERT_NO_FATAL_FAILURE(InitState());
4148 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4149
4150 VkDescriptorPoolSize ds_type_count;
4151 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4152 ds_type_count.descriptorCount = 1;
4153
4154 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4155 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4156 ds_pool_ci.maxSets = 1;
4157 ds_pool_ci.poolSizeCount = 1;
4158 ds_pool_ci.pPoolSizes = &ds_type_count;
4159
4160 VkDescriptorPool ds_pool;
4161 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4162 ASSERT_VK_SUCCESS(err);
4163
4164 VkDescriptorSetLayoutBinding layout_binding;
4165 layout_binding.binding = 0;
4166 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4167 layout_binding.descriptorCount = 1;
4168 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4169 layout_binding.pImmutableSamplers = NULL;
4170
4171 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4172 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4173 ds_layout_ci.bindingCount = 1;
4174 ds_layout_ci.pBindings = &layout_binding;
4175 VkDescriptorSetLayout ds_layout;
4176 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4177 ASSERT_VK_SUCCESS(err);
4178
4179 VkDescriptorSetAllocateInfo alloc_info = {};
4180 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4181 alloc_info.descriptorSetCount = 1;
4182 alloc_info.descriptorPool = ds_pool;
4183 alloc_info.pSetLayouts = &ds_layout;
4184 VkDescriptorSet descriptor_set;
4185 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4186 ASSERT_VK_SUCCESS(err);
4187
4188 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4189 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4190 pipeline_layout_ci.pNext = NULL;
4191 pipeline_layout_ci.setLayoutCount = 1;
4192 pipeline_layout_ci.pSetLayouts = &ds_layout;
4193
4194 VkPipelineLayout pipeline_layout;
4195 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4196 ASSERT_VK_SUCCESS(err);
4197
4198 VkBuffer buffer;
4199 uint32_t queue_family_index = 0;
4200 VkBufferCreateInfo buffer_create_info = {};
4201 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4202 buffer_create_info.size = 1024;
4203 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4204 buffer_create_info.queueFamilyIndexCount = 1;
4205 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4206
4207 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4208 ASSERT_VK_SUCCESS(err);
4209
4210 VkMemoryRequirements memory_reqs;
4211 VkDeviceMemory buffer_memory;
4212
4213 VkMemoryAllocateInfo memory_info = {};
4214 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4215 memory_info.allocationSize = 0;
4216 memory_info.memoryTypeIndex = 0;
4217
4218 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4219 memory_info.allocationSize = memory_reqs.size;
4220 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4221 ASSERT_TRUE(pass);
4222
4223 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4224 ASSERT_VK_SUCCESS(err);
4225 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4226 ASSERT_VK_SUCCESS(err);
4227
4228 VkBufferView view;
4229 VkBufferViewCreateInfo bvci = {};
4230 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4231 bvci.buffer = buffer;
4232 bvci.format = VK_FORMAT_R8_UNORM;
4233 bvci.range = VK_WHOLE_SIZE;
4234
4235 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4236 ASSERT_VK_SUCCESS(err);
4237
4238 VkWriteDescriptorSet descriptor_write = {};
4239 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4240 descriptor_write.dstSet = descriptor_set;
4241 descriptor_write.dstBinding = 0;
4242 descriptor_write.descriptorCount = 1;
4243 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4244 descriptor_write.pTexelBufferView = &view;
4245
4246 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4247
4248 char const *vsSource = "#version 450\n"
4249 "\n"
4250 "out gl_PerVertex { \n"
4251 " vec4 gl_Position;\n"
4252 "};\n"
4253 "void main(){\n"
4254 " gl_Position = vec4(1);\n"
4255 "}\n";
4256 char const *fsSource = "#version 450\n"
4257 "\n"
4258 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4259 "layout(location=0) out vec4 x;\n"
4260 "void main(){\n"
4261 " x = imageLoad(s, 0);\n"
4262 "}\n";
4263 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4264 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4265 VkPipelineObj pipe(m_device);
4266 pipe.AddShader(&vs);
4267 pipe.AddShader(&fs);
4268 pipe.AddColorAttachment();
4269 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4270
4271 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot submit cmd buffer using deleted buffer view ");
4272 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer view ");
4273
4274 BeginCommandBuffer();
4275 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4276 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4277 VkRect2D scissor = {{0, 0}, {16, 16}};
4278 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4279 // Bind pipeline to cmd buffer
4280 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4281 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4282 &descriptor_set, 0, nullptr);
4283 Draw(1, 0, 0, 0);
4284 EndCommandBuffer();
4285
4286 // Delete BufferView in order to invalidate cmd buffer
4287 vkDestroyBufferView(m_device->device(), view, NULL);
4288 // Now attempt submit of cmd buffer
4289 VkSubmitInfo submit_info = {};
4290 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4291 submit_info.commandBufferCount = 1;
4292 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4293 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4294 m_errorMonitor->VerifyFound();
4295
4296 // Clean-up
4297 vkDestroyBuffer(m_device->device(), buffer, NULL);
4298 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4299 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4300 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4301 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4302}
4303
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004304TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
4305 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4306 "due to an image dependency being destroyed.");
4307 ASSERT_NO_FATAL_FAILURE(InitState());
4308
4309 VkImage image;
4310 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4311 VkImageCreateInfo image_create_info = {};
4312 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4313 image_create_info.pNext = NULL;
4314 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4315 image_create_info.format = tex_format;
4316 image_create_info.extent.width = 32;
4317 image_create_info.extent.height = 32;
4318 image_create_info.extent.depth = 1;
4319 image_create_info.mipLevels = 1;
4320 image_create_info.arrayLayers = 1;
4321 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4322 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004323 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004324 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004325 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004326 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004327 // Have to bind memory to image before recording cmd in cmd buffer using it
4328 VkMemoryRequirements mem_reqs;
4329 VkDeviceMemory image_mem;
4330 bool pass;
4331 VkMemoryAllocateInfo mem_alloc = {};
4332 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4333 mem_alloc.pNext = NULL;
4334 mem_alloc.memoryTypeIndex = 0;
4335 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4336 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004337 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004338 ASSERT_TRUE(pass);
4339 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4340 ASSERT_VK_SUCCESS(err);
4341 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4342 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004343
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004344 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004345 VkClearColorValue ccv;
4346 ccv.float32[0] = 1.0f;
4347 ccv.float32[1] = 1.0f;
4348 ccv.float32[2] = 1.0f;
4349 ccv.float32[3] = 1.0f;
4350 VkImageSubresourceRange isr = {};
4351 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004352 isr.baseArrayLayer = 0;
4353 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004354 isr.layerCount = 1;
4355 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004356 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004357 m_commandBuffer->EndCommandBuffer();
4358
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004359 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004360 // Destroy image dependency prior to submit to cause ERROR
4361 vkDestroyImage(m_device->device(), image, NULL);
4362
4363 VkSubmitInfo submit_info = {};
4364 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4365 submit_info.commandBufferCount = 1;
4366 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4367 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4368
4369 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004370 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004371}
4372
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004373TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
4374 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4375 "due to a framebuffer image dependency being destroyed.");
4376 VkFormatProperties format_properties;
4377 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004378 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4379 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004380 return;
4381 }
4382
4383 ASSERT_NO_FATAL_FAILURE(InitState());
4384 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4385
4386 VkImageCreateInfo image_ci = {};
4387 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4388 image_ci.pNext = NULL;
4389 image_ci.imageType = VK_IMAGE_TYPE_2D;
4390 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4391 image_ci.extent.width = 32;
4392 image_ci.extent.height = 32;
4393 image_ci.extent.depth = 1;
4394 image_ci.mipLevels = 1;
4395 image_ci.arrayLayers = 1;
4396 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4397 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004398 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004399 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4400 image_ci.flags = 0;
4401 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004402 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004403
4404 VkMemoryRequirements memory_reqs;
4405 VkDeviceMemory image_memory;
4406 bool pass;
4407 VkMemoryAllocateInfo memory_info = {};
4408 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4409 memory_info.pNext = NULL;
4410 memory_info.allocationSize = 0;
4411 memory_info.memoryTypeIndex = 0;
4412 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
4413 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004414 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004415 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004416 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004417 ASSERT_VK_SUCCESS(err);
4418 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
4419 ASSERT_VK_SUCCESS(err);
4420
4421 VkImageViewCreateInfo ivci = {
4422 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4423 nullptr,
4424 0,
4425 image,
4426 VK_IMAGE_VIEW_TYPE_2D,
4427 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004428 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004429 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
4430 };
4431 VkImageView view;
4432 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4433 ASSERT_VK_SUCCESS(err);
4434
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004435 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004436 VkFramebuffer fb;
4437 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4438 ASSERT_VK_SUCCESS(err);
4439
4440 // Just use default renderpass with our framebuffer
4441 m_renderPassBeginInfo.framebuffer = fb;
4442 // Create Null cmd buffer for submit
4443 BeginCommandBuffer();
4444 EndCommandBuffer();
4445 // Destroy image attached to framebuffer to invalidate cmd buffer
4446 vkDestroyImage(m_device->device(), image, NULL);
4447 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004448 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004449 QueueCommandBuffer(false);
4450 m_errorMonitor->VerifyFound();
4451
4452 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4453 vkDestroyImageView(m_device->device(), view, nullptr);
4454 vkFreeMemory(m_device->device(), image_memory, nullptr);
4455}
4456
Tobin Ehlisb329f992016-10-12 13:20:29 -06004457TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
4458 TEST_DESCRIPTION("Delete in-use framebuffer.");
4459 VkFormatProperties format_properties;
4460 VkResult err = VK_SUCCESS;
4461 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4462
4463 ASSERT_NO_FATAL_FAILURE(InitState());
4464 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4465
4466 VkImageObj image(m_device);
4467 image.init(256, 256, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4468 ASSERT_TRUE(image.initialized());
4469 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
4470
4471 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
4472 VkFramebuffer fb;
4473 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4474 ASSERT_VK_SUCCESS(err);
4475
4476 // Just use default renderpass with our framebuffer
4477 m_renderPassBeginInfo.framebuffer = fb;
4478 // Create Null cmd buffer for submit
4479 BeginCommandBuffer();
4480 EndCommandBuffer();
4481 // Submit cmd buffer to put it in-flight
4482 VkSubmitInfo submit_info = {};
4483 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4484 submit_info.commandBufferCount = 1;
4485 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4486 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4487 // Destroy framebuffer while in-flight
4488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete framebuffer 0x");
4489 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4490 m_errorMonitor->VerifyFound();
4491 // Wait for queue to complete so we can safely destroy everything
4492 vkQueueWaitIdle(m_device->m_queue);
4493 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4494}
4495
Tobin Ehlis88becd72016-09-21 14:33:41 -06004496TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
4497 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
4498 VkFormatProperties format_properties;
4499 VkResult err = VK_SUCCESS;
4500 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06004501
4502 ASSERT_NO_FATAL_FAILURE(InitState());
4503 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4504
4505 VkImageCreateInfo image_ci = {};
4506 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4507 image_ci.pNext = NULL;
4508 image_ci.imageType = VK_IMAGE_TYPE_2D;
4509 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4510 image_ci.extent.width = 256;
4511 image_ci.extent.height = 256;
4512 image_ci.extent.depth = 1;
4513 image_ci.mipLevels = 1;
4514 image_ci.arrayLayers = 1;
4515 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4516 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06004517 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06004518 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4519 image_ci.flags = 0;
4520 VkImage image;
4521 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
4522
4523 VkMemoryRequirements memory_reqs;
4524 VkDeviceMemory image_memory;
4525 bool pass;
4526 VkMemoryAllocateInfo memory_info = {};
4527 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4528 memory_info.pNext = NULL;
4529 memory_info.allocationSize = 0;
4530 memory_info.memoryTypeIndex = 0;
4531 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
4532 memory_info.allocationSize = memory_reqs.size;
4533 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4534 ASSERT_TRUE(pass);
4535 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
4536 ASSERT_VK_SUCCESS(err);
4537 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
4538 ASSERT_VK_SUCCESS(err);
4539
4540 VkImageViewCreateInfo ivci = {
4541 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4542 nullptr,
4543 0,
4544 image,
4545 VK_IMAGE_VIEW_TYPE_2D,
4546 VK_FORMAT_B8G8R8A8_UNORM,
4547 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
4548 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
4549 };
4550 VkImageView view;
4551 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4552 ASSERT_VK_SUCCESS(err);
4553
4554 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
4555 VkFramebuffer fb;
4556 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4557 ASSERT_VK_SUCCESS(err);
4558
4559 // Just use default renderpass with our framebuffer
4560 m_renderPassBeginInfo.framebuffer = fb;
4561 // Create Null cmd buffer for submit
4562 BeginCommandBuffer();
4563 EndCommandBuffer();
4564 // Submit cmd buffer to put it (and attached imageView) in-flight
4565 VkSubmitInfo submit_info = {};
4566 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4567 submit_info.commandBufferCount = 1;
4568 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4569 // Submit cmd buffer to put framebuffer and children in-flight
4570 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4571 // Destroy image attached to framebuffer while in-flight
4572 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete image 0x");
4573 vkDestroyImage(m_device->device(), image, NULL);
4574 m_errorMonitor->VerifyFound();
4575 // Wait for queue to complete so we can safely destroy image and other objects
4576 vkQueueWaitIdle(m_device->m_queue);
4577 vkDestroyImage(m_device->device(), image, NULL);
4578 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4579 vkDestroyImageView(m_device->device(), view, nullptr);
4580 vkFreeMemory(m_device->device(), image_memory, nullptr);
4581}
4582
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06004583TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
4584 TEST_DESCRIPTION("Delete in-use renderPass.");
4585
4586 ASSERT_NO_FATAL_FAILURE(InitState());
4587 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4588
4589 // Create simple renderpass
4590 VkAttachmentReference attach = {};
4591 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4592 VkSubpassDescription subpass = {};
4593 subpass.pColorAttachments = &attach;
4594 VkRenderPassCreateInfo rpci = {};
4595 rpci.subpassCount = 1;
4596 rpci.pSubpasses = &subpass;
4597 rpci.attachmentCount = 1;
4598 VkAttachmentDescription attach_desc = {};
4599 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
4600 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4601 rpci.pAttachments = &attach_desc;
4602 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4603 VkRenderPass rp;
4604 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4605 ASSERT_VK_SUCCESS(err);
4606
4607 // Create a pipeline that uses the given renderpass
4608 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4609 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4610
4611 VkPipelineLayout pipeline_layout;
4612 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4613 ASSERT_VK_SUCCESS(err);
4614
4615 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4616 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4617 vp_state_ci.viewportCount = 1;
4618 VkViewport vp = {}; // Just need dummy vp to point to
4619 vp_state_ci.pViewports = &vp;
4620 vp_state_ci.scissorCount = 1;
4621 VkRect2D scissors = {}; // Dummy scissors to point to
4622 vp_state_ci.pScissors = &scissors;
4623
4624 VkPipelineShaderStageCreateInfo shaderStages[2];
4625 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4626
4627 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
4628 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
4629 // but add it to be able to run on more devices
4630 shaderStages[0] = vs.GetStageCreateInfo();
4631 shaderStages[1] = fs.GetStageCreateInfo();
4632
4633 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4634 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4635
4636 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4637 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4638 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4639
4640 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4641 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
4642 rs_ci.rasterizerDiscardEnable = true;
4643 rs_ci.lineWidth = 1.0f;
4644
4645 VkPipelineColorBlendAttachmentState att = {};
4646 att.blendEnable = VK_FALSE;
4647 att.colorWriteMask = 0xf;
4648
4649 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4650 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4651 cb_ci.attachmentCount = 1;
4652 cb_ci.pAttachments = &att;
4653
4654 VkGraphicsPipelineCreateInfo gp_ci = {};
4655 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4656 gp_ci.stageCount = 2;
4657 gp_ci.pStages = shaderStages;
4658 gp_ci.pVertexInputState = &vi_ci;
4659 gp_ci.pInputAssemblyState = &ia_ci;
4660 gp_ci.pViewportState = &vp_state_ci;
4661 gp_ci.pRasterizationState = &rs_ci;
4662 gp_ci.pColorBlendState = &cb_ci;
4663 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4664 gp_ci.layout = pipeline_layout;
4665 gp_ci.renderPass = rp;
4666
4667 VkPipelineCacheCreateInfo pc_ci = {};
4668 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4669
4670 VkPipeline pipeline;
4671 VkPipelineCache pipe_cache;
4672 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
4673 ASSERT_VK_SUCCESS(err);
4674
4675 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
4676 ASSERT_VK_SUCCESS(err);
4677 // Bind pipeline to cmd buffer, will also bind renderpass
4678 m_commandBuffer->BeginCommandBuffer();
4679 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
4680 m_commandBuffer->EndCommandBuffer();
4681
4682 VkSubmitInfo submit_info = {};
4683 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4684 submit_info.commandBufferCount = 1;
4685 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4686 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4687
4688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
4689 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4690 m_errorMonitor->VerifyFound();
4691
4692 // Wait for queue to complete so we can safely destroy everything
4693 vkQueueWaitIdle(m_device->m_queue);
4694 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4695 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
4696 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
4697 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
4698}
4699
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004700TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004701 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004702 ASSERT_NO_FATAL_FAILURE(InitState());
4703
4704 VkImage image;
4705 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4706 VkImageCreateInfo image_create_info = {};
4707 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4708 image_create_info.pNext = NULL;
4709 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4710 image_create_info.format = tex_format;
4711 image_create_info.extent.width = 32;
4712 image_create_info.extent.height = 32;
4713 image_create_info.extent.depth = 1;
4714 image_create_info.mipLevels = 1;
4715 image_create_info.arrayLayers = 1;
4716 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4717 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004718 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004719 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004720 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004721 ASSERT_VK_SUCCESS(err);
4722 // Have to bind memory to image before recording cmd in cmd buffer using it
4723 VkMemoryRequirements mem_reqs;
4724 VkDeviceMemory image_mem;
4725 bool pass;
4726 VkMemoryAllocateInfo mem_alloc = {};
4727 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4728 mem_alloc.pNext = NULL;
4729 mem_alloc.memoryTypeIndex = 0;
4730 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4731 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004732 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004733 ASSERT_TRUE(pass);
4734 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4735 ASSERT_VK_SUCCESS(err);
4736
Tobin Ehlisfed999f2016-09-21 15:09:45 -06004737 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
4738 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06004739 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004740
4741 m_commandBuffer->BeginCommandBuffer();
4742 VkClearColorValue ccv;
4743 ccv.float32[0] = 1.0f;
4744 ccv.float32[1] = 1.0f;
4745 ccv.float32[2] = 1.0f;
4746 ccv.float32[3] = 1.0f;
4747 VkImageSubresourceRange isr = {};
4748 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4749 isr.baseArrayLayer = 0;
4750 isr.baseMipLevel = 0;
4751 isr.layerCount = 1;
4752 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004753 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004754 m_commandBuffer->EndCommandBuffer();
4755
4756 m_errorMonitor->VerifyFound();
4757 vkDestroyImage(m_device->device(), image, NULL);
4758 vkFreeMemory(m_device->device(), image_mem, nullptr);
4759}
4760
4761TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004762 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004763 ASSERT_NO_FATAL_FAILURE(InitState());
4764
4765 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004766 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 -06004767 VK_IMAGE_TILING_OPTIMAL, 0);
4768 ASSERT_TRUE(image.initialized());
4769
4770 VkBuffer buffer;
4771 VkDeviceMemory mem;
4772 VkMemoryRequirements mem_reqs;
4773
4774 VkBufferCreateInfo buf_info = {};
4775 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12004776 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004777 buf_info.size = 256;
4778 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4779 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4780 ASSERT_VK_SUCCESS(err);
4781
4782 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4783
4784 VkMemoryAllocateInfo alloc_info = {};
4785 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4786 alloc_info.allocationSize = 256;
4787 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004788 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 -06004789 if (!pass) {
4790 vkDestroyBuffer(m_device->device(), buffer, NULL);
4791 return;
4792 }
4793 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4794 ASSERT_VK_SUCCESS(err);
4795
Tobin Ehlisfed999f2016-09-21 15:09:45 -06004796 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4797 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06004798 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004799 VkBufferImageCopy region = {};
4800 region.bufferRowLength = 128;
4801 region.bufferImageHeight = 128;
4802 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4803
4804 region.imageSubresource.layerCount = 1;
4805 region.imageExtent.height = 4;
4806 region.imageExtent.width = 4;
4807 region.imageExtent.depth = 1;
4808 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004809 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
4810 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06004811 m_commandBuffer->EndCommandBuffer();
4812
4813 m_errorMonitor->VerifyFound();
4814
4815 vkDestroyBuffer(m_device->device(), buffer, NULL);
4816 vkFreeMemory(m_device->handle(), mem, NULL);
4817}
4818
Tobin Ehlis85940f52016-07-07 16:57:21 -06004819TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
4820 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4821 "due to an event dependency being destroyed.");
4822 ASSERT_NO_FATAL_FAILURE(InitState());
4823
4824 VkEvent event;
4825 VkEventCreateInfo evci = {};
4826 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4827 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
4828 ASSERT_VK_SUCCESS(result);
4829
4830 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004831 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06004832 m_commandBuffer->EndCommandBuffer();
4833
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004834 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06004835 // Destroy event dependency prior to submit to cause ERROR
4836 vkDestroyEvent(m_device->device(), event, NULL);
4837
4838 VkSubmitInfo submit_info = {};
4839 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4840 submit_info.commandBufferCount = 1;
4841 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4842 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4843
4844 m_errorMonitor->VerifyFound();
4845}
4846
Tobin Ehlisdbea7552016-07-08 14:33:31 -06004847TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
4848 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4849 "due to a query pool dependency being destroyed.");
4850 ASSERT_NO_FATAL_FAILURE(InitState());
4851
4852 VkQueryPool query_pool;
4853 VkQueryPoolCreateInfo qpci{};
4854 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
4855 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
4856 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004857 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06004858 ASSERT_VK_SUCCESS(result);
4859
4860 m_commandBuffer->BeginCommandBuffer();
4861 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
4862 m_commandBuffer->EndCommandBuffer();
4863
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004864 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound query pool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06004865 // Destroy query pool dependency prior to submit to cause ERROR
4866 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
4867
4868 VkSubmitInfo submit_info = {};
4869 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4870 submit_info.commandBufferCount = 1;
4871 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4872 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4873
4874 m_errorMonitor->VerifyFound();
4875}
4876
Tobin Ehlis24130d92016-07-08 15:50:53 -06004877TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
4878 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4879 "due to a pipeline dependency being destroyed.");
4880 ASSERT_NO_FATAL_FAILURE(InitState());
4881 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4882
4883 VkResult err;
4884
4885 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4886 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4887
4888 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004889 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06004890 ASSERT_VK_SUCCESS(err);
4891
4892 VkPipelineViewportStateCreateInfo vp_state_ci = {};
4893 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
4894 vp_state_ci.viewportCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004895 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06004896 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06004897 vp_state_ci.scissorCount = 1;
4898 VkRect2D scissors = {}; // Dummy scissors to point to
4899 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06004900
4901 VkPipelineShaderStageCreateInfo shaderStages[2];
4902 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
4903
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004904 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
4905 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
4906 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06004907 shaderStages[0] = vs.GetStageCreateInfo();
4908 shaderStages[1] = fs.GetStageCreateInfo();
4909
4910 VkPipelineVertexInputStateCreateInfo vi_ci = {};
4911 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
4912
4913 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
4914 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
4915 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
4916
4917 VkPipelineRasterizationStateCreateInfo rs_ci = {};
4918 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12004919 rs_ci.rasterizerDiscardEnable = true;
4920 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06004921
4922 VkPipelineColorBlendAttachmentState att = {};
4923 att.blendEnable = VK_FALSE;
4924 att.colorWriteMask = 0xf;
4925
4926 VkPipelineColorBlendStateCreateInfo cb_ci = {};
4927 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
4928 cb_ci.attachmentCount = 1;
4929 cb_ci.pAttachments = &att;
4930
4931 VkGraphicsPipelineCreateInfo gp_ci = {};
4932 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
4933 gp_ci.stageCount = 2;
4934 gp_ci.pStages = shaderStages;
4935 gp_ci.pVertexInputState = &vi_ci;
4936 gp_ci.pInputAssemblyState = &ia_ci;
4937 gp_ci.pViewportState = &vp_state_ci;
4938 gp_ci.pRasterizationState = &rs_ci;
4939 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06004940 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
4941 gp_ci.layout = pipeline_layout;
4942 gp_ci.renderPass = renderPass();
4943
4944 VkPipelineCacheCreateInfo pc_ci = {};
4945 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
4946
4947 VkPipeline pipeline;
4948 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004949 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06004950 ASSERT_VK_SUCCESS(err);
4951
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004952 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06004953 ASSERT_VK_SUCCESS(err);
4954
4955 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004956 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06004957 m_commandBuffer->EndCommandBuffer();
4958 // Now destroy pipeline in order to cause error when submitting
4959 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
4960
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004961 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06004962
4963 VkSubmitInfo submit_info = {};
4964 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4965 submit_info.commandBufferCount = 1;
4966 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4967 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4968
4969 m_errorMonitor->VerifyFound();
4970 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
4971 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4972}
4973
Tobin Ehlis31289162016-08-17 14:57:58 -06004974TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
4975 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
4976 "due to a bound descriptor set with a buffer dependency "
4977 "being destroyed.");
4978 ASSERT_NO_FATAL_FAILURE(InitState());
4979 ASSERT_NO_FATAL_FAILURE(InitViewport());
4980 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4981
4982 VkDescriptorPoolSize ds_type_count = {};
4983 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4984 ds_type_count.descriptorCount = 1;
4985
4986 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4987 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4988 ds_pool_ci.pNext = NULL;
4989 ds_pool_ci.maxSets = 1;
4990 ds_pool_ci.poolSizeCount = 1;
4991 ds_pool_ci.pPoolSizes = &ds_type_count;
4992
4993 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004994 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06004995 ASSERT_VK_SUCCESS(err);
4996
4997 VkDescriptorSetLayoutBinding dsl_binding = {};
4998 dsl_binding.binding = 0;
4999 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5000 dsl_binding.descriptorCount = 1;
5001 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5002 dsl_binding.pImmutableSamplers = NULL;
5003
5004 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5005 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5006 ds_layout_ci.pNext = NULL;
5007 ds_layout_ci.bindingCount = 1;
5008 ds_layout_ci.pBindings = &dsl_binding;
5009 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005010 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005011 ASSERT_VK_SUCCESS(err);
5012
5013 VkDescriptorSet descriptorSet;
5014 VkDescriptorSetAllocateInfo alloc_info = {};
5015 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5016 alloc_info.descriptorSetCount = 1;
5017 alloc_info.descriptorPool = ds_pool;
5018 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005019 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005020 ASSERT_VK_SUCCESS(err);
5021
5022 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5023 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5024 pipeline_layout_ci.pNext = NULL;
5025 pipeline_layout_ci.setLayoutCount = 1;
5026 pipeline_layout_ci.pSetLayouts = &ds_layout;
5027
5028 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005029 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005030 ASSERT_VK_SUCCESS(err);
5031
5032 // Create a buffer to update the descriptor with
5033 uint32_t qfi = 0;
5034 VkBufferCreateInfo buffCI = {};
5035 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5036 buffCI.size = 1024;
5037 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5038 buffCI.queueFamilyIndexCount = 1;
5039 buffCI.pQueueFamilyIndices = &qfi;
5040
5041 VkBuffer buffer;
5042 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5043 ASSERT_VK_SUCCESS(err);
5044 // Allocate memory and bind to buffer so we can make it to the appropriate
5045 // error
5046 VkMemoryAllocateInfo mem_alloc = {};
5047 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5048 mem_alloc.pNext = NULL;
5049 mem_alloc.allocationSize = 1024;
5050 mem_alloc.memoryTypeIndex = 0;
5051
5052 VkMemoryRequirements memReqs;
5053 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005054 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005055 if (!pass) {
5056 vkDestroyBuffer(m_device->device(), buffer, NULL);
5057 return;
5058 }
5059
5060 VkDeviceMemory mem;
5061 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5062 ASSERT_VK_SUCCESS(err);
5063 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5064 ASSERT_VK_SUCCESS(err);
5065 // Correctly update descriptor to avoid "NOT_UPDATED" error
5066 VkDescriptorBufferInfo buffInfo = {};
5067 buffInfo.buffer = buffer;
5068 buffInfo.offset = 0;
5069 buffInfo.range = 1024;
5070
5071 VkWriteDescriptorSet descriptor_write;
5072 memset(&descriptor_write, 0, sizeof(descriptor_write));
5073 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5074 descriptor_write.dstSet = descriptorSet;
5075 descriptor_write.dstBinding = 0;
5076 descriptor_write.descriptorCount = 1;
5077 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5078 descriptor_write.pBufferInfo = &buffInfo;
5079
5080 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5081
5082 // Create PSO to be used for draw-time errors below
5083 char const *vsSource = "#version 450\n"
5084 "\n"
5085 "out gl_PerVertex { \n"
5086 " vec4 gl_Position;\n"
5087 "};\n"
5088 "void main(){\n"
5089 " gl_Position = vec4(1);\n"
5090 "}\n";
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005091 char const *fsSource = "#version 450\n"
5092 "\n"
5093 "layout(location=0) out vec4 x;\n"
5094 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5095 "void main(){\n"
5096 " x = vec4(bar.y);\n"
5097 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005098 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5099 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5100 VkPipelineObj pipe(m_device);
5101 pipe.AddShader(&vs);
5102 pipe.AddShader(&fs);
5103 pipe.AddColorAttachment();
5104 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5105
5106 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005107 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5108 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5109 &descriptorSet, 0, NULL);
Tobin Ehlis31289162016-08-17 14:57:58 -06005110 Draw(1, 0, 0, 0);
5111 EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005112 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005113 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5114 vkDestroyBuffer(m_device->device(), buffer, NULL);
5115 // Attempt to submit cmd buffer
5116 VkSubmitInfo submit_info = {};
5117 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5118 submit_info.commandBufferCount = 1;
5119 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5120 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5121 m_errorMonitor->VerifyFound();
5122 // Cleanup
5123 vkFreeMemory(m_device->device(), mem, NULL);
5124
5125 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5126 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5127 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5128}
5129
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005130TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
5131 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
5132 "due to a bound descriptor sets with a combined image "
5133 "sampler having their image, sampler, and descriptor set "
5134 "each respectively destroyed and then attempting to "
Mark Mueller917f6bc2016-08-30 10:57:19 -06005135 "submit associated cmd buffers. Attempt to destroy a "
5136 "DescriptorSet that is in use.");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005137 ASSERT_NO_FATAL_FAILURE(InitState());
5138 ASSERT_NO_FATAL_FAILURE(InitViewport());
5139 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5140
5141 VkDescriptorPoolSize ds_type_count = {};
5142 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5143 ds_type_count.descriptorCount = 1;
5144
5145 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5146 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5147 ds_pool_ci.pNext = NULL;
5148 ds_pool_ci.maxSets = 1;
5149 ds_pool_ci.poolSizeCount = 1;
5150 ds_pool_ci.pPoolSizes = &ds_type_count;
5151
5152 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005153 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005154 ASSERT_VK_SUCCESS(err);
5155
5156 VkDescriptorSetLayoutBinding dsl_binding = {};
5157 dsl_binding.binding = 0;
5158 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5159 dsl_binding.descriptorCount = 1;
5160 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5161 dsl_binding.pImmutableSamplers = NULL;
5162
5163 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5164 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5165 ds_layout_ci.pNext = NULL;
5166 ds_layout_ci.bindingCount = 1;
5167 ds_layout_ci.pBindings = &dsl_binding;
5168 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005169 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005170 ASSERT_VK_SUCCESS(err);
5171
5172 VkDescriptorSet descriptorSet;
5173 VkDescriptorSetAllocateInfo alloc_info = {};
5174 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5175 alloc_info.descriptorSetCount = 1;
5176 alloc_info.descriptorPool = ds_pool;
5177 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005178 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005179 ASSERT_VK_SUCCESS(err);
5180
5181 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5182 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5183 pipeline_layout_ci.pNext = NULL;
5184 pipeline_layout_ci.setLayoutCount = 1;
5185 pipeline_layout_ci.pSetLayouts = &ds_layout;
5186
5187 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005188 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005189 ASSERT_VK_SUCCESS(err);
5190
5191 // Create images to update the descriptor with
5192 VkImage image;
5193 VkImage image2;
5194 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5195 const int32_t tex_width = 32;
5196 const int32_t tex_height = 32;
5197 VkImageCreateInfo image_create_info = {};
5198 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5199 image_create_info.pNext = NULL;
5200 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5201 image_create_info.format = tex_format;
5202 image_create_info.extent.width = tex_width;
5203 image_create_info.extent.height = tex_height;
5204 image_create_info.extent.depth = 1;
5205 image_create_info.mipLevels = 1;
5206 image_create_info.arrayLayers = 1;
5207 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5208 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5209 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5210 image_create_info.flags = 0;
5211 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5212 ASSERT_VK_SUCCESS(err);
5213 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5214 ASSERT_VK_SUCCESS(err);
5215
5216 VkMemoryRequirements memory_reqs;
5217 VkDeviceMemory image_memory;
5218 bool pass;
5219 VkMemoryAllocateInfo memory_info = {};
5220 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5221 memory_info.pNext = NULL;
5222 memory_info.allocationSize = 0;
5223 memory_info.memoryTypeIndex = 0;
5224 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5225 // Allocate enough memory for both images
5226 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005227 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005228 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005229 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005230 ASSERT_VK_SUCCESS(err);
5231 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5232 ASSERT_VK_SUCCESS(err);
5233 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005234 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005235 ASSERT_VK_SUCCESS(err);
5236
5237 VkImageViewCreateInfo image_view_create_info = {};
5238 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5239 image_view_create_info.image = image;
5240 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5241 image_view_create_info.format = tex_format;
5242 image_view_create_info.subresourceRange.layerCount = 1;
5243 image_view_create_info.subresourceRange.baseMipLevel = 0;
5244 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005245 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005246
5247 VkImageView view;
5248 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005249 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005250 ASSERT_VK_SUCCESS(err);
5251 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005252 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005253 ASSERT_VK_SUCCESS(err);
5254 // Create Samplers
5255 VkSamplerCreateInfo sampler_ci = {};
5256 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5257 sampler_ci.pNext = NULL;
5258 sampler_ci.magFilter = VK_FILTER_NEAREST;
5259 sampler_ci.minFilter = VK_FILTER_NEAREST;
5260 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5261 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5262 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5263 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5264 sampler_ci.mipLodBias = 1.0;
5265 sampler_ci.anisotropyEnable = VK_FALSE;
5266 sampler_ci.maxAnisotropy = 1;
5267 sampler_ci.compareEnable = VK_FALSE;
5268 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5269 sampler_ci.minLod = 1.0;
5270 sampler_ci.maxLod = 1.0;
5271 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5272 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5273 VkSampler sampler;
5274 VkSampler sampler2;
5275 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5276 ASSERT_VK_SUCCESS(err);
5277 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5278 ASSERT_VK_SUCCESS(err);
5279 // Update descriptor with image and sampler
5280 VkDescriptorImageInfo img_info = {};
5281 img_info.sampler = sampler;
5282 img_info.imageView = view;
5283 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5284
5285 VkWriteDescriptorSet descriptor_write;
5286 memset(&descriptor_write, 0, sizeof(descriptor_write));
5287 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5288 descriptor_write.dstSet = descriptorSet;
5289 descriptor_write.dstBinding = 0;
5290 descriptor_write.descriptorCount = 1;
5291 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5292 descriptor_write.pImageInfo = &img_info;
5293
5294 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5295
5296 // Create PSO to be used for draw-time errors below
5297 char const *vsSource = "#version 450\n"
5298 "\n"
5299 "out gl_PerVertex { \n"
5300 " vec4 gl_Position;\n"
5301 "};\n"
5302 "void main(){\n"
5303 " gl_Position = vec4(1);\n"
5304 "}\n";
5305 char const *fsSource = "#version 450\n"
5306 "\n"
5307 "layout(set=0, binding=0) uniform sampler2D s;\n"
5308 "layout(location=0) out vec4 x;\n"
5309 "void main(){\n"
5310 " x = texture(s, vec2(1));\n"
5311 "}\n";
5312 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5313 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5314 VkPipelineObj pipe(m_device);
5315 pipe.AddShader(&vs);
5316 pipe.AddShader(&fs);
5317 pipe.AddColorAttachment();
5318 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5319
5320 // First error case is destroying sampler prior to cmd buffer submission
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005321 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot submit cmd buffer using deleted sampler ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005322 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005323 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5324 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5325 &descriptorSet, 0, NULL);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005326 Draw(1, 0, 0, 0);
5327 EndCommandBuffer();
5328 // Destroy sampler invalidates the cmd buffer, causing error on submit
5329 vkDestroySampler(m_device->device(), sampler, NULL);
5330 // Attempt to submit cmd buffer
5331 VkSubmitInfo submit_info = {};
5332 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5333 submit_info.commandBufferCount = 1;
5334 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5335 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5336 m_errorMonitor->VerifyFound();
5337 // Now re-update descriptor with valid sampler and delete image
5338 img_info.sampler = sampler2;
5339 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005340 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005341 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005342 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5343 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5344 &descriptorSet, 0, NULL);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005345 Draw(1, 0, 0, 0);
5346 EndCommandBuffer();
5347 // Destroy image invalidates the cmd buffer, causing error on submit
5348 vkDestroyImage(m_device->device(), image, NULL);
5349 // Attempt to submit cmd buffer
5350 submit_info = {};
5351 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5352 submit_info.commandBufferCount = 1;
5353 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5354 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5355 m_errorMonitor->VerifyFound();
5356 // Now update descriptor to be valid, but then free descriptor
5357 img_info.imageView = view2;
5358 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005359 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound descriptor set ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005360 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005361 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5362 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5363 &descriptorSet, 0, NULL);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005364 Draw(1, 0, 0, 0);
5365 EndCommandBuffer();
5366 // Destroy descriptor set invalidates the cb, causing error on submit
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005367 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005368 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06005369 m_errorMonitor->VerifyFound();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005370 // Attempt to submit cmd buffer
5371 submit_info = {};
5372 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5373 submit_info.commandBufferCount = 1;
5374 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5375 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5376 m_errorMonitor->VerifyFound();
5377 // Cleanup
5378 vkFreeMemory(m_device->device(), image_memory, NULL);
5379 vkDestroySampler(m_device->device(), sampler2, NULL);
5380 vkDestroyImage(m_device->device(), image2, NULL);
5381 vkDestroyImageView(m_device->device(), view, NULL);
5382 vkDestroyImageView(m_device->device(), view2, NULL);
5383 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5384 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5385 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5386}
5387
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06005388TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
5389 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
5390 ASSERT_NO_FATAL_FAILURE(InitState());
5391 ASSERT_NO_FATAL_FAILURE(InitViewport());
5392 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5393
5394 VkDescriptorPoolSize ds_type_count = {};
5395 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5396 ds_type_count.descriptorCount = 1;
5397
5398 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5399 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5400 ds_pool_ci.pNext = NULL;
5401 ds_pool_ci.maxSets = 1;
5402 ds_pool_ci.poolSizeCount = 1;
5403 ds_pool_ci.pPoolSizes = &ds_type_count;
5404
5405 VkDescriptorPool ds_pool;
5406 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5407 ASSERT_VK_SUCCESS(err);
5408
5409 VkDescriptorSetLayoutBinding dsl_binding = {};
5410 dsl_binding.binding = 0;
5411 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5412 dsl_binding.descriptorCount = 1;
5413 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5414 dsl_binding.pImmutableSamplers = NULL;
5415
5416 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5417 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5418 ds_layout_ci.pNext = NULL;
5419 ds_layout_ci.bindingCount = 1;
5420 ds_layout_ci.pBindings = &dsl_binding;
5421 VkDescriptorSetLayout ds_layout;
5422 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
5423 ASSERT_VK_SUCCESS(err);
5424
5425 VkDescriptorSet descriptor_set;
5426 VkDescriptorSetAllocateInfo alloc_info = {};
5427 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5428 alloc_info.descriptorSetCount = 1;
5429 alloc_info.descriptorPool = ds_pool;
5430 alloc_info.pSetLayouts = &ds_layout;
5431 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
5432 ASSERT_VK_SUCCESS(err);
5433
5434 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5435 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5436 pipeline_layout_ci.pNext = NULL;
5437 pipeline_layout_ci.setLayoutCount = 1;
5438 pipeline_layout_ci.pSetLayouts = &ds_layout;
5439
5440 VkPipelineLayout pipeline_layout;
5441 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5442 ASSERT_VK_SUCCESS(err);
5443
5444 // Create image to update the descriptor with
5445 VkImageObj image(m_device);
5446 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5447 ASSERT_TRUE(image.initialized());
5448
5449 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5450 // Create Sampler
5451 VkSamplerCreateInfo sampler_ci = {};
5452 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5453 sampler_ci.pNext = NULL;
5454 sampler_ci.magFilter = VK_FILTER_NEAREST;
5455 sampler_ci.minFilter = VK_FILTER_NEAREST;
5456 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5457 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5458 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5459 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5460 sampler_ci.mipLodBias = 1.0;
5461 sampler_ci.anisotropyEnable = VK_FALSE;
5462 sampler_ci.maxAnisotropy = 1;
5463 sampler_ci.compareEnable = VK_FALSE;
5464 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5465 sampler_ci.minLod = 1.0;
5466 sampler_ci.maxLod = 1.0;
5467 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5468 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5469 VkSampler sampler;
5470 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5471 ASSERT_VK_SUCCESS(err);
5472 // Update descriptor with image and sampler
5473 VkDescriptorImageInfo img_info = {};
5474 img_info.sampler = sampler;
5475 img_info.imageView = view;
5476 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5477
5478 VkWriteDescriptorSet descriptor_write;
5479 memset(&descriptor_write, 0, sizeof(descriptor_write));
5480 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5481 descriptor_write.dstSet = descriptor_set;
5482 descriptor_write.dstBinding = 0;
5483 descriptor_write.descriptorCount = 1;
5484 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5485 descriptor_write.pImageInfo = &img_info;
5486
5487 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5488
5489 // Create PSO to be used for draw-time errors below
5490 char const *vsSource = "#version 450\n"
5491 "\n"
5492 "out gl_PerVertex { \n"
5493 " vec4 gl_Position;\n"
5494 "};\n"
5495 "void main(){\n"
5496 " gl_Position = vec4(1);\n"
5497 "}\n";
5498 char const *fsSource = "#version 450\n"
5499 "\n"
5500 "layout(set=0, binding=0) uniform sampler2D s;\n"
5501 "layout(location=0) out vec4 x;\n"
5502 "void main(){\n"
5503 " x = texture(s, vec2(1));\n"
5504 "}\n";
5505 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5506 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5507 VkPipelineObj pipe(m_device);
5508 pipe.AddShader(&vs);
5509 pipe.AddShader(&fs);
5510 pipe.AddColorAttachment();
5511 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5512
5513 BeginCommandBuffer();
5514 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5515 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5516 &descriptor_set, 0, NULL);
5517 Draw(1, 0, 0, 0);
5518 EndCommandBuffer();
5519 // Submit cmd buffer to put pool in-flight
5520 VkSubmitInfo submit_info = {};
5521 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5522 submit_info.commandBufferCount = 1;
5523 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5524 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5525 // Destroy pool while in-flight, causing error
5526 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete descriptor pool ");
5527 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5528 m_errorMonitor->VerifyFound();
5529 vkQueueWaitIdle(m_device->m_queue);
5530 // Cleanup
5531 vkDestroySampler(m_device->device(), sampler, NULL);
5532 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5533 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5534 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5535}
5536
Tobin Ehlis50a095d2016-09-21 17:32:49 -06005537TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
5538 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
5539 ASSERT_NO_FATAL_FAILURE(InitState());
5540 ASSERT_NO_FATAL_FAILURE(InitViewport());
5541 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5542
5543 VkDescriptorPoolSize ds_type_count = {};
5544 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5545 ds_type_count.descriptorCount = 1;
5546
5547 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5548 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5549 ds_pool_ci.pNext = NULL;
5550 ds_pool_ci.maxSets = 1;
5551 ds_pool_ci.poolSizeCount = 1;
5552 ds_pool_ci.pPoolSizes = &ds_type_count;
5553
5554 VkDescriptorPool ds_pool;
5555 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
5556 ASSERT_VK_SUCCESS(err);
5557
5558 VkDescriptorSetLayoutBinding dsl_binding = {};
5559 dsl_binding.binding = 0;
5560 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5561 dsl_binding.descriptorCount = 1;
5562 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5563 dsl_binding.pImmutableSamplers = NULL;
5564
5565 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5566 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5567 ds_layout_ci.pNext = NULL;
5568 ds_layout_ci.bindingCount = 1;
5569 ds_layout_ci.pBindings = &dsl_binding;
5570 VkDescriptorSetLayout ds_layout;
5571 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
5572 ASSERT_VK_SUCCESS(err);
5573
5574 VkDescriptorSet descriptorSet;
5575 VkDescriptorSetAllocateInfo alloc_info = {};
5576 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5577 alloc_info.descriptorSetCount = 1;
5578 alloc_info.descriptorPool = ds_pool;
5579 alloc_info.pSetLayouts = &ds_layout;
5580 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
5581 ASSERT_VK_SUCCESS(err);
5582
5583 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5584 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5585 pipeline_layout_ci.pNext = NULL;
5586 pipeline_layout_ci.setLayoutCount = 1;
5587 pipeline_layout_ci.pSetLayouts = &ds_layout;
5588
5589 VkPipelineLayout pipeline_layout;
5590 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5591 ASSERT_VK_SUCCESS(err);
5592
5593 // Create images to update the descriptor with
5594 VkImage image;
5595 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5596 const int32_t tex_width = 32;
5597 const int32_t tex_height = 32;
5598 VkImageCreateInfo image_create_info = {};
5599 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5600 image_create_info.pNext = NULL;
5601 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5602 image_create_info.format = tex_format;
5603 image_create_info.extent.width = tex_width;
5604 image_create_info.extent.height = tex_height;
5605 image_create_info.extent.depth = 1;
5606 image_create_info.mipLevels = 1;
5607 image_create_info.arrayLayers = 1;
5608 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5609 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5610 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5611 image_create_info.flags = 0;
5612 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5613 ASSERT_VK_SUCCESS(err);
5614 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
5615 VkMemoryRequirements memory_reqs;
5616 VkDeviceMemory image_memory;
5617 bool pass;
5618 VkMemoryAllocateInfo memory_info = {};
5619 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5620 memory_info.pNext = NULL;
5621 memory_info.allocationSize = 0;
5622 memory_info.memoryTypeIndex = 0;
5623 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5624 // Allocate enough memory for image
5625 memory_info.allocationSize = memory_reqs.size;
5626 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5627 ASSERT_TRUE(pass);
5628 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5629 ASSERT_VK_SUCCESS(err);
5630 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5631 ASSERT_VK_SUCCESS(err);
5632
5633 VkImageViewCreateInfo image_view_create_info = {};
5634 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5635 image_view_create_info.image = image;
5636 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5637 image_view_create_info.format = tex_format;
5638 image_view_create_info.subresourceRange.layerCount = 1;
5639 image_view_create_info.subresourceRange.baseMipLevel = 0;
5640 image_view_create_info.subresourceRange.levelCount = 1;
5641 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5642
5643 VkImageView view;
5644 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
5645 ASSERT_VK_SUCCESS(err);
5646 // Create Samplers
5647 VkSamplerCreateInfo sampler_ci = {};
5648 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5649 sampler_ci.pNext = NULL;
5650 sampler_ci.magFilter = VK_FILTER_NEAREST;
5651 sampler_ci.minFilter = VK_FILTER_NEAREST;
5652 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5653 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5654 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5655 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5656 sampler_ci.mipLodBias = 1.0;
5657 sampler_ci.anisotropyEnable = VK_FALSE;
5658 sampler_ci.maxAnisotropy = 1;
5659 sampler_ci.compareEnable = VK_FALSE;
5660 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5661 sampler_ci.minLod = 1.0;
5662 sampler_ci.maxLod = 1.0;
5663 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5664 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5665 VkSampler sampler;
5666 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5667 ASSERT_VK_SUCCESS(err);
5668 // Update descriptor with image and sampler
5669 VkDescriptorImageInfo img_info = {};
5670 img_info.sampler = sampler;
5671 img_info.imageView = view;
5672 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5673
5674 VkWriteDescriptorSet descriptor_write;
5675 memset(&descriptor_write, 0, sizeof(descriptor_write));
5676 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5677 descriptor_write.dstSet = descriptorSet;
5678 descriptor_write.dstBinding = 0;
5679 descriptor_write.descriptorCount = 1;
5680 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5681 descriptor_write.pImageInfo = &img_info;
5682 // Break memory binding and attempt update
5683 vkFreeMemory(m_device->device(), image_memory, nullptr);
5684 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005685 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06005686 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
5687 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
5688 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5689 m_errorMonitor->VerifyFound();
5690 // Cleanup
5691 vkDestroyImage(m_device->device(), image, NULL);
5692 vkDestroySampler(m_device->device(), sampler, NULL);
5693 vkDestroyImageView(m_device->device(), view, NULL);
5694 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5695 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5696 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5697}
5698
Karl Schultz6addd812016-02-02 17:17:23 -07005699TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06005700 // Attempt to bind an invalid Pipeline to a valid Command Buffer
5701 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005702 // Create a valid cmd buffer
5703 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06005704 uint64_t fake_pipeline_handle = 0xbaad6001;
5705 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06005706 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12005707 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5708
Karl Schultzf78bcdd2016-11-30 12:36:01 -07005709 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Karl Schultzbdb75952016-04-19 11:36:49 -06005710 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005711 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06005712 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12005713
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06005714 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005715 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 -06005716 Draw(1, 0, 0, 0);
5717 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12005718
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06005719 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005720 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 +12005721 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06005722 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
5723 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06005724}
5725
Karl Schultz6addd812016-02-02 17:17:23 -07005726TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06005727 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07005728 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005729
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005730 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005731
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005732 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06005733 ASSERT_NO_FATAL_FAILURE(InitViewport());
5734 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08005735 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005736 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5737 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06005738
5739 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005740 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5741 ds_pool_ci.pNext = NULL;
5742 ds_pool_ci.maxSets = 1;
5743 ds_pool_ci.poolSizeCount = 1;
5744 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06005745
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005746 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005747 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005748 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005749
Tony Barboureb254902015-07-15 12:50:33 -06005750 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005751 dsl_binding.binding = 0;
5752 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5753 dsl_binding.descriptorCount = 1;
5754 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5755 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005756
Tony Barboureb254902015-07-15 12:50:33 -06005757 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005758 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5759 ds_layout_ci.pNext = NULL;
5760 ds_layout_ci.bindingCount = 1;
5761 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005762 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005763 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005764 ASSERT_VK_SUCCESS(err);
5765
5766 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08005767 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005768 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005769 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06005770 alloc_info.descriptorPool = ds_pool;
5771 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005772 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005773 ASSERT_VK_SUCCESS(err);
5774
Tony Barboureb254902015-07-15 12:50:33 -06005775 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005776 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5777 pipeline_layout_ci.pNext = NULL;
5778 pipeline_layout_ci.setLayoutCount = 1;
5779 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005780
5781 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005782 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005783 ASSERT_VK_SUCCESS(err);
5784
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005785 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06005786 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07005787 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005788 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005789
Tony Barbourc95e4ac2015-08-04 17:05:26 -06005790 VkPipelineObj pipe(m_device);
5791 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06005792 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06005793 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06005794 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06005795
5796 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005797 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5798 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5799 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06005800
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005801 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06005802
Chia-I Wuf7458c52015-10-26 21:10:41 +08005803 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5804 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5805 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06005806}
5807
Karl Schultz6addd812016-02-02 17:17:23 -07005808TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005809 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07005810 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005811
Karl Schultzf78bcdd2016-11-30 12:36:01 -07005812 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005813
5814 ASSERT_NO_FATAL_FAILURE(InitState());
5815 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005816 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
5817 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005818
5819 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005820 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5821 ds_pool_ci.pNext = NULL;
5822 ds_pool_ci.maxSets = 1;
5823 ds_pool_ci.poolSizeCount = 1;
5824 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005825
5826 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005827 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005828 ASSERT_VK_SUCCESS(err);
5829
5830 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005831 dsl_binding.binding = 0;
5832 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
5833 dsl_binding.descriptorCount = 1;
5834 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5835 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005836
5837 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005838 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5839 ds_layout_ci.pNext = NULL;
5840 ds_layout_ci.bindingCount = 1;
5841 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005842 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005843 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005844 ASSERT_VK_SUCCESS(err);
5845
5846 VkDescriptorSet descriptorSet;
5847 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005848 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005849 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005850 alloc_info.descriptorPool = ds_pool;
5851 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005852 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005853 ASSERT_VK_SUCCESS(err);
5854
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005855 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005856 VkWriteDescriptorSet descriptor_write;
5857 memset(&descriptor_write, 0, sizeof(descriptor_write));
5858 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5859 descriptor_write.dstSet = descriptorSet;
5860 descriptor_write.dstBinding = 0;
5861 descriptor_write.descriptorCount = 1;
5862 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
5863 descriptor_write.pTexelBufferView = &view;
5864
5865 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5866
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005867 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07005868
5869 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5870 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5871}
5872
Mark Youngd339ba32016-05-30 13:28:35 -06005873TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005874 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 -06005875
5876 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005878 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06005879
5880 ASSERT_NO_FATAL_FAILURE(InitState());
5881
5882 // Create a buffer with no bound memory and then attempt to create
5883 // a buffer view.
5884 VkBufferCreateInfo buff_ci = {};
5885 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12005886 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06005887 buff_ci.size = 256;
5888 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5889 VkBuffer buffer;
5890 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
5891 ASSERT_VK_SUCCESS(err);
5892
5893 VkBufferViewCreateInfo buff_view_ci = {};
5894 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
5895 buff_view_ci.buffer = buffer;
5896 buff_view_ci.format = VK_FORMAT_R8_UNORM;
5897 buff_view_ci.range = VK_WHOLE_SIZE;
5898 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005899 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06005900
5901 m_errorMonitor->VerifyFound();
5902 vkDestroyBuffer(m_device->device(), buffer, NULL);
5903 // If last error is success, it still created the view, so delete it.
5904 if (err == VK_SUCCESS) {
5905 vkDestroyBufferView(m_device->device(), buff_view, NULL);
5906 }
5907}
5908
Karl Schultz6addd812016-02-02 17:17:23 -07005909TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
5910 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
5911 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07005912 // 1. No dynamicOffset supplied
5913 // 2. Too many dynamicOffsets supplied
5914 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07005915 VkResult err;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005916 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " requires 1 dynamicOffsets, but only "
5917 "0 dynamicOffsets are left in "
5918 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005919
5920 ASSERT_NO_FATAL_FAILURE(InitState());
5921 ASSERT_NO_FATAL_FAILURE(InitViewport());
5922 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5923
5924 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005925 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
5926 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005927
5928 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005929 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5930 ds_pool_ci.pNext = NULL;
5931 ds_pool_ci.maxSets = 1;
5932 ds_pool_ci.poolSizeCount = 1;
5933 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005934
5935 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005936 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005937 ASSERT_VK_SUCCESS(err);
5938
5939 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005940 dsl_binding.binding = 0;
5941 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
5942 dsl_binding.descriptorCount = 1;
5943 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5944 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005945
5946 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005947 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5948 ds_layout_ci.pNext = NULL;
5949 ds_layout_ci.bindingCount = 1;
5950 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005951 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005952 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005953 ASSERT_VK_SUCCESS(err);
5954
5955 VkDescriptorSet descriptorSet;
5956 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08005957 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07005958 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005959 alloc_info.descriptorPool = ds_pool;
5960 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005961 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005962 ASSERT_VK_SUCCESS(err);
5963
5964 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005965 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5966 pipeline_layout_ci.pNext = NULL;
5967 pipeline_layout_ci.setLayoutCount = 1;
5968 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005969
5970 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005971 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005972 ASSERT_VK_SUCCESS(err);
5973
5974 // Create a buffer to update the descriptor with
5975 uint32_t qfi = 0;
5976 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07005977 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5978 buffCI.size = 1024;
5979 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5980 buffCI.queueFamilyIndexCount = 1;
5981 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07005982
5983 VkBuffer dyub;
5984 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
5985 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06005986 // Allocate memory and bind to buffer so we can make it to the appropriate
5987 // error
5988 VkMemoryAllocateInfo mem_alloc = {};
5989 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5990 mem_alloc.pNext = NULL;
5991 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12005992 mem_alloc.memoryTypeIndex = 0;
5993
5994 VkMemoryRequirements memReqs;
5995 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005996 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12005997 if (!pass) {
5998 vkDestroyBuffer(m_device->device(), dyub, NULL);
5999 return;
6000 }
6001
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006002 VkDeviceMemory mem;
6003 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6004 ASSERT_VK_SUCCESS(err);
6005 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6006 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006007 // Correctly update descriptor to avoid "NOT_UPDATED" error
6008 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006009 buffInfo.buffer = dyub;
6010 buffInfo.offset = 0;
6011 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006012
6013 VkWriteDescriptorSet descriptor_write;
6014 memset(&descriptor_write, 0, sizeof(descriptor_write));
6015 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6016 descriptor_write.dstSet = descriptorSet;
6017 descriptor_write.dstBinding = 0;
6018 descriptor_write.descriptorCount = 1;
6019 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6020 descriptor_write.pBufferInfo = &buffInfo;
6021
6022 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6023
6024 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006025 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6026 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006027 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006028 uint32_t pDynOff[2] = {512, 756};
6029 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006030 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6031 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6032 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6033 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006034 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006035 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006036 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " dynamic offset 512 combined with "
6037 "offset 0 and range 1024 that "
6038 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006039 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006040 char const *vsSource = "#version 450\n"
6041 "\n"
6042 "out gl_PerVertex { \n"
6043 " vec4 gl_Position;\n"
6044 "};\n"
6045 "void main(){\n"
6046 " gl_Position = vec4(1);\n"
6047 "}\n";
6048 char const *fsSource = "#version 450\n"
6049 "\n"
6050 "layout(location=0) out vec4 x;\n"
6051 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6052 "void main(){\n"
6053 " x = vec4(bar.y);\n"
6054 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006055 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6056 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6057 VkPipelineObj pipe(m_device);
6058 pipe.AddShader(&vs);
6059 pipe.AddShader(&fs);
6060 pipe.AddColorAttachment();
6061 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6062
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006063 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6064 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6065 VkRect2D scissor = {{0, 0}, {16, 16}};
6066 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6067
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006068 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006069 // This update should succeed, but offset size of 512 will overstep buffer
6070 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006071 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6072 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006073 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006074 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006075
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006076 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006077 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006078
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006079 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006080 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006081 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6082}
6083
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006084TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
6085 TEST_DESCRIPTION("Attempt to update a descriptor with a non-sparse buffer "
6086 "that doesn't have memory bound");
6087 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006089 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006090 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6091 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006092
6093 ASSERT_NO_FATAL_FAILURE(InitState());
6094 ASSERT_NO_FATAL_FAILURE(InitViewport());
6095 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6096
6097 VkDescriptorPoolSize ds_type_count = {};
6098 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6099 ds_type_count.descriptorCount = 1;
6100
6101 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6102 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6103 ds_pool_ci.pNext = NULL;
6104 ds_pool_ci.maxSets = 1;
6105 ds_pool_ci.poolSizeCount = 1;
6106 ds_pool_ci.pPoolSizes = &ds_type_count;
6107
6108 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006109 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006110 ASSERT_VK_SUCCESS(err);
6111
6112 VkDescriptorSetLayoutBinding dsl_binding = {};
6113 dsl_binding.binding = 0;
6114 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6115 dsl_binding.descriptorCount = 1;
6116 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6117 dsl_binding.pImmutableSamplers = NULL;
6118
6119 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6120 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6121 ds_layout_ci.pNext = NULL;
6122 ds_layout_ci.bindingCount = 1;
6123 ds_layout_ci.pBindings = &dsl_binding;
6124 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006125 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006126 ASSERT_VK_SUCCESS(err);
6127
6128 VkDescriptorSet descriptorSet;
6129 VkDescriptorSetAllocateInfo alloc_info = {};
6130 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6131 alloc_info.descriptorSetCount = 1;
6132 alloc_info.descriptorPool = ds_pool;
6133 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006134 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006135 ASSERT_VK_SUCCESS(err);
6136
6137 // Create a buffer to update the descriptor with
6138 uint32_t qfi = 0;
6139 VkBufferCreateInfo buffCI = {};
6140 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6141 buffCI.size = 1024;
6142 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6143 buffCI.queueFamilyIndexCount = 1;
6144 buffCI.pQueueFamilyIndices = &qfi;
6145
6146 VkBuffer dyub;
6147 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6148 ASSERT_VK_SUCCESS(err);
6149
6150 // Attempt to update descriptor without binding memory to it
6151 VkDescriptorBufferInfo buffInfo = {};
6152 buffInfo.buffer = dyub;
6153 buffInfo.offset = 0;
6154 buffInfo.range = 1024;
6155
6156 VkWriteDescriptorSet descriptor_write;
6157 memset(&descriptor_write, 0, sizeof(descriptor_write));
6158 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6159 descriptor_write.dstSet = descriptorSet;
6160 descriptor_write.dstBinding = 0;
6161 descriptor_write.descriptorCount = 1;
6162 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6163 descriptor_write.pBufferInfo = &buffInfo;
6164
6165 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6166 m_errorMonitor->VerifyFound();
6167
6168 vkDestroyBuffer(m_device->device(), dyub, NULL);
6169 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6170 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6171}
6172
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006173TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006174 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006175 ASSERT_NO_FATAL_FAILURE(InitState());
6176 ASSERT_NO_FATAL_FAILURE(InitViewport());
6177 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6178
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006179 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006180 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006181 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6182 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6183 pipeline_layout_ci.pushConstantRangeCount = 1;
6184 pipeline_layout_ci.pPushConstantRanges = &pc_range;
6185
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006186 //
6187 // Check for invalid push constant ranges in pipeline layouts.
6188 //
6189 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006190 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006191 char const *msg;
6192 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006193
Karl Schultzc81037d2016-05-12 08:11:23 -06006194 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
6195 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
6196 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
6197 "vkCreatePipelineLayout() call has push constants index 0 with "
6198 "size 0."},
6199 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
6200 "vkCreatePipelineLayout() call has push constants index 0 with "
6201 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006202 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06006203 "vkCreatePipelineLayout() call has push constants index 0 with "
6204 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006205 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06006206 "vkCreatePipelineLayout() call has push constants index 0 with "
6207 "size 0."},
6208 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6209 "vkCreatePipelineLayout() call has push constants index 0 with "
6210 "offset 1. Offset must"},
6211 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
6212 "vkCreatePipelineLayout() call has push constants index 0 "
6213 "with offset "},
6214 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
6215 "vkCreatePipelineLayout() call has push constants "
6216 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006217 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006218 "vkCreatePipelineLayout() call has push constants index 0 "
6219 "with offset "},
6220 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
6221 "vkCreatePipelineLayout() call has push "
6222 "constants index 0 with offset "},
6223 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
6224 "vkCreatePipelineLayout() call has push "
6225 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006226 }};
6227
6228 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06006229 for (const auto &iter : range_tests) {
6230 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006231 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6232 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006233 m_errorMonitor->VerifyFound();
6234 if (VK_SUCCESS == err) {
6235 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6236 }
6237 }
6238
6239 // Check for invalid stage flag
6240 pc_range.offset = 0;
6241 pc_range.size = 16;
6242 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006243 m_errorMonitor->SetDesiredFailureMsg(
6244 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6245 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006246 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006247 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006248 if (VK_SUCCESS == err) {
6249 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6250 }
6251
6252 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06006253 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006254 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006255 VkPushConstantRange const ranges[ranges_per_test];
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006256 char const *msg;
6257 };
6258
Karl Schultzc81037d2016-05-12 08:11:23 -06006259 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006260 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6261 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6262 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6263 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6264 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006265 "vkCreatePipelineLayout() call has push constants with overlapping ranges:"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006266 {
6267 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6268 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6269 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6270 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
6271 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006272 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 3:[12, 20), 4:[16, 20)",
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006273 },
6274 {
6275 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6276 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
6277 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6278 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6279 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006280 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[16, 20), 1:[12, 20)",
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006281 },
6282 {
6283 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6284 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
6285 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
6286 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
6287 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006288 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[16, 20), 3:[12, 20)",
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006289 },
6290 {
6291 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6292 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
6293 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
6294 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
6295 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006296 "vkCreatePipelineLayout() call has push constants with overlapping ranges:",
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006297 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006298
Karl Schultzc81037d2016-05-12 08:11:23 -06006299 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006300 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06006301 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006302 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, iter.msg);
6303 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006304 m_errorMonitor->VerifyFound();
6305 if (VK_SUCCESS == err) {
6306 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6307 }
6308 }
6309
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006310 //
6311 // CmdPushConstants tests
6312 //
Karl Schultzc81037d2016-05-12 08:11:23 -06006313 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006314
6315 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006316 const std::array<PipelineLayoutTestCase, 11> cmd_range_tests = {{
6317 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0}, "vkCmdPushConstants: parameter size must be greater than 0"},
Karl Schultzc81037d2016-05-12 08:11:23 -06006318 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
6319 "vkCmdPushConstants() call has push constants with size 1. Size "
6320 "must be greater than zero and a multiple of 4."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006321 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06006322 "vkCmdPushConstants() call has push constants with size 1. Size "
6323 "must be greater than zero and a multiple of 4."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006324 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006325 "vkCmdPushConstants() call has push constants with offset 1. "
6326 "Offset must be a multiple of 4."},
6327 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6328 "vkCmdPushConstants() call has push constants with offset 1. "
6329 "Offset must be a multiple of 4."},
6330 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
6331 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
6332 "0x1 not within flag-matching ranges in pipeline layout"},
6333 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
6334 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
6335 "0x1 not within flag-matching ranges in pipeline layout"},
6336 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
6337 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
6338 "0x1 not within flag-matching ranges in pipeline layout"},
6339 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
6340 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
6341 "0x1 not within flag-matching ranges in pipeline layout"},
6342 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
6343 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
6344 "any of the ranges in pipeline layout"},
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006345 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06006346 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
6347 "any of the ranges in pipeline layout"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006348 }};
6349
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006350 BeginCommandBuffer();
6351
6352 // Setup ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06006353 const VkPushConstantRange pc_range2[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006354 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006355 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006356 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006357 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006358 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006359 ASSERT_VK_SUCCESS(err);
Karl Schultzc81037d2016-05-12 08:11:23 -06006360 for (const auto &iter : cmd_range_tests) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006361 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6362 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
Karl Schultzc81037d2016-05-12 08:11:23 -06006363 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006364 m_errorMonitor->VerifyFound();
6365 }
6366
6367 // Check for invalid stage flag
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006368 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006369 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006370 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06006371 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006372
Karl Schultzc81037d2016-05-12 08:11:23 -06006373 // overlapping range tests with cmd
6374 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
6375 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
6376 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
6377 "0x1 not within flag-matching ranges in pipeline layout"},
6378 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
6379 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
6380 "0x1 not within flag-matching ranges in pipeline layout"},
6381 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
6382 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
6383 "0x1 not within flag-matching ranges in pipeline layout"},
6384 }};
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006385 // Setup ranges: [0,16), [20,36), [36,44), [44,52), [80,92)
Karl Schultzc81037d2016-05-12 08:11:23 -06006386 const VkPushConstantRange pc_range3[] = {
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006387 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
6388 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12}, {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
Karl Schultzc81037d2016-05-12 08:11:23 -06006389 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006390 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range3) / sizeof(VkPushConstantRange);
Karl Schultzc81037d2016-05-12 08:11:23 -06006391 pipeline_layout_ci.pPushConstantRanges = pc_range3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006392 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzc81037d2016-05-12 08:11:23 -06006393 ASSERT_VK_SUCCESS(err);
Karl Schultzc81037d2016-05-12 08:11:23 -06006394 for (const auto &iter : cmd_overlap_tests) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6396 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
Karl Schultzc81037d2016-05-12 08:11:23 -06006397 iter.range.size, dummy_values);
6398 m_errorMonitor->VerifyFound();
6399 }
Karl Schultzc81037d2016-05-12 08:11:23 -06006400 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6401
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006402 EndCommandBuffer();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006403}
6404
Karl Schultz6addd812016-02-02 17:17:23 -07006405TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07006406 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07006407 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006408
6409 ASSERT_NO_FATAL_FAILURE(InitState());
6410 ASSERT_NO_FATAL_FAILURE(InitViewport());
6411 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6412
Mike Stroyanb8a61002016-06-20 16:00:28 -06006413 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
6414 VkImageTiling tiling;
6415 VkFormatProperties format_properties;
6416 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006417 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Mike Stroyanb8a61002016-06-20 16:00:28 -06006418 tiling = VK_IMAGE_TILING_LINEAR;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006419 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Mike Stroyanb8a61002016-06-20 16:00:28 -06006420 tiling = VK_IMAGE_TILING_OPTIMAL;
6421 } else {
6422 printf("Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
6423 "skipped.\n");
6424 return;
6425 }
6426
Tobin Ehlis559c6382015-11-05 09:52:49 -07006427 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
6428 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006429 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6430 ds_type_count[0].descriptorCount = 10;
6431 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
6432 ds_type_count[1].descriptorCount = 2;
6433 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
6434 ds_type_count[2].descriptorCount = 2;
6435 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
6436 ds_type_count[3].descriptorCount = 5;
6437 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
6438 // type
6439 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
6440 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
6441 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006442
6443 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006444 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6445 ds_pool_ci.pNext = NULL;
6446 ds_pool_ci.maxSets = 5;
6447 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
6448 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006449
6450 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006451 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006452 ASSERT_VK_SUCCESS(err);
6453
6454 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
6455 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006456 dsl_binding[0].binding = 0;
6457 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6458 dsl_binding[0].descriptorCount = 5;
6459 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6460 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006461
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006462 // Create layout identical to set0 layout but w/ different stageFlags
6463 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006464 dsl_fs_stage_only.binding = 0;
6465 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6466 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006467 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
6468 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07006469 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006470 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006471 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6472 ds_layout_ci.pNext = NULL;
6473 ds_layout_ci.bindingCount = 1;
6474 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006475 static const uint32_t NUM_LAYOUTS = 4;
6476 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006477 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006478 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
6479 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006480 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006481 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006482 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006483 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006484 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006485 dsl_binding[0].binding = 0;
6486 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006487 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07006488 dsl_binding[1].binding = 1;
6489 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
6490 dsl_binding[1].descriptorCount = 2;
6491 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
6492 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07006493 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006494 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006495 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006496 ASSERT_VK_SUCCESS(err);
6497 dsl_binding[0].binding = 0;
6498 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006499 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006500 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006501 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006502 ASSERT_VK_SUCCESS(err);
6503 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006504 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006505 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006506 ASSERT_VK_SUCCESS(err);
6507
6508 static const uint32_t NUM_SETS = 4;
6509 VkDescriptorSet descriptorSet[NUM_SETS] = {};
6510 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006511 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006512 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006513 alloc_info.descriptorPool = ds_pool;
6514 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006515 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006516 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006517 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07006518 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006519 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006520 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006521 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006522
6523 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006524 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6525 pipeline_layout_ci.pNext = NULL;
6526 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
6527 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006528
6529 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006530 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006531 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006532 // Create pipelineLayout with only one setLayout
6533 pipeline_layout_ci.setLayoutCount = 1;
6534 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006535 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006536 ASSERT_VK_SUCCESS(err);
6537 // Create pipelineLayout with 2 descriptor setLayout at index 0
6538 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
6539 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006540 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006541 ASSERT_VK_SUCCESS(err);
6542 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
6543 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
6544 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006545 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006546 ASSERT_VK_SUCCESS(err);
6547 // Create pipelineLayout with UB type, but stageFlags for FS only
6548 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
6549 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006550 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006551 ASSERT_VK_SUCCESS(err);
6552 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
6553 VkDescriptorSetLayout pl_bad_s0[2] = {};
6554 pl_bad_s0[0] = ds_layout_fs_only;
6555 pl_bad_s0[1] = ds_layout[1];
6556 pipeline_layout_ci.setLayoutCount = 2;
6557 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
6558 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006559 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006560 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006561
6562 // Create a buffer to update the descriptor with
6563 uint32_t qfi = 0;
6564 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006565 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6566 buffCI.size = 1024;
6567 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6568 buffCI.queueFamilyIndexCount = 1;
6569 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006570
6571 VkBuffer dyub;
6572 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6573 ASSERT_VK_SUCCESS(err);
6574 // Correctly update descriptor to avoid "NOT_UPDATED" error
6575 static const uint32_t NUM_BUFFS = 5;
6576 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006577 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07006578 buffInfo[i].buffer = dyub;
6579 buffInfo[i].offset = 0;
6580 buffInfo[i].range = 1024;
6581 }
Karl Schultz6addd812016-02-02 17:17:23 -07006582 VkImage image;
Karl Schultz6addd812016-02-02 17:17:23 -07006583 const int32_t tex_width = 32;
6584 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006585 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006586 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6587 image_create_info.pNext = NULL;
6588 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6589 image_create_info.format = tex_format;
6590 image_create_info.extent.width = tex_width;
6591 image_create_info.extent.height = tex_height;
6592 image_create_info.extent.depth = 1;
6593 image_create_info.mipLevels = 1;
6594 image_create_info.arrayLayers = 1;
6595 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyanb8a61002016-06-20 16:00:28 -06006596 image_create_info.tiling = tiling;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006597 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07006598 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006599 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6600 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006601
Karl Schultz6addd812016-02-02 17:17:23 -07006602 VkMemoryRequirements memReqs;
6603 VkDeviceMemory imageMem;
6604 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07006605 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006606 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6607 memAlloc.pNext = NULL;
6608 memAlloc.allocationSize = 0;
6609 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07006610 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
6611 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006612 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07006613 ASSERT_TRUE(pass);
6614 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
6615 ASSERT_VK_SUCCESS(err);
6616 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
6617 ASSERT_VK_SUCCESS(err);
6618
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006619 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006620 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6621 image_view_create_info.image = image;
6622 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6623 image_view_create_info.format = tex_format;
6624 image_view_create_info.subresourceRange.layerCount = 1;
6625 image_view_create_info.subresourceRange.baseMipLevel = 0;
6626 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006627 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07006628
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006629 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006630 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006631 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07006632 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006633 imageInfo[0].imageView = view;
6634 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6635 imageInfo[1].imageView = view;
6636 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07006637 imageInfo[2].imageView = view;
Tobin Ehlisa1fccbc2016-10-10 14:54:43 -06006638 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07006639 imageInfo[3].imageView = view;
Tobin Ehlisa1fccbc2016-10-10 14:54:43 -06006640 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006641
6642 static const uint32_t NUM_SET_UPDATES = 3;
6643 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
6644 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6645 descriptor_write[0].dstSet = descriptorSet[0];
6646 descriptor_write[0].dstBinding = 0;
6647 descriptor_write[0].descriptorCount = 5;
6648 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6649 descriptor_write[0].pBufferInfo = buffInfo;
6650 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6651 descriptor_write[1].dstSet = descriptorSet[1];
6652 descriptor_write[1].dstBinding = 0;
6653 descriptor_write[1].descriptorCount = 2;
6654 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
6655 descriptor_write[1].pImageInfo = imageInfo;
6656 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6657 descriptor_write[2].dstSet = descriptorSet[1];
6658 descriptor_write[2].dstBinding = 1;
6659 descriptor_write[2].descriptorCount = 2;
6660 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07006661 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006662
6663 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006664
Tobin Ehlis88452832015-12-03 09:40:56 -07006665 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006666 char const *vsSource = "#version 450\n"
6667 "\n"
6668 "out gl_PerVertex {\n"
6669 " vec4 gl_Position;\n"
6670 "};\n"
6671 "void main(){\n"
6672 " gl_Position = vec4(1);\n"
6673 "}\n";
6674 char const *fsSource = "#version 450\n"
6675 "\n"
6676 "layout(location=0) out vec4 x;\n"
6677 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6678 "void main(){\n"
6679 " x = vec4(bar.y);\n"
6680 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07006681 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6682 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006683 VkPipelineObj pipe(m_device);
6684 pipe.AddShader(&vs);
6685 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07006686 pipe.AddColorAttachment();
6687 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07006688
6689 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07006690
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006691 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006692 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
6693 // of PSO
6694 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
6695 // cmd_pipeline.c
6696 // due to the fact that cmd_alloc_dset_data() has not been called in
6697 // cmd_bind_graphics_pipeline()
6698 // TODO : Want to cause various binding incompatibility issues here to test
6699 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07006700 // First cause various verify_layout_compatibility() fails
6701 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006702 // verify_set_layout_compatibility fail cases:
6703 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006704 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006705 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
6706 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006707 m_errorMonitor->VerifyFound();
6708
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006709 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006710 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
6711 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
6712 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006713 m_errorMonitor->VerifyFound();
6714
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006715 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07006716 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
6717 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
6719 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
6720 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006721 m_errorMonitor->VerifyFound();
6722
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006723 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
6724 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
6726 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
6727 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006728 m_errorMonitor->VerifyFound();
6729
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006730 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
6731 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006732 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6733 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
6734 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
6735 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006736 m_errorMonitor->VerifyFound();
6737
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006738 // Cause INFO messages due to disturbing previously bound Sets
6739 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006740 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
6741 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006742 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006743 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
6744 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
6745 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006746 m_errorMonitor->VerifyFound();
6747
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006748 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
6749 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006750 // 2. Disturb set after last bound set
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006751 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " newly bound as set #0 so set #1 and "
6752 "any subsequent sets were disturbed ");
6753 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
6754 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006755 m_errorMonitor->VerifyFound();
6756
Tobin Ehlis10fad692016-07-07 12:00:36 -06006757 // Now that we're done actively using the pipelineLayout that gfx pipeline
6758 // was created with, we should be able to delete it. Do that now to verify
6759 // that validation obeys pipelineLayout lifetime
6760 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
6761
Tobin Ehlis88452832015-12-03 09:40:56 -07006762 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07006763 // 1. Error due to not binding required set (we actually use same code as
6764 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006765 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
6766 &descriptorSet[0], 0, NULL);
6767 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
6768 &descriptorSet[1], 0, NULL);
6769 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 -07006770 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006771 m_errorMonitor->VerifyFound();
6772
Tobin Ehlis991d45a2016-01-06 08:48:41 -07006773 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07006774 // 2. Error due to bound set not being compatible with PSO's
6775 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006776 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
6777 &descriptorSet[0], 0, NULL);
6778 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07006779 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006780 m_errorMonitor->VerifyFound();
6781
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006782 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07006783 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006784 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
6785 }
6786 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07006787 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006788 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6789 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006790 vkFreeMemory(m_device->device(), imageMem, NULL);
6791 vkDestroyImage(m_device->device(), image, NULL);
6792 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07006793}
Tobin Ehlis559c6382015-11-05 09:52:49 -07006794
Karl Schultz6addd812016-02-02 17:17:23 -07006795TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006796
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006797 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6798 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006799
6800 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006801 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006802 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006803 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006804
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006805 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006806}
6807
Karl Schultz6addd812016-02-02 17:17:23 -07006808TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
6809 VkResult err;
6810 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006811
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006812 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006813
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006814 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006815
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006816 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006817 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06006818 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006819 cmd.commandPool = m_commandPool;
6820 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006821 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06006822
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006823 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06006824 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006825
6826 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006827 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07006828 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006829 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06006830 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006831 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 -07006832 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006833
6834 // The error should be caught by validation of the BeginCommandBuffer call
6835 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
6836
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006837 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006838 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06006839}
6840
Karl Schultz6addd812016-02-02 17:17:23 -07006841TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006842 // Cause error due to Begin while recording CB
6843 // Then cause 2 errors for attempting to reset CB w/o having
6844 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
6845 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06006846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006847
6848 ASSERT_NO_FATAL_FAILURE(InitState());
6849
6850 // Calls AllocateCommandBuffers
6851 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
6852
Karl Schultz6addd812016-02-02 17:17:23 -07006853 // Force the failure by setting the Renderpass and Framebuffer fields with
6854 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006855 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07006856 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006857 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6858 cmd_buf_info.pNext = NULL;
6859 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006860 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006861
6862 // Begin CB to transition to recording state
6863 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
6864 // Can't re-begin. This should trigger error
6865 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006866 m_errorMonitor->VerifyFound();
6867
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006868 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006869 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
6870 // Reset attempt will trigger error due to incorrect CommandPool state
6871 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006872 m_errorMonitor->VerifyFound();
6873
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006875 // Transition CB to RECORDED state
6876 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
6877 // Now attempting to Begin will implicitly reset, which triggers error
6878 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006879 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07006880}
6881
Karl Schultz6addd812016-02-02 17:17:23 -07006882TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006883 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07006884 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006885
Mike Weiblencce7ec72016-10-17 19:33:05 -06006886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006887
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006888 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06006889 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006890
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006891 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006892 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6893 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006894
6895 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006896 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6897 ds_pool_ci.pNext = NULL;
6898 ds_pool_ci.maxSets = 1;
6899 ds_pool_ci.poolSizeCount = 1;
6900 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06006901
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006902 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006903 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006904 ASSERT_VK_SUCCESS(err);
6905
Tony Barboureb254902015-07-15 12:50:33 -06006906 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006907 dsl_binding.binding = 0;
6908 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6909 dsl_binding.descriptorCount = 1;
6910 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6911 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006912
Tony Barboureb254902015-07-15 12:50:33 -06006913 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006914 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6915 ds_layout_ci.pNext = NULL;
6916 ds_layout_ci.bindingCount = 1;
6917 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06006918
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006919 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006920 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006921 ASSERT_VK_SUCCESS(err);
6922
6923 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006924 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006925 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006926 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006927 alloc_info.descriptorPool = ds_pool;
6928 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006929 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006930 ASSERT_VK_SUCCESS(err);
6931
Tony Barboureb254902015-07-15 12:50:33 -06006932 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006933 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6934 pipeline_layout_ci.setLayoutCount = 1;
6935 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006936
6937 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006938 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006939 ASSERT_VK_SUCCESS(err);
6940
Tobin Ehlise68360f2015-10-01 11:15:13 -06006941 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07006942 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06006943
6944 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006945 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
6946 vp_state_ci.scissorCount = 1;
6947 vp_state_ci.pScissors = &sc;
6948 vp_state_ci.viewportCount = 1;
6949 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06006950
Karl Schultzdfdb8d42016-03-08 10:30:21 -07006951 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
6952 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
6953 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
6954 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
6955 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
6956 rs_state_ci.depthClampEnable = VK_FALSE;
6957 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
6958 rs_state_ci.depthBiasEnable = VK_FALSE;
6959
Tony Barboureb254902015-07-15 12:50:33 -06006960 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006961 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
6962 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07006963 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07006964 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
6965 gp_ci.layout = pipeline_layout;
6966 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06006967
6968 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006969 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
6970 pc_ci.initialDataSize = 0;
6971 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006972
6973 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06006974 VkPipelineCache pipelineCache;
6975
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006976 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06006977 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006978 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006979
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006980 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006981
Chia-I Wuf7458c52015-10-26 21:10:41 +08006982 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
6983 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6984 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6985 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006986}
Tobin Ehlis912df022015-09-17 08:46:18 -06006987/*// TODO : This test should be good, but needs Tess support in compiler to run
6988TEST_F(VkLayerTest, InvalidPatchControlPoints)
6989{
6990 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06006991 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006992
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006993 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006994 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
6995primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006996
Tobin Ehlis912df022015-09-17 08:46:18 -06006997 ASSERT_NO_FATAL_FAILURE(InitState());
6998 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06006999
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007000 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007001 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007002 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007003
7004 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7005 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7006 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007007 ds_pool_ci.poolSizeCount = 1;
7008 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007009
7010 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007011 err = vkCreateDescriptorPool(m_device->device(),
7012VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007013 ASSERT_VK_SUCCESS(err);
7014
7015 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007016 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007017 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007018 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007019 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7020 dsl_binding.pImmutableSamplers = NULL;
7021
7022 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007023 ds_layout_ci.sType =
7024VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007025 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007026 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007027 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007028
7029 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007030 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7031&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007032 ASSERT_VK_SUCCESS(err);
7033
7034 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007035 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7036VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007037 ASSERT_VK_SUCCESS(err);
7038
7039 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007040 pipeline_layout_ci.sType =
7041VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007042 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007043 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007044 pipeline_layout_ci.pSetLayouts = &ds_layout;
7045
7046 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007047 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7048&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007049 ASSERT_VK_SUCCESS(err);
7050
7051 VkPipelineShaderStageCreateInfo shaderStages[3];
7052 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7053
Karl Schultz6addd812016-02-02 17:17:23 -07007054 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7055this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007056 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007057 VkShaderObj
7058tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7059this);
7060 VkShaderObj
7061te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7062this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007063
Karl Schultz6addd812016-02-02 17:17:23 -07007064 shaderStages[0].sType =
7065VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007066 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007067 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007068 shaderStages[1].sType =
7069VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007070 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007071 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007072 shaderStages[2].sType =
7073VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007074 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007075 shaderStages[2].shader = te.handle();
7076
7077 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007078 iaCI.sType =
7079VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007080 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007081
7082 VkPipelineTessellationStateCreateInfo tsCI = {};
7083 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7084 tsCI.patchControlPoints = 0; // This will cause an error
7085
7086 VkGraphicsPipelineCreateInfo gp_ci = {};
7087 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7088 gp_ci.pNext = NULL;
7089 gp_ci.stageCount = 3;
7090 gp_ci.pStages = shaderStages;
7091 gp_ci.pVertexInputState = NULL;
7092 gp_ci.pInputAssemblyState = &iaCI;
7093 gp_ci.pTessellationState = &tsCI;
7094 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007095 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007096 gp_ci.pMultisampleState = NULL;
7097 gp_ci.pDepthStencilState = NULL;
7098 gp_ci.pColorBlendState = NULL;
7099 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7100 gp_ci.layout = pipeline_layout;
7101 gp_ci.renderPass = renderPass();
7102
7103 VkPipelineCacheCreateInfo pc_ci = {};
7104 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7105 pc_ci.pNext = NULL;
7106 pc_ci.initialSize = 0;
7107 pc_ci.initialData = 0;
7108 pc_ci.maxSize = 0;
7109
7110 VkPipeline pipeline;
7111 VkPipelineCache pipelineCache;
7112
Karl Schultz6addd812016-02-02 17:17:23 -07007113 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7114&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007115 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007116 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7117&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007118
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007119 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007120
Chia-I Wuf7458c52015-10-26 21:10:41 +08007121 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7122 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7123 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7124 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007125}
7126*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06007127// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07007128TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07007129 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007130
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007131 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7132 "Gfx Pipeline viewport count (1) must match scissor count (0).");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007133
Tobin Ehlise68360f2015-10-01 11:15:13 -06007134 ASSERT_NO_FATAL_FAILURE(InitState());
7135 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007136
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007137 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007138 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7139 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007140
7141 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007142 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7143 ds_pool_ci.maxSets = 1;
7144 ds_pool_ci.poolSizeCount = 1;
7145 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007146
7147 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007148 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007149 ASSERT_VK_SUCCESS(err);
7150
7151 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007152 dsl_binding.binding = 0;
7153 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7154 dsl_binding.descriptorCount = 1;
7155 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007156
7157 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007158 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7159 ds_layout_ci.bindingCount = 1;
7160 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007161
7162 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007163 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007164 ASSERT_VK_SUCCESS(err);
7165
7166 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007167 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007168 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007169 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007170 alloc_info.descriptorPool = ds_pool;
7171 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007172 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007173 ASSERT_VK_SUCCESS(err);
7174
7175 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007176 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7177 pipeline_layout_ci.setLayoutCount = 1;
7178 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007179
7180 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007181 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007182 ASSERT_VK_SUCCESS(err);
7183
7184 VkViewport vp = {}; // Just need dummy vp to point to
7185
7186 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007187 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7188 vp_state_ci.scissorCount = 0;
7189 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
7190 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007191
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007192 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7193 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7194 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7195 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7196 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7197 rs_state_ci.depthClampEnable = VK_FALSE;
7198 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7199 rs_state_ci.depthBiasEnable = VK_FALSE;
7200
Cody Northropeb3a6c12015-10-05 14:44:45 -06007201 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007202 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007203
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007204 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7205 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
7206 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08007207 shaderStages[0] = vs.GetStageCreateInfo();
7208 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007209
7210 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007211 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7212 gp_ci.stageCount = 2;
7213 gp_ci.pStages = shaderStages;
7214 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007215 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007216 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7217 gp_ci.layout = pipeline_layout;
7218 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007219
7220 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007221 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007222
7223 VkPipeline pipeline;
7224 VkPipelineCache pipelineCache;
7225
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007226 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007227 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007228 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007229
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007230 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007231
Chia-I Wuf7458c52015-10-26 21:10:41 +08007232 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7233 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7234 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7235 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007236}
Karl Schultz6addd812016-02-02 17:17:23 -07007237// Don't set viewport state in PSO. This is an error b/c we always need this
7238// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06007239// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07007240TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06007241 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007242 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007243
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007244 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Gfx Pipeline pViewportState is null. Even if ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007245
Tobin Ehlise68360f2015-10-01 11:15:13 -06007246 ASSERT_NO_FATAL_FAILURE(InitState());
7247 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007248
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007249 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007250 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7251 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007252
7253 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007254 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7255 ds_pool_ci.maxSets = 1;
7256 ds_pool_ci.poolSizeCount = 1;
7257 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007258
7259 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007260 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007261 ASSERT_VK_SUCCESS(err);
7262
7263 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007264 dsl_binding.binding = 0;
7265 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7266 dsl_binding.descriptorCount = 1;
7267 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007268
7269 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007270 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7271 ds_layout_ci.bindingCount = 1;
7272 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007273
7274 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007275 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007276 ASSERT_VK_SUCCESS(err);
7277
7278 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007279 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007280 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007281 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007282 alloc_info.descriptorPool = ds_pool;
7283 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007284 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007285 ASSERT_VK_SUCCESS(err);
7286
7287 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007288 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7289 pipeline_layout_ci.setLayoutCount = 1;
7290 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007291
7292 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007293 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007294 ASSERT_VK_SUCCESS(err);
7295
7296 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7297 // Set scissor as dynamic to avoid second error
7298 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007299 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7300 dyn_state_ci.dynamicStateCount = 1;
7301 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007302
Cody Northropeb3a6c12015-10-05 14:44:45 -06007303 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007304 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007305
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007306 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7307 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
7308 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08007309 shaderStages[0] = vs.GetStageCreateInfo();
7310 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007311
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007312 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7313 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7314 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7315 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7316 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7317 rs_state_ci.depthClampEnable = VK_FALSE;
7318 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7319 rs_state_ci.depthBiasEnable = VK_FALSE;
7320
Tobin Ehlise68360f2015-10-01 11:15:13 -06007321 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007322 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7323 gp_ci.stageCount = 2;
7324 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007325 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007326 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
7327 // should cause validation error
7328 gp_ci.pDynamicState = &dyn_state_ci;
7329 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7330 gp_ci.layout = pipeline_layout;
7331 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007332
7333 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007334 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007335
7336 VkPipeline pipeline;
7337 VkPipelineCache pipelineCache;
7338
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007339 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007340 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007341 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007342
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007343 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007344
Chia-I Wuf7458c52015-10-26 21:10:41 +08007345 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7346 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7347 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7348 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007349}
7350// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07007351// Then run second test where dynamic scissor count doesn't match PSO scissor
7352// count
7353TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
7354 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007355
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007356 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7357 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007358
Tobin Ehlise68360f2015-10-01 11:15:13 -06007359 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007360
7361 if (!m_device->phy().features().multiViewport) {
7362 printf("Device does not support multiple viewports/scissors; skipped.\n");
7363 return;
7364 }
7365
Tobin Ehlise68360f2015-10-01 11:15:13 -06007366 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007367
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007368 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007369 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7370 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007371
7372 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007373 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7374 ds_pool_ci.maxSets = 1;
7375 ds_pool_ci.poolSizeCount = 1;
7376 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007377
7378 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007379 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007380 ASSERT_VK_SUCCESS(err);
7381
7382 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007383 dsl_binding.binding = 0;
7384 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7385 dsl_binding.descriptorCount = 1;
7386 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007387
7388 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007389 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7390 ds_layout_ci.bindingCount = 1;
7391 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007392
7393 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007394 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007395 ASSERT_VK_SUCCESS(err);
7396
7397 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007398 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007399 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007400 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007401 alloc_info.descriptorPool = ds_pool;
7402 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007403 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007404 ASSERT_VK_SUCCESS(err);
7405
7406 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007407 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7408 pipeline_layout_ci.setLayoutCount = 1;
7409 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007410
7411 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007412 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007413 ASSERT_VK_SUCCESS(err);
7414
7415 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007416 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7417 vp_state_ci.viewportCount = 1;
7418 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
7419 vp_state_ci.scissorCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007420 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06007421
7422 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7423 // Set scissor as dynamic to avoid that error
7424 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007425 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7426 dyn_state_ci.dynamicStateCount = 1;
7427 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007428
Cody Northropeb3a6c12015-10-05 14:44:45 -06007429 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007430 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007431
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007432 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7433 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
7434 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08007435 shaderStages[0] = vs.GetStageCreateInfo();
7436 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007437
Cody Northropf6622dc2015-10-06 10:33:21 -06007438 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7439 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7440 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007441 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06007442 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007443 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06007444 vi_ci.pVertexAttributeDescriptions = nullptr;
7445
7446 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7447 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7448 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7449
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007450 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007451 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06007452 rs_ci.pNext = nullptr;
7453
Mark Youngc89c6312016-03-31 16:03:20 -06007454 VkPipelineColorBlendAttachmentState att = {};
7455 att.blendEnable = VK_FALSE;
7456 att.colorWriteMask = 0xf;
7457
Cody Northropf6622dc2015-10-06 10:33:21 -06007458 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7459 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7460 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06007461 cb_ci.attachmentCount = 1;
7462 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06007463
Tobin Ehlise68360f2015-10-01 11:15:13 -06007464 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007465 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7466 gp_ci.stageCount = 2;
7467 gp_ci.pStages = shaderStages;
7468 gp_ci.pVertexInputState = &vi_ci;
7469 gp_ci.pInputAssemblyState = &ia_ci;
7470 gp_ci.pViewportState = &vp_state_ci;
7471 gp_ci.pRasterizationState = &rs_ci;
7472 gp_ci.pColorBlendState = &cb_ci;
7473 gp_ci.pDynamicState = &dyn_state_ci;
7474 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7475 gp_ci.layout = pipeline_layout;
7476 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007477
7478 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007479 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007480
7481 VkPipeline pipeline;
7482 VkPipelineCache pipelineCache;
7483
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007484 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007485 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007486 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007487
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007488 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007489
Tobin Ehlisd332f282015-10-02 11:00:56 -06007490 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07007491 // First need to successfully create the PSO from above by setting
7492 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06007493 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 -07007494
7495 VkViewport vp = {}; // Just need dummy vp to point to
7496 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007497 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07007498 ASSERT_VK_SUCCESS(err);
7499 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007500 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007501 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07007502 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007503 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07007504 Draw(1, 0, 0, 0);
7505
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007506 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07007507
7508 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7509 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7510 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7511 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007512 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007513}
7514// Create PSO w/o non-zero scissorCount but no scissor data
7515// Then run second test where dynamic viewportCount doesn't match PSO
7516// viewportCount
7517TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
7518 VkResult err;
7519
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007520 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 -07007521
7522 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007523
7524 if (!m_device->phy().features().multiViewport) {
7525 printf("Device does not support multiple viewports/scissors; skipped.\n");
7526 return;
7527 }
7528
Karl Schultz6addd812016-02-02 17:17:23 -07007529 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7530
7531 VkDescriptorPoolSize ds_type_count = {};
7532 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7533 ds_type_count.descriptorCount = 1;
7534
7535 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7536 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7537 ds_pool_ci.maxSets = 1;
7538 ds_pool_ci.poolSizeCount = 1;
7539 ds_pool_ci.pPoolSizes = &ds_type_count;
7540
7541 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007542 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07007543 ASSERT_VK_SUCCESS(err);
7544
7545 VkDescriptorSetLayoutBinding dsl_binding = {};
7546 dsl_binding.binding = 0;
7547 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7548 dsl_binding.descriptorCount = 1;
7549 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7550
7551 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7552 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7553 ds_layout_ci.bindingCount = 1;
7554 ds_layout_ci.pBindings = &dsl_binding;
7555
7556 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007557 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07007558 ASSERT_VK_SUCCESS(err);
7559
7560 VkDescriptorSet descriptorSet;
7561 VkDescriptorSetAllocateInfo alloc_info = {};
7562 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7563 alloc_info.descriptorSetCount = 1;
7564 alloc_info.descriptorPool = ds_pool;
7565 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007566 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07007567 ASSERT_VK_SUCCESS(err);
7568
7569 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7570 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7571 pipeline_layout_ci.setLayoutCount = 1;
7572 pipeline_layout_ci.pSetLayouts = &ds_layout;
7573
7574 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007575 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07007576 ASSERT_VK_SUCCESS(err);
7577
7578 VkPipelineViewportStateCreateInfo vp_state_ci = {};
7579 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7580 vp_state_ci.scissorCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007581 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07007582 vp_state_ci.viewportCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007583 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07007584
7585 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
7586 // Set scissor as dynamic to avoid that error
7587 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
7588 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7589 dyn_state_ci.dynamicStateCount = 1;
7590 dyn_state_ci.pDynamicStates = &vp_state;
7591
7592 VkPipelineShaderStageCreateInfo shaderStages[2];
7593 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7594
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007595 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7596 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
7597 // but add it to be able to run on more devices
Karl Schultz6addd812016-02-02 17:17:23 -07007598 shaderStages[0] = vs.GetStageCreateInfo();
7599 shaderStages[1] = fs.GetStageCreateInfo();
7600
7601 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7602 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7603 vi_ci.pNext = nullptr;
7604 vi_ci.vertexBindingDescriptionCount = 0;
7605 vi_ci.pVertexBindingDescriptions = nullptr;
7606 vi_ci.vertexAttributeDescriptionCount = 0;
7607 vi_ci.pVertexAttributeDescriptions = nullptr;
7608
7609 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7610 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7611 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7612
7613 VkPipelineRasterizationStateCreateInfo rs_ci = {};
7614 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7615 rs_ci.pNext = nullptr;
7616
Mark Youngc89c6312016-03-31 16:03:20 -06007617 VkPipelineColorBlendAttachmentState att = {};
7618 att.blendEnable = VK_FALSE;
7619 att.colorWriteMask = 0xf;
7620
Karl Schultz6addd812016-02-02 17:17:23 -07007621 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7622 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7623 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06007624 cb_ci.attachmentCount = 1;
7625 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07007626
7627 VkGraphicsPipelineCreateInfo gp_ci = {};
7628 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7629 gp_ci.stageCount = 2;
7630 gp_ci.pStages = shaderStages;
7631 gp_ci.pVertexInputState = &vi_ci;
7632 gp_ci.pInputAssemblyState = &ia_ci;
7633 gp_ci.pViewportState = &vp_state_ci;
7634 gp_ci.pRasterizationState = &rs_ci;
7635 gp_ci.pColorBlendState = &cb_ci;
7636 gp_ci.pDynamicState = &dyn_state_ci;
7637 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7638 gp_ci.layout = pipeline_layout;
7639 gp_ci.renderPass = renderPass();
7640
7641 VkPipelineCacheCreateInfo pc_ci = {};
7642 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7643
7644 VkPipeline pipeline;
7645 VkPipelineCache pipelineCache;
7646
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007647 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07007648 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007649 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07007650
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007651 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07007652
7653 // Now hit second fail case where we set scissor w/ different count than PSO
7654 // First need to successfully create the PSO from above by setting
7655 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06007656 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 -06007657
Tobin Ehlisd332f282015-10-02 11:00:56 -06007658 VkRect2D sc = {}; // Just need dummy vp to point to
7659 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007660 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06007661 ASSERT_VK_SUCCESS(err);
7662 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007663 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007664 VkViewport viewports[1] = {}; // don't care about data
Tobin Ehlisd332f282015-10-02 11:00:56 -06007665 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007666 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06007667 Draw(1, 0, 0, 0);
7668
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007669 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007670
Chia-I Wuf7458c52015-10-26 21:10:41 +08007671 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7672 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7673 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7674 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007675 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007676}
7677
Mark Young7394fdd2016-03-31 14:56:43 -06007678TEST_F(VkLayerTest, PSOLineWidthInvalid) {
7679 VkResult err;
7680
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007681 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06007682
7683 ASSERT_NO_FATAL_FAILURE(InitState());
7684 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7685
7686 VkDescriptorPoolSize ds_type_count = {};
7687 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7688 ds_type_count.descriptorCount = 1;
7689
7690 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7691 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7692 ds_pool_ci.maxSets = 1;
7693 ds_pool_ci.poolSizeCount = 1;
7694 ds_pool_ci.pPoolSizes = &ds_type_count;
7695
7696 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007697 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06007698 ASSERT_VK_SUCCESS(err);
7699
7700 VkDescriptorSetLayoutBinding dsl_binding = {};
7701 dsl_binding.binding = 0;
7702 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7703 dsl_binding.descriptorCount = 1;
7704 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7705
7706 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7707 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7708 ds_layout_ci.bindingCount = 1;
7709 ds_layout_ci.pBindings = &dsl_binding;
7710
7711 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007712 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06007713 ASSERT_VK_SUCCESS(err);
7714
7715 VkDescriptorSet descriptorSet;
7716 VkDescriptorSetAllocateInfo alloc_info = {};
7717 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7718 alloc_info.descriptorSetCount = 1;
7719 alloc_info.descriptorPool = ds_pool;
7720 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007721 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06007722 ASSERT_VK_SUCCESS(err);
7723
7724 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7725 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7726 pipeline_layout_ci.setLayoutCount = 1;
7727 pipeline_layout_ci.pSetLayouts = &ds_layout;
7728
7729 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007730 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06007731 ASSERT_VK_SUCCESS(err);
7732
7733 VkPipelineViewportStateCreateInfo vp_state_ci = {};
7734 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7735 vp_state_ci.scissorCount = 1;
7736 vp_state_ci.pScissors = NULL;
7737 vp_state_ci.viewportCount = 1;
7738 vp_state_ci.pViewports = NULL;
7739
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007740 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06007741 // Set scissor as dynamic to avoid that error
7742 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
7743 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7744 dyn_state_ci.dynamicStateCount = 2;
7745 dyn_state_ci.pDynamicStates = dynamic_states;
7746
7747 VkPipelineShaderStageCreateInfo shaderStages[2];
7748 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7749
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007750 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7751 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Young7394fdd2016-03-31 14:56:43 -06007752 this); // TODO - We shouldn't need a fragment shader
7753 // but add it to be able to run on more devices
7754 shaderStages[0] = vs.GetStageCreateInfo();
7755 shaderStages[1] = fs.GetStageCreateInfo();
7756
7757 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7758 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7759 vi_ci.pNext = nullptr;
7760 vi_ci.vertexBindingDescriptionCount = 0;
7761 vi_ci.pVertexBindingDescriptions = nullptr;
7762 vi_ci.vertexAttributeDescriptionCount = 0;
7763 vi_ci.pVertexAttributeDescriptions = nullptr;
7764
7765 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7766 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7767 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7768
7769 VkPipelineRasterizationStateCreateInfo rs_ci = {};
7770 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7771 rs_ci.pNext = nullptr;
7772
Mark Young47107952016-05-02 15:59:55 -06007773 // Check too low (line width of -1.0f).
7774 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06007775
7776 VkPipelineColorBlendAttachmentState att = {};
7777 att.blendEnable = VK_FALSE;
7778 att.colorWriteMask = 0xf;
7779
7780 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7781 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7782 cb_ci.pNext = nullptr;
7783 cb_ci.attachmentCount = 1;
7784 cb_ci.pAttachments = &att;
7785
7786 VkGraphicsPipelineCreateInfo gp_ci = {};
7787 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7788 gp_ci.stageCount = 2;
7789 gp_ci.pStages = shaderStages;
7790 gp_ci.pVertexInputState = &vi_ci;
7791 gp_ci.pInputAssemblyState = &ia_ci;
7792 gp_ci.pViewportState = &vp_state_ci;
7793 gp_ci.pRasterizationState = &rs_ci;
7794 gp_ci.pColorBlendState = &cb_ci;
7795 gp_ci.pDynamicState = &dyn_state_ci;
7796 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7797 gp_ci.layout = pipeline_layout;
7798 gp_ci.renderPass = renderPass();
7799
7800 VkPipelineCacheCreateInfo pc_ci = {};
7801 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7802
7803 VkPipeline pipeline;
7804 VkPipelineCache pipelineCache;
7805
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007806 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06007807 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007808 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06007809
7810 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06007811 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06007812
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007813 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06007814
7815 // Check too high (line width of 65536.0f).
7816 rs_ci.lineWidth = 65536.0f;
7817
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007818 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06007819 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007820 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06007821
7822 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06007823 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06007824
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06007826
7827 dyn_state_ci.dynamicStateCount = 3;
7828
7829 rs_ci.lineWidth = 1.0f;
7830
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007831 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06007832 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007833 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06007834 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007835 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06007836
7837 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06007838 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06007839 m_errorMonitor->VerifyFound();
7840
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007841 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06007842
7843 // Check too high with dynamic setting.
7844 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
7845 m_errorMonitor->VerifyFound();
7846 EndCommandBuffer();
7847
7848 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7849 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7850 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7851 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007852 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06007853}
7854
Karl Schultz6addd812016-02-02 17:17:23 -07007855TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007856 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7858 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007859
7860 ASSERT_NO_FATAL_FAILURE(InitState());
7861 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007862
Tony Barbourfe3351b2015-07-28 10:17:20 -06007863 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007864 // Don't care about RenderPass handle b/c error should be flagged before
7865 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007866 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007867
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007868 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06007869}
7870
Karl Schultz6addd812016-02-02 17:17:23 -07007871TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007872 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007873 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7874 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007875
7876 ASSERT_NO_FATAL_FAILURE(InitState());
7877 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007878
Tony Barbourfe3351b2015-07-28 10:17:20 -06007879 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007880 // Just create a dummy Renderpass that's non-NULL so we can get to the
7881 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007882 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007883
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007884 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06007885}
7886
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06007887TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
7888 TEST_DESCRIPTION("Begin a renderPass where clearValueCount is less than"
7889 "the number of renderPass attachments that use loadOp"
7890 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
7891
7892 ASSERT_NO_FATAL_FAILURE(InitState());
7893 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7894
7895 // Create a renderPass with a single attachment that uses loadOp CLEAR
7896 VkAttachmentReference attach = {};
7897 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7898 VkSubpassDescription subpass = {};
7899 subpass.inputAttachmentCount = 1;
7900 subpass.pInputAttachments = &attach;
7901 VkRenderPassCreateInfo rpci = {};
7902 rpci.subpassCount = 1;
7903 rpci.pSubpasses = &subpass;
7904 rpci.attachmentCount = 1;
7905 VkAttachmentDescription attach_desc = {};
7906 attach_desc.format = VK_FORMAT_UNDEFINED;
7907 // Set loadOp to CLEAR
7908 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
7909 rpci.pAttachments = &attach_desc;
7910 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
7911 VkRenderPass rp;
7912 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7913
7914 VkCommandBufferInheritanceInfo hinfo = {};
7915 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7916 hinfo.renderPass = VK_NULL_HANDLE;
7917 hinfo.subpass = 0;
7918 hinfo.framebuffer = VK_NULL_HANDLE;
7919 hinfo.occlusionQueryEnable = VK_FALSE;
7920 hinfo.queryFlags = 0;
7921 hinfo.pipelineStatistics = 0;
7922 VkCommandBufferBeginInfo info = {};
7923 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
7924 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7925 info.pInheritanceInfo = &hinfo;
7926
7927 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
7928 VkRenderPassBeginInfo rp_begin = {};
7929 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
7930 rp_begin.pNext = NULL;
7931 rp_begin.renderPass = renderPass();
7932 rp_begin.framebuffer = framebuffer();
7933 rp_begin.clearValueCount = 0; // Should be 1
7934
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007935 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has a clearValueCount of 0 but "
7936 "there must be at least 1 entries in "
7937 "pClearValues array to account for ");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06007938
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007939 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06007940
7941 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06007942
7943 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06007944}
7945
Slawomir Cygan0808f392016-11-28 17:53:23 +01007946TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
7947 TEST_DESCRIPTION("Begin a renderPass where clearValueCount is greater than"
7948 "the number of renderPass attachments that use loadOp"
7949 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
7950
7951 ASSERT_NO_FATAL_FAILURE(InitState());
7952 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7953
7954 // Create a renderPass with a single attachment that uses loadOp CLEAR
7955 VkAttachmentReference attach = {};
7956 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
7957 VkSubpassDescription subpass = {};
7958 subpass.inputAttachmentCount = 1;
7959 subpass.pInputAttachments = &attach;
7960 VkRenderPassCreateInfo rpci = {};
7961 rpci.subpassCount = 1;
7962 rpci.pSubpasses = &subpass;
7963 rpci.attachmentCount = 1;
7964 VkAttachmentDescription attach_desc = {};
7965 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
7966 // Set loadOp to CLEAR
7967 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
7968 rpci.pAttachments = &attach_desc;
7969 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
7970 VkRenderPass rp;
7971 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
7972
7973 VkCommandBufferBeginInfo info = {};
7974 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
7975 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7976
7977 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
7978 VkRenderPassBeginInfo rp_begin = {};
7979 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
7980 rp_begin.pNext = NULL;
7981 rp_begin.renderPass = renderPass();
7982 rp_begin.framebuffer = framebuffer();
7983 rp_begin.clearValueCount = 2; // Should be 1
7984
7985 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " has a clearValueCount of"
7986 " 2 but only first 1 entries in pClearValues array are used");
7987
7988 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
7989
7990 m_errorMonitor->VerifyFound();
7991
7992 vkDestroyRenderPass(m_device->device(), rp, NULL);
7993}
7994
7995
Cody Northrop3bb4d962016-05-09 16:15:57 -06007996TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
7997
7998 TEST_DESCRIPTION("End a command buffer with an active render pass");
7999
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008000 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8001 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008002
8003 ASSERT_NO_FATAL_FAILURE(InitState());
8004 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8005
8006 // The framework's BeginCommandBuffer calls CreateRenderPass
8007 BeginCommandBuffer();
8008
8009 // Call directly into vkEndCommandBuffer instead of the
8010 // the framework's EndCommandBuffer, which inserts a
8011 // vkEndRenderPass
8012 vkEndCommandBuffer(m_commandBuffer->GetBufferHandle());
8013
8014 m_errorMonitor->VerifyFound();
8015
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008016 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8017 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008018}
8019
Karl Schultz6addd812016-02-02 17:17:23 -07008020TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008021 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008022 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8023 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008024
8025 ASSERT_NO_FATAL_FAILURE(InitState());
8026 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008027
8028 // Renderpass is started here
8029 BeginCommandBuffer();
8030
8031 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008032 vk_testing::Buffer dstBuffer;
8033 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008034
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008035 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008036
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008037 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008038}
8039
Karl Schultz6addd812016-02-02 17:17:23 -07008040TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008041 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008042 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8043 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008044
8045 ASSERT_NO_FATAL_FAILURE(InitState());
8046 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008047
8048 // Renderpass is started here
8049 BeginCommandBuffer();
8050
8051 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008052 vk_testing::Buffer dstBuffer;
8053 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008054
Karl Schultz6addd812016-02-02 17:17:23 -07008055 VkDeviceSize dstOffset = 0;
8056 VkDeviceSize dataSize = 1024;
Karl Schultzee344492016-07-11 15:09:57 -06008057 const void *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008058
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008059 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008060
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008061 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008062}
8063
Karl Schultz6addd812016-02-02 17:17:23 -07008064TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008065 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008066 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8067 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008068
8069 ASSERT_NO_FATAL_FAILURE(InitState());
8070 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008071
8072 // Renderpass is started here
8073 BeginCommandBuffer();
8074
Michael Lentine0a369f62016-02-03 16:51:46 -06008075 VkClearColorValue clear_color;
8076 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008077 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8078 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8079 const int32_t tex_width = 32;
8080 const int32_t tex_height = 32;
8081 VkImageCreateInfo image_create_info = {};
8082 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8083 image_create_info.pNext = NULL;
8084 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8085 image_create_info.format = tex_format;
8086 image_create_info.extent.width = tex_width;
8087 image_create_info.extent.height = tex_height;
8088 image_create_info.extent.depth = 1;
8089 image_create_info.mipLevels = 1;
8090 image_create_info.arrayLayers = 1;
8091 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8092 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8093 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008094
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008095 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008096 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008097
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008098 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008099
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008100 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008101
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008102 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008103}
8104
Karl Schultz6addd812016-02-02 17:17:23 -07008105TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008106 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008107 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8108 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008109
8110 ASSERT_NO_FATAL_FAILURE(InitState());
8111 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008112
8113 // Renderpass is started here
8114 BeginCommandBuffer();
8115
8116 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008117 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008118 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8119 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8120 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
8121 image_create_info.extent.width = 64;
8122 image_create_info.extent.height = 64;
8123 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8124 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008125
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008126 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008127 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008128
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008129 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008130
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008131 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
8132 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008133
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008134 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008135}
8136
Karl Schultz6addd812016-02-02 17:17:23 -07008137TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008138 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008139 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008140
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008141 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearAttachments(): This call "
8142 "must be issued inside an active "
8143 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008144
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008145 ASSERT_NO_FATAL_FAILURE(InitState());
8146 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008147
8148 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008149 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008150 ASSERT_VK_SUCCESS(err);
8151
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008152 VkClearAttachment color_attachment;
8153 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8154 color_attachment.clearValue.color.float32[0] = 0;
8155 color_attachment.clearValue.color.float32[1] = 0;
8156 color_attachment.clearValue.color.float32[2] = 0;
8157 color_attachment.clearValue.color.float32[3] = 0;
8158 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008159 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008160 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008161
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008162 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008163}
8164
Chris Forbes3b97e932016-09-07 11:29:24 +12008165TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
8166 TEST_DESCRIPTION("Test that an error is produced when CmdNextSubpass is "
8167 "called too many times in a renderpass instance");
8168
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008169 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdNextSubpass(): Attempted to advance "
8170 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12008171
8172 ASSERT_NO_FATAL_FAILURE(InitState());
8173 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8174
8175 BeginCommandBuffer();
8176
8177 // error here.
8178 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
8179 m_errorMonitor->VerifyFound();
8180
8181 EndCommandBuffer();
8182}
8183
Chris Forbes6d624702016-09-07 13:57:05 +12008184TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
8185 TEST_DESCRIPTION("Test that an error is produced when CmdEndRenderPass is "
8186 "called before the final subpass has been reached");
8187
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdEndRenderPass(): Called before reaching "
8189 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12008190
8191 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008192 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
8193 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12008194
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008195 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12008196
8197 VkRenderPass rp;
8198 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
8199 ASSERT_VK_SUCCESS(err);
8200
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008201 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12008202
8203 VkFramebuffer fb;
8204 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
8205 ASSERT_VK_SUCCESS(err);
8206
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008207 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12008208
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008209 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 +12008210
8211 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
8212
8213 // Error here.
8214 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8215 m_errorMonitor->VerifyFound();
8216
8217 // Clean up.
8218 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
8219 vkDestroyRenderPass(m_device->device(), rp, nullptr);
8220}
8221
Karl Schultz9e66a292016-04-21 15:57:51 -06008222TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
8223 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8225 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06008226
8227 ASSERT_NO_FATAL_FAILURE(InitState());
8228 BeginCommandBuffer();
8229
8230 VkBufferMemoryBarrier buf_barrier = {};
8231 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8232 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8233 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8234 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8235 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8236 buf_barrier.buffer = VK_NULL_HANDLE;
8237 buf_barrier.offset = 0;
8238 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008239 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8240 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06008241
8242 m_errorMonitor->VerifyFound();
8243}
8244
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008245TEST_F(VkLayerTest, InvalidBarriers) {
8246 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
8247
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008248 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008249
8250 ASSERT_NO_FATAL_FAILURE(InitState());
8251 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8252
8253 VkMemoryBarrier mem_barrier = {};
8254 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
8255 mem_barrier.pNext = NULL;
8256 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8257 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8258 BeginCommandBuffer();
8259 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008260 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008261 &mem_barrier, 0, nullptr, 0, nullptr);
8262 m_errorMonitor->VerifyFound();
8263
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008264 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008265 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008266 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 -06008267 ASSERT_TRUE(image.initialized());
8268 VkImageMemoryBarrier img_barrier = {};
8269 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8270 img_barrier.pNext = NULL;
8271 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8272 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8273 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8274 // New layout can't be UNDEFINED
8275 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8276 img_barrier.image = image.handle();
8277 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8278 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8279 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8280 img_barrier.subresourceRange.baseArrayLayer = 0;
8281 img_barrier.subresourceRange.baseMipLevel = 0;
8282 img_barrier.subresourceRange.layerCount = 1;
8283 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008284 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8285 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008286 m_errorMonitor->VerifyFound();
8287 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8288
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008289 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the "
8290 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008291 // baseArrayLayer + layerCount must be <= image's arrayLayers
8292 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008293 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8294 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008295 m_errorMonitor->VerifyFound();
8296 img_barrier.subresourceRange.baseArrayLayer = 0;
8297
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008298 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008299 // baseMipLevel + levelCount must be <= image's mipLevels
8300 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008301 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8302 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008303 m_errorMonitor->VerifyFound();
8304 img_barrier.subresourceRange.baseMipLevel = 0;
8305
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008306 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 -06008307 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07008308 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8309 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008310 VkBufferMemoryBarrier buf_barrier = {};
8311 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8312 buf_barrier.pNext = NULL;
8313 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8314 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8315 buf_barrier.buffer = buffer.handle();
8316 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8317 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8318 buf_barrier.offset = 0;
8319 buf_barrier.size = VK_WHOLE_SIZE;
8320 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008321 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8322 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008323 m_errorMonitor->VerifyFound();
8324 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8325
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008326 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008327 buf_barrier.offset = 257;
8328 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008329 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8330 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008331 m_errorMonitor->VerifyFound();
8332 buf_barrier.offset = 0;
8333
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008334 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008335 buf_barrier.size = 257;
8336 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008337 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8338 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008339 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008340
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008341 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008342 m_errorMonitor->SetDesiredFailureMsg(
8343 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8344 "Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
8345 m_errorMonitor->SetDesiredFailureMsg(
8346 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8347 "Depth/stencil image formats must have at least one of VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008348 VkDepthStencilObj ds_image(m_device);
8349 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
8350 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06008351 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
8352 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008353 img_barrier.image = ds_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06008354 // Use of COLOR aspect on DS image is error
8355 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008356 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8357 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008358 m_errorMonitor->VerifyFound();
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008359 // Now test depth-only
8360 VkFormatProperties format_props;
8361
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008362 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
8363 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008364 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8365 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
8366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8367 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008368 VkDepthStencilObj d_image(m_device);
8369 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
8370 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008371 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06008372 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008373 img_barrier.image = d_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06008374 // Use of COLOR aspect on depth image is error
8375 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008376 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
8377 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008378 m_errorMonitor->VerifyFound();
8379 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008380 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
8381 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008382 // Now test stencil-only
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008383 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8384 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008385 VkDepthStencilObj s_image(m_device);
8386 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
8387 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008388 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06008389 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008390 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06008391 // Use of COLOR aspect on depth image is error
8392 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008393 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
8394 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008395 m_errorMonitor->VerifyFound();
8396 }
8397 // Finally test color
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06008398 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8399 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
8400 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8401 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008402 VkImageObj c_image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008403 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 -06008404 ASSERT_TRUE(c_image.initialized());
8405 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8406 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
8407 img_barrier.image = c_image.handle();
8408 // Set aspect to depth (non-color)
8409 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008410 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8411 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06008412 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07008413
8414 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
8415
8416 // Create command pool with incompatible queueflags
8417 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
8418 uint32_t queue_family_index = UINT32_MAX;
8419 for (uint32_t i = 0; i < queue_props.size(); i++) {
8420 if ((queue_props[i].queueFlags & VK_QUEUE_COMPUTE_BIT) == 0) {
8421 queue_family_index = i;
8422 break;
8423 }
8424 }
8425 if (queue_family_index == UINT32_MAX) {
8426 printf("No non-compute queue found; skipped.\n");
8427 return;
8428 }
8429 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
8430
8431 VkCommandPool command_pool;
8432 VkCommandPoolCreateInfo pool_create_info{};
8433 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
8434 pool_create_info.queueFamilyIndex = queue_family_index;
8435 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
8436 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
8437
8438 // Allocate a command buffer
8439 VkCommandBuffer bad_command_buffer;
8440 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
8441 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
8442 command_buffer_allocate_info.commandPool = command_pool;
8443 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
8444 command_buffer_allocate_info.commandBufferCount = 1;
8445 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
8446
8447 VkCommandBufferBeginInfo cbbi = {};
8448 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8449 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
8450 buf_barrier.offset = 0;
8451 buf_barrier.size = VK_WHOLE_SIZE;
8452 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
8453 &buf_barrier, 0, nullptr);
8454 m_errorMonitor->VerifyFound();
8455
8456 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
8457 vkEndCommandBuffer(bad_command_buffer);
8458 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
8459 printf("The non-compute queue does not support graphics; skipped.\n");
8460 return;
8461 }
8462 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
8463 VkEvent event;
8464 VkEventCreateInfo event_create_info{};
8465 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
8466 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
8467 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
8468 nullptr, 0, nullptr);
8469 m_errorMonitor->VerifyFound();
8470
8471 vkEndCommandBuffer(bad_command_buffer);
8472 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008473}
8474
Tony Barbour18ba25c2016-09-29 13:42:40 -06008475TEST_F(VkLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
8476 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ in srcAccessMask
8477
8478 m_errorMonitor->SetDesiredFailureMsg(
8479 VK_DEBUG_REPORT_WARNING_BIT_EXT,
8480 "must have required access bit");
8481 ASSERT_NO_FATAL_FAILURE(InitState());
8482 VkImageObj image(m_device);
Tony Barbour256c80a2016-10-05 13:23:46 -06008483 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 -06008484 ASSERT_TRUE(image.initialized());
8485
8486 VkImageMemoryBarrier barrier = {};
8487 VkImageSubresourceRange range;
8488 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8489 barrier.srcAccessMask = 0;
8490 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
8491 barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
8492 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8493 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
8494 barrier.image = image.handle();
8495 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8496 range.baseMipLevel = 0;
8497 range.levelCount = 1;
8498 range.baseArrayLayer = 0;
8499 range.layerCount = 1;
8500 barrier.subresourceRange = range;
8501 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
8502 cmdbuf.BeginCommandBuffer();
8503 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
8504 &barrier);
8505 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
8506 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
8507 barrier.srcAccessMask = 0;
8508 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
8509 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
8510 &barrier);
8511
8512 m_errorMonitor->VerifyFound();
8513}
8514
Karl Schultz6addd812016-02-02 17:17:23 -07008515TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008516 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008517 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008518
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008519 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008520
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008521 ASSERT_NO_FATAL_FAILURE(InitState());
8522 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008523 uint32_t qfi = 0;
8524 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008525 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8526 buffCI.size = 1024;
8527 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
8528 buffCI.queueFamilyIndexCount = 1;
8529 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008530
8531 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08008532 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008533 ASSERT_VK_SUCCESS(err);
8534
8535 BeginCommandBuffer();
8536 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008537 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8538 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008539 // Should error before calling to driver so don't care about actual data
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008540 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7, VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008541
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008542 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008543
Chia-I Wuf7458c52015-10-26 21:10:41 +08008544 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06008545}
8546
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008547TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
8548 // Create an out-of-range queueFamilyIndex
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008549 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8550 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
8551 "of the indices specified when the device was created, via the "
8552 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008553
8554 ASSERT_NO_FATAL_FAILURE(InitState());
8555 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8556 VkBufferCreateInfo buffCI = {};
8557 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8558 buffCI.size = 1024;
8559 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
8560 buffCI.queueFamilyIndexCount = 1;
8561 // Introduce failure by specifying invalid queue_family_index
8562 uint32_t qfi = 777;
8563 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06008564 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008565
8566 VkBuffer ib;
8567 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
8568
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008569 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008570 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07008571}
8572
Karl Schultz6addd812016-02-02 17:17:23 -07008573TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -06008574TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a primary command buffer"
Tobin Ehlis0c94db02016-07-19 10:49:32 -06008575 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008576
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008577 ASSERT_NO_FATAL_FAILURE(InitState());
8578 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008579
Chris Forbesf29a84f2016-10-06 18:39:28 +13008580 // An empty primary command buffer
8581 VkCommandBufferObj cb(m_device, m_commandPool);
8582 cb.BeginCommandBuffer();
8583 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -06008584
Chris Forbesf29a84f2016-10-06 18:39:28 +13008585 m_commandBuffer->BeginCommandBuffer();
8586 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
8587 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008588
Chris Forbesf29a84f2016-10-06 18:39:28 +13008589 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
8590 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008591 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06008592}
8593
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008594TEST_F(VkLayerTest, DSUsageBitsErrors) {
8595 TEST_DESCRIPTION("Attempt to update descriptor sets for images and buffers "
8596 "that do not have correct usage bits sets.");
8597 VkResult err;
8598
8599 ASSERT_NO_FATAL_FAILURE(InitState());
8600 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
8601 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8602 ds_type_count[i].type = VkDescriptorType(i);
8603 ds_type_count[i].descriptorCount = 1;
8604 }
8605 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8606 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8607 ds_pool_ci.pNext = NULL;
8608 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
8609 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
8610 ds_pool_ci.pPoolSizes = ds_type_count;
8611
8612 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008613 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008614 ASSERT_VK_SUCCESS(err);
8615
8616 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008617 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008618 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8619 dsl_binding[i].binding = 0;
8620 dsl_binding[i].descriptorType = VkDescriptorType(i);
8621 dsl_binding[i].descriptorCount = 1;
8622 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
8623 dsl_binding[i].pImmutableSamplers = NULL;
8624 }
8625
8626 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8627 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8628 ds_layout_ci.pNext = NULL;
8629 ds_layout_ci.bindingCount = 1;
8630 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
8631 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8632 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008633 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008634 ASSERT_VK_SUCCESS(err);
8635 }
8636 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
8637 VkDescriptorSetAllocateInfo alloc_info = {};
8638 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8639 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
8640 alloc_info.descriptorPool = ds_pool;
8641 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008642 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008643 ASSERT_VK_SUCCESS(err);
8644
8645 // Create a buffer & bufferView to be used for invalid updates
8646 VkBufferCreateInfo buff_ci = {};
8647 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8648 // This usage is not valid for any descriptor type
8649 buff_ci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
8650 buff_ci.size = 256;
8651 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
8652 VkBuffer buffer;
8653 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
8654 ASSERT_VK_SUCCESS(err);
8655
8656 VkBufferViewCreateInfo buff_view_ci = {};
8657 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
8658 buff_view_ci.buffer = buffer;
8659 buff_view_ci.format = VK_FORMAT_R8_UNORM;
8660 buff_view_ci.range = VK_WHOLE_SIZE;
8661 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008662 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008663 ASSERT_VK_SUCCESS(err);
8664
8665 // Create an image to be used for invalid updates
8666 VkImageCreateInfo image_ci = {};
8667 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8668 image_ci.imageType = VK_IMAGE_TYPE_2D;
8669 image_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
8670 image_ci.extent.width = 64;
8671 image_ci.extent.height = 64;
8672 image_ci.extent.depth = 1;
8673 image_ci.mipLevels = 1;
8674 image_ci.arrayLayers = 1;
8675 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
8676 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
8677 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
8678 // This usage is not valid for any descriptor type
8679 image_ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
8680 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
8681 VkImage image;
8682 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
8683 ASSERT_VK_SUCCESS(err);
8684 // Bind memory to image
8685 VkMemoryRequirements mem_reqs;
8686 VkDeviceMemory image_mem;
8687 bool pass;
8688 VkMemoryAllocateInfo mem_alloc = {};
8689 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8690 mem_alloc.pNext = NULL;
8691 mem_alloc.allocationSize = 0;
8692 mem_alloc.memoryTypeIndex = 0;
8693 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
8694 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008695 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008696 ASSERT_TRUE(pass);
8697 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
8698 ASSERT_VK_SUCCESS(err);
8699 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
8700 ASSERT_VK_SUCCESS(err);
8701 // Now create view for image
8702 VkImageViewCreateInfo image_view_ci = {};
8703 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
8704 image_view_ci.image = image;
8705 image_view_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
8706 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
8707 image_view_ci.subresourceRange.layerCount = 1;
8708 image_view_ci.subresourceRange.baseArrayLayer = 0;
8709 image_view_ci.subresourceRange.levelCount = 1;
8710 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8711 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008712 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008713 ASSERT_VK_SUCCESS(err);
8714
8715 VkDescriptorBufferInfo buff_info = {};
8716 buff_info.buffer = buffer;
8717 VkDescriptorImageInfo img_info = {};
8718 img_info.imageView = image_view;
8719 VkWriteDescriptorSet descriptor_write = {};
8720 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8721 descriptor_write.dstBinding = 0;
8722 descriptor_write.descriptorCount = 1;
8723 descriptor_write.pTexelBufferView = &buff_view;
8724 descriptor_write.pBufferInfo = &buff_info;
8725 descriptor_write.pImageInfo = &img_info;
8726
8727 // These error messages align with VkDescriptorType struct
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008728 const char *error_msgs[] = {"", // placeholder, no error for SAMPLER descriptor
8729 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
8730 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
8731 " does not have VK_IMAGE_USAGE_STORAGE_BIT set.",
8732 " does not have VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT set.",
8733 " does not have VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set.",
8734 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
8735 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
8736 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
8737 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
8738 " does not have VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set."};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008739 // Start loop at 1 as SAMPLER desc type has no usage bit error
8740 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
8741 descriptor_write.descriptorType = VkDescriptorType(i);
8742 descriptor_write.dstSet = descriptor_sets[i];
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008743 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msgs[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008744
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008745 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008746
8747 m_errorMonitor->VerifyFound();
8748 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
8749 }
8750 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
8751 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008752 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008753 vkDestroyImageView(m_device->device(), image_view, NULL);
8754 vkDestroyBuffer(m_device->device(), buffer, NULL);
8755 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008756 vkFreeDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_TYPE_RANGE_SIZE, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06008757 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
8758}
8759
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008760TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008761 TEST_DESCRIPTION("Attempt to update buffer descriptor set that has incorrect "
8762 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
8763 "1. offset value greater than buffer size\n"
8764 "2. range value of 0\n"
8765 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008766 VkResult err;
8767
8768 ASSERT_NO_FATAL_FAILURE(InitState());
8769 VkDescriptorPoolSize ds_type_count = {};
8770 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8771 ds_type_count.descriptorCount = 1;
8772
8773 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8774 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8775 ds_pool_ci.pNext = NULL;
8776 ds_pool_ci.maxSets = 1;
8777 ds_pool_ci.poolSizeCount = 1;
8778 ds_pool_ci.pPoolSizes = &ds_type_count;
8779
8780 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008781 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008782 ASSERT_VK_SUCCESS(err);
8783
8784 // Create layout with single uniform buffer descriptor
8785 VkDescriptorSetLayoutBinding dsl_binding = {};
8786 dsl_binding.binding = 0;
8787 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8788 dsl_binding.descriptorCount = 1;
8789 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8790 dsl_binding.pImmutableSamplers = NULL;
8791
8792 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8793 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8794 ds_layout_ci.pNext = NULL;
8795 ds_layout_ci.bindingCount = 1;
8796 ds_layout_ci.pBindings = &dsl_binding;
8797 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008798 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008799 ASSERT_VK_SUCCESS(err);
8800
8801 VkDescriptorSet descriptor_set = {};
8802 VkDescriptorSetAllocateInfo alloc_info = {};
8803 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8804 alloc_info.descriptorSetCount = 1;
8805 alloc_info.descriptorPool = ds_pool;
8806 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008807 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008808 ASSERT_VK_SUCCESS(err);
8809
8810 // Create a buffer to be used for invalid updates
8811 VkBufferCreateInfo buff_ci = {};
8812 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8813 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
8814 buff_ci.size = 256;
8815 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
8816 VkBuffer buffer;
8817 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
8818 ASSERT_VK_SUCCESS(err);
8819 // Have to bind memory to buffer before descriptor update
8820 VkMemoryAllocateInfo mem_alloc = {};
8821 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8822 mem_alloc.pNext = NULL;
8823 mem_alloc.allocationSize = 256;
8824 mem_alloc.memoryTypeIndex = 0;
8825
8826 VkMemoryRequirements mem_reqs;
8827 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008828 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008829 if (!pass) {
8830 vkDestroyBuffer(m_device->device(), buffer, NULL);
8831 return;
8832 }
8833
8834 VkDeviceMemory mem;
8835 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
8836 ASSERT_VK_SUCCESS(err);
8837 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
8838 ASSERT_VK_SUCCESS(err);
8839
8840 VkDescriptorBufferInfo buff_info = {};
8841 buff_info.buffer = buffer;
8842 // First make offset 1 larger than buffer size
8843 buff_info.offset = 257;
8844 buff_info.range = VK_WHOLE_SIZE;
8845 VkWriteDescriptorSet descriptor_write = {};
8846 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8847 descriptor_write.dstBinding = 0;
8848 descriptor_write.descriptorCount = 1;
8849 descriptor_write.pTexelBufferView = nullptr;
8850 descriptor_write.pBufferInfo = &buff_info;
8851 descriptor_write.pImageInfo = nullptr;
8852
8853 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8854 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008855 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " offset of 257 is greater than buffer ");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008856
8857 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8858
8859 m_errorMonitor->VerifyFound();
8860 // Now cause error due to range of 0
8861 buff_info.offset = 0;
8862 buff_info.range = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8864 " range is not VK_WHOLE_SIZE and is zero, which is not allowed.");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008865
8866 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8867
8868 m_errorMonitor->VerifyFound();
8869 // Now cause error due to range exceeding buffer size - offset
8870 buff_info.offset = 128;
8871 buff_info.range = 200;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008872 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 -06008873
8874 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8875
8876 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -06008877 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06008878 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8879 vkDestroyBuffer(m_device->device(), buffer, NULL);
8880 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
8881 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
8882}
8883
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008884TEST_F(VkLayerTest, DSAspectBitsErrors) {
8885 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
8886 // are set, but could expand this test to hit more cases.
8887 TEST_DESCRIPTION("Attempt to update descriptor sets for images "
8888 "that do not have correct aspect bits sets.");
8889 VkResult err;
8890
8891 ASSERT_NO_FATAL_FAILURE(InitState());
8892 VkDescriptorPoolSize ds_type_count = {};
8893 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
8894 ds_type_count.descriptorCount = 1;
8895
8896 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8897 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8898 ds_pool_ci.pNext = NULL;
8899 ds_pool_ci.maxSets = 5;
8900 ds_pool_ci.poolSizeCount = 1;
8901 ds_pool_ci.pPoolSizes = &ds_type_count;
8902
8903 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008904 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008905 ASSERT_VK_SUCCESS(err);
8906
8907 VkDescriptorSetLayoutBinding dsl_binding = {};
8908 dsl_binding.binding = 0;
8909 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
8910 dsl_binding.descriptorCount = 1;
8911 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8912 dsl_binding.pImmutableSamplers = NULL;
8913
8914 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8915 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8916 ds_layout_ci.pNext = NULL;
8917 ds_layout_ci.bindingCount = 1;
8918 ds_layout_ci.pBindings = &dsl_binding;
8919 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008920 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008921 ASSERT_VK_SUCCESS(err);
8922
8923 VkDescriptorSet descriptor_set = {};
8924 VkDescriptorSetAllocateInfo alloc_info = {};
8925 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8926 alloc_info.descriptorSetCount = 1;
8927 alloc_info.descriptorPool = ds_pool;
8928 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008929 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008930 ASSERT_VK_SUCCESS(err);
8931
8932 // Create an image to be used for invalid updates
8933 VkImageCreateInfo image_ci = {};
8934 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8935 image_ci.imageType = VK_IMAGE_TYPE_2D;
8936 image_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
8937 image_ci.extent.width = 64;
8938 image_ci.extent.height = 64;
8939 image_ci.extent.depth = 1;
8940 image_ci.mipLevels = 1;
8941 image_ci.arrayLayers = 1;
8942 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
8943 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
8944 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
8945 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8946 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
8947 VkImage image;
8948 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
8949 ASSERT_VK_SUCCESS(err);
8950 // Bind memory to image
8951 VkMemoryRequirements mem_reqs;
8952 VkDeviceMemory image_mem;
8953 bool pass;
8954 VkMemoryAllocateInfo mem_alloc = {};
8955 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8956 mem_alloc.pNext = NULL;
8957 mem_alloc.allocationSize = 0;
8958 mem_alloc.memoryTypeIndex = 0;
8959 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
8960 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008961 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008962 ASSERT_TRUE(pass);
8963 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
8964 ASSERT_VK_SUCCESS(err);
8965 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
8966 ASSERT_VK_SUCCESS(err);
8967 // Now create view for image
8968 VkImageViewCreateInfo image_view_ci = {};
8969 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
8970 image_view_ci.image = image;
8971 image_view_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
8972 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
8973 image_view_ci.subresourceRange.layerCount = 1;
8974 image_view_ci.subresourceRange.baseArrayLayer = 0;
8975 image_view_ci.subresourceRange.levelCount = 1;
8976 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008977 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008978
8979 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008980 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008981 ASSERT_VK_SUCCESS(err);
8982
8983 VkDescriptorImageInfo img_info = {};
8984 img_info.imageView = image_view;
8985 VkWriteDescriptorSet descriptor_write = {};
8986 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8987 descriptor_write.dstBinding = 0;
8988 descriptor_write.descriptorCount = 1;
8989 descriptor_write.pTexelBufferView = NULL;
8990 descriptor_write.pBufferInfo = NULL;
8991 descriptor_write.pImageInfo = &img_info;
8992 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
8993 descriptor_write.dstSet = descriptor_set;
8994 const char *error_msg = " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
8995 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008996 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06008997
8998 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8999
9000 m_errorMonitor->VerifyFound();
9001 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9002 vkDestroyImage(m_device->device(), image, NULL);
9003 vkFreeMemory(m_device->device(), image_mem, NULL);
9004 vkDestroyImageView(m_device->device(), image_view, NULL);
9005 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9006 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9007}
9008
Karl Schultz6addd812016-02-02 17:17:23 -07009009TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009010 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -07009011 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009012
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009013 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9014 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
9015 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009016
Tobin Ehlis3b780662015-05-28 12:11:26 -06009017 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009018 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009019 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009020 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9021 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009022
9023 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009024 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9025 ds_pool_ci.pNext = NULL;
9026 ds_pool_ci.maxSets = 1;
9027 ds_pool_ci.poolSizeCount = 1;
9028 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06009029
Tobin Ehlis3b780662015-05-28 12:11:26 -06009030 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009031 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009032 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06009033 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009034 dsl_binding.binding = 0;
9035 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9036 dsl_binding.descriptorCount = 1;
9037 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9038 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009039
Tony Barboureb254902015-07-15 12:50:33 -06009040 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009041 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9042 ds_layout_ci.pNext = NULL;
9043 ds_layout_ci.bindingCount = 1;
9044 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009045
Tobin Ehlis3b780662015-05-28 12:11:26 -06009046 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009047 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009048 ASSERT_VK_SUCCESS(err);
9049
9050 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009051 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009052 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009053 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009054 alloc_info.descriptorPool = ds_pool;
9055 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009056 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009057 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009058
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009059 VkSamplerCreateInfo sampler_ci = {};
9060 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9061 sampler_ci.pNext = NULL;
9062 sampler_ci.magFilter = VK_FILTER_NEAREST;
9063 sampler_ci.minFilter = VK_FILTER_NEAREST;
9064 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9065 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9066 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9067 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9068 sampler_ci.mipLodBias = 1.0;
9069 sampler_ci.anisotropyEnable = VK_FALSE;
9070 sampler_ci.maxAnisotropy = 1;
9071 sampler_ci.compareEnable = VK_FALSE;
9072 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9073 sampler_ci.minLod = 1.0;
9074 sampler_ci.maxLod = 1.0;
9075 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9076 sampler_ci.unnormalizedCoordinates = VK_FALSE;
9077 VkSampler sampler;
9078 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
9079 ASSERT_VK_SUCCESS(err);
9080
9081 VkDescriptorImageInfo info = {};
9082 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009083
9084 VkWriteDescriptorSet descriptor_write;
9085 memset(&descriptor_write, 0, sizeof(descriptor_write));
9086 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009087 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009088 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009089 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009090 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009091 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009092
9093 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9094
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009095 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009096
Chia-I Wuf7458c52015-10-26 21:10:41 +08009097 vkDestroySampler(m_device->device(), sampler, NULL);
9098 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9099 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009100}
9101
Karl Schultz6addd812016-02-02 17:17:23 -07009102TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009103 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -07009104 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009105
Tobin Ehlisf922ef82016-11-30 10:19:14 -07009106 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009107
Tobin Ehlis3b780662015-05-28 12:11:26 -06009108 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009109 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009110 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009111 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9112 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009113
9114 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009115 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9116 ds_pool_ci.pNext = NULL;
9117 ds_pool_ci.maxSets = 1;
9118 ds_pool_ci.poolSizeCount = 1;
9119 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -06009120
Tobin Ehlis3b780662015-05-28 12:11:26 -06009121 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009122 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009123 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009124
Tony Barboureb254902015-07-15 12:50:33 -06009125 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009126 dsl_binding.binding = 0;
9127 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9128 dsl_binding.descriptorCount = 1;
9129 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9130 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06009131
9132 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009133 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9134 ds_layout_ci.pNext = NULL;
9135 ds_layout_ci.bindingCount = 1;
9136 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009137
Tobin Ehlis3b780662015-05-28 12:11:26 -06009138 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009139 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009140 ASSERT_VK_SUCCESS(err);
9141
9142 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009143 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009144 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009145 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009146 alloc_info.descriptorPool = ds_pool;
9147 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009148 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009149 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009150
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009151 // Correctly update descriptor to avoid "NOT_UPDATED" error
9152 VkDescriptorBufferInfo buff_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009153 buff_info.buffer = VkBuffer(0); // Don't care about buffer handle for this test
Tobin Ehlis30db8f82016-05-05 08:19:48 -06009154 buff_info.offset = 0;
9155 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009156
9157 VkWriteDescriptorSet descriptor_write;
9158 memset(&descriptor_write, 0, sizeof(descriptor_write));
9159 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009160 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009161 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +08009162 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06009163 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9164 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009165
9166 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9167
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009168 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009169
Chia-I Wuf7458c52015-10-26 21:10:41 +08009170 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9171 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009172}
9173
Karl Schultz6addd812016-02-02 17:17:23 -07009174TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -07009175 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -07009176 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009177
Tobin Ehlisc8d352d2016-11-21 10:33:40 -07009178 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009179
Tobin Ehlis3b780662015-05-28 12:11:26 -06009180 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009181 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009182 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009183 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9184 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009185
9186 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009187 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9188 ds_pool_ci.pNext = NULL;
9189 ds_pool_ci.maxSets = 1;
9190 ds_pool_ci.poolSizeCount = 1;
9191 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06009192
Tobin Ehlis3b780662015-05-28 12:11:26 -06009193 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009194 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009195 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009196
Tony Barboureb254902015-07-15 12:50:33 -06009197 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009198 dsl_binding.binding = 0;
9199 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9200 dsl_binding.descriptorCount = 1;
9201 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9202 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -06009203
9204 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009205 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9206 ds_layout_ci.pNext = NULL;
9207 ds_layout_ci.bindingCount = 1;
9208 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009209 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009210 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009211 ASSERT_VK_SUCCESS(err);
9212
9213 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009214 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009215 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009216 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009217 alloc_info.descriptorPool = ds_pool;
9218 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009219 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009220 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009221
Tony Barboureb254902015-07-15 12:50:33 -06009222 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009223 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9224 sampler_ci.pNext = NULL;
9225 sampler_ci.magFilter = VK_FILTER_NEAREST;
9226 sampler_ci.minFilter = VK_FILTER_NEAREST;
9227 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9228 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9229 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9230 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9231 sampler_ci.mipLodBias = 1.0;
9232 sampler_ci.anisotropyEnable = VK_FALSE;
9233 sampler_ci.maxAnisotropy = 1;
9234 sampler_ci.compareEnable = VK_FALSE;
9235 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9236 sampler_ci.minLod = 1.0;
9237 sampler_ci.maxLod = 1.0;
9238 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9239 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -06009240
Tobin Ehlis3b780662015-05-28 12:11:26 -06009241 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009242 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009243 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009244
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009245 VkDescriptorImageInfo info = {};
9246 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009247
9248 VkWriteDescriptorSet descriptor_write;
9249 memset(&descriptor_write, 0, sizeof(descriptor_write));
9250 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009251 descriptor_write.dstSet = descriptorSet;
9252 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009253 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009254 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009255 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009256 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009257
9258 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9259
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009260 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009261
Chia-I Wuf7458c52015-10-26 21:10:41 +08009262 vkDestroySampler(m_device->device(), sampler, NULL);
9263 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9264 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009265}
9266
Tobin Ehlise202b2d2016-11-21 10:36:16 -07009267TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
9268 // Create layout w/ empty binding and attempt to update it
9269 VkResult err;
9270
9271 ASSERT_NO_FATAL_FAILURE(InitState());
9272
9273 VkDescriptorPoolSize ds_type_count = {};
9274 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
9275 ds_type_count.descriptorCount = 1;
9276
9277 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9278 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9279 ds_pool_ci.pNext = NULL;
9280 ds_pool_ci.maxSets = 1;
9281 ds_pool_ci.poolSizeCount = 1;
9282 ds_pool_ci.pPoolSizes = &ds_type_count;
9283
9284 VkDescriptorPool ds_pool;
9285 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9286 ASSERT_VK_SUCCESS(err);
9287
9288 VkDescriptorSetLayoutBinding dsl_binding = {};
9289 dsl_binding.binding = 0;
9290 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9291 dsl_binding.descriptorCount = 0;
9292 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9293 dsl_binding.pImmutableSamplers = NULL;
9294
9295 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9296 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9297 ds_layout_ci.pNext = NULL;
9298 ds_layout_ci.bindingCount = 1;
9299 ds_layout_ci.pBindings = &dsl_binding;
9300 VkDescriptorSetLayout ds_layout;
9301 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
9302 ASSERT_VK_SUCCESS(err);
9303
9304 VkDescriptorSet descriptor_set;
9305 VkDescriptorSetAllocateInfo alloc_info = {};
9306 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9307 alloc_info.descriptorSetCount = 1;
9308 alloc_info.descriptorPool = ds_pool;
9309 alloc_info.pSetLayouts = &ds_layout;
9310 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
9311 ASSERT_VK_SUCCESS(err);
9312
9313 VkSamplerCreateInfo sampler_ci = {};
9314 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9315 sampler_ci.magFilter = VK_FILTER_NEAREST;
9316 sampler_ci.minFilter = VK_FILTER_NEAREST;
9317 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9318 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9319 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9320 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9321 sampler_ci.mipLodBias = 1.0;
9322 sampler_ci.maxAnisotropy = 1;
9323 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9324 sampler_ci.minLod = 1.0;
9325 sampler_ci.maxLod = 1.0;
9326 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9327
9328 VkSampler sampler;
9329 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
9330 ASSERT_VK_SUCCESS(err);
9331
9332 VkDescriptorImageInfo info = {};
9333 info.sampler = sampler;
9334
9335 VkWriteDescriptorSet descriptor_write;
9336 memset(&descriptor_write, 0, sizeof(descriptor_write));
9337 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9338 descriptor_write.dstSet = descriptor_set;
9339 descriptor_write.dstBinding = 0;
9340 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
9341 // This is the wrong type, but empty binding error will be flagged first
9342 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9343 descriptor_write.pImageInfo = &info;
9344
9345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
9346 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9347 m_errorMonitor->VerifyFound();
9348
9349 vkDestroySampler(m_device->device(), sampler, NULL);
9350 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9351 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9352}
9353
Karl Schultz6addd812016-02-02 17:17:23 -07009354TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
9355 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
9356 // types
9357 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009358
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009359 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 -06009360
Tobin Ehlis3b780662015-05-28 12:11:26 -06009361 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06009362
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009363 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009364 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9365 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009366
9367 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009368 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9369 ds_pool_ci.pNext = NULL;
9370 ds_pool_ci.maxSets = 1;
9371 ds_pool_ci.poolSizeCount = 1;
9372 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06009373
Tobin Ehlis3b780662015-05-28 12:11:26 -06009374 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009375 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009376 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -06009377 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009378 dsl_binding.binding = 0;
9379 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9380 dsl_binding.descriptorCount = 1;
9381 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9382 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009383
Tony Barboureb254902015-07-15 12:50:33 -06009384 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009385 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9386 ds_layout_ci.pNext = NULL;
9387 ds_layout_ci.bindingCount = 1;
9388 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009389
Tobin Ehlis3b780662015-05-28 12:11:26 -06009390 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009391 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009392 ASSERT_VK_SUCCESS(err);
9393
9394 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009395 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009396 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009397 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009398 alloc_info.descriptorPool = ds_pool;
9399 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009400 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009401 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009402
Tony Barboureb254902015-07-15 12:50:33 -06009403 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009404 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9405 sampler_ci.pNext = NULL;
9406 sampler_ci.magFilter = VK_FILTER_NEAREST;
9407 sampler_ci.minFilter = VK_FILTER_NEAREST;
9408 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9409 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9410 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9411 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9412 sampler_ci.mipLodBias = 1.0;
9413 sampler_ci.anisotropyEnable = VK_FALSE;
9414 sampler_ci.maxAnisotropy = 1;
9415 sampler_ci.compareEnable = VK_FALSE;
9416 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9417 sampler_ci.minLod = 1.0;
9418 sampler_ci.maxLod = 1.0;
9419 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9420 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009421 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009422 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009423 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009424
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009425 VkDescriptorImageInfo info = {};
9426 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009427
9428 VkWriteDescriptorSet descriptor_write;
9429 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009430 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009431 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009432 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009433 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009434 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -06009435 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +08009436
9437 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9438
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009439 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009440
Chia-I Wuf7458c52015-10-26 21:10:41 +08009441 vkDestroySampler(m_device->device(), sampler, NULL);
9442 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9443 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009444}
9445
Karl Schultz6addd812016-02-02 17:17:23 -07009446TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009447 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -07009448 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009449
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009450 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9451 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009452
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009453 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009454 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
9455 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009456 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009457 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
9458 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009459
9460 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009461 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9462 ds_pool_ci.pNext = NULL;
9463 ds_pool_ci.maxSets = 1;
9464 ds_pool_ci.poolSizeCount = 1;
9465 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009466
9467 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009468 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009469 ASSERT_VK_SUCCESS(err);
9470
9471 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009472 dsl_binding.binding = 0;
9473 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9474 dsl_binding.descriptorCount = 1;
9475 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9476 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009477
9478 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009479 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9480 ds_layout_ci.pNext = NULL;
9481 ds_layout_ci.bindingCount = 1;
9482 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009483 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009484 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009485 ASSERT_VK_SUCCESS(err);
9486
9487 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009488 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009489 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009490 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009491 alloc_info.descriptorPool = ds_pool;
9492 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009493 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009494 ASSERT_VK_SUCCESS(err);
9495
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009496 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009497
9498 VkDescriptorImageInfo descriptor_info;
9499 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
9500 descriptor_info.sampler = sampler;
9501
9502 VkWriteDescriptorSet descriptor_write;
9503 memset(&descriptor_write, 0, sizeof(descriptor_write));
9504 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009505 descriptor_write.dstSet = descriptorSet;
9506 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009507 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009508 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9509 descriptor_write.pImageInfo = &descriptor_info;
9510
9511 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9512
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009513 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009514
Chia-I Wuf7458c52015-10-26 21:10:41 +08009515 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9516 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009517}
9518
Karl Schultz6addd812016-02-02 17:17:23 -07009519TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
9520 // Create a single combined Image/Sampler descriptor and send it an invalid
9521 // imageView
9522 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009523
Karl Schultzf78bcdd2016-11-30 12:36:01 -07009524 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009525
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009526 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009527 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009528 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
9529 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009530
9531 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009532 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9533 ds_pool_ci.pNext = NULL;
9534 ds_pool_ci.maxSets = 1;
9535 ds_pool_ci.poolSizeCount = 1;
9536 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009537
9538 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009539 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009540 ASSERT_VK_SUCCESS(err);
9541
9542 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009543 dsl_binding.binding = 0;
9544 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
9545 dsl_binding.descriptorCount = 1;
9546 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9547 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009548
9549 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009550 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9551 ds_layout_ci.pNext = NULL;
9552 ds_layout_ci.bindingCount = 1;
9553 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009554 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009555 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009556 ASSERT_VK_SUCCESS(err);
9557
9558 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009559 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009560 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009561 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009562 alloc_info.descriptorPool = ds_pool;
9563 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009564 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009565 ASSERT_VK_SUCCESS(err);
9566
9567 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009568 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9569 sampler_ci.pNext = NULL;
9570 sampler_ci.magFilter = VK_FILTER_NEAREST;
9571 sampler_ci.minFilter = VK_FILTER_NEAREST;
9572 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9573 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9574 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9575 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9576 sampler_ci.mipLodBias = 1.0;
9577 sampler_ci.anisotropyEnable = VK_FALSE;
9578 sampler_ci.maxAnisotropy = 1;
9579 sampler_ci.compareEnable = VK_FALSE;
9580 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9581 sampler_ci.minLod = 1.0;
9582 sampler_ci.maxLod = 1.0;
9583 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9584 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009585
9586 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009587 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009588 ASSERT_VK_SUCCESS(err);
9589
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009590 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009591
9592 VkDescriptorImageInfo descriptor_info;
9593 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
9594 descriptor_info.sampler = sampler;
9595 descriptor_info.imageView = view;
9596
9597 VkWriteDescriptorSet descriptor_write;
9598 memset(&descriptor_write, 0, sizeof(descriptor_write));
9599 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009600 descriptor_write.dstSet = descriptorSet;
9601 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009602 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009603 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
9604 descriptor_write.pImageInfo = &descriptor_info;
9605
9606 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9607
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009608 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009609
Chia-I Wuf7458c52015-10-26 21:10:41 +08009610 vkDestroySampler(m_device->device(), sampler, NULL);
9611 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9612 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -06009613}
9614
Karl Schultz6addd812016-02-02 17:17:23 -07009615TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
9616 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
9617 // into the other
9618 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009619
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009620 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding #1 with type "
9621 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
9622 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009623
Tobin Ehlis04356f92015-10-27 16:35:27 -06009624 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -07009625 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009626 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009627 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9628 ds_type_count[0].descriptorCount = 1;
9629 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
9630 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009631
9632 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009633 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9634 ds_pool_ci.pNext = NULL;
9635 ds_pool_ci.maxSets = 1;
9636 ds_pool_ci.poolSizeCount = 2;
9637 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009638
9639 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009640 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009641 ASSERT_VK_SUCCESS(err);
9642 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009643 dsl_binding[0].binding = 0;
9644 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9645 dsl_binding[0].descriptorCount = 1;
9646 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
9647 dsl_binding[0].pImmutableSamplers = NULL;
9648 dsl_binding[1].binding = 1;
9649 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9650 dsl_binding[1].descriptorCount = 1;
9651 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
9652 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009653
9654 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009655 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9656 ds_layout_ci.pNext = NULL;
9657 ds_layout_ci.bindingCount = 2;
9658 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009659
9660 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009661 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009662 ASSERT_VK_SUCCESS(err);
9663
9664 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009665 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009666 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009667 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009668 alloc_info.descriptorPool = ds_pool;
9669 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009670 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009671 ASSERT_VK_SUCCESS(err);
9672
9673 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009674 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
9675 sampler_ci.pNext = NULL;
9676 sampler_ci.magFilter = VK_FILTER_NEAREST;
9677 sampler_ci.minFilter = VK_FILTER_NEAREST;
9678 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
9679 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9680 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9681 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
9682 sampler_ci.mipLodBias = 1.0;
9683 sampler_ci.anisotropyEnable = VK_FALSE;
9684 sampler_ci.maxAnisotropy = 1;
9685 sampler_ci.compareEnable = VK_FALSE;
9686 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
9687 sampler_ci.minLod = 1.0;
9688 sampler_ci.maxLod = 1.0;
9689 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
9690 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009691
9692 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009693 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009694 ASSERT_VK_SUCCESS(err);
9695
9696 VkDescriptorImageInfo info = {};
9697 info.sampler = sampler;
9698
9699 VkWriteDescriptorSet descriptor_write;
9700 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
9701 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009702 descriptor_write.dstSet = descriptorSet;
9703 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +08009704 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -06009705 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
9706 descriptor_write.pImageInfo = &info;
9707 // This write update should succeed
9708 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9709 // Now perform a copy update that fails due to type mismatch
9710 VkCopyDescriptorSet copy_ds_update;
9711 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
9712 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
9713 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -06009714 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009715 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07009716 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +08009717 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06009718 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
9719
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009720 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06009721 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009722 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 -06009723 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
9724 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
9725 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009726 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009727 copy_ds_update.dstSet = descriptorSet;
9728 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -06009729 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -06009730 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
9731
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009732 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009733
Tobin Ehlis04356f92015-10-27 16:35:27 -06009734 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009735 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
9736 "update array offset of 0 and update of "
9737 "5 descriptors oversteps total number "
9738 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009739
Tobin Ehlis04356f92015-10-27 16:35:27 -06009740 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
9741 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
9742 copy_ds_update.srcSet = descriptorSet;
9743 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009744 copy_ds_update.dstSet = descriptorSet;
9745 copy_ds_update.dstBinding = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009746 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -06009747 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
9748
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009749 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -06009750
Chia-I Wuf7458c52015-10-26 21:10:41 +08009751 vkDestroySampler(m_device->device(), sampler, NULL);
9752 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9753 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -06009754}
9755
Karl Schultz6addd812016-02-02 17:17:23 -07009756TEST_F(VkLayerTest, NumSamplesMismatch) {
9757 // Create CommandBuffer where MSAA samples doesn't match RenderPass
9758 // sampleCount
9759 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009760
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009761 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009762
Tobin Ehlis3b780662015-05-28 12:11:26 -06009763 ASSERT_NO_FATAL_FAILURE(InitState());
9764 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009765 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -06009766 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009767 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009768
9769 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009770 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9771 ds_pool_ci.pNext = NULL;
9772 ds_pool_ci.maxSets = 1;
9773 ds_pool_ci.poolSizeCount = 1;
9774 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -06009775
Tobin Ehlis3b780662015-05-28 12:11:26 -06009776 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009777 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009778 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009779
Tony Barboureb254902015-07-15 12:50:33 -06009780 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08009781 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -06009782 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08009783 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009784 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9785 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009786
Tony Barboureb254902015-07-15 12:50:33 -06009787 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9788 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9789 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009790 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07009791 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009792
Tobin Ehlis3b780662015-05-28 12:11:26 -06009793 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009794 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009795 ASSERT_VK_SUCCESS(err);
9796
9797 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009798 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009799 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009800 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009801 alloc_info.descriptorPool = ds_pool;
9802 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009803 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009804 ASSERT_VK_SUCCESS(err);
9805
Tony Barboureb254902015-07-15 12:50:33 -06009806 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009807 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07009808 pipe_ms_state_ci.pNext = NULL;
9809 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
9810 pipe_ms_state_ci.sampleShadingEnable = 0;
9811 pipe_ms_state_ci.minSampleShading = 1.0;
9812 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009813
Tony Barboureb254902015-07-15 12:50:33 -06009814 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009815 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9816 pipeline_layout_ci.pNext = NULL;
9817 pipeline_layout_ci.setLayoutCount = 1;
9818 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -06009819
9820 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009821 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -06009822 ASSERT_VK_SUCCESS(err);
9823
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009824 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
9825 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
9826 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -06009827 VkPipelineObj pipe(m_device);
9828 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06009829 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06009830 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -06009831 pipe.SetMSAA(&pipe_ms_state_ci);
9832 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -06009833
Tony Barbourfe3351b2015-07-28 10:17:20 -06009834 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009835 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -06009836
Mark Young29927482016-05-04 14:38:51 -06009837 // Render triangle (the error should trigger on the attempt to draw).
9838 Draw(3, 1, 0, 0);
9839
9840 // Finalize recording of the command buffer
9841 EndCommandBuffer();
9842
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009843 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009844
Chia-I Wuf7458c52015-10-26 21:10:41 +08009845 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9846 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9847 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009848}
Mark Young29927482016-05-04 14:38:51 -06009849
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009850TEST_F(VkLayerTest, RenderPassIncompatible) {
9851 TEST_DESCRIPTION("Hit RenderPass incompatible cases. "
9852 "Initial case is drawing with an active renderpass that's "
Mike Weiblencce7ec72016-10-17 19:33:05 -06009853 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009854 VkResult err;
9855
9856 ASSERT_NO_FATAL_FAILURE(InitState());
9857 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9858
9859 VkDescriptorSetLayoutBinding dsl_binding = {};
9860 dsl_binding.binding = 0;
9861 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9862 dsl_binding.descriptorCount = 1;
9863 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9864 dsl_binding.pImmutableSamplers = NULL;
9865
9866 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9867 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9868 ds_layout_ci.pNext = NULL;
9869 ds_layout_ci.bindingCount = 1;
9870 ds_layout_ci.pBindings = &dsl_binding;
9871
9872 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009873 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009874 ASSERT_VK_SUCCESS(err);
9875
9876 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
9877 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9878 pipeline_layout_ci.pNext = NULL;
9879 pipeline_layout_ci.setLayoutCount = 1;
9880 pipeline_layout_ci.pSetLayouts = &ds_layout;
9881
9882 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009883 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009884 ASSERT_VK_SUCCESS(err);
9885
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009886 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
9887 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
9888 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009889 // Create a renderpass that will be incompatible with default renderpass
9890 VkAttachmentReference attach = {};
9891 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
9892 VkAttachmentReference color_att = {};
9893 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9894 VkSubpassDescription subpass = {};
9895 subpass.inputAttachmentCount = 1;
9896 subpass.pInputAttachments = &attach;
9897 subpass.colorAttachmentCount = 1;
9898 subpass.pColorAttachments = &color_att;
9899 VkRenderPassCreateInfo rpci = {};
9900 rpci.subpassCount = 1;
9901 rpci.pSubpasses = &subpass;
9902 rpci.attachmentCount = 1;
9903 VkAttachmentDescription attach_desc = {};
9904 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -06009905 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
9906 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009907 rpci.pAttachments = &attach_desc;
9908 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9909 VkRenderPass rp;
9910 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
9911 VkPipelineObj pipe(m_device);
9912 pipe.AddShader(&vs);
9913 pipe.AddShader(&fs);
9914 pipe.AddColorAttachment();
9915 VkViewport view_port = {};
9916 m_viewports.push_back(view_port);
9917 pipe.SetViewport(m_viewports);
9918 VkRect2D rect = {};
9919 m_scissors.push_back(rect);
9920 pipe.SetScissor(m_scissors);
9921 pipe.CreateVKPipeline(pipeline_layout, renderPass());
9922
9923 VkCommandBufferInheritanceInfo cbii = {};
9924 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
9925 cbii.renderPass = rp;
9926 cbii.subpass = 0;
9927 VkCommandBufferBeginInfo cbbi = {};
9928 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9929 cbbi.pInheritanceInfo = &cbii;
9930 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
9931 VkRenderPassBeginInfo rpbi = {};
9932 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
9933 rpbi.framebuffer = m_framebuffer;
9934 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009935 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9936 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009937
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -06009939 // Render triangle (the error should trigger on the attempt to draw).
9940 Draw(3, 1, 0, 0);
9941
9942 // Finalize recording of the command buffer
9943 EndCommandBuffer();
9944
9945 m_errorMonitor->VerifyFound();
9946
9947 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9948 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9949 vkDestroyRenderPass(m_device->device(), rp, NULL);
9950}
9951
Mark Youngc89c6312016-03-31 16:03:20 -06009952TEST_F(VkLayerTest, NumBlendAttachMismatch) {
9953 // Create Pipeline where the number of blend attachments doesn't match the
9954 // number of color attachments. In this case, we don't add any color
9955 // blend attachments even though we have a color attachment.
9956 VkResult err;
9957
9958 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009959 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -06009960
9961 ASSERT_NO_FATAL_FAILURE(InitState());
9962 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9963 VkDescriptorPoolSize ds_type_count = {};
9964 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9965 ds_type_count.descriptorCount = 1;
9966
9967 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9968 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9969 ds_pool_ci.pNext = NULL;
9970 ds_pool_ci.maxSets = 1;
9971 ds_pool_ci.poolSizeCount = 1;
9972 ds_pool_ci.pPoolSizes = &ds_type_count;
9973
9974 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009975 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -06009976 ASSERT_VK_SUCCESS(err);
9977
9978 VkDescriptorSetLayoutBinding dsl_binding = {};
9979 dsl_binding.binding = 0;
9980 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9981 dsl_binding.descriptorCount = 1;
9982 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9983 dsl_binding.pImmutableSamplers = NULL;
9984
9985 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9986 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9987 ds_layout_ci.pNext = NULL;
9988 ds_layout_ci.bindingCount = 1;
9989 ds_layout_ci.pBindings = &dsl_binding;
9990
9991 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009992 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -06009993 ASSERT_VK_SUCCESS(err);
9994
9995 VkDescriptorSet descriptorSet;
9996 VkDescriptorSetAllocateInfo alloc_info = {};
9997 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9998 alloc_info.descriptorSetCount = 1;
9999 alloc_info.descriptorPool = ds_pool;
10000 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010001 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060010002 ASSERT_VK_SUCCESS(err);
10003
10004 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010005 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060010006 pipe_ms_state_ci.pNext = NULL;
10007 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10008 pipe_ms_state_ci.sampleShadingEnable = 0;
10009 pipe_ms_state_ci.minSampleShading = 1.0;
10010 pipe_ms_state_ci.pSampleMask = NULL;
10011
10012 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10013 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10014 pipeline_layout_ci.pNext = NULL;
10015 pipeline_layout_ci.setLayoutCount = 1;
10016 pipeline_layout_ci.pSetLayouts = &ds_layout;
10017
10018 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010019 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060010020 ASSERT_VK_SUCCESS(err);
10021
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010022 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
10023 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
10024 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060010025 VkPipelineObj pipe(m_device);
10026 pipe.AddShader(&vs);
10027 pipe.AddShader(&fs);
10028 pipe.SetMSAA(&pipe_ms_state_ci);
10029 pipe.CreateVKPipeline(pipeline_layout, renderPass());
10030
10031 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010032 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Youngc89c6312016-03-31 16:03:20 -060010033
Mark Young29927482016-05-04 14:38:51 -060010034 // Render triangle (the error should trigger on the attempt to draw).
10035 Draw(3, 1, 0, 0);
10036
10037 // Finalize recording of the command buffer
10038 EndCommandBuffer();
10039
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010040 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060010041
10042 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10043 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10044 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10045}
Mark Young29927482016-05-04 14:38:51 -060010046
Mark Muellerd4914412016-06-13 17:52:06 -060010047TEST_F(VkLayerTest, MissingClearAttachment) {
10048 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment "
10049 "structure passed to vkCmdClearAttachments");
Cody Northropc31a84f2016-08-22 10:41:47 -060010050 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesda6ae6f2016-09-09 14:36:33 +120010051 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesfa79fc72016-11-01 10:18:12 +130010052 "vkCmdClearAttachments() color attachment index 1 out of range for active subpass 0");
Mark Muellerd4914412016-06-13 17:52:06 -060010053
10054 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
10055 m_errorMonitor->VerifyFound();
10056}
10057
Karl Schultz6addd812016-02-02 17:17:23 -070010058TEST_F(VkLayerTest, ClearCmdNoDraw) {
10059 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
10060 // to issuing a Draw
10061 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010062
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010063 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060010064 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010065
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010066 ASSERT_NO_FATAL_FAILURE(InitState());
10067 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060010068
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010069 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010070 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10071 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010072
10073 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010074 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10075 ds_pool_ci.pNext = NULL;
10076 ds_pool_ci.maxSets = 1;
10077 ds_pool_ci.poolSizeCount = 1;
10078 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010079
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010080 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010081 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010082 ASSERT_VK_SUCCESS(err);
10083
Tony Barboureb254902015-07-15 12:50:33 -060010084 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010085 dsl_binding.binding = 0;
10086 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10087 dsl_binding.descriptorCount = 1;
10088 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10089 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010090
Tony Barboureb254902015-07-15 12:50:33 -060010091 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010092 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10093 ds_layout_ci.pNext = NULL;
10094 ds_layout_ci.bindingCount = 1;
10095 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010096
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010097 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010098 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010099 ASSERT_VK_SUCCESS(err);
10100
10101 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010102 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010103 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010104 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010105 alloc_info.descriptorPool = ds_pool;
10106 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010107 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010108 ASSERT_VK_SUCCESS(err);
10109
Tony Barboureb254902015-07-15 12:50:33 -060010110 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010111 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010112 pipe_ms_state_ci.pNext = NULL;
10113 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10114 pipe_ms_state_ci.sampleShadingEnable = 0;
10115 pipe_ms_state_ci.minSampleShading = 1.0;
10116 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010117
Tony Barboureb254902015-07-15 12:50:33 -060010118 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010119 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10120 pipeline_layout_ci.pNext = NULL;
10121 pipeline_layout_ci.setLayoutCount = 1;
10122 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010123
10124 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010125 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010126 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010127
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010128 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060010129 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070010130 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010131 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010132
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010133 VkPipelineObj pipe(m_device);
10134 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010135 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010136 pipe.SetMSAA(&pipe_ms_state_ci);
10137 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060010138
10139 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010140
Karl Schultz6addd812016-02-02 17:17:23 -070010141 // Main thing we care about for this test is that the VkImage obj we're
10142 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010143 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060010144 VkClearAttachment color_attachment;
10145 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10146 color_attachment.clearValue.color.float32[0] = 1.0;
10147 color_attachment.clearValue.color.float32[1] = 1.0;
10148 color_attachment.clearValue.color.float32[2] = 1.0;
10149 color_attachment.clearValue.color.float32[3] = 1.0;
10150 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010151 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010152
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010153 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010154
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010155 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010156
Chia-I Wuf7458c52015-10-26 21:10:41 +080010157 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10158 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10159 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060010160}
10161
Karl Schultz6addd812016-02-02 17:17:23 -070010162TEST_F(VkLayerTest, VtxBufferBadIndex) {
10163 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010164
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010165 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10166 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010167
Tobin Ehlis502480b2015-06-24 15:53:07 -060010168 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -060010169 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060010170 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060010171
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010172 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010173 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10174 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010175
10176 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010177 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10178 ds_pool_ci.pNext = NULL;
10179 ds_pool_ci.maxSets = 1;
10180 ds_pool_ci.poolSizeCount = 1;
10181 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010182
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010183 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010184 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010185 ASSERT_VK_SUCCESS(err);
10186
Tony Barboureb254902015-07-15 12:50:33 -060010187 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010188 dsl_binding.binding = 0;
10189 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10190 dsl_binding.descriptorCount = 1;
10191 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10192 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010193
Tony Barboureb254902015-07-15 12:50:33 -060010194 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010195 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10196 ds_layout_ci.pNext = NULL;
10197 ds_layout_ci.bindingCount = 1;
10198 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010199
Tobin Ehlis502480b2015-06-24 15:53:07 -060010200 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010201 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010202 ASSERT_VK_SUCCESS(err);
10203
10204 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010205 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010206 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010207 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010208 alloc_info.descriptorPool = ds_pool;
10209 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010210 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010211 ASSERT_VK_SUCCESS(err);
10212
Tony Barboureb254902015-07-15 12:50:33 -060010213 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010214 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010215 pipe_ms_state_ci.pNext = NULL;
10216 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10217 pipe_ms_state_ci.sampleShadingEnable = 0;
10218 pipe_ms_state_ci.minSampleShading = 1.0;
10219 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010220
Tony Barboureb254902015-07-15 12:50:33 -060010221 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010222 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10223 pipeline_layout_ci.pNext = NULL;
10224 pipeline_layout_ci.setLayoutCount = 1;
10225 pipeline_layout_ci.pSetLayouts = &ds_layout;
10226 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060010227
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010228 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010229 ASSERT_VK_SUCCESS(err);
10230
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010231 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
10232 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
10233 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010234 VkPipelineObj pipe(m_device);
10235 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010236 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010237 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010238 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060010239 pipe.SetViewport(m_viewports);
10240 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010241 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060010242
10243 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010244 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060010245 // Don't care about actual data, just need to get to draw to flag error
10246 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010247 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060010248 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060010249 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010250
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010251 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010252
Chia-I Wuf7458c52015-10-26 21:10:41 +080010253 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10254 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10255 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060010256}
Mark Muellerdfe37552016-07-07 14:47:42 -060010257
Mark Mueller2ee294f2016-08-04 12:59:48 -060010258TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
10259 TEST_DESCRIPTION("Use an invalid count in a vkEnumeratePhysicalDevices call."
10260 "Use invalid Queue Family Index in vkCreateDevice");
Cody Northropc31a84f2016-08-22 10:41:47 -060010261 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Mueller2ee294f2016-08-04 12:59:48 -060010262
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010263 const char *mismatch_count_message = "Call to vkEnumeratePhysicalDevices() "
10264 "w/ pPhysicalDeviceCount value ";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010265
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010266 const char *invalid_queueFamilyIndex_message = "Invalid queue create request in vkCreateDevice(). Invalid "
10267 "queueFamilyIndex ";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010268
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010269 const char *unavailable_feature_message = "While calling vkCreateDevice(), requesting feature #";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010270
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010271 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, mismatch_count_message);
Mark Mueller880fce52016-08-17 15:23:23 -060010272 // The following test fails with recent NVidia drivers.
10273 // By the time core_validation is reached, the NVidia
10274 // driver has sanitized the invalid condition and core_validation
10275 // is not introduced to the failure condition. This is not the case
10276 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010277 // uint32_t count = static_cast<uint32_t>(~0);
10278 // VkPhysicalDevice physical_device;
10279 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
10280 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060010281
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queueFamilyIndex_message);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010283 float queue_priority = 0.0;
10284
10285 VkDeviceQueueCreateInfo queue_create_info = {};
10286 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
10287 queue_create_info.queueCount = 1;
10288 queue_create_info.pQueuePriorities = &queue_priority;
10289 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
10290
10291 VkPhysicalDeviceFeatures features = m_device->phy().features();
10292 VkDevice testDevice;
10293 VkDeviceCreateInfo device_create_info = {};
10294 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
10295 device_create_info.queueCreateInfoCount = 1;
10296 device_create_info.pQueueCreateInfos = &queue_create_info;
10297 device_create_info.pEnabledFeatures = &features;
10298 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
10299 m_errorMonitor->VerifyFound();
10300
10301 queue_create_info.queueFamilyIndex = 1;
10302
10303 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
10304 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
10305 for (unsigned i = 0; i < feature_count; i++) {
10306 if (VK_FALSE == feature_array[i]) {
10307 feature_array[i] = VK_TRUE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010308 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, unavailable_feature_message);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010309 device_create_info.pEnabledFeatures = &features;
10310 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
10311 m_errorMonitor->VerifyFound();
10312 break;
10313 }
10314 }
10315}
10316
Tobin Ehlis16edf082016-11-21 12:33:49 -070010317TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
10318 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
10319
10320 ASSERT_NO_FATAL_FAILURE(InitState());
10321
10322 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
10323 std::vector<VkDeviceQueueCreateInfo> queue_info;
10324 queue_info.reserve(queue_props.size());
10325 std::vector<std::vector<float>> queue_priorities;
10326 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
10327 VkDeviceQueueCreateInfo qi{};
10328 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
10329 qi.queueFamilyIndex = i;
10330 qi.queueCount = queue_props[i].queueCount;
10331 queue_priorities.emplace_back(qi.queueCount, 0.0f);
10332 qi.pQueuePriorities = queue_priorities[i].data();
10333 queue_info.push_back(qi);
10334 }
10335
10336 std::vector<const char *> device_extension_names;
10337
10338 VkDevice local_device;
10339 VkDeviceCreateInfo device_create_info = {};
10340 auto features = m_device->phy().features();
10341 // Intentionally disable pipeline stats
10342 features.pipelineStatisticsQuery = VK_FALSE;
10343 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
10344 device_create_info.pNext = NULL;
10345 device_create_info.queueCreateInfoCount = queue_info.size();
10346 device_create_info.pQueueCreateInfos = queue_info.data();
10347 device_create_info.enabledLayerCount = 0;
10348 device_create_info.ppEnabledLayerNames = NULL;
10349 device_create_info.pEnabledFeatures = &features;
10350 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
10351 ASSERT_VK_SUCCESS(err);
10352
10353 VkQueryPoolCreateInfo qpci{};
10354 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
10355 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
10356 qpci.queryCount = 1;
10357 VkQueryPool query_pool;
10358
10359 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
10360 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
10361 m_errorMonitor->VerifyFound();
10362
10363 vkDestroyDevice(local_device, nullptr);
10364}
10365
Mark Mueller2ee294f2016-08-04 12:59:48 -060010366TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
10367 TEST_DESCRIPTION("Use an invalid queue index in a vkCmdWaitEvents call."
10368 "End a command buffer with a query still in progress.");
10369
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010370 const char *invalid_queue_index = "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
10371 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
10372 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010373
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010374 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060010375
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010376 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010377
10378 ASSERT_NO_FATAL_FAILURE(InitState());
10379
10380 VkEvent event;
10381 VkEventCreateInfo event_create_info{};
10382 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
10383 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
10384
Mark Mueller2ee294f2016-08-04 12:59:48 -060010385 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010386 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010387
10388 BeginCommandBuffer();
10389
10390 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010391 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 -060010392 ASSERT_TRUE(image.initialized());
10393 VkImageMemoryBarrier img_barrier = {};
10394 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
10395 img_barrier.pNext = NULL;
10396 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10397 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10398 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10399 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10400 img_barrier.image = image.handle();
10401 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060010402
10403 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
10404 // that layer validation catches the case when it is not.
10405 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060010406 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10407 img_barrier.subresourceRange.baseArrayLayer = 0;
10408 img_barrier.subresourceRange.baseMipLevel = 0;
10409 img_barrier.subresourceRange.layerCount = 1;
10410 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010411 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
10412 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010413 m_errorMonitor->VerifyFound();
10414
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010415 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010416
10417 VkQueryPool query_pool;
10418 VkQueryPoolCreateInfo query_pool_create_info = {};
10419 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
10420 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
10421 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010422 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010423
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010424 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060010425 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
10426
10427 vkEndCommandBuffer(m_commandBuffer->handle());
10428 m_errorMonitor->VerifyFound();
10429
10430 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
10431 vkDestroyEvent(m_device->device(), event, nullptr);
10432}
10433
Mark Muellerdfe37552016-07-07 14:47:42 -060010434TEST_F(VkLayerTest, VertexBufferInvalid) {
10435 TEST_DESCRIPTION("Submit a command buffer using deleted vertex buffer, "
10436 "delete a buffer twice, use an invalid offset for each "
10437 "buffer type, and attempt to bind a null buffer");
10438
10439 const char *deleted_buffer_in_command_buffer = "Cannot submit cmd buffer "
10440 "using deleted buffer ";
Mark Muellerdfe37552016-07-07 14:47:42 -060010441 const char *invalid_offset_message = "vkBindBufferMemory(): "
10442 "memoryOffset is 0x";
10443 const char *invalid_storage_buffer_offset_message = "vkBindBufferMemory(): "
10444 "storage memoryOffset "
10445 "is 0x";
10446 const char *invalid_texel_buffer_offset_message = "vkBindBufferMemory(): "
10447 "texel memoryOffset "
10448 "is 0x";
10449 const char *invalid_uniform_buffer_offset_message = "vkBindBufferMemory(): "
10450 "uniform memoryOffset "
10451 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060010452
10453 ASSERT_NO_FATAL_FAILURE(InitState());
10454 ASSERT_NO_FATAL_FAILURE(InitViewport());
10455 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10456
10457 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010458 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060010459 pipe_ms_state_ci.pNext = NULL;
10460 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
10461 pipe_ms_state_ci.sampleShadingEnable = 0;
10462 pipe_ms_state_ci.minSampleShading = 1.0;
10463 pipe_ms_state_ci.pSampleMask = nullptr;
10464
10465 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10466 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10467 VkPipelineLayout pipeline_layout;
10468
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010469 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060010470 ASSERT_VK_SUCCESS(err);
10471
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010472 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
10473 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060010474 VkPipelineObj pipe(m_device);
10475 pipe.AddShader(&vs);
10476 pipe.AddShader(&fs);
10477 pipe.AddColorAttachment();
10478 pipe.SetMSAA(&pipe_ms_state_ci);
10479 pipe.SetViewport(m_viewports);
10480 pipe.SetScissor(m_scissors);
10481 pipe.CreateVKPipeline(pipeline_layout, renderPass());
10482
10483 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010484 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060010485
10486 {
10487 // Create and bind a vertex buffer in a reduced scope, which will cause
10488 // it to be deleted upon leaving this scope
10489 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010490 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060010491 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
10492 draw_verticies.AddVertexInputToPipe(pipe);
10493 }
10494
10495 Draw(1, 0, 0, 0);
10496
10497 EndCommandBuffer();
10498
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010499 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060010500 QueueCommandBuffer(false);
10501 m_errorMonitor->VerifyFound();
10502
10503 {
10504 // Create and bind a vertex buffer in a reduced scope, and delete it
10505 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010506 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010507 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060010508 buffer_test.TestDoubleDestroy();
10509 }
10510 m_errorMonitor->VerifyFound();
10511
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010512 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060010513 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010514 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
10515 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
10516 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010517 m_errorMonitor->VerifyFound();
10518 }
10519
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010520 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
10521 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060010522 // Create and bind a memory buffer with an invalid offset again,
10523 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010524 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
10525 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
10526 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010527 m_errorMonitor->VerifyFound();
10528 }
10529
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010530 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060010531 // Create and bind a memory buffer with an invalid offset again, but
10532 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010533 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
10534 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
10535 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010536 m_errorMonitor->VerifyFound();
10537 }
10538
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010539 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060010540 // Create and bind a memory buffer with an invalid offset again, but
10541 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
10543 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
10544 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010545 m_errorMonitor->VerifyFound();
10546 }
10547
10548 {
10549 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010550 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010551 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
10552 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010553 m_errorMonitor->VerifyFound();
10554 }
10555
10556 {
10557 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010558 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010559 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
10560 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060010561 }
10562 m_errorMonitor->VerifyFound();
10563
10564 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10565}
10566
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010567// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
10568TEST_F(VkLayerTest, InvalidImageLayout) {
10569 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010570 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
10571 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010572 // 3 in ValidateCmdBufImageLayouts
10573 // * -1 Attempt to submit cmd buf w/ deleted image
10574 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
10575 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010576
10577 ASSERT_NO_FATAL_FAILURE(InitState());
10578 // Create src & dst images to use for copy operations
10579 VkImage src_image;
10580 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080010581 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010582
10583 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
10584 const int32_t tex_width = 32;
10585 const int32_t tex_height = 32;
10586
10587 VkImageCreateInfo image_create_info = {};
10588 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10589 image_create_info.pNext = NULL;
10590 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10591 image_create_info.format = tex_format;
10592 image_create_info.extent.width = tex_width;
10593 image_create_info.extent.height = tex_height;
10594 image_create_info.extent.depth = 1;
10595 image_create_info.mipLevels = 1;
10596 image_create_info.arrayLayers = 4;
10597 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10598 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10599 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080010600 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010601 image_create_info.flags = 0;
10602
10603 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
10604 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080010605 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010606 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
10607 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080010608 image_create_info.format = VK_FORMAT_D32_SFLOAT;
10609 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
10610 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
10611 ASSERT_VK_SUCCESS(err);
10612
10613 // Allocate memory
10614 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080010615 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080010616 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080010617 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10618 mem_alloc.pNext = NULL;
10619 mem_alloc.allocationSize = 0;
10620 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080010621
10622 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080010623 mem_alloc.allocationSize = img_mem_reqs.size;
10624 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080010625 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080010626 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080010627 ASSERT_VK_SUCCESS(err);
10628
10629 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080010630 mem_alloc.allocationSize = img_mem_reqs.size;
10631 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080010632 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080010633 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080010634 ASSERT_VK_SUCCESS(err);
10635
10636 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080010637 mem_alloc.allocationSize = img_mem_reqs.size;
10638 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080010639 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080010640 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080010641 ASSERT_VK_SUCCESS(err);
10642
10643 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
10644 ASSERT_VK_SUCCESS(err);
10645 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
10646 ASSERT_VK_SUCCESS(err);
10647 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
10648 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010649
10650 BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080010651 VkImageCopy copy_region;
10652 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10653 copy_region.srcSubresource.mipLevel = 0;
10654 copy_region.srcSubresource.baseArrayLayer = 0;
10655 copy_region.srcSubresource.layerCount = 1;
10656 copy_region.srcOffset.x = 0;
10657 copy_region.srcOffset.y = 0;
10658 copy_region.srcOffset.z = 0;
10659 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10660 copy_region.dstSubresource.mipLevel = 0;
10661 copy_region.dstSubresource.baseArrayLayer = 0;
10662 copy_region.dstSubresource.layerCount = 1;
10663 copy_region.dstOffset.x = 0;
10664 copy_region.dstOffset.y = 0;
10665 copy_region.dstOffset.z = 0;
10666 copy_region.extent.width = 1;
10667 copy_region.extent.height = 1;
10668 copy_region.extent.depth = 1;
10669
10670 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10671 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
10672 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010673 m_errorMonitor->VerifyFound();
10674 // Now cause error due to src image layout changing
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot copy from an image whose source layout is "
10676 "VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current "
10677 "layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080010678 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010679 m_errorMonitor->VerifyFound();
10680 // Final src error is due to bad layout type
10681 m_errorMonitor->SetDesiredFailureMsg(
10682 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10683 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
Cort530cf382016-12-08 09:59:47 -080010684 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010685 m_errorMonitor->VerifyFound();
10686 // Now verify same checks for dst
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010687 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10688 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080010689 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010690 m_errorMonitor->VerifyFound();
10691 // Now cause error due to src image layout changing
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010692 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot copy from an image whose dest layout is "
10693 "VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current "
10694 "layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080010695 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010696 m_errorMonitor->VerifyFound();
10697 m_errorMonitor->SetDesiredFailureMsg(
10698 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10699 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
Cort530cf382016-12-08 09:59:47 -080010700 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010701 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010010702
Cort3b021012016-12-07 12:00:57 -080010703 // Convert dst and depth images to TRANSFER_DST for subsequent tests
10704 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
10705 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
10706 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
10707 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
10708 transfer_dst_image_barrier[0].srcAccessMask = 0;
10709 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
10710 transfer_dst_image_barrier[0].image = dst_image;
10711 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
10712 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
10713 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10714 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
10715 NULL, 0, NULL, 1, transfer_dst_image_barrier);
10716 transfer_dst_image_barrier[0].image = depth_image;
10717 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
10718 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
10719 NULL, 0, NULL, 1, transfer_dst_image_barrier);
10720
10721 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080010722 VkClearColorValue color_clear_value = {};
10723 VkImageSubresourceRange clear_range;
10724 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10725 clear_range.baseMipLevel = 0;
10726 clear_range.baseArrayLayer = 0;
10727 clear_range.layerCount = 1;
10728 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010010729
Cort3b021012016-12-07 12:00:57 -080010730 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
10731 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
10732 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
10733 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080010734 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010010735 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080010736 // Fail due to provided layout not matching actual current layout for color clear.
10737 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080010738 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010010739 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080010740
Cort530cf382016-12-08 09:59:47 -080010741 VkClearDepthStencilValue depth_clear_value = {};
10742 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080010743
10744 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
10745 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
10746 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
10747 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080010748 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080010749 m_errorMonitor->VerifyFound();
10750 // Fail due to provided layout not matching actual current layout for depth clear.
10751 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080010752 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080010753 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010010754
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010755 // Now cause error due to bad image layout transition in PipelineBarrier
10756 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080010757 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010758 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080010759 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010760 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080010761 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
10762 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010763 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "You cannot transition the layout from "
10765 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when "
10766 "current layout is VK_IMAGE_LAYOUT_GENERAL.");
10767 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
10768 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010769 m_errorMonitor->VerifyFound();
10770
10771 // Finally some layout errors at RenderPass create time
10772 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
10773 VkAttachmentReference attach = {};
10774 // perf warning for GENERAL layout w/ non-DS input attachment
10775 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
10776 VkSubpassDescription subpass = {};
10777 subpass.inputAttachmentCount = 1;
10778 subpass.pInputAttachments = &attach;
10779 VkRenderPassCreateInfo rpci = {};
10780 rpci.subpassCount = 1;
10781 rpci.pSubpasses = &subpass;
10782 rpci.attachmentCount = 1;
10783 VkAttachmentDescription attach_desc = {};
10784 attach_desc.format = VK_FORMAT_UNDEFINED;
10785 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060010786 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010787 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010788 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10789 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010790 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10791 m_errorMonitor->VerifyFound();
10792 // error w/ non-general layout
10793 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
10794
10795 m_errorMonitor->SetDesiredFailureMsg(
10796 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10797 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
10798 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10799 m_errorMonitor->VerifyFound();
10800 subpass.inputAttachmentCount = 0;
10801 subpass.colorAttachmentCount = 1;
10802 subpass.pColorAttachments = &attach;
10803 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
10804 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10806 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010807 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10808 m_errorMonitor->VerifyFound();
10809 // error w/ non-color opt or GENERAL layout for color attachment
10810 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
10811 m_errorMonitor->SetDesiredFailureMsg(
10812 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10813 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
10814 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10815 m_errorMonitor->VerifyFound();
10816 subpass.colorAttachmentCount = 0;
10817 subpass.pDepthStencilAttachment = &attach;
10818 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
10819 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010820 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
10821 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010822 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10823 m_errorMonitor->VerifyFound();
10824 // error w/ non-ds opt or GENERAL layout for color attachment
10825 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010826 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10827 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
10828 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010829 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10830 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060010831 // For this error we need a valid renderpass so create default one
10832 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
10833 attach.attachment = 0;
10834 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
10835 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
10836 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
10837 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
10838 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
10839 // Can't do a CLEAR load on READ_ONLY initialLayout
10840 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
10841 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
10842 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " with invalid first layout "
10844 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
10845 "ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060010846 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10847 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010848
Cort3b021012016-12-07 12:00:57 -080010849 vkFreeMemory(m_device->device(), src_image_mem, NULL);
10850 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
10851 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010852 vkDestroyImage(m_device->device(), src_image, NULL);
10853 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080010854 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060010855}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060010856
Tobin Ehlise0936662016-10-11 08:10:51 -060010857TEST_F(VkLayerTest, InvalidStorageImageLayout) {
10858 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
10859 VkResult err;
10860
10861 ASSERT_NO_FATAL_FAILURE(InitState());
10862
10863 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
10864 VkImageTiling tiling;
10865 VkFormatProperties format_properties;
10866 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
10867 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
10868 tiling = VK_IMAGE_TILING_LINEAR;
10869 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
10870 tiling = VK_IMAGE_TILING_OPTIMAL;
10871 } else {
10872 printf("Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
10873 "skipped.\n");
10874 return;
10875 }
10876
10877 VkDescriptorPoolSize ds_type = {};
10878 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
10879 ds_type.descriptorCount = 1;
10880
10881 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10882 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10883 ds_pool_ci.maxSets = 1;
10884 ds_pool_ci.poolSizeCount = 1;
10885 ds_pool_ci.pPoolSizes = &ds_type;
10886 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
10887
10888 VkDescriptorPool ds_pool;
10889 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10890 ASSERT_VK_SUCCESS(err);
10891
10892 VkDescriptorSetLayoutBinding dsl_binding = {};
10893 dsl_binding.binding = 0;
10894 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
10895 dsl_binding.descriptorCount = 1;
10896 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
10897 dsl_binding.pImmutableSamplers = NULL;
10898
10899 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10900 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10901 ds_layout_ci.pNext = NULL;
10902 ds_layout_ci.bindingCount = 1;
10903 ds_layout_ci.pBindings = &dsl_binding;
10904
10905 VkDescriptorSetLayout ds_layout;
10906 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10907 ASSERT_VK_SUCCESS(err);
10908
10909 VkDescriptorSetAllocateInfo alloc_info = {};
10910 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10911 alloc_info.descriptorSetCount = 1;
10912 alloc_info.descriptorPool = ds_pool;
10913 alloc_info.pSetLayouts = &ds_layout;
10914 VkDescriptorSet descriptor_set;
10915 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10916 ASSERT_VK_SUCCESS(err);
10917
10918 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10919 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10920 pipeline_layout_ci.pNext = NULL;
10921 pipeline_layout_ci.setLayoutCount = 1;
10922 pipeline_layout_ci.pSetLayouts = &ds_layout;
10923 VkPipelineLayout pipeline_layout;
10924 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
10925 ASSERT_VK_SUCCESS(err);
10926
10927 VkImageObj image(m_device);
10928 image.init(32, 32, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
10929 ASSERT_TRUE(image.initialized());
10930 VkImageView view = image.targetView(tex_format);
10931
10932 VkDescriptorImageInfo image_info = {};
10933 image_info.imageView = view;
10934 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
10935
10936 VkWriteDescriptorSet descriptor_write = {};
10937 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10938 descriptor_write.dstSet = descriptor_set;
10939 descriptor_write.dstBinding = 0;
10940 descriptor_write.descriptorCount = 1;
10941 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
10942 descriptor_write.pImageInfo = &image_info;
10943
10944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10945 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
10946 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
10947 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10948 m_errorMonitor->VerifyFound();
10949
10950 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10951 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10952 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10953 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10954}
10955
Mark Mueller93b938f2016-08-18 10:27:40 -060010956TEST_F(VkLayerTest, SimultaneousUse) {
10957 TEST_DESCRIPTION("Use vkCmdExecuteCommands with invalid state "
10958 "in primary and secondary command buffers.");
10959
10960 ASSERT_NO_FATAL_FAILURE(InitState());
10961 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10962
Mike Weiblen95dd0f92016-10-19 12:28:27 -060010963 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010964 const char *simultaneous_use_message2 = "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
10965 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060010966
10967 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010968 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060010969 command_buffer_allocate_info.commandPool = m_commandPool;
10970 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
10971 command_buffer_allocate_info.commandBufferCount = 1;
10972
10973 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010974 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060010975 VkCommandBufferBeginInfo command_buffer_begin_info = {};
10976 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010977 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060010978 command_buffer_inheritance_info.renderPass = m_renderPass;
10979 command_buffer_inheritance_info.framebuffer = m_framebuffer;
10980 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010981 command_buffer_begin_info.flags =
10982 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060010983 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
10984
10985 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010986 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
10987 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller4042b652016-09-05 22:52:21 -060010988 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
Mark Mueller93b938f2016-08-18 10:27:40 -060010989 vkEndCommandBuffer(secondary_command_buffer);
10990
Mark Mueller93b938f2016-08-18 10:27:40 -060010991 VkSubmitInfo submit_info = {};
10992 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
10993 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010994 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller4042b652016-09-05 22:52:21 -060010995 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Mueller93b938f2016-08-18 10:27:40 -060010996
Mark Mueller4042b652016-09-05 22:52:21 -060010997 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010998 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
10999 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
11000 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060011001 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060011002 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
11003 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060011004
11005 m_errorMonitor->SetDesiredFailureMsg(0, "");
Mark Mueller93b938f2016-08-18 10:27:40 -060011006 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11007
Mark Mueller4042b652016-09-05 22:52:21 -060011008 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060011009 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011010 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060011011
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011012 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
11013 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060011014 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060011015 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
11016 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060011017}
11018
Mark Mueller917f6bc2016-08-30 10:57:19 -060011019TEST_F(VkLayerTest, InUseDestroyedSignaled) {
11020 TEST_DESCRIPTION("Use vkCmdExecuteCommands with invalid state "
11021 "in primary and secondary command buffers. "
Mark Muellerc8d441e2016-08-23 17:36:00 -060011022 "Delete objects that are inuse. Call VkQueueSubmit "
11023 "with an event that has been deleted.");
Mark Mueller917f6bc2016-08-30 10:57:19 -060011024
11025 ASSERT_NO_FATAL_FAILURE(InitState());
11026 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11027
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011028 const char *submit_with_deleted_event_message = "Cannot submit cmd buffer using deleted event 0x";
11029 const char *cannot_delete_event_message = "Cannot delete event 0x";
11030 const char *cannot_delete_semaphore_message = "Cannot delete semaphore 0x";
11031 const char *cannot_destroy_fence_message = "Fence 0x";
Mark Mueller917f6bc2016-08-30 10:57:19 -060011032
11033 BeginCommandBuffer();
11034
11035 VkEvent event;
11036 VkEventCreateInfo event_create_info = {};
11037 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11038 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011039 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011040
Mark Muellerc8d441e2016-08-23 17:36:00 -060011041 EndCommandBuffer();
11042 vkDestroyEvent(m_device->device(), event, nullptr);
11043
11044 VkSubmitInfo submit_info = {};
11045 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11046 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011047 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11048 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, submit_with_deleted_event_message);
Mark Muellerc8d441e2016-08-23 17:36:00 -060011049 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11050 m_errorMonitor->VerifyFound();
11051
11052 m_errorMonitor->SetDesiredFailureMsg(0, "");
11053 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
11054
11055 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11056
Mark Mueller917f6bc2016-08-30 10:57:19 -060011057 VkSemaphoreCreateInfo semaphore_create_info = {};
11058 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
11059 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011060 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011061 VkFenceCreateInfo fence_create_info = {};
11062 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
11063 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011064 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011065
11066 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060011067 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011068 descriptor_pool_type_count.descriptorCount = 1;
11069
11070 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
11071 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11072 descriptor_pool_create_info.maxSets = 1;
11073 descriptor_pool_create_info.poolSizeCount = 1;
11074 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011075 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011076
11077 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011078 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011079
11080 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060011081 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011082 descriptorset_layout_binding.descriptorCount = 1;
11083 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
11084
11085 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011086 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011087 descriptorset_layout_create_info.bindingCount = 1;
11088 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
11089
11090 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011091 ASSERT_VK_SUCCESS(
11092 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011093
11094 VkDescriptorSet descriptorset;
11095 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011096 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011097 descriptorset_allocate_info.descriptorSetCount = 1;
11098 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
11099 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011100 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011101
Mark Mueller4042b652016-09-05 22:52:21 -060011102 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
11103
11104 VkDescriptorBufferInfo buffer_info = {};
11105 buffer_info.buffer = buffer_test.GetBuffer();
11106 buffer_info.offset = 0;
11107 buffer_info.range = 1024;
11108
11109 VkWriteDescriptorSet write_descriptor_set = {};
11110 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11111 write_descriptor_set.dstSet = descriptorset;
11112 write_descriptor_set.descriptorCount = 1;
11113 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11114 write_descriptor_set.pBufferInfo = &buffer_info;
11115
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011116 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060011117
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011118 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11119 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011120
11121 VkPipelineObj pipe(m_device);
11122 pipe.AddColorAttachment();
11123 pipe.AddShader(&vs);
11124 pipe.AddShader(&fs);
11125
11126 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011127 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060011128 pipeline_layout_create_info.setLayoutCount = 1;
11129 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
11130
11131 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011132 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060011133
11134 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
11135
Mark Muellerc8d441e2016-08-23 17:36:00 -060011136 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011137 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060011138
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011139 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11140 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
11141 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011142
Mark Muellerc8d441e2016-08-23 17:36:00 -060011143 EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060011144
Mark Mueller917f6bc2016-08-30 10:57:19 -060011145 submit_info.signalSemaphoreCount = 1;
11146 submit_info.pSignalSemaphores = &semaphore;
11147 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Muellerc8d441e2016-08-23 17:36:00 -060011148
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011149 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, cannot_delete_event_message);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011150 vkDestroyEvent(m_device->device(), event, nullptr);
11151 m_errorMonitor->VerifyFound();
11152
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011153 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, cannot_delete_semaphore_message);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011154 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
11155 m_errorMonitor->VerifyFound();
11156
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011157 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, cannot_destroy_fence_message);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011158 vkDestroyFence(m_device->device(), fence, nullptr);
11159 m_errorMonitor->VerifyFound();
11160
Tobin Ehlis122207b2016-09-01 08:50:06 -070011161 vkQueueWaitIdle(m_device->m_queue);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011162 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
11163 vkDestroyFence(m_device->device(), fence, nullptr);
11164 vkDestroyEvent(m_device->device(), event, nullptr);
11165 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011166 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060011167 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
11168}
11169
Tobin Ehlis2adda372016-09-01 08:51:06 -070011170TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
11171 TEST_DESCRIPTION("Delete in-use query pool.");
11172
11173 ASSERT_NO_FATAL_FAILURE(InitState());
11174 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11175
11176 VkQueryPool query_pool;
11177 VkQueryPoolCreateInfo query_pool_ci{};
11178 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11179 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
11180 query_pool_ci.queryCount = 1;
11181 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
11182 BeginCommandBuffer();
11183 // Reset query pool to create binding with cmd buffer
11184 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
11185
11186 EndCommandBuffer();
11187
11188 VkSubmitInfo submit_info = {};
11189 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11190 submit_info.commandBufferCount = 1;
11191 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11192 // Submit cmd buffer and then destroy query pool while in-flight
11193 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11194
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011195 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete query pool 0x");
Tobin Ehlis2adda372016-09-01 08:51:06 -070011196 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
11197 m_errorMonitor->VerifyFound();
11198
11199 vkQueueWaitIdle(m_device->m_queue);
11200 // Now that cmd buffer done we can safely destroy query_pool
11201 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
11202}
11203
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011204TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
11205 TEST_DESCRIPTION("Delete in-use pipeline.");
11206
11207 ASSERT_NO_FATAL_FAILURE(InitState());
11208 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11209
11210 // Empty pipeline layout used for binding PSO
11211 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11212 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11213 pipeline_layout_ci.setLayoutCount = 0;
11214 pipeline_layout_ci.pSetLayouts = NULL;
11215
11216 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011217 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011218 ASSERT_VK_SUCCESS(err);
11219
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011220 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete pipeline 0x");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011221 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011222 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11223 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011224 // Store pipeline handle so we can actually delete it before test finishes
11225 VkPipeline delete_this_pipeline;
11226 { // Scope pipeline so it will be auto-deleted
11227 VkPipelineObj pipe(m_device);
11228 pipe.AddShader(&vs);
11229 pipe.AddShader(&fs);
11230 pipe.AddColorAttachment();
11231 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11232 delete_this_pipeline = pipe.handle();
11233
11234 BeginCommandBuffer();
11235 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011236 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060011237
11238 EndCommandBuffer();
11239
11240 VkSubmitInfo submit_info = {};
11241 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11242 submit_info.commandBufferCount = 1;
11243 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11244 // Submit cmd buffer and then pipeline destroyed while in-flight
11245 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11246 } // Pipeline deletion triggered here
11247 m_errorMonitor->VerifyFound();
11248 // Make sure queue finished and then actually delete pipeline
11249 vkQueueWaitIdle(m_device->m_queue);
11250 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
11251 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
11252}
11253
Tobin Ehlis7d965da2016-09-19 16:15:45 -060011254TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
11255 TEST_DESCRIPTION("Delete in-use imageView.");
11256
11257 ASSERT_NO_FATAL_FAILURE(InitState());
11258 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11259
11260 VkDescriptorPoolSize ds_type_count;
11261 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11262 ds_type_count.descriptorCount = 1;
11263
11264 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11265 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11266 ds_pool_ci.maxSets = 1;
11267 ds_pool_ci.poolSizeCount = 1;
11268 ds_pool_ci.pPoolSizes = &ds_type_count;
11269
11270 VkDescriptorPool ds_pool;
11271 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11272 ASSERT_VK_SUCCESS(err);
11273
11274 VkSamplerCreateInfo sampler_ci = {};
11275 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11276 sampler_ci.pNext = NULL;
11277 sampler_ci.magFilter = VK_FILTER_NEAREST;
11278 sampler_ci.minFilter = VK_FILTER_NEAREST;
11279 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11280 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11281 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11282 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11283 sampler_ci.mipLodBias = 1.0;
11284 sampler_ci.anisotropyEnable = VK_FALSE;
11285 sampler_ci.maxAnisotropy = 1;
11286 sampler_ci.compareEnable = VK_FALSE;
11287 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11288 sampler_ci.minLod = 1.0;
11289 sampler_ci.maxLod = 1.0;
11290 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11291 sampler_ci.unnormalizedCoordinates = VK_FALSE;
11292 VkSampler sampler;
11293
11294 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
11295 ASSERT_VK_SUCCESS(err);
11296
11297 VkDescriptorSetLayoutBinding layout_binding;
11298 layout_binding.binding = 0;
11299 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11300 layout_binding.descriptorCount = 1;
11301 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
11302 layout_binding.pImmutableSamplers = NULL;
11303
11304 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11305 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11306 ds_layout_ci.bindingCount = 1;
11307 ds_layout_ci.pBindings = &layout_binding;
11308 VkDescriptorSetLayout ds_layout;
11309 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
11310 ASSERT_VK_SUCCESS(err);
11311
11312 VkDescriptorSetAllocateInfo alloc_info = {};
11313 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11314 alloc_info.descriptorSetCount = 1;
11315 alloc_info.descriptorPool = ds_pool;
11316 alloc_info.pSetLayouts = &ds_layout;
11317 VkDescriptorSet descriptor_set;
11318 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
11319 ASSERT_VK_SUCCESS(err);
11320
11321 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11322 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11323 pipeline_layout_ci.pNext = NULL;
11324 pipeline_layout_ci.setLayoutCount = 1;
11325 pipeline_layout_ci.pSetLayouts = &ds_layout;
11326
11327 VkPipelineLayout pipeline_layout;
11328 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
11329 ASSERT_VK_SUCCESS(err);
11330
11331 VkImageObj image(m_device);
11332 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
11333 ASSERT_TRUE(image.initialized());
11334
11335 VkImageView view;
11336 VkImageViewCreateInfo ivci = {};
11337 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
11338 ivci.image = image.handle();
11339 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
11340 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
11341 ivci.subresourceRange.layerCount = 1;
11342 ivci.subresourceRange.baseMipLevel = 0;
11343 ivci.subresourceRange.levelCount = 1;
11344 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11345
11346 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
11347 ASSERT_VK_SUCCESS(err);
11348
11349 VkDescriptorImageInfo image_info{};
11350 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11351 image_info.imageView = view;
11352 image_info.sampler = sampler;
11353
11354 VkWriteDescriptorSet descriptor_write = {};
11355 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11356 descriptor_write.dstSet = descriptor_set;
11357 descriptor_write.dstBinding = 0;
11358 descriptor_write.descriptorCount = 1;
11359 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11360 descriptor_write.pImageInfo = &image_info;
11361
11362 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11363
11364 // Create PSO to use the sampler
11365 char const *vsSource = "#version 450\n"
11366 "\n"
11367 "out gl_PerVertex { \n"
11368 " vec4 gl_Position;\n"
11369 "};\n"
11370 "void main(){\n"
11371 " gl_Position = vec4(1);\n"
11372 "}\n";
11373 char const *fsSource = "#version 450\n"
11374 "\n"
11375 "layout(set=0, binding=0) uniform sampler2D s;\n"
11376 "layout(location=0) out vec4 x;\n"
11377 "void main(){\n"
11378 " x = texture(s, vec2(1));\n"
11379 "}\n";
11380 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11381 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11382 VkPipelineObj pipe(m_device);
11383 pipe.AddShader(&vs);
11384 pipe.AddShader(&fs);
11385 pipe.AddColorAttachment();
11386 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11387
11388 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete image view 0x");
11389
11390 BeginCommandBuffer();
11391 // Bind pipeline to cmd buffer
11392 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11393 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
11394 &descriptor_set, 0, nullptr);
11395 Draw(1, 0, 0, 0);
11396 EndCommandBuffer();
11397 // Submit cmd buffer then destroy sampler
11398 VkSubmitInfo submit_info = {};
11399 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11400 submit_info.commandBufferCount = 1;
11401 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11402 // Submit cmd buffer and then destroy imageView while in-flight
11403 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11404
11405 vkDestroyImageView(m_device->device(), view, nullptr);
11406 m_errorMonitor->VerifyFound();
11407 vkQueueWaitIdle(m_device->m_queue);
11408 // Now we can actually destroy imageView
11409 vkDestroyImageView(m_device->device(), view, NULL);
11410 vkDestroySampler(m_device->device(), sampler, nullptr);
11411 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11412 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11413 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11414}
11415
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060011416TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
11417 TEST_DESCRIPTION("Delete in-use bufferView.");
11418
11419 ASSERT_NO_FATAL_FAILURE(InitState());
11420 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11421
11422 VkDescriptorPoolSize ds_type_count;
11423 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
11424 ds_type_count.descriptorCount = 1;
11425
11426 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11427 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11428 ds_pool_ci.maxSets = 1;
11429 ds_pool_ci.poolSizeCount = 1;
11430 ds_pool_ci.pPoolSizes = &ds_type_count;
11431
11432 VkDescriptorPool ds_pool;
11433 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11434 ASSERT_VK_SUCCESS(err);
11435
11436 VkDescriptorSetLayoutBinding layout_binding;
11437 layout_binding.binding = 0;
11438 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
11439 layout_binding.descriptorCount = 1;
11440 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
11441 layout_binding.pImmutableSamplers = NULL;
11442
11443 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11444 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11445 ds_layout_ci.bindingCount = 1;
11446 ds_layout_ci.pBindings = &layout_binding;
11447 VkDescriptorSetLayout ds_layout;
11448 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
11449 ASSERT_VK_SUCCESS(err);
11450
11451 VkDescriptorSetAllocateInfo alloc_info = {};
11452 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11453 alloc_info.descriptorSetCount = 1;
11454 alloc_info.descriptorPool = ds_pool;
11455 alloc_info.pSetLayouts = &ds_layout;
11456 VkDescriptorSet descriptor_set;
11457 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
11458 ASSERT_VK_SUCCESS(err);
11459
11460 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11461 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11462 pipeline_layout_ci.pNext = NULL;
11463 pipeline_layout_ci.setLayoutCount = 1;
11464 pipeline_layout_ci.pSetLayouts = &ds_layout;
11465
11466 VkPipelineLayout pipeline_layout;
11467 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
11468 ASSERT_VK_SUCCESS(err);
11469
11470 VkBuffer buffer;
11471 uint32_t queue_family_index = 0;
11472 VkBufferCreateInfo buffer_create_info = {};
11473 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
11474 buffer_create_info.size = 1024;
11475 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
11476 buffer_create_info.queueFamilyIndexCount = 1;
11477 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
11478
11479 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
11480 ASSERT_VK_SUCCESS(err);
11481
11482 VkMemoryRequirements memory_reqs;
11483 VkDeviceMemory buffer_memory;
11484
11485 VkMemoryAllocateInfo memory_info = {};
11486 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11487 memory_info.allocationSize = 0;
11488 memory_info.memoryTypeIndex = 0;
11489
11490 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
11491 memory_info.allocationSize = memory_reqs.size;
11492 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
11493 ASSERT_TRUE(pass);
11494
11495 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
11496 ASSERT_VK_SUCCESS(err);
11497 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
11498 ASSERT_VK_SUCCESS(err);
11499
11500 VkBufferView view;
11501 VkBufferViewCreateInfo bvci = {};
11502 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
11503 bvci.buffer = buffer;
11504 bvci.format = VK_FORMAT_R8_UNORM;
11505 bvci.range = VK_WHOLE_SIZE;
11506
11507 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
11508 ASSERT_VK_SUCCESS(err);
11509
11510 VkWriteDescriptorSet descriptor_write = {};
11511 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11512 descriptor_write.dstSet = descriptor_set;
11513 descriptor_write.dstBinding = 0;
11514 descriptor_write.descriptorCount = 1;
11515 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
11516 descriptor_write.pTexelBufferView = &view;
11517
11518 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11519
11520 char const *vsSource = "#version 450\n"
11521 "\n"
11522 "out gl_PerVertex { \n"
11523 " vec4 gl_Position;\n"
11524 "};\n"
11525 "void main(){\n"
11526 " gl_Position = vec4(1);\n"
11527 "}\n";
11528 char const *fsSource = "#version 450\n"
11529 "\n"
11530 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
11531 "layout(location=0) out vec4 x;\n"
11532 "void main(){\n"
11533 " x = imageLoad(s, 0);\n"
11534 "}\n";
11535 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11536 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11537 VkPipelineObj pipe(m_device);
11538 pipe.AddShader(&vs);
11539 pipe.AddShader(&fs);
11540 pipe.AddColorAttachment();
11541 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11542
11543 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete buffer view 0x");
11544
11545 BeginCommandBuffer();
11546 VkViewport viewport = {0, 0, 16, 16, 0, 1};
11547 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
11548 VkRect2D scissor = {{0, 0}, {16, 16}};
11549 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
11550 // Bind pipeline to cmd buffer
11551 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11552 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
11553 &descriptor_set, 0, nullptr);
11554 Draw(1, 0, 0, 0);
11555 EndCommandBuffer();
11556
11557 VkSubmitInfo submit_info = {};
11558 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11559 submit_info.commandBufferCount = 1;
11560 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11561 // Submit cmd buffer and then destroy bufferView while in-flight
11562 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11563
11564 vkDestroyBufferView(m_device->device(), view, nullptr);
11565 m_errorMonitor->VerifyFound();
11566 vkQueueWaitIdle(m_device->m_queue);
11567 // Now we can actually destroy bufferView
11568 vkDestroyBufferView(m_device->device(), view, NULL);
11569 vkDestroyBuffer(m_device->device(), buffer, NULL);
11570 vkFreeMemory(m_device->device(), buffer_memory, NULL);
11571 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11572 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11573 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11574}
11575
Tobin Ehlis209532e2016-09-07 13:52:18 -060011576TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
11577 TEST_DESCRIPTION("Delete in-use sampler.");
11578
11579 ASSERT_NO_FATAL_FAILURE(InitState());
11580 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11581
11582 VkDescriptorPoolSize ds_type_count;
11583 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11584 ds_type_count.descriptorCount = 1;
11585
11586 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11587 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11588 ds_pool_ci.maxSets = 1;
11589 ds_pool_ci.poolSizeCount = 1;
11590 ds_pool_ci.pPoolSizes = &ds_type_count;
11591
11592 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011593 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060011594 ASSERT_VK_SUCCESS(err);
11595
11596 VkSamplerCreateInfo sampler_ci = {};
11597 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11598 sampler_ci.pNext = NULL;
11599 sampler_ci.magFilter = VK_FILTER_NEAREST;
11600 sampler_ci.minFilter = VK_FILTER_NEAREST;
11601 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11602 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11603 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11604 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11605 sampler_ci.mipLodBias = 1.0;
11606 sampler_ci.anisotropyEnable = VK_FALSE;
11607 sampler_ci.maxAnisotropy = 1;
11608 sampler_ci.compareEnable = VK_FALSE;
11609 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11610 sampler_ci.minLod = 1.0;
11611 sampler_ci.maxLod = 1.0;
11612 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11613 sampler_ci.unnormalizedCoordinates = VK_FALSE;
11614 VkSampler sampler;
11615
11616 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
11617 ASSERT_VK_SUCCESS(err);
11618
11619 VkDescriptorSetLayoutBinding layout_binding;
11620 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060011621 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060011622 layout_binding.descriptorCount = 1;
11623 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
11624 layout_binding.pImmutableSamplers = NULL;
11625
11626 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11627 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11628 ds_layout_ci.bindingCount = 1;
11629 ds_layout_ci.pBindings = &layout_binding;
11630 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011631 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060011632 ASSERT_VK_SUCCESS(err);
11633
11634 VkDescriptorSetAllocateInfo alloc_info = {};
11635 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11636 alloc_info.descriptorSetCount = 1;
11637 alloc_info.descriptorPool = ds_pool;
11638 alloc_info.pSetLayouts = &ds_layout;
11639 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011640 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060011641 ASSERT_VK_SUCCESS(err);
11642
11643 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11644 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11645 pipeline_layout_ci.pNext = NULL;
11646 pipeline_layout_ci.setLayoutCount = 1;
11647 pipeline_layout_ci.pSetLayouts = &ds_layout;
11648
11649 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011650 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060011651 ASSERT_VK_SUCCESS(err);
11652
11653 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011654 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 -060011655 ASSERT_TRUE(image.initialized());
11656
11657 VkImageView view;
11658 VkImageViewCreateInfo ivci = {};
11659 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
11660 ivci.image = image.handle();
11661 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
11662 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
11663 ivci.subresourceRange.layerCount = 1;
11664 ivci.subresourceRange.baseMipLevel = 0;
11665 ivci.subresourceRange.levelCount = 1;
11666 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11667
11668 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
11669 ASSERT_VK_SUCCESS(err);
11670
11671 VkDescriptorImageInfo image_info{};
11672 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11673 image_info.imageView = view;
11674 image_info.sampler = sampler;
11675
11676 VkWriteDescriptorSet descriptor_write = {};
11677 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11678 descriptor_write.dstSet = descriptor_set;
11679 descriptor_write.dstBinding = 0;
11680 descriptor_write.descriptorCount = 1;
11681 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11682 descriptor_write.pImageInfo = &image_info;
11683
11684 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11685
11686 // Create PSO to use the sampler
11687 char const *vsSource = "#version 450\n"
11688 "\n"
11689 "out gl_PerVertex { \n"
11690 " vec4 gl_Position;\n"
11691 "};\n"
11692 "void main(){\n"
11693 " gl_Position = vec4(1);\n"
11694 "}\n";
11695 char const *fsSource = "#version 450\n"
11696 "\n"
11697 "layout(set=0, binding=0) uniform sampler2D s;\n"
11698 "layout(location=0) out vec4 x;\n"
11699 "void main(){\n"
11700 " x = texture(s, vec2(1));\n"
11701 "}\n";
11702 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11703 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11704 VkPipelineObj pipe(m_device);
11705 pipe.AddShader(&vs);
11706 pipe.AddShader(&fs);
11707 pipe.AddColorAttachment();
11708 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11709
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011710 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete sampler 0x");
Tobin Ehlis209532e2016-09-07 13:52:18 -060011711
11712 BeginCommandBuffer();
11713 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011714 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11715 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
11716 &descriptor_set, 0, nullptr);
Tobin Ehlis209532e2016-09-07 13:52:18 -060011717 Draw(1, 0, 0, 0);
11718 EndCommandBuffer();
11719 // Submit cmd buffer then destroy sampler
11720 VkSubmitInfo submit_info = {};
11721 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11722 submit_info.commandBufferCount = 1;
11723 submit_info.pCommandBuffers = &m_commandBuffer->handle();
11724 // Submit cmd buffer and then destroy sampler while in-flight
11725 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11726
11727 vkDestroySampler(m_device->device(), sampler, nullptr);
11728 m_errorMonitor->VerifyFound();
11729 vkQueueWaitIdle(m_device->m_queue);
11730 // Now we can actually destroy sampler
11731 vkDestroySampler(m_device->device(), sampler, nullptr);
11732 vkDestroyImageView(m_device->device(), view, NULL);
11733 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11734 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11735 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11736}
11737
Mark Mueller1cd9f412016-08-25 13:23:52 -060011738TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Mueller96a56d52016-08-24 10:28:05 -060011739 TEST_DESCRIPTION("Call VkQueueSubmit with a semaphore that is already "
Mark Mueller1cd9f412016-08-25 13:23:52 -060011740 "signaled but not waited on by the queue. Wait on a "
11741 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060011742
11743 ASSERT_NO_FATAL_FAILURE(InitState());
11744 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11745
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011746 const char *queue_forward_progress_message = " that has already been signaled but not waited on by queue 0x";
11747 const char *invalid_fence_wait_message = " which has not been submitted on a Queue or during "
11748 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060011749
11750 BeginCommandBuffer();
11751 EndCommandBuffer();
11752
11753 VkSemaphoreCreateInfo semaphore_create_info = {};
11754 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
11755 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011756 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060011757 VkSubmitInfo submit_info = {};
11758 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11759 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011760 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060011761 submit_info.signalSemaphoreCount = 1;
11762 submit_info.pSignalSemaphores = &semaphore;
11763 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11764 m_errorMonitor->SetDesiredFailureMsg(0, "");
11765 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
11766 BeginCommandBuffer();
11767 EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011768 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060011769 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
11770 m_errorMonitor->VerifyFound();
11771
Mark Mueller1cd9f412016-08-25 13:23:52 -060011772 VkFenceCreateInfo fence_create_info = {};
11773 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
11774 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011775 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060011776
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060011778 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
11779 m_errorMonitor->VerifyFound();
11780
Mark Mueller4042b652016-09-05 22:52:21 -060011781 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060011782 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060011783 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
11784}
11785
Tobin Ehlis4af23302016-07-19 10:50:30 -060011786TEST_F(VkLayerTest, FramebufferIncompatible) {
11787 TEST_DESCRIPTION("Bind a secondary command buffer with with a framebuffer "
11788 "that does not match the framebuffer for the active "
11789 "renderpass.");
11790 ASSERT_NO_FATAL_FAILURE(InitState());
11791 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11792
11793 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011794 VkAttachmentDescription attachment = {0,
11795 VK_FORMAT_B8G8R8A8_UNORM,
11796 VK_SAMPLE_COUNT_1_BIT,
11797 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
11798 VK_ATTACHMENT_STORE_OP_STORE,
11799 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
11800 VK_ATTACHMENT_STORE_OP_DONT_CARE,
11801 VK_IMAGE_LAYOUT_UNDEFINED,
11802 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060011803
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011804 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060011805
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011806 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060011807
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011808 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060011809
11810 VkRenderPass rp;
11811 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
11812 ASSERT_VK_SUCCESS(err);
11813
11814 // A compatible framebuffer.
11815 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011816 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 -060011817 ASSERT_TRUE(image.initialized());
11818
11819 VkImageViewCreateInfo ivci = {
11820 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
11821 nullptr,
11822 0,
11823 image.handle(),
11824 VK_IMAGE_VIEW_TYPE_2D,
11825 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011826 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
11827 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060011828 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
11829 };
11830 VkImageView view;
11831 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
11832 ASSERT_VK_SUCCESS(err);
11833
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011834 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060011835 VkFramebuffer fb;
11836 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
11837 ASSERT_VK_SUCCESS(err);
11838
11839 VkCommandBufferAllocateInfo cbai = {};
11840 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
11841 cbai.commandPool = m_commandPool;
11842 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
11843 cbai.commandBufferCount = 1;
11844
11845 VkCommandBuffer sec_cb;
11846 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
11847 ASSERT_VK_SUCCESS(err);
11848 VkCommandBufferBeginInfo cbbi = {};
11849 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130011850 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060011851 cbii.renderPass = renderPass();
11852 cbii.framebuffer = fb;
11853 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11854 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011855 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 -060011856 cbbi.pInheritanceInfo = &cbii;
11857 vkBeginCommandBuffer(sec_cb, &cbbi);
11858 vkEndCommandBuffer(sec_cb);
11859
Chris Forbes3400bc52016-09-13 18:10:34 +120011860 VkCommandBufferBeginInfo cbbi2 = {
11861 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
11862 0, nullptr
11863 };
11864 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
11865 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060011866
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060011868 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060011869 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
11870 m_errorMonitor->VerifyFound();
11871 // Cleanup
11872 vkDestroyImageView(m_device->device(), view, NULL);
11873 vkDestroyRenderPass(m_device->device(), rp, NULL);
11874 vkDestroyFramebuffer(m_device->device(), fb, NULL);
11875}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011876
11877TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
11878 TEST_DESCRIPTION("If logicOp is available on the device, set it to an "
11879 "invalid value. If logicOp is not available, attempt to "
11880 "use it and verify that we see the correct error.");
11881 ASSERT_NO_FATAL_FAILURE(InitState());
11882 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11883
11884 auto features = m_device->phy().features();
11885 // Set the expected error depending on whether or not logicOp available
11886 if (VK_FALSE == features.logicOp) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011887 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "If logic operations feature not "
11888 "enabled, logicOpEnable must be "
11889 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011890 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130011891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011892 }
11893 // Create a pipeline using logicOp
11894 VkResult err;
11895
11896 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11897 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11898
11899 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011900 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011901 ASSERT_VK_SUCCESS(err);
11902
11903 VkPipelineViewportStateCreateInfo vp_state_ci = {};
11904 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
11905 vp_state_ci.viewportCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011906 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011907 vp_state_ci.pViewports = &vp;
11908 vp_state_ci.scissorCount = 1;
11909 VkRect2D scissors = {}; // Dummy scissors to point to
11910 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011911
11912 VkPipelineShaderStageCreateInfo shaderStages[2];
11913 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
11914
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011915 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11916 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011917 shaderStages[0] = vs.GetStageCreateInfo();
11918 shaderStages[1] = fs.GetStageCreateInfo();
11919
11920 VkPipelineVertexInputStateCreateInfo vi_ci = {};
11921 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
11922
11923 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
11924 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
11925 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
11926
11927 VkPipelineRasterizationStateCreateInfo rs_ci = {};
11928 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130011929 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011930
11931 VkPipelineColorBlendAttachmentState att = {};
11932 att.blendEnable = VK_FALSE;
11933 att.colorWriteMask = 0xf;
11934
11935 VkPipelineColorBlendStateCreateInfo cb_ci = {};
11936 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
11937 // Enable logicOp & set logicOp to value 1 beyond allowed entries
11938 cb_ci.logicOpEnable = VK_TRUE;
11939 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
11940 cb_ci.attachmentCount = 1;
11941 cb_ci.pAttachments = &att;
11942
Chris Forbes8aeacbf2016-10-03 14:25:08 +130011943 VkPipelineMultisampleStateCreateInfo ms_ci = {};
11944 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11945 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11946
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011947 VkGraphicsPipelineCreateInfo gp_ci = {};
11948 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
11949 gp_ci.stageCount = 2;
11950 gp_ci.pStages = shaderStages;
11951 gp_ci.pVertexInputState = &vi_ci;
11952 gp_ci.pInputAssemblyState = &ia_ci;
11953 gp_ci.pViewportState = &vp_state_ci;
11954 gp_ci.pRasterizationState = &rs_ci;
11955 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130011956 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011957 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
11958 gp_ci.layout = pipeline_layout;
11959 gp_ci.renderPass = renderPass();
11960
11961 VkPipelineCacheCreateInfo pc_ci = {};
11962 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
11963
11964 VkPipeline pipeline;
11965 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011966 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011967 ASSERT_VK_SUCCESS(err);
11968
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011969 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011970 m_errorMonitor->VerifyFound();
11971 if (VK_SUCCESS == err) {
11972 vkDestroyPipeline(m_device->device(), pipeline, NULL);
11973 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060011974 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
11975 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11976}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011977#endif // DRAW_STATE_TESTS
11978
Tobin Ehlis0788f522015-05-26 16:11:58 -060011979#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -060011980#if GTEST_IS_THREADSAFE
11981struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011982 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011983 VkEvent event;
11984 bool bailout;
11985};
11986
Karl Schultz6addd812016-02-02 17:17:23 -070011987extern "C" void *AddToCommandBuffer(void *arg) {
11988 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011989
Mike Stroyana6d14942016-07-13 15:10:05 -060011990 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011991 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011992 if (data->bailout) {
11993 break;
11994 }
11995 }
11996 return NULL;
11997}
11998
Karl Schultz6addd812016-02-02 17:17:23 -070011999TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012000 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012001
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012002 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012003
Mike Stroyanaccf7692015-05-12 16:00:45 -060012004 ASSERT_NO_FATAL_FAILURE(InitState());
12005 ASSERT_NO_FATAL_FAILURE(InitViewport());
12006 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12007
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012008 // Calls AllocateCommandBuffers
12009 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060012010
12011 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012012 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012013
12014 VkEventCreateInfo event_info;
12015 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012016 VkResult err;
12017
12018 memset(&event_info, 0, sizeof(event_info));
12019 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12020
Chia-I Wuf7458c52015-10-26 21:10:41 +080012021 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012022 ASSERT_VK_SUCCESS(err);
12023
Mike Stroyanaccf7692015-05-12 16:00:45 -060012024 err = vkResetEvent(device(), event);
12025 ASSERT_VK_SUCCESS(err);
12026
12027 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012028 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012029 data.event = event;
12030 data.bailout = false;
12031 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060012032
12033 // First do some correct operations using multiple threads.
12034 // Add many entries to command buffer from another thread.
12035 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
12036 // Make non-conflicting calls from this thread at the same time.
12037 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060012038 uint32_t count;
12039 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060012040 }
12041 test_platform_thread_join(thread, NULL);
12042
12043 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060012044 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012045 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012046 // Add many entries to command buffer from this thread at the same time.
12047 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060012048
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012049 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012050 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012051
Mike Stroyan10b8cb72016-01-22 15:22:03 -070012052 m_errorMonitor->SetBailout(NULL);
12053
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012054 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012055
Chia-I Wuf7458c52015-10-26 21:10:41 +080012056 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012057}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012058#endif // GTEST_IS_THREADSAFE
12059#endif // THREADING_TESTS
12060
Chris Forbes9f7ff632015-05-25 11:13:08 +120012061#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070012062TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012063 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
12064 "with an impossible code size");
12065
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012066 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012067
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012068 ASSERT_NO_FATAL_FAILURE(InitState());
12069 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12070
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012071 VkShaderModule module;
12072 VkShaderModuleCreateInfo moduleCreateInfo;
12073 struct icd_spv_header spv;
12074
12075 spv.magic = ICD_SPV_MAGIC;
12076 spv.version = ICD_SPV_VERSION;
12077 spv.gen_magic = 0;
12078
12079 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12080 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070012081 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012082 moduleCreateInfo.codeSize = 4;
12083 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012084 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012085
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012086 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012087}
12088
Karl Schultz6addd812016-02-02 17:17:23 -070012089TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012090 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
12091 "with a bad magic number");
12092
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012093 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012094
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012095 ASSERT_NO_FATAL_FAILURE(InitState());
12096 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12097
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012098 VkShaderModule module;
12099 VkShaderModuleCreateInfo moduleCreateInfo;
12100 struct icd_spv_header spv;
12101
12102 spv.magic = ~ICD_SPV_MAGIC;
12103 spv.version = ICD_SPV_VERSION;
12104 spv.gen_magic = 0;
12105
12106 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12107 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070012108 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012109 moduleCreateInfo.codeSize = sizeof(spv) + 10;
12110 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012111 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012112
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012113 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012114}
12115
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012116#if 0
12117// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070012118TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012119 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012120 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012121
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012122 ASSERT_NO_FATAL_FAILURE(InitState());
12123 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12124
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012125 VkShaderModule module;
12126 VkShaderModuleCreateInfo moduleCreateInfo;
12127 struct icd_spv_header spv;
12128
12129 spv.magic = ICD_SPV_MAGIC;
12130 spv.version = ~ICD_SPV_VERSION;
12131 spv.gen_magic = 0;
12132
12133 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12134 moduleCreateInfo.pNext = NULL;
12135
Karl Schultz6addd812016-02-02 17:17:23 -070012136 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012137 moduleCreateInfo.codeSize = sizeof(spv) + 10;
12138 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012139 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012140
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012141 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012142}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012143#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012144
Karl Schultz6addd812016-02-02 17:17:23 -070012145TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012146 TEST_DESCRIPTION("Test that a warning is produced for a vertex output that "
12147 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012148 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012149
Chris Forbes9f7ff632015-05-25 11:13:08 +120012150 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012151 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120012152
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012153 char const *vsSource = "#version 450\n"
12154 "\n"
12155 "layout(location=0) out float x;\n"
12156 "out gl_PerVertex {\n"
12157 " vec4 gl_Position;\n"
12158 "};\n"
12159 "void main(){\n"
12160 " gl_Position = vec4(1);\n"
12161 " x = 0;\n"
12162 "}\n";
12163 char const *fsSource = "#version 450\n"
12164 "\n"
12165 "layout(location=0) out vec4 color;\n"
12166 "void main(){\n"
12167 " color = vec4(1);\n"
12168 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120012169
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012170 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12171 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120012172
12173 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012174 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120012175 pipe.AddShader(&vs);
12176 pipe.AddShader(&fs);
12177
Chris Forbes9f7ff632015-05-25 11:13:08 +120012178 VkDescriptorSetObj descriptorSet(m_device);
12179 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012180 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120012181
Tony Barbour5781e8f2015-08-04 16:23:11 -060012182 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120012183
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012184 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120012185}
Chris Forbes9f7ff632015-05-25 11:13:08 +120012186
Mark Mueller098c9cb2016-09-08 09:01:57 -060012187TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
12188 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
12189
12190 ASSERT_NO_FATAL_FAILURE(InitState());
12191 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12192
12193 const char *bad_specialization_message =
12194 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
12195
12196 char const *vsSource =
12197 "#version 450\n"
12198 "\n"
12199 "out gl_PerVertex {\n"
12200 " vec4 gl_Position;\n"
12201 "};\n"
12202 "void main(){\n"
12203 " gl_Position = vec4(1);\n"
12204 "}\n";
12205
12206 char const *fsSource =
12207 "#version 450\n"
12208 "\n"
12209 "layout (constant_id = 0) const float r = 0.0f;\n"
12210 "layout(location = 0) out vec4 uFragColor;\n"
12211 "void main(){\n"
12212 " uFragColor = vec4(r,1,0,1);\n"
12213 "}\n";
12214
12215 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12216 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12217
12218 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12219 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12220
12221 VkPipelineLayout pipeline_layout;
12222 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12223
12224 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
12225 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
12226 vp_state_create_info.viewportCount = 1;
12227 VkViewport viewport = {};
12228 vp_state_create_info.pViewports = &viewport;
12229 vp_state_create_info.scissorCount = 1;
12230 VkRect2D scissors = {};
12231 vp_state_create_info.pScissors = &scissors;
12232
12233 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
12234
12235 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
12236 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
12237 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
12238 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
12239
12240 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {
12241 vs.GetStageCreateInfo(),
12242 fs.GetStageCreateInfo()
12243 };
12244
12245 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
12246 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
12247
12248 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
12249 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
12250 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
12251
12252 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
12253 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
12254 rasterization_state_create_info.pNext = nullptr;
12255 rasterization_state_create_info.lineWidth = 1.0f;
12256 rasterization_state_create_info.rasterizerDiscardEnable = true;
12257
12258 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
12259 color_blend_attachment_state.blendEnable = VK_FALSE;
12260 color_blend_attachment_state.colorWriteMask = 0xf;
12261
12262 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
12263 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
12264 color_blend_state_create_info.attachmentCount = 1;
12265 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
12266
12267 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
12268 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
12269 graphicspipe_create_info.stageCount = 2;
12270 graphicspipe_create_info.pStages = shader_stage_create_info;
12271 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
12272 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
12273 graphicspipe_create_info.pViewportState = &vp_state_create_info;
12274 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
12275 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
12276 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
12277 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
12278 graphicspipe_create_info.layout = pipeline_layout;
12279 graphicspipe_create_info.renderPass = renderPass();
12280
12281 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
12282 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
12283
12284 VkPipelineCache pipelineCache;
12285 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
12286
12287 // This structure maps constant ids to data locations.
12288 const VkSpecializationMapEntry entry =
12289 // id, offset, size
12290 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
12291
12292 uint32_t data = 1;
12293
12294 // Set up the info describing spec map and data
12295 const VkSpecializationInfo specialization_info = {
12296 1,
12297 &entry,
12298 1 * sizeof(float),
12299 &data,
12300 };
12301 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
12302
12303 VkPipeline pipeline;
12304 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
12305 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
12306 m_errorMonitor->VerifyFound();
12307
12308 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
12309 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12310}
12311
12312TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
12313 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
12314
12315 ASSERT_NO_FATAL_FAILURE(InitState());
12316 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12317
12318 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
12319
12320 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
12321 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12322 descriptor_pool_type_count[0].descriptorCount = 1;
12323 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
12324 descriptor_pool_type_count[1].descriptorCount = 1;
12325
12326 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12327 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12328 descriptor_pool_create_info.maxSets = 1;
12329 descriptor_pool_create_info.poolSizeCount = 2;
12330 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
12331 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12332
12333 VkDescriptorPool descriptorset_pool;
12334 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
12335
12336 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
12337 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
12338 descriptorset_layout_binding.descriptorCount = 1;
12339 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
12340
12341 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
12342 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12343 descriptorset_layout_create_info.bindingCount = 1;
12344 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12345
12346 VkDescriptorSetLayout descriptorset_layout;
12347 ASSERT_VK_SUCCESS(vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
12348
12349 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
12350 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12351 descriptorset_allocate_info.descriptorSetCount = 1;
12352 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12353 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
12354 VkDescriptorSet descriptorset;
12355 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
12356
12357 // Challenge core_validation with a non uniform buffer type.
12358 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
12359
Mark Mueller098c9cb2016-09-08 09:01:57 -060012360 char const *vsSource =
12361 "#version 450\n"
12362 "\n"
12363 "layout (std140, set = 0, binding = 0) uniform buf {\n"
12364 " mat4 mvp;\n"
12365 "} ubuf;\n"
12366 "out gl_PerVertex {\n"
12367 " vec4 gl_Position;\n"
12368 "};\n"
12369 "void main(){\n"
12370 " gl_Position = ubuf.mvp * vec4(1);\n"
12371 "}\n";
12372
12373 char const *fsSource =
12374 "#version 450\n"
12375 "\n"
12376 "layout(location = 0) out vec4 uFragColor;\n"
12377 "void main(){\n"
12378 " uFragColor = vec4(0,1,0,1);\n"
12379 "}\n";
12380
12381 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12382 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12383
12384 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12385 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12386 pipeline_layout_create_info.setLayoutCount = 1;
12387 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12388
12389 VkPipelineLayout pipeline_layout;
12390 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12391
12392 VkPipelineObj pipe(m_device);
12393 pipe.AddColorAttachment();
12394 pipe.AddShader(&vs);
12395 pipe.AddShader(&fs);
12396
12397 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
12398 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12399 m_errorMonitor->VerifyFound();
12400
12401 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12402 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
12403 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
12404}
12405
12406TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
12407 TEST_DESCRIPTION(
12408 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
12409
12410 ASSERT_NO_FATAL_FAILURE(InitState());
12411 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12412
12413 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
12414
12415 VkDescriptorPoolSize descriptor_pool_type_count = {};
12416 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12417 descriptor_pool_type_count.descriptorCount = 1;
12418
12419 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12420 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12421 descriptor_pool_create_info.maxSets = 1;
12422 descriptor_pool_create_info.poolSizeCount = 1;
12423 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
12424 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12425
12426 VkDescriptorPool descriptorset_pool;
12427 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
12428
12429 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
12430 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12431 descriptorset_layout_binding.descriptorCount = 1;
12432 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
12433 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12434
12435 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
12436 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12437 descriptorset_layout_create_info.bindingCount = 1;
12438 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12439
12440 VkDescriptorSetLayout descriptorset_layout;
12441 ASSERT_VK_SUCCESS(vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info,
12442 nullptr, &descriptorset_layout));
12443
12444 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
12445 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12446 descriptorset_allocate_info.descriptorSetCount = 1;
12447 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12448 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
12449 VkDescriptorSet descriptorset;
12450 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
12451
12452 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
12453
Mark Mueller098c9cb2016-09-08 09:01:57 -060012454 char const *vsSource =
12455 "#version 450\n"
12456 "\n"
12457 "layout (std140, set = 0, binding = 0) uniform buf {\n"
12458 " mat4 mvp;\n"
12459 "} ubuf;\n"
12460 "out gl_PerVertex {\n"
12461 " vec4 gl_Position;\n"
12462 "};\n"
12463 "void main(){\n"
12464 " gl_Position = ubuf.mvp * vec4(1);\n"
12465 "}\n";
12466
12467 char const *fsSource =
12468 "#version 450\n"
12469 "\n"
12470 "layout(location = 0) out vec4 uFragColor;\n"
12471 "void main(){\n"
12472 " uFragColor = vec4(0,1,0,1);\n"
12473 "}\n";
12474
12475 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12476 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12477
12478 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12479 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12480 pipeline_layout_create_info.setLayoutCount = 1;
12481 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12482
12483 VkPipelineLayout pipeline_layout;
12484 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12485
12486 VkPipelineObj pipe(m_device);
12487 pipe.AddColorAttachment();
12488 pipe.AddShader(&vs);
12489 pipe.AddShader(&fs);
12490
12491 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
12492 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12493 m_errorMonitor->VerifyFound();
12494
12495 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12496 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
12497 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
12498}
12499
12500TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
12501 TEST_DESCRIPTION("Create a graphics pipleine in which a push constant range containing a push constant block member is not "
12502 "accessible from the current shader stage.");
12503
12504 ASSERT_NO_FATAL_FAILURE(InitState());
12505 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12506
12507 const char *push_constant_not_accessible_message =
12508 "Push constant range covering variable starting at offset 0 not accessible from stage VK_SHADER_STAGE_VERTEX_BIT";
12509
12510 char const *vsSource =
12511 "#version 450\n"
12512 "\n"
12513 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
12514 "out gl_PerVertex {\n"
12515 " vec4 gl_Position;\n"
12516 "};\n"
12517 "void main(){\n"
12518 " gl_Position = vec4(consts.x);\n"
12519 "}\n";
12520
12521 char const *fsSource =
12522 "#version 450\n"
12523 "\n"
12524 "layout(location = 0) out vec4 uFragColor;\n"
12525 "void main(){\n"
12526 " uFragColor = vec4(0,1,0,1);\n"
12527 "}\n";
12528
12529 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12530 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12531
12532 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12533 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12534
12535 // Set up a push constant range
12536 VkPushConstantRange push_constant_ranges = {};
12537 // Set to the wrong stage to challenge core_validation
12538 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12539 push_constant_ranges.size = 4;
12540
12541 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
12542 pipeline_layout_create_info.pushConstantRangeCount = 1;
12543
12544 VkPipelineLayout pipeline_layout;
12545 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12546
12547 VkPipelineObj pipe(m_device);
12548 pipe.AddColorAttachment();
12549 pipe.AddShader(&vs);
12550 pipe.AddShader(&fs);
12551
12552 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
12553 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12554 m_errorMonitor->VerifyFound();
12555
12556 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12557}
12558
12559TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
12560 TEST_DESCRIPTION(
12561 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
12562
12563 ASSERT_NO_FATAL_FAILURE(InitState());
12564 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12565
12566 const char *feature_not_enabled_message =
12567 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
12568
12569 // Some awkward steps are required to test with custom device features.
12570 std::vector<const char *> device_extension_names;
12571 auto features = m_device->phy().features();
12572 // Disable support for 64 bit floats
12573 features.shaderFloat64 = false;
12574 // The sacrificial device object
12575 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12576
12577 char const *vsSource = "#version 450\n"
12578 "\n"
12579 "out gl_PerVertex {\n"
12580 " vec4 gl_Position;\n"
12581 "};\n"
12582 "void main(){\n"
12583 " gl_Position = vec4(1);\n"
12584 "}\n";
12585 char const *fsSource = "#version 450\n"
12586 "\n"
12587 "layout(location=0) out vec4 color;\n"
12588 "void main(){\n"
12589 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
12590 " color = vec4(green);\n"
12591 "}\n";
12592
12593 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12594 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12595
12596 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060012597
12598 VkPipelineObj pipe(&test_device);
12599 pipe.AddColorAttachment();
12600 pipe.AddShader(&vs);
12601 pipe.AddShader(&fs);
12602
12603 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12604 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12605 VkPipelineLayout pipeline_layout;
12606 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12607
12608 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
12609 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
12610 m_errorMonitor->VerifyFound();
12611
12612 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
12613}
12614
12615TEST_F(VkLayerTest, CreatePipelineCheckShaderBadCapability) {
12616 TEST_DESCRIPTION("Create a graphics pipeline in which a capability declared by the shader is not supported by Vulkan shaders.");
12617
12618 ASSERT_NO_FATAL_FAILURE(InitState());
12619 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12620
12621 const char *bad_capability_message = "Shader declares capability 53, not supported in Vulkan.";
12622
12623 char const *vsSource = "#version 450\n"
12624 "\n"
12625 "out gl_PerVertex {\n"
12626 " vec4 gl_Position;\n"
12627 "};\n"
12628 "layout(xfb_buffer = 1) out;"
12629 "void main(){\n"
12630 " gl_Position = vec4(1);\n"
12631 "}\n";
12632 char const *fsSource = "#version 450\n"
12633 "\n"
12634 "layout(location=0) out vec4 color;\n"
12635 "void main(){\n"
12636 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
12637 " color = vec4(green);\n"
12638 "}\n";
12639
12640 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12641 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12642
12643 VkPipelineObj pipe(m_device);
12644 pipe.AddColorAttachment();
12645 pipe.AddShader(&vs);
12646 pipe.AddShader(&fs);
12647
12648 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
12649 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12650 VkPipelineLayout pipeline_layout;
12651 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
12652
12653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_capability_message);
12654 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12655 m_errorMonitor->VerifyFound();
12656
12657 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12658}
12659
Karl Schultz6addd812016-02-02 17:17:23 -070012660TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012661 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
12662 "which is not present in the outputs of the previous stage");
12663
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012664 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012665
Chris Forbes59cb88d2015-05-25 11:13:13 +120012666 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012667 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120012668
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012669 char const *vsSource = "#version 450\n"
12670 "\n"
12671 "out gl_PerVertex {\n"
12672 " vec4 gl_Position;\n"
12673 "};\n"
12674 "void main(){\n"
12675 " gl_Position = vec4(1);\n"
12676 "}\n";
12677 char const *fsSource = "#version 450\n"
12678 "\n"
12679 "layout(location=0) in float x;\n"
12680 "layout(location=0) out vec4 color;\n"
12681 "void main(){\n"
12682 " color = vec4(x);\n"
12683 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120012684
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012685 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12686 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120012687
12688 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012689 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120012690 pipe.AddShader(&vs);
12691 pipe.AddShader(&fs);
12692
Chris Forbes59cb88d2015-05-25 11:13:13 +120012693 VkDescriptorSetObj descriptorSet(m_device);
12694 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012695 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120012696
Tony Barbour5781e8f2015-08-04 16:23:11 -060012697 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120012698
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012699 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120012700}
12701
Karl Schultz6addd812016-02-02 17:17:23 -070012702TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012703 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
12704 "within an interace block, which is not present in the outputs "
12705 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012706 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012707
12708 ASSERT_NO_FATAL_FAILURE(InitState());
12709 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12710
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012711 char const *vsSource = "#version 450\n"
12712 "\n"
12713 "out gl_PerVertex {\n"
12714 " vec4 gl_Position;\n"
12715 "};\n"
12716 "void main(){\n"
12717 " gl_Position = vec4(1);\n"
12718 "}\n";
12719 char const *fsSource = "#version 450\n"
12720 "\n"
12721 "in block { layout(location=0) float x; } ins;\n"
12722 "layout(location=0) out vec4 color;\n"
12723 "void main(){\n"
12724 " color = vec4(ins.x);\n"
12725 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130012726
12727 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12728 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12729
12730 VkPipelineObj pipe(m_device);
12731 pipe.AddColorAttachment();
12732 pipe.AddShader(&vs);
12733 pipe.AddShader(&fs);
12734
12735 VkDescriptorSetObj descriptorSet(m_device);
12736 descriptorSet.AppendDummy();
12737 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12738
12739 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12740
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012741 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130012742}
12743
Karl Schultz6addd812016-02-02 17:17:23 -070012744TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012745 TEST_DESCRIPTION("Test that an error is produced for mismatched array sizes "
Mike Weiblencce7ec72016-10-17 19:33:05 -060012746 "across the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012747 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0.0: 'ptr to "
12748 "output arr[2] of float32' vs 'ptr to "
12749 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130012750
12751 ASSERT_NO_FATAL_FAILURE(InitState());
12752 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12753
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012754 char const *vsSource = "#version 450\n"
12755 "\n"
12756 "layout(location=0) out float x[2];\n"
12757 "out gl_PerVertex {\n"
12758 " vec4 gl_Position;\n"
12759 "};\n"
12760 "void main(){\n"
12761 " x[0] = 0; x[1] = 0;\n"
12762 " gl_Position = vec4(1);\n"
12763 "}\n";
12764 char const *fsSource = "#version 450\n"
12765 "\n"
12766 "layout(location=0) in float x[3];\n"
12767 "layout(location=0) out vec4 color;\n"
12768 "void main(){\n"
12769 " color = vec4(x[0] + x[1] + x[2]);\n"
12770 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130012771
12772 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12773 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12774
12775 VkPipelineObj pipe(m_device);
12776 pipe.AddColorAttachment();
12777 pipe.AddShader(&vs);
12778 pipe.AddShader(&fs);
12779
12780 VkDescriptorSetObj descriptorSet(m_device);
12781 descriptorSet.AppendDummy();
12782 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12783
12784 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12785
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012786 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130012787}
12788
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060012789
Karl Schultz6addd812016-02-02 17:17:23 -070012790TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012791 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
Mike Weiblencce7ec72016-10-17 19:33:05 -060012792 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012793 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012794
Chris Forbesb56af562015-05-25 11:13:17 +120012795 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012796 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120012797
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012798 char const *vsSource = "#version 450\n"
12799 "\n"
12800 "layout(location=0) out int x;\n"
12801 "out gl_PerVertex {\n"
12802 " vec4 gl_Position;\n"
12803 "};\n"
12804 "void main(){\n"
12805 " x = 0;\n"
12806 " gl_Position = vec4(1);\n"
12807 "}\n";
12808 char const *fsSource = "#version 450\n"
12809 "\n"
12810 "layout(location=0) in float x;\n" /* VS writes int */
12811 "layout(location=0) out vec4 color;\n"
12812 "void main(){\n"
12813 " color = vec4(x);\n"
12814 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120012815
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012816 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12817 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120012818
12819 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012820 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120012821 pipe.AddShader(&vs);
12822 pipe.AddShader(&fs);
12823
Chris Forbesb56af562015-05-25 11:13:17 +120012824 VkDescriptorSetObj descriptorSet(m_device);
12825 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012826 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120012827
Tony Barbour5781e8f2015-08-04 16:23:11 -060012828 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120012829
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012830 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120012831}
12832
Karl Schultz6addd812016-02-02 17:17:23 -070012833TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012834 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
Mike Weiblencce7ec72016-10-17 19:33:05 -060012835 "the vertex->fragment shader interface, when the variable is contained within "
Chris Forbes1cc79542016-07-20 11:13:44 +120012836 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012837 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012838
12839 ASSERT_NO_FATAL_FAILURE(InitState());
12840 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12841
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012842 char const *vsSource = "#version 450\n"
12843 "\n"
12844 "out block { layout(location=0) int x; } outs;\n"
12845 "out gl_PerVertex {\n"
12846 " vec4 gl_Position;\n"
12847 "};\n"
12848 "void main(){\n"
12849 " outs.x = 0;\n"
12850 " gl_Position = vec4(1);\n"
12851 "}\n";
12852 char const *fsSource = "#version 450\n"
12853 "\n"
12854 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
12855 "layout(location=0) out vec4 color;\n"
12856 "void main(){\n"
12857 " color = vec4(ins.x);\n"
12858 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130012859
12860 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12861 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12862
12863 VkPipelineObj pipe(m_device);
12864 pipe.AddColorAttachment();
12865 pipe.AddShader(&vs);
12866 pipe.AddShader(&fs);
12867
12868 VkDescriptorSetObj descriptorSet(m_device);
12869 descriptorSet.AppendDummy();
12870 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12871
12872 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12873
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012874 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130012875}
12876
12877TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012878 TEST_DESCRIPTION("Test that an error is produced for location mismatches across "
Mike Weiblencce7ec72016-10-17 19:33:05 -060012879 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
Chris Forbes1cc79542016-07-20 11:13:44 +120012880 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012881 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 +130012882
12883 ASSERT_NO_FATAL_FAILURE(InitState());
12884 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12885
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012886 char const *vsSource = "#version 450\n"
12887 "\n"
12888 "out block { layout(location=1) float x; } outs;\n"
12889 "out gl_PerVertex {\n"
12890 " vec4 gl_Position;\n"
12891 "};\n"
12892 "void main(){\n"
12893 " outs.x = 0;\n"
12894 " gl_Position = vec4(1);\n"
12895 "}\n";
12896 char const *fsSource = "#version 450\n"
12897 "\n"
12898 "in block { layout(location=0) float x; } ins;\n"
12899 "layout(location=0) out vec4 color;\n"
12900 "void main(){\n"
12901 " color = vec4(ins.x);\n"
12902 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130012903
12904 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12905 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12906
12907 VkPipelineObj pipe(m_device);
12908 pipe.AddColorAttachment();
12909 pipe.AddShader(&vs);
12910 pipe.AddShader(&fs);
12911
12912 VkDescriptorSetObj descriptorSet(m_device);
12913 descriptorSet.AppendDummy();
12914 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12915
12916 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12917
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012918 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130012919}
12920
12921TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012922 TEST_DESCRIPTION("Test that an error is produced for component mismatches across the "
Mike Weiblencce7ec72016-10-17 19:33:05 -060012923 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
Chris Forbes1cc79542016-07-20 11:13:44 +120012924 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012925 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 +130012926
12927 ASSERT_NO_FATAL_FAILURE(InitState());
12928 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12929
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012930 char const *vsSource = "#version 450\n"
12931 "\n"
12932 "out block { layout(location=0, component=0) float x; } outs;\n"
12933 "out gl_PerVertex {\n"
12934 " vec4 gl_Position;\n"
12935 "};\n"
12936 "void main(){\n"
12937 " outs.x = 0;\n"
12938 " gl_Position = vec4(1);\n"
12939 "}\n";
12940 char const *fsSource = "#version 450\n"
12941 "\n"
12942 "in block { layout(location=0, component=1) float x; } ins;\n"
12943 "layout(location=0) out vec4 color;\n"
12944 "void main(){\n"
12945 " color = vec4(ins.x);\n"
12946 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130012947
12948 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12949 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12950
12951 VkPipelineObj pipe(m_device);
12952 pipe.AddColorAttachment();
12953 pipe.AddShader(&vs);
12954 pipe.AddShader(&fs);
12955
12956 VkDescriptorSetObj descriptorSet(m_device);
12957 descriptorSet.AppendDummy();
12958 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12959
12960 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12961
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012962 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130012963}
12964
Chris Forbes1f3b0152016-11-30 12:48:40 +130012965TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
12966 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
12967
12968 ASSERT_NO_FATAL_FAILURE(InitState());
12969 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12970
12971 char const *vsSource = "#version 450\n"
12972 "layout(location=0) out mediump float x;\n"
12973 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
12974 char const *fsSource = "#version 450\n"
12975 "layout(location=0) in highp float x;\n"
12976 "layout(location=0) out vec4 color;\n"
12977 "void main() { color = vec4(x); }\n";
12978
12979 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12980 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12981
12982 VkPipelineObj pipe(m_device);
12983 pipe.AddColorAttachment();
12984 pipe.AddShader(&vs);
12985 pipe.AddShader(&fs);
12986
12987 VkDescriptorSetObj descriptorSet(m_device);
12988 descriptorSet.AppendDummy();
12989 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12990
12991 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
12992
12993 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12994
12995 m_errorMonitor->VerifyFound();
12996}
12997
Chris Forbes870a39e2016-11-30 12:55:56 +130012998TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
12999 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
13000
13001 ASSERT_NO_FATAL_FAILURE(InitState());
13002 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13003
13004 char const *vsSource = "#version 450\n"
13005 "out block { layout(location=0) mediump float x; };\n"
13006 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
13007 char const *fsSource = "#version 450\n"
13008 "in block { layout(location=0) highp float x; };\n"
13009 "layout(location=0) out vec4 color;\n"
13010 "void main() { color = vec4(x); }\n";
13011
13012 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13013 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13014
13015 VkPipelineObj pipe(m_device);
13016 pipe.AddColorAttachment();
13017 pipe.AddShader(&vs);
13018 pipe.AddShader(&fs);
13019
13020 VkDescriptorSetObj descriptorSet(m_device);
13021 descriptorSet.AppendDummy();
13022 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13023
13024 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
13025
13026 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13027
13028 m_errorMonitor->VerifyFound();
13029}
13030
Karl Schultz6addd812016-02-02 17:17:23 -070013031TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013032 TEST_DESCRIPTION("Test that a warning is produced for a vertex attribute which is "
13033 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060013034 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013035
Chris Forbesde136e02015-05-25 11:13:28 +120013036 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013037 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120013038
13039 VkVertexInputBindingDescription input_binding;
13040 memset(&input_binding, 0, sizeof(input_binding));
13041
13042 VkVertexInputAttributeDescription input_attrib;
13043 memset(&input_attrib, 0, sizeof(input_attrib));
13044 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13045
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013046 char const *vsSource = "#version 450\n"
13047 "\n"
13048 "out gl_PerVertex {\n"
13049 " vec4 gl_Position;\n"
13050 "};\n"
13051 "void main(){\n"
13052 " gl_Position = vec4(1);\n"
13053 "}\n";
13054 char const *fsSource = "#version 450\n"
13055 "\n"
13056 "layout(location=0) out vec4 color;\n"
13057 "void main(){\n"
13058 " color = vec4(1);\n"
13059 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120013060
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013061 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13062 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120013063
13064 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013065 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120013066 pipe.AddShader(&vs);
13067 pipe.AddShader(&fs);
13068
13069 pipe.AddVertexInputBindings(&input_binding, 1);
13070 pipe.AddVertexInputAttribs(&input_attrib, 1);
13071
Chris Forbesde136e02015-05-25 11:13:28 +120013072 VkDescriptorSetObj descriptorSet(m_device);
13073 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013074 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120013075
Tony Barbour5781e8f2015-08-04 16:23:11 -060013076 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120013077
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013078 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120013079}
13080
Karl Schultz6addd812016-02-02 17:17:23 -070013081TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013082 TEST_DESCRIPTION("Test that a warning is produced for a location mismatch on "
13083 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060013084 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130013085
13086 ASSERT_NO_FATAL_FAILURE(InitState());
13087 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13088
13089 VkVertexInputBindingDescription input_binding;
13090 memset(&input_binding, 0, sizeof(input_binding));
13091
13092 VkVertexInputAttributeDescription input_attrib;
13093 memset(&input_attrib, 0, sizeof(input_attrib));
13094 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13095
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013096 char const *vsSource = "#version 450\n"
13097 "\n"
13098 "layout(location=1) in float x;\n"
13099 "out gl_PerVertex {\n"
13100 " vec4 gl_Position;\n"
13101 "};\n"
13102 "void main(){\n"
13103 " gl_Position = vec4(x);\n"
13104 "}\n";
13105 char const *fsSource = "#version 450\n"
13106 "\n"
13107 "layout(location=0) out vec4 color;\n"
13108 "void main(){\n"
13109 " color = vec4(1);\n"
13110 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130013111
13112 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13113 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13114
13115 VkPipelineObj pipe(m_device);
13116 pipe.AddColorAttachment();
13117 pipe.AddShader(&vs);
13118 pipe.AddShader(&fs);
13119
13120 pipe.AddVertexInputBindings(&input_binding, 1);
13121 pipe.AddVertexInputAttribs(&input_attrib, 1);
13122
13123 VkDescriptorSetObj descriptorSet(m_device);
13124 descriptorSet.AppendDummy();
13125 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13126
13127 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13128
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013129 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130013130}
13131
Karl Schultz6addd812016-02-02 17:17:23 -070013132TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mike Weiblen15bd38e2016-10-03 19:19:41 -060013133 TEST_DESCRIPTION("Test that an error is produced for a vertex shader input which is not "
Chris Forbes1cc79542016-07-20 11:13:44 +120013134 "provided by a vertex attribute");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060013135 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 -060013136
Chris Forbes62e8e502015-05-25 11:13:29 +120013137 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013138 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120013139
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013140 char const *vsSource = "#version 450\n"
13141 "\n"
13142 "layout(location=0) in vec4 x;\n" /* not provided */
13143 "out gl_PerVertex {\n"
13144 " vec4 gl_Position;\n"
13145 "};\n"
13146 "void main(){\n"
13147 " gl_Position = x;\n"
13148 "}\n";
13149 char const *fsSource = "#version 450\n"
13150 "\n"
13151 "layout(location=0) out vec4 color;\n"
13152 "void main(){\n"
13153 " color = vec4(1);\n"
13154 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120013155
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013156 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13157 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120013158
13159 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013160 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120013161 pipe.AddShader(&vs);
13162 pipe.AddShader(&fs);
13163
Chris Forbes62e8e502015-05-25 11:13:29 +120013164 VkDescriptorSetObj descriptorSet(m_device);
13165 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013166 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120013167
Tony Barbour5781e8f2015-08-04 16:23:11 -060013168 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120013169
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013170 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120013171}
13172
Karl Schultz6addd812016-02-02 17:17:23 -070013173TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013174 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the "
13175 "fundamental type (float/int/uint) of an attribute and the "
Mike Weiblen15bd38e2016-10-03 19:19:41 -060013176 "vertex shader input that consumes it");
13177 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 -060013178
Chris Forbesc97d98e2015-05-25 11:13:31 +120013179 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013180 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120013181
13182 VkVertexInputBindingDescription input_binding;
13183 memset(&input_binding, 0, sizeof(input_binding));
13184
13185 VkVertexInputAttributeDescription input_attrib;
13186 memset(&input_attrib, 0, sizeof(input_attrib));
13187 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13188
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013189 char const *vsSource = "#version 450\n"
13190 "\n"
13191 "layout(location=0) in int x;\n" /* attrib provided float */
13192 "out gl_PerVertex {\n"
13193 " vec4 gl_Position;\n"
13194 "};\n"
13195 "void main(){\n"
13196 " gl_Position = vec4(x);\n"
13197 "}\n";
13198 char const *fsSource = "#version 450\n"
13199 "\n"
13200 "layout(location=0) out vec4 color;\n"
13201 "void main(){\n"
13202 " color = vec4(1);\n"
13203 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120013204
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013205 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13206 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120013207
13208 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013209 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120013210 pipe.AddShader(&vs);
13211 pipe.AddShader(&fs);
13212
13213 pipe.AddVertexInputBindings(&input_binding, 1);
13214 pipe.AddVertexInputAttribs(&input_attrib, 1);
13215
Chris Forbesc97d98e2015-05-25 11:13:31 +120013216 VkDescriptorSetObj descriptorSet(m_device);
13217 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013218 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120013219
Tony Barbour5781e8f2015-08-04 16:23:11 -060013220 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120013221
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013222 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120013223}
13224
Chris Forbesc68b43c2016-04-06 11:18:47 +120013225TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013226 TEST_DESCRIPTION("Test that an error is produced for a pipeline containing multiple "
13227 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013228 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13229 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120013230
13231 ASSERT_NO_FATAL_FAILURE(InitState());
13232 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13233
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013234 char const *vsSource = "#version 450\n"
13235 "\n"
13236 "out gl_PerVertex {\n"
13237 " vec4 gl_Position;\n"
13238 "};\n"
13239 "void main(){\n"
13240 " gl_Position = vec4(1);\n"
13241 "}\n";
13242 char const *fsSource = "#version 450\n"
13243 "\n"
13244 "layout(location=0) out vec4 color;\n"
13245 "void main(){\n"
13246 " color = vec4(1);\n"
13247 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120013248
13249 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13250 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13251
13252 VkPipelineObj pipe(m_device);
13253 pipe.AddColorAttachment();
13254 pipe.AddShader(&vs);
Mike Weiblencce7ec72016-10-17 19:33:05 -060013255 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120013256 pipe.AddShader(&fs);
13257
13258 VkDescriptorSetObj descriptorSet(m_device);
13259 descriptorSet.AppendDummy();
13260 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13261
13262 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13263
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013264 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120013265}
13266
Chris Forbes82ff92a2016-09-09 10:50:24 +120013267TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
13268 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13269 "No entrypoint found named `foo`");
13270
13271 ASSERT_NO_FATAL_FAILURE(InitState());
13272 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13273
13274 char const *vsSource = "#version 450\n"
13275 "out gl_PerVertex {\n"
13276 " vec4 gl_Position;\n"
13277 "};\n"
13278 "void main(){\n"
13279 " gl_Position = vec4(0);\n"
13280 "}\n";
13281 char const *fsSource = "#version 450\n"
13282 "\n"
13283 "layout(location=0) out vec4 color;\n"
13284 "void main(){\n"
13285 " color = vec4(1);\n"
13286 "}\n";
13287
13288 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13289 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
13290
13291 VkPipelineObj pipe(m_device);
13292 pipe.AddColorAttachment();
13293 pipe.AddShader(&vs);
13294 pipe.AddShader(&fs);
13295
13296 VkDescriptorSetObj descriptorSet(m_device);
13297 descriptorSet.AppendDummy();
13298 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13299
13300 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13301
13302 m_errorMonitor->VerifyFound();
13303}
13304
Chris Forbesae9d8cd2016-09-13 16:32:57 +120013305TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
13306 m_errorMonitor->SetDesiredFailureMsg(
13307 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13308 "pDepthStencilState is NULL when rasterization is enabled and subpass "
13309 "uses a depth/stencil attachment");
13310
13311 ASSERT_NO_FATAL_FAILURE(InitState());
13312 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13313
13314 char const *vsSource = "#version 450\n"
13315 "void main(){ gl_Position = vec4(0); }\n";
13316 char const *fsSource = "#version 450\n"
13317 "\n"
13318 "layout(location=0) out vec4 color;\n"
13319 "void main(){\n"
13320 " color = vec4(1);\n"
13321 "}\n";
13322
13323 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13324 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13325
13326 VkPipelineObj pipe(m_device);
13327 pipe.AddColorAttachment();
13328 pipe.AddShader(&vs);
13329 pipe.AddShader(&fs);
13330
13331 VkDescriptorSetObj descriptorSet(m_device);
13332 descriptorSet.AppendDummy();
13333 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13334
13335 VkAttachmentDescription attachments[] = {
13336 { 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
13337 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
13338 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
13339 VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
13340 },
13341 { 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT,
13342 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
13343 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
13344 VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
13345 },
13346 };
13347 VkAttachmentReference refs[] = {
13348 { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL },
13349 { 1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL },
13350 };
13351 VkSubpassDescription subpass = {
13352 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
13353 1, &refs[0], nullptr, &refs[1],
13354 0, nullptr
13355 };
13356 VkRenderPassCreateInfo rpci = {
13357 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
13358 0, 2, attachments, 1, &subpass, 0, nullptr
13359 };
13360 VkRenderPass rp;
13361 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13362 ASSERT_VK_SUCCESS(err);
13363
13364 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
13365
13366 m_errorMonitor->VerifyFound();
13367
13368 vkDestroyRenderPass(m_device->device(), rp, nullptr);
13369}
13370
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013371TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013372 TEST_DESCRIPTION("Test that an error is produced for a variable output from "
13373 "the TCS without the patch decoration, but consumed in the TES "
13374 "with the decoration.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013375 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is per-vertex in tessellation control shader stage "
13376 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120013377
13378 ASSERT_NO_FATAL_FAILURE(InitState());
13379 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13380
Chris Forbesc1e852d2016-04-04 19:26:42 +120013381 if (!m_device->phy().features().tessellationShader) {
13382 printf("Device does not support tessellation shaders; skipped.\n");
13383 return;
13384 }
13385
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013386 char const *vsSource = "#version 450\n"
13387 "void main(){}\n";
13388 char const *tcsSource = "#version 450\n"
13389 "layout(location=0) out int x[];\n"
13390 "layout(vertices=3) out;\n"
13391 "void main(){\n"
13392 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
13393 " gl_TessLevelInner[0] = 1;\n"
13394 " x[gl_InvocationID] = gl_InvocationID;\n"
13395 "}\n";
13396 char const *tesSource = "#version 450\n"
13397 "layout(triangles, equal_spacing, cw) in;\n"
13398 "layout(location=0) patch in int x;\n"
13399 "out gl_PerVertex { vec4 gl_Position; };\n"
13400 "void main(){\n"
13401 " gl_Position.xyz = gl_TessCoord;\n"
13402 " gl_Position.w = x;\n"
13403 "}\n";
13404 char const *fsSource = "#version 450\n"
13405 "layout(location=0) out vec4 color;\n"
13406 "void main(){\n"
13407 " color = vec4(1);\n"
13408 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120013409
13410 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13411 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
13412 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
13413 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13414
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013415 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
13416 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120013417
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013418 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120013419
13420 VkPipelineObj pipe(m_device);
13421 pipe.SetInputAssembly(&iasci);
13422 pipe.SetTessellation(&tsci);
13423 pipe.AddColorAttachment();
13424 pipe.AddShader(&vs);
13425 pipe.AddShader(&tcs);
13426 pipe.AddShader(&tes);
13427 pipe.AddShader(&fs);
13428
13429 VkDescriptorSetObj descriptorSet(m_device);
13430 descriptorSet.AppendDummy();
13431 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13432
13433 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13434
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013435 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120013436}
13437
Karl Schultz6addd812016-02-02 17:17:23 -070013438TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013439 TEST_DESCRIPTION("Test that an error is produced for a vertex attribute setup where multiple "
13440 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013441 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13442 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013443
Chris Forbes280ba2c2015-06-12 11:16:41 +120013444 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013445 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120013446
13447 /* Two binding descriptions for binding 0 */
13448 VkVertexInputBindingDescription input_bindings[2];
13449 memset(input_bindings, 0, sizeof(input_bindings));
13450
13451 VkVertexInputAttributeDescription input_attrib;
13452 memset(&input_attrib, 0, sizeof(input_attrib));
13453 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13454
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013455 char const *vsSource = "#version 450\n"
13456 "\n"
13457 "layout(location=0) in float x;\n" /* attrib provided float */
13458 "out gl_PerVertex {\n"
13459 " vec4 gl_Position;\n"
13460 "};\n"
13461 "void main(){\n"
13462 " gl_Position = vec4(x);\n"
13463 "}\n";
13464 char const *fsSource = "#version 450\n"
13465 "\n"
13466 "layout(location=0) out vec4 color;\n"
13467 "void main(){\n"
13468 " color = vec4(1);\n"
13469 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120013470
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013471 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13472 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120013473
13474 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013475 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120013476 pipe.AddShader(&vs);
13477 pipe.AddShader(&fs);
13478
13479 pipe.AddVertexInputBindings(input_bindings, 2);
13480 pipe.AddVertexInputAttribs(&input_attrib, 1);
13481
Chris Forbes280ba2c2015-06-12 11:16:41 +120013482 VkDescriptorSetObj descriptorSet(m_device);
13483 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013484 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120013485
Tony Barbour5781e8f2015-08-04 16:23:11 -060013486 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120013487
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013488 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120013489}
Chris Forbes8f68b562015-05-25 11:13:32 +120013490
Karl Schultz6addd812016-02-02 17:17:23 -070013491TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mike Weiblencce7ec72016-10-17 19:33:05 -060013492 TEST_DESCRIPTION("Test that an error is produced for a fragment shader which does not "
Chris Forbes1cc79542016-07-20 11:13:44 +120013493 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060013494 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013495
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013496 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013497
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013498 char const *vsSource = "#version 450\n"
13499 "\n"
13500 "out gl_PerVertex {\n"
13501 " vec4 gl_Position;\n"
13502 "};\n"
13503 "void main(){\n"
13504 " gl_Position = vec4(1);\n"
13505 "}\n";
13506 char const *fsSource = "#version 450\n"
13507 "\n"
13508 "void main(){\n"
13509 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013510
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013511 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13512 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013513
13514 VkPipelineObj pipe(m_device);
13515 pipe.AddShader(&vs);
13516 pipe.AddShader(&fs);
13517
Chia-I Wu08accc62015-07-07 11:50:03 +080013518 /* set up CB 0, not written */
13519 pipe.AddColorAttachment();
13520 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013521
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013522 VkDescriptorSetObj descriptorSet(m_device);
13523 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013524 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013525
Tony Barbour5781e8f2015-08-04 16:23:11 -060013526 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013527
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013528 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013529}
13530
Karl Schultz6addd812016-02-02 17:17:23 -070013531TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mike Weiblencce7ec72016-10-17 19:33:05 -060013532 TEST_DESCRIPTION("Test that a warning is produced for a fragment shader which provides a spurious "
Chris Forbes1cc79542016-07-20 11:13:44 +120013533 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013534 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013535 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013536
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013537 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013538
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013539 char const *vsSource = "#version 450\n"
13540 "\n"
13541 "out gl_PerVertex {\n"
13542 " vec4 gl_Position;\n"
13543 "};\n"
13544 "void main(){\n"
13545 " gl_Position = vec4(1);\n"
13546 "}\n";
13547 char const *fsSource = "#version 450\n"
13548 "\n"
13549 "layout(location=0) out vec4 x;\n"
13550 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
13551 "void main(){\n"
13552 " x = vec4(1);\n"
13553 " y = vec4(1);\n"
13554 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013555
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013556 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13557 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013558
13559 VkPipelineObj pipe(m_device);
13560 pipe.AddShader(&vs);
13561 pipe.AddShader(&fs);
13562
Chia-I Wu08accc62015-07-07 11:50:03 +080013563 /* set up CB 0, not written */
13564 pipe.AddColorAttachment();
13565 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013566 /* FS writes CB 1, but we don't configure it */
13567
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013568 VkDescriptorSetObj descriptorSet(m_device);
13569 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013570 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013571
Tony Barbour5781e8f2015-08-04 16:23:11 -060013572 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013573
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013574 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013575}
13576
Karl Schultz6addd812016-02-02 17:17:23 -070013577TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013578 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the fundamental "
Mike Weiblencce7ec72016-10-17 19:33:05 -060013579 "type of an fragment shader output variable, and the format of the corresponding attachment");
13580 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013581
Chris Forbesa36d69e2015-05-25 11:13:44 +120013582 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013583
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013584 char const *vsSource = "#version 450\n"
13585 "\n"
13586 "out gl_PerVertex {\n"
13587 " vec4 gl_Position;\n"
13588 "};\n"
13589 "void main(){\n"
13590 " gl_Position = vec4(1);\n"
13591 "}\n";
13592 char const *fsSource = "#version 450\n"
13593 "\n"
13594 "layout(location=0) out ivec4 x;\n" /* not UNORM */
13595 "void main(){\n"
13596 " x = ivec4(1);\n"
13597 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120013598
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013599 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13600 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120013601
13602 VkPipelineObj pipe(m_device);
13603 pipe.AddShader(&vs);
13604 pipe.AddShader(&fs);
13605
Chia-I Wu08accc62015-07-07 11:50:03 +080013606 /* set up CB 0; type is UNORM by default */
13607 pipe.AddColorAttachment();
13608 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013609
Chris Forbesa36d69e2015-05-25 11:13:44 +120013610 VkDescriptorSetObj descriptorSet(m_device);
13611 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013612 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120013613
Tony Barbour5781e8f2015-08-04 16:23:11 -060013614 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013615
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013616 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120013617}
Chris Forbes7b1b8932015-06-05 14:43:36 +120013618
Karl Schultz6addd812016-02-02 17:17:23 -070013619TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013620 TEST_DESCRIPTION("Test that an error is produced for a shader consuming a uniform "
13621 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013622 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013623
Chris Forbes556c76c2015-08-14 12:04:59 +120013624 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120013625
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013626 char const *vsSource = "#version 450\n"
13627 "\n"
13628 "out gl_PerVertex {\n"
13629 " vec4 gl_Position;\n"
13630 "};\n"
13631 "void main(){\n"
13632 " gl_Position = vec4(1);\n"
13633 "}\n";
13634 char const *fsSource = "#version 450\n"
13635 "\n"
13636 "layout(location=0) out vec4 x;\n"
13637 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
13638 "void main(){\n"
13639 " x = vec4(bar.y);\n"
13640 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120013641
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013642 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13643 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120013644
Chris Forbes556c76c2015-08-14 12:04:59 +120013645 VkPipelineObj pipe(m_device);
13646 pipe.AddShader(&vs);
13647 pipe.AddShader(&fs);
13648
13649 /* set up CB 0; type is UNORM by default */
13650 pipe.AddColorAttachment();
13651 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13652
13653 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013654 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120013655
13656 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13657
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013658 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120013659}
13660
Chris Forbes5c59e902016-02-26 16:56:09 +130013661TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013662 TEST_DESCRIPTION("Test that an error is produced for a shader consuming push constants "
13663 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013664 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130013665
13666 ASSERT_NO_FATAL_FAILURE(InitState());
13667
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013668 char const *vsSource = "#version 450\n"
13669 "\n"
13670 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13671 "out gl_PerVertex {\n"
13672 " vec4 gl_Position;\n"
13673 "};\n"
13674 "void main(){\n"
13675 " gl_Position = vec4(consts.x);\n"
13676 "}\n";
13677 char const *fsSource = "#version 450\n"
13678 "\n"
13679 "layout(location=0) out vec4 x;\n"
13680 "void main(){\n"
13681 " x = vec4(1);\n"
13682 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130013683
13684 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13685 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13686
13687 VkPipelineObj pipe(m_device);
13688 pipe.AddShader(&vs);
13689 pipe.AddShader(&fs);
13690
13691 /* set up CB 0; type is UNORM by default */
13692 pipe.AddColorAttachment();
13693 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13694
13695 VkDescriptorSetObj descriptorSet(m_device);
13696 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13697
13698 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13699
13700 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013701 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130013702}
13703
Chris Forbes3fb17902016-08-22 14:57:55 +120013704TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
13705 TEST_DESCRIPTION("Test that an error is produced for a shader consuming an input attachment "
13706 "which is not included in the subpass description");
13707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13708 "consumes input attachment index 0 but not provided in subpass");
13709
13710 ASSERT_NO_FATAL_FAILURE(InitState());
13711
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013712 char const *vsSource = "#version 450\n"
13713 "\n"
13714 "out gl_PerVertex {\n"
13715 " vec4 gl_Position;\n"
13716 "};\n"
13717 "void main(){\n"
13718 " gl_Position = vec4(1);\n"
13719 "}\n";
13720 char const *fsSource = "#version 450\n"
13721 "\n"
13722 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
13723 "layout(location=0) out vec4 color;\n"
13724 "void main() {\n"
13725 " color = subpassLoad(x);\n"
13726 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120013727
13728 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13729 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13730
13731 VkPipelineObj pipe(m_device);
13732 pipe.AddShader(&vs);
13733 pipe.AddShader(&fs);
13734 pipe.AddColorAttachment();
13735 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13736
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013737 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
13738 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120013739 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013740 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120013741 ASSERT_VK_SUCCESS(err);
13742
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013743 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120013744 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013745 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120013746 ASSERT_VK_SUCCESS(err);
13747
13748 // error here.
13749 pipe.CreateVKPipeline(pl, renderPass());
13750
13751 m_errorMonitor->VerifyFound();
13752
13753 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
13754 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
13755}
13756
Chris Forbes5a9a0472016-08-22 16:02:09 +120013757TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
13758 TEST_DESCRIPTION("Test that an error is produced for a shader consuming an input attachment "
13759 "with a format having a different fundamental type");
13760 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13761 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
13762
13763 ASSERT_NO_FATAL_FAILURE(InitState());
13764
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013765 char const *vsSource = "#version 450\n"
13766 "\n"
13767 "out gl_PerVertex {\n"
13768 " vec4 gl_Position;\n"
13769 "};\n"
13770 "void main(){\n"
13771 " gl_Position = vec4(1);\n"
13772 "}\n";
13773 char const *fsSource = "#version 450\n"
13774 "\n"
13775 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
13776 "layout(location=0) out vec4 color;\n"
13777 "void main() {\n"
13778 " color = subpassLoad(x);\n"
13779 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120013780
13781 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13782 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13783
13784 VkPipelineObj pipe(m_device);
13785 pipe.AddShader(&vs);
13786 pipe.AddShader(&fs);
13787 pipe.AddColorAttachment();
13788 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13789
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013790 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
13791 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120013792 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013793 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120013794 ASSERT_VK_SUCCESS(err);
13795
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013796 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120013797 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013798 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120013799 ASSERT_VK_SUCCESS(err);
13800
13801 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013802 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
13803 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
13804 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
13805 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
13806 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 +120013807 };
13808 VkAttachmentReference color = {
13809 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
13810 };
13811 VkAttachmentReference input = {
13812 1, VK_IMAGE_LAYOUT_GENERAL,
13813 };
13814
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013815 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120013816
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013817 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120013818 VkRenderPass rp;
13819 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13820 ASSERT_VK_SUCCESS(err);
13821
13822 // error here.
13823 pipe.CreateVKPipeline(pl, rp);
13824
13825 m_errorMonitor->VerifyFound();
13826
13827 vkDestroyRenderPass(m_device->device(), rp, nullptr);
13828 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
13829 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
13830}
13831
Chris Forbes541f7b02016-08-22 15:30:27 +120013832TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
13833 TEST_DESCRIPTION("Test that an error is produced for a shader consuming an input attachment "
13834 "which is not included in the subpass description -- array case");
13835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13836 "consumes input attachment index 1 but not provided in subpass");
13837
13838 ASSERT_NO_FATAL_FAILURE(InitState());
13839
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013840 char const *vsSource = "#version 450\n"
13841 "\n"
13842 "out gl_PerVertex {\n"
13843 " vec4 gl_Position;\n"
13844 "};\n"
13845 "void main(){\n"
13846 " gl_Position = vec4(1);\n"
13847 "}\n";
13848 char const *fsSource = "#version 450\n"
13849 "\n"
13850 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[2];\n"
13851 "layout(location=0) out vec4 color;\n"
13852 "void main() {\n"
13853 " color = subpassLoad(xs[1]);\n"
13854 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120013855
13856 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13857 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13858
13859 VkPipelineObj pipe(m_device);
13860 pipe.AddShader(&vs);
13861 pipe.AddShader(&fs);
13862 pipe.AddColorAttachment();
13863 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13864
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013865 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
13866 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120013867 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013868 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120013869 ASSERT_VK_SUCCESS(err);
13870
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013871 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120013872 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013873 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120013874 ASSERT_VK_SUCCESS(err);
13875
13876 // error here.
13877 pipe.CreateVKPipeline(pl, renderPass());
13878
13879 m_errorMonitor->VerifyFound();
13880
13881 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
13882 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
13883}
13884
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013885TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013886 TEST_DESCRIPTION("Test that an error is produced for a compute pipeline consuming a "
13887 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013888 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013889
13890 ASSERT_NO_FATAL_FAILURE(InitState());
13891
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013892 char const *csSource = "#version 450\n"
13893 "\n"
13894 "layout(local_size_x=1) in;\n"
13895 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13896 "void main(){\n"
13897 " x = vec4(1);\n"
13898 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013899
13900 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13901
13902 VkDescriptorSetObj descriptorSet(m_device);
13903 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13904
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013905 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
13906 nullptr,
13907 0,
13908 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
13909 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
13910 descriptorSet.GetPipelineLayout(),
13911 VK_NULL_HANDLE,
13912 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013913
13914 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013915 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013916
13917 m_errorMonitor->VerifyFound();
13918
13919 if (err == VK_SUCCESS) {
13920 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13921 }
13922}
13923
Chris Forbes22a9b092016-07-19 14:34:05 +120013924TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013925 TEST_DESCRIPTION("Test that an error is produced for a pipeline consuming a "
13926 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013927 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13928 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120013929
13930 ASSERT_NO_FATAL_FAILURE(InitState());
13931
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013932 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
13933 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120013934 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013935 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120013936 ASSERT_VK_SUCCESS(err);
13937
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013938 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120013939 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013940 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120013941 ASSERT_VK_SUCCESS(err);
13942
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013943 char const *csSource = "#version 450\n"
13944 "\n"
13945 "layout(local_size_x=1) in;\n"
13946 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13947 "void main() {\n"
13948 " x.x = 1.0f;\n"
13949 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120013950 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13951
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013952 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
13953 nullptr,
13954 0,
13955 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
13956 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
13957 pl,
13958 VK_NULL_HANDLE,
13959 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120013960
13961 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013962 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120013963
13964 m_errorMonitor->VerifyFound();
13965
13966 if (err == VK_SUCCESS) {
13967 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13968 }
13969
13970 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
13971 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
13972}
13973
Chris Forbes50020592016-07-27 13:52:41 +120013974TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
13975 TEST_DESCRIPTION("Test that an error is produced when an image view type "
13976 "does not match the dimensionality declared in the shader");
13977
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013978 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 +120013979
13980 ASSERT_NO_FATAL_FAILURE(InitState());
13981 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13982
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013983 char const *vsSource = "#version 450\n"
13984 "\n"
13985 "out gl_PerVertex { vec4 gl_Position; };\n"
13986 "void main() { gl_Position = vec4(0); }\n";
13987 char const *fsSource = "#version 450\n"
13988 "\n"
13989 "layout(set=0, binding=0) uniform sampler3D s;\n"
13990 "layout(location=0) out vec4 color;\n"
13991 "void main() {\n"
13992 " color = texture(s, vec3(0));\n"
13993 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120013994 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13995 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13996
13997 VkPipelineObj pipe(m_device);
13998 pipe.AddShader(&vs);
13999 pipe.AddShader(&fs);
14000 pipe.AddColorAttachment();
14001
14002 VkTextureObj texture(m_device, nullptr);
14003 VkSamplerObj sampler(m_device);
14004
14005 VkDescriptorSetObj descriptorSet(m_device);
14006 descriptorSet.AppendSamplerTexture(&sampler, &texture);
14007 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14008
14009 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14010 ASSERT_VK_SUCCESS(err);
14011
14012 BeginCommandBuffer();
14013
14014 m_commandBuffer->BindPipeline(pipe);
14015 m_commandBuffer->BindDescriptorSet(descriptorSet);
14016
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014017 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120014018 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014019 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120014020 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
14021
14022 // error produced here.
14023 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
14024
14025 m_errorMonitor->VerifyFound();
14026
14027 EndCommandBuffer();
14028}
14029
Chris Forbes5533bfc2016-07-27 14:12:34 +120014030TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
14031 TEST_DESCRIPTION("Test that an error is produced when a multisampled images "
14032 "are consumed via singlesample images types in the shader, or vice versa.");
14033
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014034 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120014035
14036 ASSERT_NO_FATAL_FAILURE(InitState());
14037 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14038
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014039 char const *vsSource = "#version 450\n"
14040 "\n"
14041 "out gl_PerVertex { vec4 gl_Position; };\n"
14042 "void main() { gl_Position = vec4(0); }\n";
14043 char const *fsSource = "#version 450\n"
14044 "\n"
14045 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
14046 "layout(location=0) out vec4 color;\n"
14047 "void main() {\n"
14048 " color = texelFetch(s, ivec2(0), 0);\n"
14049 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120014050 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14051 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14052
14053 VkPipelineObj pipe(m_device);
14054 pipe.AddShader(&vs);
14055 pipe.AddShader(&fs);
14056 pipe.AddColorAttachment();
14057
14058 VkTextureObj texture(m_device, nullptr);
14059 VkSamplerObj sampler(m_device);
14060
14061 VkDescriptorSetObj descriptorSet(m_device);
14062 descriptorSet.AppendSamplerTexture(&sampler, &texture);
14063 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14064
14065 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14066 ASSERT_VK_SUCCESS(err);
14067
14068 BeginCommandBuffer();
14069
14070 m_commandBuffer->BindPipeline(pipe);
14071 m_commandBuffer->BindDescriptorSet(descriptorSet);
14072
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014073 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120014074 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014075 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120014076 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
14077
14078 // error produced here.
14079 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
14080
14081 m_errorMonitor->VerifyFound();
14082
14083 EndCommandBuffer();
14084}
14085
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014086#endif // SHADER_CHECKER_TESTS
14087
14088#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -060014089TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014090 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014091
14092 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014093
14094 // Create an image
14095 VkImage image;
14096
Karl Schultz6addd812016-02-02 17:17:23 -070014097 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14098 const int32_t tex_width = 32;
14099 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014100
14101 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014102 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14103 image_create_info.pNext = NULL;
14104 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14105 image_create_info.format = tex_format;
14106 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014107 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070014108 image_create_info.extent.depth = 1;
14109 image_create_info.mipLevels = 1;
14110 image_create_info.arrayLayers = 1;
14111 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14112 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14113 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14114 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014115
14116 // Introduce error by sending down a bogus width extent
14117 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014118 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014119
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014120 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014121}
14122
Mark Youngc48c4c12016-04-11 14:26:49 -060014123TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014124 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14125 "CreateImage extents is 0 for at least one required dimension");
Mark Youngc48c4c12016-04-11 14:26:49 -060014126
14127 ASSERT_NO_FATAL_FAILURE(InitState());
14128
14129 // Create an image
14130 VkImage image;
14131
14132 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14133 const int32_t tex_width = 32;
14134 const int32_t tex_height = 32;
14135
14136 VkImageCreateInfo image_create_info = {};
14137 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14138 image_create_info.pNext = NULL;
14139 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14140 image_create_info.format = tex_format;
14141 image_create_info.extent.width = tex_width;
14142 image_create_info.extent.height = tex_height;
14143 image_create_info.extent.depth = 1;
14144 image_create_info.mipLevels = 1;
14145 image_create_info.arrayLayers = 1;
14146 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14147 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14148 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14149 image_create_info.flags = 0;
14150
14151 // Introduce error by sending down a bogus width extent
14152 image_create_info.extent.width = 0;
14153 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
14154
14155 m_errorMonitor->VerifyFound();
14156}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014157#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +120014158
Tobin Ehliscde08892015-09-22 10:11:37 -060014159#if IMAGE_TESTS
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070014160
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060014161TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
14162 TEST_DESCRIPTION("Create a render pass with an attachment description "
14163 "format set to VK_FORMAT_UNDEFINED");
14164
14165 ASSERT_NO_FATAL_FAILURE(InitState());
14166 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14167
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014168 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060014169
14170 VkAttachmentReference color_attach = {};
14171 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
14172 color_attach.attachment = 0;
14173 VkSubpassDescription subpass = {};
14174 subpass.colorAttachmentCount = 1;
14175 subpass.pColorAttachments = &color_attach;
14176
14177 VkRenderPassCreateInfo rpci = {};
14178 rpci.subpassCount = 1;
14179 rpci.pSubpasses = &subpass;
14180 rpci.attachmentCount = 1;
14181 VkAttachmentDescription attach_desc = {};
14182 attach_desc.format = VK_FORMAT_UNDEFINED;
14183 rpci.pAttachments = &attach_desc;
14184 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
14185 VkRenderPass rp;
14186 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
14187
14188 m_errorMonitor->VerifyFound();
14189
14190 if (result == VK_SUCCESS) {
14191 vkDestroyRenderPass(m_device->device(), rp, NULL);
14192 }
14193}
14194
Karl Schultz6addd812016-02-02 17:17:23 -070014195TEST_F(VkLayerTest, InvalidImageView) {
14196 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060014197
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with baseMipLevel 10 ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014199
Tobin Ehliscde08892015-09-22 10:11:37 -060014200 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060014201
Mike Stroyana3082432015-09-25 13:39:21 -060014202 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070014203 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060014204
Karl Schultz6addd812016-02-02 17:17:23 -070014205 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14206 const int32_t tex_width = 32;
14207 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060014208
14209 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014210 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14211 image_create_info.pNext = NULL;
14212 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14213 image_create_info.format = tex_format;
14214 image_create_info.extent.width = tex_width;
14215 image_create_info.extent.height = tex_height;
14216 image_create_info.extent.depth = 1;
14217 image_create_info.mipLevels = 1;
14218 image_create_info.arrayLayers = 1;
14219 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14220 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14221 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14222 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060014223
Chia-I Wuf7458c52015-10-26 21:10:41 +080014224 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060014225 ASSERT_VK_SUCCESS(err);
14226
14227 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130014228 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070014229 image_view_create_info.image = image;
14230 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14231 image_view_create_info.format = tex_format;
14232 image_view_create_info.subresourceRange.layerCount = 1;
14233 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
14234 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014235 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060014236
14237 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014238 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060014239
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014240 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060014241 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060014242}
Mike Stroyana3082432015-09-25 13:39:21 -060014243
Mark Youngd339ba32016-05-30 13:28:35 -060014244TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
14245 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060014246 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060014247 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060014248
14249 ASSERT_NO_FATAL_FAILURE(InitState());
14250
14251 // Create an image and try to create a view with no memory backing the image
14252 VkImage image;
14253
14254 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14255 const int32_t tex_width = 32;
14256 const int32_t tex_height = 32;
14257
14258 VkImageCreateInfo image_create_info = {};
14259 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14260 image_create_info.pNext = NULL;
14261 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14262 image_create_info.format = tex_format;
14263 image_create_info.extent.width = tex_width;
14264 image_create_info.extent.height = tex_height;
14265 image_create_info.extent.depth = 1;
14266 image_create_info.mipLevels = 1;
14267 image_create_info.arrayLayers = 1;
14268 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14269 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14270 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14271 image_create_info.flags = 0;
14272
14273 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
14274 ASSERT_VK_SUCCESS(err);
14275
14276 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130014277 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060014278 image_view_create_info.image = image;
14279 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14280 image_view_create_info.format = tex_format;
14281 image_view_create_info.subresourceRange.layerCount = 1;
14282 image_view_create_info.subresourceRange.baseMipLevel = 0;
14283 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014284 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060014285
14286 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014287 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060014288
14289 m_errorMonitor->VerifyFound();
14290 vkDestroyImage(m_device->device(), image, NULL);
14291 // If last error is success, it still created the view, so delete it.
14292 if (err == VK_SUCCESS) {
14293 vkDestroyImageView(m_device->device(), view, NULL);
14294 }
Mark Youngd339ba32016-05-30 13:28:35 -060014295}
14296
Karl Schultz6addd812016-02-02 17:17:23 -070014297TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014298 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014299 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView(): Color image "
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014300 "formats must have ONLY the "
14301 "VK_IMAGE_ASPECT_COLOR_BIT set");
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014302 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14303 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014304
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014305 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014306
Karl Schultz6addd812016-02-02 17:17:23 -070014307 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014308 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014309 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014310 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014311
14312 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014313 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014314 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070014315 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14316 image_view_create_info.format = tex_format;
14317 image_view_create_info.subresourceRange.baseMipLevel = 0;
14318 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014319 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014320 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014321 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014322
14323 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014324 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014325
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014326 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014327}
14328
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014329TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070014330 VkResult err;
14331 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014332
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014333 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14334 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014335
Mike Stroyana3082432015-09-25 13:39:21 -060014336 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014337
14338 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014339 VkImage srcImage;
14340 VkImage dstImage;
14341 VkDeviceMemory srcMem;
14342 VkDeviceMemory destMem;
14343 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014344
14345 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014346 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14347 image_create_info.pNext = NULL;
14348 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14349 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14350 image_create_info.extent.width = 32;
14351 image_create_info.extent.height = 32;
14352 image_create_info.extent.depth = 1;
14353 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014354 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070014355 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14356 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14357 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14358 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014359
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014360 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014361 ASSERT_VK_SUCCESS(err);
14362
Mark Lobodzinski867787a2016-10-14 11:49:55 -060014363 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014364 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014365 ASSERT_VK_SUCCESS(err);
14366
14367 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014368 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014369 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14370 memAlloc.pNext = NULL;
14371 memAlloc.allocationSize = 0;
14372 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014373
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014374 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014375 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014376 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014377 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014378 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014379 ASSERT_VK_SUCCESS(err);
14380
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014381 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014382 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014383 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014384 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014385 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014386 ASSERT_VK_SUCCESS(err);
14387
14388 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14389 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014390 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014391 ASSERT_VK_SUCCESS(err);
14392
14393 BeginCommandBuffer();
14394 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014395 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014396 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014397 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014398 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060014399 copyRegion.srcOffset.x = 0;
14400 copyRegion.srcOffset.y = 0;
14401 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014402 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014403 copyRegion.dstSubresource.mipLevel = 0;
14404 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014405 // Introduce failure by forcing the dst layerCount to differ from src
14406 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014407 copyRegion.dstOffset.x = 0;
14408 copyRegion.dstOffset.y = 0;
14409 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014410 copyRegion.extent.width = 1;
14411 copyRegion.extent.height = 1;
14412 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014413 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014414 EndCommandBuffer();
14415
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014416 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014417
Chia-I Wuf7458c52015-10-26 21:10:41 +080014418 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014419 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014420 vkFreeMemory(m_device->device(), srcMem, NULL);
14421 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014422}
14423
Tony Barbourd6673642016-05-05 14:46:39 -060014424TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
14425
14426 TEST_DESCRIPTION("Creating images with unsuported formats ");
14427
14428 ASSERT_NO_FATAL_FAILURE(InitState());
14429 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14430 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014431 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 -060014432 VK_IMAGE_TILING_OPTIMAL, 0);
14433 ASSERT_TRUE(image.initialized());
14434
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014435 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130014436 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014437 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014438 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14439 image_create_info.format = VK_FORMAT_UNDEFINED;
14440 image_create_info.extent.width = 32;
14441 image_create_info.extent.height = 32;
14442 image_create_info.extent.depth = 1;
14443 image_create_info.mipLevels = 1;
14444 image_create_info.arrayLayers = 1;
14445 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14446 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14447 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014448
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014449 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14450 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014451
14452 VkImage localImage;
14453 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
14454 m_errorMonitor->VerifyFound();
14455
Tony Barbourd6673642016-05-05 14:46:39 -060014456 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014457 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060014458 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
14459 VkFormat format = static_cast<VkFormat>(f);
14460 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014461 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060014462 unsupported = format;
14463 break;
14464 }
14465 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014466
Tony Barbourd6673642016-05-05 14:46:39 -060014467 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060014468 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014469 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060014470
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014471 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060014472 m_errorMonitor->VerifyFound();
14473 }
14474}
14475
14476TEST_F(VkLayerTest, ImageLayerViewTests) {
14477 VkResult ret;
14478 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
14479
14480 ASSERT_NO_FATAL_FAILURE(InitState());
14481
14482 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014483 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 -060014484 VK_IMAGE_TILING_OPTIMAL, 0);
14485 ASSERT_TRUE(image.initialized());
14486
14487 VkImageView imgView;
14488 VkImageViewCreateInfo imgViewInfo = {};
14489 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
14490 imgViewInfo.image = image.handle();
14491 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
14492 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
14493 imgViewInfo.subresourceRange.layerCount = 1;
14494 imgViewInfo.subresourceRange.baseMipLevel = 0;
14495 imgViewInfo.subresourceRange.levelCount = 1;
14496 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14497
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014498 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with baseMipLevel");
Tony Barbourd6673642016-05-05 14:46:39 -060014499 // View can't have baseMipLevel >= image's mipLevels - Expect
14500 // VIEW_CREATE_ERROR
14501 imgViewInfo.subresourceRange.baseMipLevel = 1;
14502 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14503 m_errorMonitor->VerifyFound();
14504 imgViewInfo.subresourceRange.baseMipLevel = 0;
14505
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014506 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with baseArrayLayer");
Tony Barbourd6673642016-05-05 14:46:39 -060014507 // View can't have baseArrayLayer >= image's arraySize - Expect
14508 // VIEW_CREATE_ERROR
14509 imgViewInfo.subresourceRange.baseArrayLayer = 1;
14510 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14511 m_errorMonitor->VerifyFound();
14512 imgViewInfo.subresourceRange.baseArrayLayer = 0;
14513
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014514 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with 0 in "
14515 "pCreateInfo->subresourceRange."
14516 "levelCount");
Tony Barbourd6673642016-05-05 14:46:39 -060014517 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
14518 imgViewInfo.subresourceRange.levelCount = 0;
14519 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14520 m_errorMonitor->VerifyFound();
14521 imgViewInfo.subresourceRange.levelCount = 1;
14522
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014523 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with 0 in "
14524 "pCreateInfo->subresourceRange."
14525 "layerCount");
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014526 m_errorMonitor->SetDesiredFailureMsg(
14527 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14528 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060014529 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
14530 imgViewInfo.subresourceRange.layerCount = 0;
14531 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14532 m_errorMonitor->VerifyFound();
14533 imgViewInfo.subresourceRange.layerCount = 1;
14534
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014535 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "but both must be color formats");
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014536 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Formats MUST be IDENTICAL unless "
14537 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
14538 "was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060014539 // Can't use depth format for view into color image - Expect INVALID_FORMAT
14540 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
14541 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14542 m_errorMonitor->VerifyFound();
14543 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
14544
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014545 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Formats MUST be IDENTICAL unless "
14546 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
14547 "was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060014548 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
14549 // VIEW_CREATE_ERROR
14550 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
14551 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14552 m_errorMonitor->VerifyFound();
14553 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
14554
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014555 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "can support ImageViews with "
14556 "differing formats but they must be "
14557 "in the same compatibility class.");
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060014558 // TODO: Update framework to easily passing mutable flag into ImageObj init
14559 // For now just allowing image for this one test to not have memory bound
14560 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14561 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060014562 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
14563 // VIEW_CREATE_ERROR
14564 VkImageCreateInfo mutImgInfo = image.create_info();
14565 VkImage mutImage;
14566 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014567 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060014568 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
14569 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14570 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
14571 ASSERT_VK_SUCCESS(ret);
14572 imgViewInfo.image = mutImage;
14573 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14574 m_errorMonitor->VerifyFound();
14575 imgViewInfo.image = image.handle();
14576 vkDestroyImage(m_device->handle(), mutImage, NULL);
14577}
14578
14579TEST_F(VkLayerTest, MiscImageLayerTests) {
14580
14581 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
14582
14583 ASSERT_NO_FATAL_FAILURE(InitState());
14584
14585 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014586 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 -060014587 VK_IMAGE_TILING_OPTIMAL, 0);
14588 ASSERT_TRUE(image.initialized());
14589
Tony Barbourd6673642016-05-05 14:46:39 -060014590 vk_testing::Buffer buffer;
14591 VkMemoryPropertyFlags reqs = 0;
14592 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
14593 VkBufferImageCopy region = {};
14594 region.bufferRowLength = 128;
14595 region.bufferImageHeight = 128;
14596 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14597 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070014598 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060014599 region.imageExtent.height = 4;
14600 region.imageExtent.width = 4;
14601 region.imageExtent.depth = 1;
14602 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060014603
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070014604 // Image must have offset.z of 0 and extent.depth of 1
14605 // Introduce failure by setting imageExtent.depth to 0
14606 region.imageExtent.depth = 0;
14607 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01269);
14608 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
14609 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
14610 m_errorMonitor->VerifyFound();
14611
14612 region.imageExtent.depth = 1;
14613
14614 // Image must have offset.z of 0 and extent.depth of 1
14615 // Introduce failure by setting imageOffset.z to 4
14616 region.imageOffset.z = 4;
14617 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01269);
14618 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
14619 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
14620 m_errorMonitor->VerifyFound();
14621
14622 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060014623 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
14624 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
14625 region.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070014626 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014627 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
14628 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060014629 m_errorMonitor->VerifyFound();
14630
14631 // BufferOffset must be a multiple of 4
14632 // Introduce failure by setting bufferOffset to a value not divisible by 4
14633 region.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070014634 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014635 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
14636 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060014637 m_errorMonitor->VerifyFound();
14638
14639 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
14640 region.bufferOffset = 0;
14641 region.imageExtent.height = 128;
14642 region.imageExtent.width = 128;
14643 // Introduce failure by setting bufferRowLength > 0 but less than width
14644 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070014645 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014646 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
14647 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060014648 m_errorMonitor->VerifyFound();
14649
14650 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
14651 region.bufferRowLength = 128;
14652 // Introduce failure by setting bufferRowHeight > 0 but less than height
14653 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070014654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014655 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
14656 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060014657 m_errorMonitor->VerifyFound();
14658
14659 region.bufferImageHeight = 128;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14661 "If the format of srcImage is a depth, stencil, depth stencil or "
14662 "integer-based format then filter must be VK_FILTER_NEAREST");
Tony Barbourd6673642016-05-05 14:46:39 -060014663 // Expect INVALID_FILTER
14664 VkImageObj intImage1(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014665 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 -060014666 VkImageObj intImage2(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014667 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 -060014668 VkImageBlit blitRegion = {};
14669 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14670 blitRegion.srcSubresource.baseArrayLayer = 0;
14671 blitRegion.srcSubresource.layerCount = 1;
14672 blitRegion.srcSubresource.mipLevel = 0;
14673 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14674 blitRegion.dstSubresource.baseArrayLayer = 0;
14675 blitRegion.dstSubresource.layerCount = 1;
14676 blitRegion.dstSubresource.mipLevel = 0;
14677
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014678 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
14679 intImage2.layout(), 16, &blitRegion, VK_FILTER_LINEAR);
Tony Barbourd6673642016-05-05 14:46:39 -060014680 m_errorMonitor->VerifyFound();
14681
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060014682 // Look for NULL-blit warning
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "Offsets specify a zero-volume area.");
14684 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
14685 intImage2.layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060014686 m_errorMonitor->VerifyFound();
14687
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with 0 in ppMemoryBarriers");
Tony Barbourd6673642016-05-05 14:46:39 -060014689 VkImageMemoryBarrier img_barrier;
14690 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
14691 img_barrier.pNext = NULL;
14692 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
14693 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
14694 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14695 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14696 img_barrier.image = image.handle();
14697 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
14698 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
14699 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14700 img_barrier.subresourceRange.baseArrayLayer = 0;
14701 img_barrier.subresourceRange.baseMipLevel = 0;
14702 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
14703 img_barrier.subresourceRange.layerCount = 0;
14704 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014705 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
14706 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060014707 m_errorMonitor->VerifyFound();
14708 img_barrier.subresourceRange.layerCount = 1;
14709}
14710
14711TEST_F(VkLayerTest, ImageFormatLimits) {
14712
14713 TEST_DESCRIPTION("Exceed the limits of image format ");
14714
Cody Northropc31a84f2016-08-22 10:41:47 -060014715 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014716 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060014717 VkImageCreateInfo image_create_info = {};
14718 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14719 image_create_info.pNext = NULL;
14720 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14721 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14722 image_create_info.extent.width = 32;
14723 image_create_info.extent.height = 32;
14724 image_create_info.extent.depth = 1;
14725 image_create_info.mipLevels = 1;
14726 image_create_info.arrayLayers = 1;
14727 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14728 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14729 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14730 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
14731 image_create_info.flags = 0;
14732
14733 VkImage nullImg;
14734 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014735 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
14736 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Tony Barbourd6673642016-05-05 14:46:39 -060014737 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
14738 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14739 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14740 m_errorMonitor->VerifyFound();
14741 image_create_info.extent.depth = 1;
14742
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014743 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060014744 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
14745 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14746 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14747 m_errorMonitor->VerifyFound();
14748 image_create_info.mipLevels = 1;
14749
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014750 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060014751 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
14752 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14753 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14754 m_errorMonitor->VerifyFound();
14755 image_create_info.arrayLayers = 1;
14756
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014757 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060014758 int samples = imgFmtProps.sampleCounts >> 1;
14759 image_create_info.samples = (VkSampleCountFlagBits)samples;
14760 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14761 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14762 m_errorMonitor->VerifyFound();
14763 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14764
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014765 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pCreateInfo->initialLayout, must be "
14766 "VK_IMAGE_LAYOUT_UNDEFINED or "
14767 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060014768 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14769 // Expect INVALID_LAYOUT
14770 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14771 m_errorMonitor->VerifyFound();
14772 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
14773}
14774
Mark Lobodzinskicea14992016-10-14 10:59:42 -060014775TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
14776
14777 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060014778 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060014779
14780 ASSERT_NO_FATAL_FAILURE(InitState());
14781
14782 VkImageObj src_image(m_device);
14783 src_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
14784 VkImageObj dst_image(m_device);
14785 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
14786
14787 BeginCommandBuffer();
14788 VkImageCopy copy_region;
14789 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14790 copy_region.srcSubresource.mipLevel = 0;
14791 copy_region.srcSubresource.baseArrayLayer = 0;
14792 copy_region.srcSubresource.layerCount = 0;
14793 copy_region.srcOffset.x = 0;
14794 copy_region.srcOffset.y = 0;
14795 copy_region.srcOffset.z = 0;
14796 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14797 copy_region.dstSubresource.mipLevel = 0;
14798 copy_region.dstSubresource.baseArrayLayer = 0;
14799 copy_region.dstSubresource.layerCount = 0;
14800 copy_region.dstOffset.x = 0;
14801 copy_region.dstOffset.y = 0;
14802 copy_region.dstOffset.z = 0;
14803 copy_region.extent.width = 64;
14804 copy_region.extent.height = 64;
14805 copy_region.extent.depth = 1;
14806 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
14807 &copy_region);
14808 EndCommandBuffer();
14809
14810 m_errorMonitor->VerifyFound();
14811}
14812
14813TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
14814
14815 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060014816 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060014817
14818 ASSERT_NO_FATAL_FAILURE(InitState());
14819
14820 VkImageObj src_image(m_device);
14821 src_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
14822 VkImageObj dst_image(m_device);
14823 dst_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
14824
14825 BeginCommandBuffer();
14826 VkImageCopy copy_region;
14827 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14828 copy_region.srcSubresource.mipLevel = 0;
14829 copy_region.srcSubresource.baseArrayLayer = 0;
14830 copy_region.srcSubresource.layerCount = 0;
14831 copy_region.srcOffset.x = 0;
14832 copy_region.srcOffset.y = 0;
14833 copy_region.srcOffset.z = 0;
14834 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14835 copy_region.dstSubresource.mipLevel = 0;
14836 copy_region.dstSubresource.baseArrayLayer = 0;
14837 copy_region.dstSubresource.layerCount = 0;
14838 copy_region.dstOffset.x = 0;
14839 copy_region.dstOffset.y = 0;
14840 copy_region.dstOffset.z = 0;
14841 copy_region.extent.width = 64;
14842 copy_region.extent.height = 64;
14843 copy_region.extent.depth = 1;
14844 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
14845 &copy_region);
14846 EndCommandBuffer();
14847
14848 m_errorMonitor->VerifyFound();
14849}
14850
Karl Schultz6addd812016-02-02 17:17:23 -070014851TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060014852 VkResult err;
14853 bool pass;
14854
14855 // Create color images with different format sizes and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14857 "vkCmdCopyImage called with unmatched source and dest image format sizes");
Karl Schultzbdb75952016-04-19 11:36:49 -060014858
14859 ASSERT_NO_FATAL_FAILURE(InitState());
14860
14861 // Create two images of different types and try to copy between them
14862 VkImage srcImage;
14863 VkImage dstImage;
14864 VkDeviceMemory srcMem;
14865 VkDeviceMemory destMem;
14866 VkMemoryRequirements memReqs;
14867
14868 VkImageCreateInfo image_create_info = {};
14869 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14870 image_create_info.pNext = NULL;
14871 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14872 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14873 image_create_info.extent.width = 32;
14874 image_create_info.extent.height = 32;
14875 image_create_info.extent.depth = 1;
14876 image_create_info.mipLevels = 1;
14877 image_create_info.arrayLayers = 1;
14878 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14879 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14880 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14881 image_create_info.flags = 0;
14882
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014883 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060014884 ASSERT_VK_SUCCESS(err);
14885
14886 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
14887 // Introduce failure by creating second image with a different-sized format.
14888 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
14889
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014890 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060014891 ASSERT_VK_SUCCESS(err);
14892
14893 // Allocate memory
14894 VkMemoryAllocateInfo memAlloc = {};
14895 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14896 memAlloc.pNext = NULL;
14897 memAlloc.allocationSize = 0;
14898 memAlloc.memoryTypeIndex = 0;
14899
14900 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
14901 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014902 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060014903 ASSERT_TRUE(pass);
14904 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
14905 ASSERT_VK_SUCCESS(err);
14906
14907 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
14908 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014909 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060014910 ASSERT_TRUE(pass);
14911 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
14912 ASSERT_VK_SUCCESS(err);
14913
14914 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14915 ASSERT_VK_SUCCESS(err);
14916 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
14917 ASSERT_VK_SUCCESS(err);
14918
14919 BeginCommandBuffer();
14920 VkImageCopy copyRegion;
14921 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14922 copyRegion.srcSubresource.mipLevel = 0;
14923 copyRegion.srcSubresource.baseArrayLayer = 0;
14924 copyRegion.srcSubresource.layerCount = 0;
14925 copyRegion.srcOffset.x = 0;
14926 copyRegion.srcOffset.y = 0;
14927 copyRegion.srcOffset.z = 0;
14928 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14929 copyRegion.dstSubresource.mipLevel = 0;
14930 copyRegion.dstSubresource.baseArrayLayer = 0;
14931 copyRegion.dstSubresource.layerCount = 0;
14932 copyRegion.dstOffset.x = 0;
14933 copyRegion.dstOffset.y = 0;
14934 copyRegion.dstOffset.z = 0;
14935 copyRegion.extent.width = 1;
14936 copyRegion.extent.height = 1;
14937 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014938 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Karl Schultzbdb75952016-04-19 11:36:49 -060014939 EndCommandBuffer();
14940
14941 m_errorMonitor->VerifyFound();
14942
14943 vkDestroyImage(m_device->device(), srcImage, NULL);
14944 vkDestroyImage(m_device->device(), dstImage, NULL);
14945 vkFreeMemory(m_device->device(), srcMem, NULL);
14946 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014947}
14948
Karl Schultz6addd812016-02-02 17:17:23 -070014949TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
14950 VkResult err;
14951 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014952
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014953 // Create a color image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14955 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014956
Mike Stroyana3082432015-09-25 13:39:21 -060014957 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014958
14959 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014960 VkImage srcImage;
14961 VkImage dstImage;
14962 VkDeviceMemory srcMem;
14963 VkDeviceMemory destMem;
14964 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014965
14966 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014967 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14968 image_create_info.pNext = NULL;
14969 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14970 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14971 image_create_info.extent.width = 32;
14972 image_create_info.extent.height = 32;
14973 image_create_info.extent.depth = 1;
14974 image_create_info.mipLevels = 1;
14975 image_create_info.arrayLayers = 1;
14976 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14977 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14978 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14979 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014980
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014981 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014982 ASSERT_VK_SUCCESS(err);
14983
Karl Schultzbdb75952016-04-19 11:36:49 -060014984 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
14985
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014986 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070014987 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014988 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060014989 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014990
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014991 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014992 ASSERT_VK_SUCCESS(err);
14993
14994 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014995 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014996 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14997 memAlloc.pNext = NULL;
14998 memAlloc.allocationSize = 0;
14999 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015000
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015001 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015002 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015003 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015004 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015005 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015006 ASSERT_VK_SUCCESS(err);
15007
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015008 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015009 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015010 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015011 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015012 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015013 ASSERT_VK_SUCCESS(err);
15014
15015 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15016 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015017 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015018 ASSERT_VK_SUCCESS(err);
15019
15020 BeginCommandBuffer();
15021 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015022 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015023 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015024 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015025 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015026 copyRegion.srcOffset.x = 0;
15027 copyRegion.srcOffset.y = 0;
15028 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015029 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015030 copyRegion.dstSubresource.mipLevel = 0;
15031 copyRegion.dstSubresource.baseArrayLayer = 0;
15032 copyRegion.dstSubresource.layerCount = 0;
15033 copyRegion.dstOffset.x = 0;
15034 copyRegion.dstOffset.y = 0;
15035 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015036 copyRegion.extent.width = 1;
15037 copyRegion.extent.height = 1;
15038 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015039 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015040 EndCommandBuffer();
15041
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015042 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015043
Chia-I Wuf7458c52015-10-26 21:10:41 +080015044 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015045 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015046 vkFreeMemory(m_device->device(), srcMem, NULL);
15047 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015048}
15049
Karl Schultz6addd812016-02-02 17:17:23 -070015050TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
15051 VkResult err;
15052 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015053
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015054 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15055 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015056
Mike Stroyana3082432015-09-25 13:39:21 -060015057 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015058
15059 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070015060 VkImage srcImage;
15061 VkImage dstImage;
15062 VkDeviceMemory srcMem;
15063 VkDeviceMemory destMem;
15064 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015065
15066 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015067 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15068 image_create_info.pNext = NULL;
15069 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15070 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15071 image_create_info.extent.width = 32;
15072 image_create_info.extent.height = 1;
15073 image_create_info.extent.depth = 1;
15074 image_create_info.mipLevels = 1;
15075 image_create_info.arrayLayers = 1;
15076 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15077 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15078 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15079 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015080
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015081 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015082 ASSERT_VK_SUCCESS(err);
15083
Karl Schultz6addd812016-02-02 17:17:23 -070015084 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015085
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015086 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015087 ASSERT_VK_SUCCESS(err);
15088
15089 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015090 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015091 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15092 memAlloc.pNext = NULL;
15093 memAlloc.allocationSize = 0;
15094 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015095
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015096 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015097 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015098 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015099 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015100 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015101 ASSERT_VK_SUCCESS(err);
15102
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015103 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015104 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015105 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015106 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015107 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015108 ASSERT_VK_SUCCESS(err);
15109
15110 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15111 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015112 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015113 ASSERT_VK_SUCCESS(err);
15114
15115 BeginCommandBuffer();
15116 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015117 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15118 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015119 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015120 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015121 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015122 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015123 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015124 resolveRegion.srcOffset.x = 0;
15125 resolveRegion.srcOffset.y = 0;
15126 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015127 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015128 resolveRegion.dstSubresource.mipLevel = 0;
15129 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015130 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015131 resolveRegion.dstOffset.x = 0;
15132 resolveRegion.dstOffset.y = 0;
15133 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015134 resolveRegion.extent.width = 1;
15135 resolveRegion.extent.height = 1;
15136 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015137 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015138 EndCommandBuffer();
15139
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015140 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015141
Chia-I Wuf7458c52015-10-26 21:10:41 +080015142 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015143 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015144 vkFreeMemory(m_device->device(), srcMem, NULL);
15145 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015146}
15147
Karl Schultz6addd812016-02-02 17:17:23 -070015148TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
15149 VkResult err;
15150 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015151
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015152 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15153 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015154
Mike Stroyana3082432015-09-25 13:39:21 -060015155 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015156
Chris Forbesa7530692016-05-08 12:35:39 +120015157 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070015158 VkImage srcImage;
15159 VkImage dstImage;
15160 VkDeviceMemory srcMem;
15161 VkDeviceMemory destMem;
15162 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015163
15164 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015165 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15166 image_create_info.pNext = NULL;
15167 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15168 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15169 image_create_info.extent.width = 32;
15170 image_create_info.extent.height = 1;
15171 image_create_info.extent.depth = 1;
15172 image_create_info.mipLevels = 1;
15173 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120015174 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015175 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15176 // Note: Some implementations expect color attachment usage for any
15177 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015178 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015179 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015180
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015181 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015182 ASSERT_VK_SUCCESS(err);
15183
Karl Schultz6addd812016-02-02 17:17:23 -070015184 // Note: Some implementations expect color attachment usage for any
15185 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015186 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015187
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015188 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015189 ASSERT_VK_SUCCESS(err);
15190
15191 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015192 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015193 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15194 memAlloc.pNext = NULL;
15195 memAlloc.allocationSize = 0;
15196 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015197
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015198 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015199 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015200 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015201 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015202 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015203 ASSERT_VK_SUCCESS(err);
15204
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015205 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015206 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015207 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015208 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015209 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015210 ASSERT_VK_SUCCESS(err);
15211
15212 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15213 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015214 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015215 ASSERT_VK_SUCCESS(err);
15216
15217 BeginCommandBuffer();
15218 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015219 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15220 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015221 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015222 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015223 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015224 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015225 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015226 resolveRegion.srcOffset.x = 0;
15227 resolveRegion.srcOffset.y = 0;
15228 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015229 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015230 resolveRegion.dstSubresource.mipLevel = 0;
15231 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015232 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015233 resolveRegion.dstOffset.x = 0;
15234 resolveRegion.dstOffset.y = 0;
15235 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015236 resolveRegion.extent.width = 1;
15237 resolveRegion.extent.height = 1;
15238 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015239 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015240 EndCommandBuffer();
15241
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015242 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015243
Chia-I Wuf7458c52015-10-26 21:10:41 +080015244 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015245 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015246 vkFreeMemory(m_device->device(), srcMem, NULL);
15247 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015248}
15249
Karl Schultz6addd812016-02-02 17:17:23 -070015250TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
15251 VkResult err;
15252 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015253
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015254 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15255 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015256
Mike Stroyana3082432015-09-25 13:39:21 -060015257 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015258
15259 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015260 VkImage srcImage;
15261 VkImage dstImage;
15262 VkDeviceMemory srcMem;
15263 VkDeviceMemory destMem;
15264 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015265
15266 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015267 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15268 image_create_info.pNext = NULL;
15269 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15270 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15271 image_create_info.extent.width = 32;
15272 image_create_info.extent.height = 1;
15273 image_create_info.extent.depth = 1;
15274 image_create_info.mipLevels = 1;
15275 image_create_info.arrayLayers = 1;
15276 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
15277 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15278 // Note: Some implementations expect color attachment usage for any
15279 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015280 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015281 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015282
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015283 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015284 ASSERT_VK_SUCCESS(err);
15285
Karl Schultz6addd812016-02-02 17:17:23 -070015286 // Set format to something other than source image
15287 image_create_info.format = VK_FORMAT_R32_SFLOAT;
15288 // Note: Some implementations expect color attachment usage for any
15289 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015290 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015291 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015292
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015293 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015294 ASSERT_VK_SUCCESS(err);
15295
15296 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015297 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015298 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15299 memAlloc.pNext = NULL;
15300 memAlloc.allocationSize = 0;
15301 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015302
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015303 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015304 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015305 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015306 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015307 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015308 ASSERT_VK_SUCCESS(err);
15309
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015310 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015311 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015312 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015313 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015314 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015315 ASSERT_VK_SUCCESS(err);
15316
15317 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15318 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015319 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015320 ASSERT_VK_SUCCESS(err);
15321
15322 BeginCommandBuffer();
15323 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015324 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15325 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015326 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015327 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015328 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015329 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015330 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015331 resolveRegion.srcOffset.x = 0;
15332 resolveRegion.srcOffset.y = 0;
15333 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015334 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015335 resolveRegion.dstSubresource.mipLevel = 0;
15336 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015337 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015338 resolveRegion.dstOffset.x = 0;
15339 resolveRegion.dstOffset.y = 0;
15340 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015341 resolveRegion.extent.width = 1;
15342 resolveRegion.extent.height = 1;
15343 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015344 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015345 EndCommandBuffer();
15346
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015347 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015348
Chia-I Wuf7458c52015-10-26 21:10:41 +080015349 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015350 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015351 vkFreeMemory(m_device->device(), srcMem, NULL);
15352 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015353}
15354
Karl Schultz6addd812016-02-02 17:17:23 -070015355TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
15356 VkResult err;
15357 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015358
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015359 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15360 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015361
Mike Stroyana3082432015-09-25 13:39:21 -060015362 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015363
15364 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015365 VkImage srcImage;
15366 VkImage dstImage;
15367 VkDeviceMemory srcMem;
15368 VkDeviceMemory destMem;
15369 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015370
15371 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015372 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15373 image_create_info.pNext = NULL;
15374 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15375 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15376 image_create_info.extent.width = 32;
15377 image_create_info.extent.height = 1;
15378 image_create_info.extent.depth = 1;
15379 image_create_info.mipLevels = 1;
15380 image_create_info.arrayLayers = 1;
15381 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
15382 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15383 // Note: Some implementations expect color attachment usage for any
15384 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015385 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015386 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015387
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015388 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015389 ASSERT_VK_SUCCESS(err);
15390
Karl Schultz6addd812016-02-02 17:17:23 -070015391 image_create_info.imageType = VK_IMAGE_TYPE_1D;
15392 // Note: Some implementations expect color attachment usage for any
15393 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015394 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015395 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015396
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015397 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015398 ASSERT_VK_SUCCESS(err);
15399
15400 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015401 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015402 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15403 memAlloc.pNext = NULL;
15404 memAlloc.allocationSize = 0;
15405 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015406
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015407 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015408 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015409 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015410 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015411 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015412 ASSERT_VK_SUCCESS(err);
15413
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015414 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015415 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015416 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015417 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015418 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015419 ASSERT_VK_SUCCESS(err);
15420
15421 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15422 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015423 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015424 ASSERT_VK_SUCCESS(err);
15425
15426 BeginCommandBuffer();
15427 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015428 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15429 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015430 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015431 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015432 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015433 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015434 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015435 resolveRegion.srcOffset.x = 0;
15436 resolveRegion.srcOffset.y = 0;
15437 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015438 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015439 resolveRegion.dstSubresource.mipLevel = 0;
15440 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130015441 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015442 resolveRegion.dstOffset.x = 0;
15443 resolveRegion.dstOffset.y = 0;
15444 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015445 resolveRegion.extent.width = 1;
15446 resolveRegion.extent.height = 1;
15447 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015448 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015449 EndCommandBuffer();
15450
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015451 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015452
Chia-I Wuf7458c52015-10-26 21:10:41 +080015453 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015454 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015455 vkFreeMemory(m_device->device(), srcMem, NULL);
15456 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015457}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015458
Karl Schultz6addd812016-02-02 17:17:23 -070015459TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015460 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070015461 // to using a DS format, then cause it to hit error due to COLOR_BIT not
15462 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015463 // The image format check comes 2nd in validation so we trigger it first,
15464 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070015465 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015466
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015467 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15468 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015469
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015470 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015471
Chia-I Wu1b99bb22015-10-27 19:25:11 +080015472 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015473 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
15474 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015475
15476 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015477 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
15478 ds_pool_ci.pNext = NULL;
15479 ds_pool_ci.maxSets = 1;
15480 ds_pool_ci.poolSizeCount = 1;
15481 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015482
15483 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015484 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015485 ASSERT_VK_SUCCESS(err);
15486
15487 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015488 dsl_binding.binding = 0;
15489 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
15490 dsl_binding.descriptorCount = 1;
15491 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
15492 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015493
15494 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015495 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
15496 ds_layout_ci.pNext = NULL;
15497 ds_layout_ci.bindingCount = 1;
15498 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015499 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015500 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015501 ASSERT_VK_SUCCESS(err);
15502
15503 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015504 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080015505 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070015506 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015507 alloc_info.descriptorPool = ds_pool;
15508 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015509 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015510 ASSERT_VK_SUCCESS(err);
15511
Karl Schultz6addd812016-02-02 17:17:23 -070015512 VkImage image_bad;
15513 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015514 // One bad format and one good format for Color attachment
Tobin Ehlis269f0322016-05-25 16:24:21 -060015515 const VkFormat tex_format_bad = VK_FORMAT_D24_UNORM_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015516 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070015517 const int32_t tex_width = 32;
15518 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015519
15520 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015521 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15522 image_create_info.pNext = NULL;
15523 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15524 image_create_info.format = tex_format_bad;
15525 image_create_info.extent.width = tex_width;
15526 image_create_info.extent.height = tex_height;
15527 image_create_info.extent.depth = 1;
15528 image_create_info.mipLevels = 1;
15529 image_create_info.arrayLayers = 1;
15530 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15531 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015532 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015533 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015534
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015535 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015536 ASSERT_VK_SUCCESS(err);
15537 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015538 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15539 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015540 ASSERT_VK_SUCCESS(err);
15541
15542 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015543 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015544 image_view_create_info.image = image_bad;
15545 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15546 image_view_create_info.format = tex_format_bad;
15547 image_view_create_info.subresourceRange.baseArrayLayer = 0;
15548 image_view_create_info.subresourceRange.baseMipLevel = 0;
15549 image_view_create_info.subresourceRange.layerCount = 1;
15550 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015551 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015552
15553 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015554 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015555
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015556 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015557
Chia-I Wuf7458c52015-10-26 21:10:41 +080015558 vkDestroyImage(m_device->device(), image_bad, NULL);
15559 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015560 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
15561 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015562}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015563
15564TEST_F(VkLayerTest, ClearImageErrors) {
15565 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and "
15566 "ClearDepthStencilImage with a color image.");
15567
15568 ASSERT_NO_FATAL_FAILURE(InitState());
15569 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15570
15571 // Renderpass is started here so end it as Clear cmds can't be in renderpass
15572 BeginCommandBuffer();
15573 m_commandBuffer->EndRenderPass();
15574
15575 // Color image
15576 VkClearColorValue clear_color;
15577 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
15578 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
15579 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
15580 const int32_t img_width = 32;
15581 const int32_t img_height = 32;
15582 VkImageCreateInfo image_create_info = {};
15583 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15584 image_create_info.pNext = NULL;
15585 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15586 image_create_info.format = color_format;
15587 image_create_info.extent.width = img_width;
15588 image_create_info.extent.height = img_height;
15589 image_create_info.extent.depth = 1;
15590 image_create_info.mipLevels = 1;
15591 image_create_info.arrayLayers = 1;
15592 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15593 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15594 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15595
15596 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015597 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015598
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015599 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015600
15601 // Depth/Stencil image
15602 VkClearDepthStencilValue clear_value = {0};
15603 reqs = 0; // don't need HOST_VISIBLE DS image
15604 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
15605 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
15606 ds_image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
15607 ds_image_create_info.extent.width = 64;
15608 ds_image_create_info.extent.height = 64;
15609 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15610 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
15611
15612 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015613 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015614
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015615 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 -060015616
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015617 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015618
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015619 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015620 &color_range);
15621
15622 m_errorMonitor->VerifyFound();
15623
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015624 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with "
15625 "image created without "
15626 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060015627
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015628 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060015629 &color_range);
15630
15631 m_errorMonitor->VerifyFound();
15632
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015633 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015634 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15635 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015636
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015637 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(),
15638 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015639
15640 m_errorMonitor->VerifyFound();
15641}
Tobin Ehliscde08892015-09-22 10:11:37 -060015642#endif // IMAGE_TESTS
15643
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060015644
15645// WSI Enabled Tests
15646//
Chris Forbes09368e42016-10-13 11:59:22 +130015647#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060015648TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
15649
15650#if defined(VK_USE_PLATFORM_XCB_KHR)
15651 VkSurfaceKHR surface = VK_NULL_HANDLE;
15652
15653 VkResult err;
15654 bool pass;
15655 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
15656 VkSwapchainCreateInfoKHR swapchain_create_info = {};
15657 // uint32_t swapchain_image_count = 0;
15658 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
15659 // uint32_t image_index = 0;
15660 // VkPresentInfoKHR present_info = {};
15661
15662 ASSERT_NO_FATAL_FAILURE(InitState());
15663
15664 // Use the create function from one of the VK_KHR_*_surface extension in
15665 // order to create a surface, testing all known errors in the process,
15666 // before successfully creating a surface:
15667 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
15668 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
15669 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
15670 pass = (err != VK_SUCCESS);
15671 ASSERT_TRUE(pass);
15672 m_errorMonitor->VerifyFound();
15673
15674 // Next, try to create a surface with the wrong
15675 // VkXcbSurfaceCreateInfoKHR::sType:
15676 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
15677 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
15678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
15679 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
15680 pass = (err != VK_SUCCESS);
15681 ASSERT_TRUE(pass);
15682 m_errorMonitor->VerifyFound();
15683
15684 // Create a native window, and then correctly create a surface:
15685 xcb_connection_t *connection;
15686 xcb_screen_t *screen;
15687 xcb_window_t xcb_window;
15688 xcb_intern_atom_reply_t *atom_wm_delete_window;
15689
15690 const xcb_setup_t *setup;
15691 xcb_screen_iterator_t iter;
15692 int scr;
15693 uint32_t value_mask, value_list[32];
15694 int width = 1;
15695 int height = 1;
15696
15697 connection = xcb_connect(NULL, &scr);
15698 ASSERT_TRUE(connection != NULL);
15699 setup = xcb_get_setup(connection);
15700 iter = xcb_setup_roots_iterator(setup);
15701 while (scr-- > 0)
15702 xcb_screen_next(&iter);
15703 screen = iter.data;
15704
15705 xcb_window = xcb_generate_id(connection);
15706
15707 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
15708 value_list[0] = screen->black_pixel;
15709 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
15710
15711 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
15712 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
15713
15714 /* Magic code that will send notification when window is destroyed */
15715 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
15716 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
15717
15718 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
15719 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
15720 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
15721 free(reply);
15722
15723 xcb_map_window(connection, xcb_window);
15724
15725 // Force the x/y coordinates to 100,100 results are identical in consecutive
15726 // runs
15727 const uint32_t coords[] = { 100, 100 };
15728 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
15729
15730 // Finally, try to correctly create a surface:
15731 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
15732 xcb_create_info.pNext = NULL;
15733 xcb_create_info.flags = 0;
15734 xcb_create_info.connection = connection;
15735 xcb_create_info.window = xcb_window;
15736 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
15737 pass = (err == VK_SUCCESS);
15738 ASSERT_TRUE(pass);
15739
15740 // Check if surface supports presentation:
15741
15742 // 1st, do so without having queried the queue families:
15743 VkBool32 supported = false;
15744 // TODO: Get the following error to come out:
15745 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15746 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
15747 "function");
15748 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
15749 pass = (err != VK_SUCCESS);
15750 // ASSERT_TRUE(pass);
15751 // m_errorMonitor->VerifyFound();
15752
15753 // Next, query a queue family index that's too large:
15754 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
15755 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
15756 pass = (err != VK_SUCCESS);
15757 ASSERT_TRUE(pass);
15758 m_errorMonitor->VerifyFound();
15759
15760 // Finally, do so correctly:
15761 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
15762 // SUPPORTED
15763 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
15764 pass = (err == VK_SUCCESS);
15765 ASSERT_TRUE(pass);
15766
15767 // Before proceeding, try to create a swapchain without having called
15768 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
15769 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
15770 swapchain_create_info.pNext = NULL;
15771 swapchain_create_info.flags = 0;
15772 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15773 swapchain_create_info.surface = surface;
15774 swapchain_create_info.imageArrayLayers = 1;
15775 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
15776 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
15777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15778 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
15779 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
15780 pass = (err != VK_SUCCESS);
15781 ASSERT_TRUE(pass);
15782 m_errorMonitor->VerifyFound();
15783
15784 // Get the surface capabilities:
15785 VkSurfaceCapabilitiesKHR surface_capabilities;
15786
15787 // Do so correctly (only error logged by this entrypoint is if the
15788 // extension isn't enabled):
15789 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
15790 pass = (err == VK_SUCCESS);
15791 ASSERT_TRUE(pass);
15792
15793 // Get the surface formats:
15794 uint32_t surface_format_count;
15795
15796 // First, try without a pointer to surface_format_count:
15797 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
15798 "specified as NULL");
15799 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
15800 pass = (err == VK_SUCCESS);
15801 ASSERT_TRUE(pass);
15802 m_errorMonitor->VerifyFound();
15803
15804 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
15805 // correctly done a 1st try (to get the count):
15806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
15807 surface_format_count = 0;
15808 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
15809 pass = (err == VK_SUCCESS);
15810 ASSERT_TRUE(pass);
15811 m_errorMonitor->VerifyFound();
15812
15813 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
15814 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
15815 pass = (err == VK_SUCCESS);
15816 ASSERT_TRUE(pass);
15817
15818 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
15819 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
15820
15821 // Next, do a 2nd try with surface_format_count being set too high:
15822 surface_format_count += 5;
15823 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
15824 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
15825 pass = (err == VK_SUCCESS);
15826 ASSERT_TRUE(pass);
15827 m_errorMonitor->VerifyFound();
15828
15829 // Finally, do a correct 1st and 2nd try:
15830 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
15831 pass = (err == VK_SUCCESS);
15832 ASSERT_TRUE(pass);
15833 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
15834 pass = (err == VK_SUCCESS);
15835 ASSERT_TRUE(pass);
15836
15837 // Get the surface present modes:
15838 uint32_t surface_present_mode_count;
15839
15840 // First, try without a pointer to surface_format_count:
15841 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
15842 "specified as NULL");
15843
15844 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
15845 pass = (err == VK_SUCCESS);
15846 ASSERT_TRUE(pass);
15847 m_errorMonitor->VerifyFound();
15848
15849 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
15850 // correctly done a 1st try (to get the count):
15851 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
15852 surface_present_mode_count = 0;
15853 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
15854 (VkPresentModeKHR *)&surface_present_mode_count);
15855 pass = (err == VK_SUCCESS);
15856 ASSERT_TRUE(pass);
15857 m_errorMonitor->VerifyFound();
15858
15859 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
15860 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
15861 pass = (err == VK_SUCCESS);
15862 ASSERT_TRUE(pass);
15863
15864 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
15865 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
15866
15867 // Next, do a 2nd try with surface_format_count being set too high:
15868 surface_present_mode_count += 5;
15869 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
15870 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
15871 pass = (err == VK_SUCCESS);
15872 ASSERT_TRUE(pass);
15873 m_errorMonitor->VerifyFound();
15874
15875 // Finally, do a correct 1st and 2nd try:
15876 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
15877 pass = (err == VK_SUCCESS);
15878 ASSERT_TRUE(pass);
15879 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
15880 pass = (err == VK_SUCCESS);
15881 ASSERT_TRUE(pass);
15882
15883 // Create a swapchain:
15884
15885 // First, try without a pointer to swapchain_create_info:
15886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
15887 "specified as NULL");
15888
15889 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
15890 pass = (err != VK_SUCCESS);
15891 ASSERT_TRUE(pass);
15892 m_errorMonitor->VerifyFound();
15893
15894 // Next, call with a non-NULL swapchain_create_info, that has the wrong
15895 // sType:
15896 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
15897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
15898
15899 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
15900 pass = (err != VK_SUCCESS);
15901 ASSERT_TRUE(pass);
15902 m_errorMonitor->VerifyFound();
15903
15904 // Next, call with a NULL swapchain pointer:
15905 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
15906 swapchain_create_info.pNext = NULL;
15907 swapchain_create_info.flags = 0;
15908 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
15909 "specified as NULL");
15910
15911 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
15912 pass = (err != VK_SUCCESS);
15913 ASSERT_TRUE(pass);
15914 m_errorMonitor->VerifyFound();
15915
15916 // TODO: Enhance swapchain layer so that
15917 // swapchain_create_info.queueFamilyIndexCount is checked against something?
15918
15919 // Next, call with a queue family index that's too large:
15920 uint32_t queueFamilyIndex[2] = { 100000, 0 };
15921 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
15922 swapchain_create_info.queueFamilyIndexCount = 2;
15923 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
15924 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
15925 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
15926 pass = (err != VK_SUCCESS);
15927 ASSERT_TRUE(pass);
15928 m_errorMonitor->VerifyFound();
15929
15930 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
15931 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
15932 swapchain_create_info.queueFamilyIndexCount = 1;
15933 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15934 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
15935 "pCreateInfo->pQueueFamilyIndices).");
15936 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
15937 pass = (err != VK_SUCCESS);
15938 ASSERT_TRUE(pass);
15939 m_errorMonitor->VerifyFound();
15940
15941 // Next, call with an invalid imageSharingMode:
15942 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
15943 swapchain_create_info.queueFamilyIndexCount = 1;
15944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15945 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
15946 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
15947 pass = (err != VK_SUCCESS);
15948 ASSERT_TRUE(pass);
15949 m_errorMonitor->VerifyFound();
15950 // Fix for the future:
15951 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
15952 // SUPPORTED
15953 swapchain_create_info.queueFamilyIndexCount = 0;
15954 queueFamilyIndex[0] = 0;
15955 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
15956
15957 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
15958 // Get the images from a swapchain:
15959 // Acquire an image from a swapchain:
15960 // Present an image to a swapchain:
15961 // Destroy the swapchain:
15962
15963 // TODOs:
15964 //
15965 // - Try destroying the device without first destroying the swapchain
15966 //
15967 // - Try destroying the device without first destroying the surface
15968 //
15969 // - Try destroying the surface without first destroying the swapchain
15970
15971 // Destroy the surface:
15972 vkDestroySurfaceKHR(instance(), surface, NULL);
15973
15974 // Tear down the window:
15975 xcb_destroy_window(connection, xcb_window);
15976 xcb_disconnect(connection);
15977
15978#else // VK_USE_PLATFORM_XCB_KHR
15979 return;
15980#endif // VK_USE_PLATFORM_XCB_KHR
15981}
Chris Forbes09368e42016-10-13 11:59:22 +130015982#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060015983
15984//
15985// POSITIVE VALIDATION TESTS
15986//
15987// These tests do not expect to encounter ANY validation errors pass only if this is true
15988
Tobin Ehlise0006882016-11-03 10:14:28 -060015989TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
15990 TEST_DESCRIPTION("Perform an image layout transition in a secondary command buffer followed "
15991 "by a transition in the primary.");
15992 VkResult err;
15993 m_errorMonitor->ExpectSuccess();
15994 ASSERT_NO_FATAL_FAILURE(InitState());
15995 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15996 // Allocate a secondary and primary cmd buffer
15997 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
15998 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
15999 command_buffer_allocate_info.commandPool = m_commandPool;
16000 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
16001 command_buffer_allocate_info.commandBufferCount = 1;
16002
16003 VkCommandBuffer secondary_command_buffer;
16004 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
16005 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
16006 VkCommandBuffer primary_command_buffer;
16007 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
16008 VkCommandBufferBeginInfo command_buffer_begin_info = {};
16009 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
16010 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
16011 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
16012 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
16013 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
16014
16015 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
16016 ASSERT_VK_SUCCESS(err);
16017 VkImageObj image(m_device);
16018 image.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
16019 ASSERT_TRUE(image.initialized());
16020 VkImageMemoryBarrier img_barrier = {};
16021 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16022 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16023 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16024 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16025 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
16026 img_barrier.image = image.handle();
16027 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16028 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16029 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16030 img_barrier.subresourceRange.baseArrayLayer = 0;
16031 img_barrier.subresourceRange.baseMipLevel = 0;
16032 img_barrier.subresourceRange.layerCount = 1;
16033 img_barrier.subresourceRange.levelCount = 1;
16034 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
16035 0, nullptr, 1, &img_barrier);
16036 err = vkEndCommandBuffer(secondary_command_buffer);
16037 ASSERT_VK_SUCCESS(err);
16038
16039 // Now update primary cmd buffer to execute secondary and transitions image
16040 command_buffer_begin_info.pInheritanceInfo = nullptr;
16041 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
16042 ASSERT_VK_SUCCESS(err);
16043 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
16044 VkImageMemoryBarrier img_barrier2 = {};
16045 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16046 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16047 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16048 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
16049 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
16050 img_barrier2.image = image.handle();
16051 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16052 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16053 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16054 img_barrier2.subresourceRange.baseArrayLayer = 0;
16055 img_barrier2.subresourceRange.baseMipLevel = 0;
16056 img_barrier2.subresourceRange.layerCount = 1;
16057 img_barrier2.subresourceRange.levelCount = 1;
16058 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
16059 nullptr, 1, &img_barrier2);
16060 err = vkEndCommandBuffer(primary_command_buffer);
16061 ASSERT_VK_SUCCESS(err);
16062 VkSubmitInfo submit_info = {};
16063 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
16064 submit_info.commandBufferCount = 1;
16065 submit_info.pCommandBuffers = &primary_command_buffer;
16066 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
16067 ASSERT_VK_SUCCESS(err);
16068 m_errorMonitor->VerifyNotFound();
16069 err = vkDeviceWaitIdle(m_device->device());
16070 ASSERT_VK_SUCCESS(err);
16071 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &secondary_command_buffer);
16072 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &primary_command_buffer);
16073}
16074
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016075// This is a positive test. No failures are expected.
16076TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
16077 TEST_DESCRIPTION("Ensure that the vkUpdateDescriptorSets validation code "
16078 "is ignoring VkWriteDescriptorSet members that are not "
16079 "related to the descriptor type specified by "
16080 "VkWriteDescriptorSet::descriptorType. Correct "
16081 "validation behavior will result in the test running to "
16082 "completion without validation errors.");
16083
16084 const uintptr_t invalid_ptr = 0xcdcdcdcd;
16085
16086 ASSERT_NO_FATAL_FAILURE(InitState());
16087
16088 // Image Case
16089 {
16090 m_errorMonitor->ExpectSuccess();
16091
16092 VkImage image;
16093 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
16094 const int32_t tex_width = 32;
16095 const int32_t tex_height = 32;
16096 VkImageCreateInfo image_create_info = {};
16097 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16098 image_create_info.pNext = NULL;
16099 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16100 image_create_info.format = tex_format;
16101 image_create_info.extent.width = tex_width;
16102 image_create_info.extent.height = tex_height;
16103 image_create_info.extent.depth = 1;
16104 image_create_info.mipLevels = 1;
16105 image_create_info.arrayLayers = 1;
16106 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16107 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16108 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16109 image_create_info.flags = 0;
16110 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
16111 ASSERT_VK_SUCCESS(err);
16112
16113 VkMemoryRequirements memory_reqs;
16114 VkDeviceMemory image_memory;
16115 bool pass;
16116 VkMemoryAllocateInfo memory_info = {};
16117 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16118 memory_info.pNext = NULL;
16119 memory_info.allocationSize = 0;
16120 memory_info.memoryTypeIndex = 0;
16121 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
16122 memory_info.allocationSize = memory_reqs.size;
16123 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
16124 ASSERT_TRUE(pass);
16125 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
16126 ASSERT_VK_SUCCESS(err);
16127 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
16128 ASSERT_VK_SUCCESS(err);
16129
16130 VkImageViewCreateInfo image_view_create_info = {};
16131 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
16132 image_view_create_info.image = image;
16133 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16134 image_view_create_info.format = tex_format;
16135 image_view_create_info.subresourceRange.layerCount = 1;
16136 image_view_create_info.subresourceRange.baseMipLevel = 0;
16137 image_view_create_info.subresourceRange.levelCount = 1;
16138 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16139
16140 VkImageView view;
16141 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
16142 ASSERT_VK_SUCCESS(err);
16143
16144 VkDescriptorPoolSize ds_type_count = {};
16145 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16146 ds_type_count.descriptorCount = 1;
16147
16148 VkDescriptorPoolCreateInfo ds_pool_ci = {};
16149 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16150 ds_pool_ci.pNext = NULL;
16151 ds_pool_ci.maxSets = 1;
16152 ds_pool_ci.poolSizeCount = 1;
16153 ds_pool_ci.pPoolSizes = &ds_type_count;
16154
16155 VkDescriptorPool ds_pool;
16156 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
16157 ASSERT_VK_SUCCESS(err);
16158
16159 VkDescriptorSetLayoutBinding dsl_binding = {};
16160 dsl_binding.binding = 0;
16161 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16162 dsl_binding.descriptorCount = 1;
16163 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
16164 dsl_binding.pImmutableSamplers = NULL;
16165
16166 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16167 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16168 ds_layout_ci.pNext = NULL;
16169 ds_layout_ci.bindingCount = 1;
16170 ds_layout_ci.pBindings = &dsl_binding;
16171 VkDescriptorSetLayout ds_layout;
16172 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16173 ASSERT_VK_SUCCESS(err);
16174
16175 VkDescriptorSet descriptor_set;
16176 VkDescriptorSetAllocateInfo alloc_info = {};
16177 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
16178 alloc_info.descriptorSetCount = 1;
16179 alloc_info.descriptorPool = ds_pool;
16180 alloc_info.pSetLayouts = &ds_layout;
16181 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
16182 ASSERT_VK_SUCCESS(err);
16183
16184 VkDescriptorImageInfo image_info = {};
16185 image_info.imageView = view;
16186 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
16187
16188 VkWriteDescriptorSet descriptor_write;
16189 memset(&descriptor_write, 0, sizeof(descriptor_write));
16190 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
16191 descriptor_write.dstSet = descriptor_set;
16192 descriptor_write.dstBinding = 0;
16193 descriptor_write.descriptorCount = 1;
16194 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
16195 descriptor_write.pImageInfo = &image_info;
16196
16197 // Set pBufferInfo and pTexelBufferView to invalid values, which should
16198 // be
16199 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
16200 // This will most likely produce a crash if the parameter_validation
16201 // layer
16202 // does not correctly ignore pBufferInfo.
16203 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
16204 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
16205
16206 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
16207
16208 m_errorMonitor->VerifyNotFound();
16209
16210 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16211 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
16212 vkDestroyImageView(m_device->device(), view, NULL);
16213 vkDestroyImage(m_device->device(), image, NULL);
16214 vkFreeMemory(m_device->device(), image_memory, NULL);
16215 }
16216
16217 // Buffer Case
16218 {
16219 m_errorMonitor->ExpectSuccess();
16220
16221 VkBuffer buffer;
16222 uint32_t queue_family_index = 0;
16223 VkBufferCreateInfo buffer_create_info = {};
16224 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
16225 buffer_create_info.size = 1024;
16226 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
16227 buffer_create_info.queueFamilyIndexCount = 1;
16228 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
16229
16230 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
16231 ASSERT_VK_SUCCESS(err);
16232
16233 VkMemoryRequirements memory_reqs;
16234 VkDeviceMemory buffer_memory;
16235 bool pass;
16236 VkMemoryAllocateInfo memory_info = {};
16237 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16238 memory_info.pNext = NULL;
16239 memory_info.allocationSize = 0;
16240 memory_info.memoryTypeIndex = 0;
16241
16242 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
16243 memory_info.allocationSize = memory_reqs.size;
16244 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
16245 ASSERT_TRUE(pass);
16246
16247 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
16248 ASSERT_VK_SUCCESS(err);
16249 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
16250 ASSERT_VK_SUCCESS(err);
16251
16252 VkDescriptorPoolSize ds_type_count = {};
16253 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16254 ds_type_count.descriptorCount = 1;
16255
16256 VkDescriptorPoolCreateInfo ds_pool_ci = {};
16257 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16258 ds_pool_ci.pNext = NULL;
16259 ds_pool_ci.maxSets = 1;
16260 ds_pool_ci.poolSizeCount = 1;
16261 ds_pool_ci.pPoolSizes = &ds_type_count;
16262
16263 VkDescriptorPool ds_pool;
16264 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
16265 ASSERT_VK_SUCCESS(err);
16266
16267 VkDescriptorSetLayoutBinding dsl_binding = {};
16268 dsl_binding.binding = 0;
16269 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16270 dsl_binding.descriptorCount = 1;
16271 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
16272 dsl_binding.pImmutableSamplers = NULL;
16273
16274 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16275 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16276 ds_layout_ci.pNext = NULL;
16277 ds_layout_ci.bindingCount = 1;
16278 ds_layout_ci.pBindings = &dsl_binding;
16279 VkDescriptorSetLayout ds_layout;
16280 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16281 ASSERT_VK_SUCCESS(err);
16282
16283 VkDescriptorSet descriptor_set;
16284 VkDescriptorSetAllocateInfo alloc_info = {};
16285 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
16286 alloc_info.descriptorSetCount = 1;
16287 alloc_info.descriptorPool = ds_pool;
16288 alloc_info.pSetLayouts = &ds_layout;
16289 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
16290 ASSERT_VK_SUCCESS(err);
16291
16292 VkDescriptorBufferInfo buffer_info = {};
16293 buffer_info.buffer = buffer;
16294 buffer_info.offset = 0;
16295 buffer_info.range = 1024;
16296
16297 VkWriteDescriptorSet descriptor_write;
16298 memset(&descriptor_write, 0, sizeof(descriptor_write));
16299 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
16300 descriptor_write.dstSet = descriptor_set;
16301 descriptor_write.dstBinding = 0;
16302 descriptor_write.descriptorCount = 1;
16303 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16304 descriptor_write.pBufferInfo = &buffer_info;
16305
16306 // Set pImageInfo and pTexelBufferView to invalid values, which should
16307 // be
16308 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
16309 // This will most likely produce a crash if the parameter_validation
16310 // layer
16311 // does not correctly ignore pImageInfo.
16312 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
16313 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
16314
16315 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
16316
16317 m_errorMonitor->VerifyNotFound();
16318
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016319 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16320 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
16321 vkDestroyBuffer(m_device->device(), buffer, NULL);
16322 vkFreeMemory(m_device->device(), buffer_memory, NULL);
16323 }
16324
16325 // Texel Buffer Case
16326 {
16327 m_errorMonitor->ExpectSuccess();
16328
16329 VkBuffer buffer;
16330 uint32_t queue_family_index = 0;
16331 VkBufferCreateInfo buffer_create_info = {};
16332 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
16333 buffer_create_info.size = 1024;
16334 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
16335 buffer_create_info.queueFamilyIndexCount = 1;
16336 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
16337
16338 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
16339 ASSERT_VK_SUCCESS(err);
16340
16341 VkMemoryRequirements memory_reqs;
16342 VkDeviceMemory buffer_memory;
16343 bool pass;
16344 VkMemoryAllocateInfo memory_info = {};
16345 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16346 memory_info.pNext = NULL;
16347 memory_info.allocationSize = 0;
16348 memory_info.memoryTypeIndex = 0;
16349
16350 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
16351 memory_info.allocationSize = memory_reqs.size;
16352 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
16353 ASSERT_TRUE(pass);
16354
16355 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
16356 ASSERT_VK_SUCCESS(err);
16357 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
16358 ASSERT_VK_SUCCESS(err);
16359
16360 VkBufferViewCreateInfo buff_view_ci = {};
16361 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
16362 buff_view_ci.buffer = buffer;
16363 buff_view_ci.format = VK_FORMAT_R8_UNORM;
16364 buff_view_ci.range = VK_WHOLE_SIZE;
16365 VkBufferView buffer_view;
16366 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
16367
16368 VkDescriptorPoolSize ds_type_count = {};
16369 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
16370 ds_type_count.descriptorCount = 1;
16371
16372 VkDescriptorPoolCreateInfo ds_pool_ci = {};
16373 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16374 ds_pool_ci.pNext = NULL;
16375 ds_pool_ci.maxSets = 1;
16376 ds_pool_ci.poolSizeCount = 1;
16377 ds_pool_ci.pPoolSizes = &ds_type_count;
16378
16379 VkDescriptorPool ds_pool;
16380 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
16381 ASSERT_VK_SUCCESS(err);
16382
16383 VkDescriptorSetLayoutBinding dsl_binding = {};
16384 dsl_binding.binding = 0;
16385 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
16386 dsl_binding.descriptorCount = 1;
16387 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
16388 dsl_binding.pImmutableSamplers = NULL;
16389
16390 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16391 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16392 ds_layout_ci.pNext = NULL;
16393 ds_layout_ci.bindingCount = 1;
16394 ds_layout_ci.pBindings = &dsl_binding;
16395 VkDescriptorSetLayout ds_layout;
16396 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16397 ASSERT_VK_SUCCESS(err);
16398
16399 VkDescriptorSet descriptor_set;
16400 VkDescriptorSetAllocateInfo alloc_info = {};
16401 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
16402 alloc_info.descriptorSetCount = 1;
16403 alloc_info.descriptorPool = ds_pool;
16404 alloc_info.pSetLayouts = &ds_layout;
16405 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
16406 ASSERT_VK_SUCCESS(err);
16407
16408 VkWriteDescriptorSet descriptor_write;
16409 memset(&descriptor_write, 0, sizeof(descriptor_write));
16410 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
16411 descriptor_write.dstSet = descriptor_set;
16412 descriptor_write.dstBinding = 0;
16413 descriptor_write.descriptorCount = 1;
16414 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
16415 descriptor_write.pTexelBufferView = &buffer_view;
16416
16417 // Set pImageInfo and pBufferInfo to invalid values, which should be
16418 // ignored for descriptorType ==
16419 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
16420 // This will most likely produce a crash if the parameter_validation
16421 // layer
16422 // does not correctly ignore pImageInfo and pBufferInfo.
16423 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
16424 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
16425
16426 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
16427
16428 m_errorMonitor->VerifyNotFound();
16429
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016430 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16431 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
16432 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
16433 vkDestroyBuffer(m_device->device(), buffer, NULL);
16434 vkFreeMemory(m_device->device(), buffer_memory, NULL);
16435 }
16436}
16437
Tobin Ehlisf7428442016-10-25 07:58:24 -060016438TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
16439 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
16440
16441 ASSERT_NO_FATAL_FAILURE(InitState());
16442 // Create layout where two binding #s are "1"
16443 static const uint32_t NUM_BINDINGS = 3;
16444 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
16445 dsl_binding[0].binding = 1;
16446 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16447 dsl_binding[0].descriptorCount = 1;
16448 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
16449 dsl_binding[0].pImmutableSamplers = NULL;
16450 dsl_binding[1].binding = 0;
16451 dsl_binding[1].descriptorCount = 1;
16452 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16453 dsl_binding[1].descriptorCount = 1;
16454 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
16455 dsl_binding[1].pImmutableSamplers = NULL;
16456 dsl_binding[2].binding = 1; // Duplicate binding should cause error
16457 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16458 dsl_binding[2].descriptorCount = 1;
16459 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
16460 dsl_binding[2].pImmutableSamplers = NULL;
16461
16462 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16463 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16464 ds_layout_ci.pNext = NULL;
16465 ds_layout_ci.bindingCount = NUM_BINDINGS;
16466 ds_layout_ci.pBindings = dsl_binding;
16467 VkDescriptorSetLayout ds_layout;
16468 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
16469 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16470 m_errorMonitor->VerifyFound();
16471}
16472
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060016473TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060016474 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
16475
16476 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060016477
16478 BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060016479
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060016480 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
16481
16482 {
16483 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
16484 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
16485 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16486 m_errorMonitor->VerifyFound();
16487 }
16488
16489 {
16490 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
16491 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
16492 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16493 m_errorMonitor->VerifyFound();
16494 }
16495
16496 {
16497 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
16498 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
16499 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16500 m_errorMonitor->VerifyFound();
16501 }
16502
16503 {
16504 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
16505 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
16506 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16507 m_errorMonitor->VerifyFound();
16508 }
16509
16510 {
16511 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
16512 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
16513 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16514 m_errorMonitor->VerifyFound();
16515 }
16516
16517 {
16518 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
16519 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
16520 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
16521 m_errorMonitor->VerifyFound();
16522 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060016523
16524 {
16525 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
16526 VkRect2D scissor = {{-1, 0}, {16, 16}};
16527 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16528 m_errorMonitor->VerifyFound();
16529 }
16530
16531 {
16532 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
16533 VkRect2D scissor = {{0, -2}, {16, 16}};
16534 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16535 m_errorMonitor->VerifyFound();
16536 }
16537
16538 {
16539 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
16540 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
16541 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16542 m_errorMonitor->VerifyFound();
16543 }
16544
16545 {
16546 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
16547 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
16548 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16549 m_errorMonitor->VerifyFound();
16550 }
16551
16552 EndCommandBuffer();
16553}
16554
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016555// This is a positive test. No failures are expected.
16556TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
16557 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
16558 VkResult err;
16559
16560 ASSERT_NO_FATAL_FAILURE(InitState());
16561 m_errorMonitor->ExpectSuccess();
16562 VkDescriptorPoolSize ds_type_count = {};
16563 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16564 ds_type_count.descriptorCount = 2;
16565
16566 VkDescriptorPoolCreateInfo ds_pool_ci = {};
16567 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16568 ds_pool_ci.pNext = NULL;
16569 ds_pool_ci.maxSets = 1;
16570 ds_pool_ci.poolSizeCount = 1;
16571 ds_pool_ci.pPoolSizes = &ds_type_count;
16572
16573 VkDescriptorPool ds_pool;
16574 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
16575 ASSERT_VK_SUCCESS(err);
16576
16577 // Create layout with two uniform buffer descriptors w/ empty binding between them
16578 static const uint32_t NUM_BINDINGS = 3;
16579 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
16580 dsl_binding[0].binding = 0;
16581 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16582 dsl_binding[0].descriptorCount = 1;
16583 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
16584 dsl_binding[0].pImmutableSamplers = NULL;
16585 dsl_binding[1].binding = 1;
16586 dsl_binding[1].descriptorCount = 0; // empty binding
16587 dsl_binding[2].binding = 2;
16588 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16589 dsl_binding[2].descriptorCount = 1;
16590 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
16591 dsl_binding[2].pImmutableSamplers = NULL;
16592
16593 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16594 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16595 ds_layout_ci.pNext = NULL;
16596 ds_layout_ci.bindingCount = NUM_BINDINGS;
16597 ds_layout_ci.pBindings = dsl_binding;
16598 VkDescriptorSetLayout ds_layout;
16599 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16600 ASSERT_VK_SUCCESS(err);
16601
16602 VkDescriptorSet descriptor_set = {};
16603 VkDescriptorSetAllocateInfo alloc_info = {};
16604 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
16605 alloc_info.descriptorSetCount = 1;
16606 alloc_info.descriptorPool = ds_pool;
16607 alloc_info.pSetLayouts = &ds_layout;
16608 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
16609 ASSERT_VK_SUCCESS(err);
16610
16611 // Create a buffer to be used for update
16612 VkBufferCreateInfo buff_ci = {};
16613 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
16614 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
16615 buff_ci.size = 256;
16616 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16617 VkBuffer buffer;
16618 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
16619 ASSERT_VK_SUCCESS(err);
16620 // Have to bind memory to buffer before descriptor update
16621 VkMemoryAllocateInfo mem_alloc = {};
16622 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16623 mem_alloc.pNext = NULL;
16624 mem_alloc.allocationSize = 512; // one allocation for both buffers
16625 mem_alloc.memoryTypeIndex = 0;
16626
16627 VkMemoryRequirements mem_reqs;
16628 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
16629 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
16630 if (!pass) {
16631 vkDestroyBuffer(m_device->device(), buffer, NULL);
16632 return;
16633 }
16634
16635 VkDeviceMemory mem;
16636 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
16637 ASSERT_VK_SUCCESS(err);
16638 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
16639 ASSERT_VK_SUCCESS(err);
16640
16641 // Only update the descriptor at binding 2
16642 VkDescriptorBufferInfo buff_info = {};
16643 buff_info.buffer = buffer;
16644 buff_info.offset = 0;
16645 buff_info.range = VK_WHOLE_SIZE;
16646 VkWriteDescriptorSet descriptor_write = {};
16647 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
16648 descriptor_write.dstBinding = 2;
16649 descriptor_write.descriptorCount = 1;
16650 descriptor_write.pTexelBufferView = nullptr;
16651 descriptor_write.pBufferInfo = &buff_info;
16652 descriptor_write.pImageInfo = nullptr;
16653 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
16654 descriptor_write.dstSet = descriptor_set;
16655
16656 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
16657
16658 m_errorMonitor->VerifyNotFound();
16659 // Cleanup
16660 vkFreeMemory(m_device->device(), mem, NULL);
16661 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16662 vkDestroyBuffer(m_device->device(), buffer, NULL);
16663 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
16664}
16665
16666// This is a positive test. No failures are expected.
16667TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
16668 VkResult err;
16669 bool pass;
16670
16671 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
16672 "the buffer, create an image, and bind the same memory to "
16673 "it");
16674
16675 m_errorMonitor->ExpectSuccess();
16676
16677 ASSERT_NO_FATAL_FAILURE(InitState());
16678
16679 VkBuffer buffer;
16680 VkImage image;
16681 VkDeviceMemory mem;
16682 VkMemoryRequirements mem_reqs;
16683
16684 VkBufferCreateInfo buf_info = {};
16685 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
16686 buf_info.pNext = NULL;
16687 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
16688 buf_info.size = 256;
16689 buf_info.queueFamilyIndexCount = 0;
16690 buf_info.pQueueFamilyIndices = NULL;
16691 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16692 buf_info.flags = 0;
16693 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
16694 ASSERT_VK_SUCCESS(err);
16695
16696 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
16697
16698 VkMemoryAllocateInfo alloc_info = {};
16699 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16700 alloc_info.pNext = NULL;
16701 alloc_info.memoryTypeIndex = 0;
16702
16703 // Ensure memory is big enough for both bindings
16704 alloc_info.allocationSize = 0x10000;
16705
16706 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
16707 if (!pass) {
16708 vkDestroyBuffer(m_device->device(), buffer, NULL);
16709 return;
16710 }
16711
16712 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
16713 ASSERT_VK_SUCCESS(err);
16714
16715 uint8_t *pData;
16716 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
16717 ASSERT_VK_SUCCESS(err);
16718
16719 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
16720
16721 vkUnmapMemory(m_device->device(), mem);
16722
16723 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
16724 ASSERT_VK_SUCCESS(err);
16725
16726 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
16727 // memory. In fact, it was never used by the GPU.
16728 // Just be be sure, wait for idle.
16729 vkDestroyBuffer(m_device->device(), buffer, NULL);
16730 vkDeviceWaitIdle(m_device->device());
16731
16732 VkImageCreateInfo image_create_info = {};
16733 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16734 image_create_info.pNext = NULL;
16735 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16736 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
16737 image_create_info.extent.width = 64;
16738 image_create_info.extent.height = 64;
16739 image_create_info.extent.depth = 1;
16740 image_create_info.mipLevels = 1;
16741 image_create_info.arrayLayers = 1;
16742 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16743 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16744 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
16745 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16746 image_create_info.queueFamilyIndexCount = 0;
16747 image_create_info.pQueueFamilyIndices = NULL;
16748 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16749 image_create_info.flags = 0;
16750
16751 VkMemoryAllocateInfo mem_alloc = {};
16752 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16753 mem_alloc.pNext = NULL;
16754 mem_alloc.allocationSize = 0;
16755 mem_alloc.memoryTypeIndex = 0;
16756
16757 /* Create a mappable image. It will be the texture if linear images are ok
16758 * to be textures or it will be the staging image if they are not.
16759 */
16760 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
16761 ASSERT_VK_SUCCESS(err);
16762
16763 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
16764
16765 mem_alloc.allocationSize = mem_reqs.size;
16766
16767 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
16768 if (!pass) {
16769 vkDestroyImage(m_device->device(), image, NULL);
16770 return;
16771 }
16772
16773 // VALIDATION FAILURE:
16774 err = vkBindImageMemory(m_device->device(), image, mem, 0);
16775 ASSERT_VK_SUCCESS(err);
16776
16777 m_errorMonitor->VerifyNotFound();
16778
16779 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016780 vkDestroyImage(m_device->device(), image, NULL);
16781}
16782
Tobin Ehlis953e8392016-11-17 10:54:13 -070016783TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
16784 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
16785 // We previously had a bug where dynamic offset of inactive bindings was still being used
16786 VkResult err;
16787 m_errorMonitor->ExpectSuccess();
16788
16789 ASSERT_NO_FATAL_FAILURE(InitState());
16790 ASSERT_NO_FATAL_FAILURE(InitViewport());
16791 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16792
16793 VkDescriptorPoolSize ds_type_count = {};
16794 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
16795 ds_type_count.descriptorCount = 3;
16796
16797 VkDescriptorPoolCreateInfo ds_pool_ci = {};
16798 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
16799 ds_pool_ci.pNext = NULL;
16800 ds_pool_ci.maxSets = 1;
16801 ds_pool_ci.poolSizeCount = 1;
16802 ds_pool_ci.pPoolSizes = &ds_type_count;
16803
16804 VkDescriptorPool ds_pool;
16805 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
16806 ASSERT_VK_SUCCESS(err);
16807
16808 const uint32_t BINDING_COUNT = 3;
16809 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070016810 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070016811 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
16812 dsl_binding[0].descriptorCount = 1;
16813 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
16814 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070016815 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070016816 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
16817 dsl_binding[1].descriptorCount = 1;
16818 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
16819 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070016820 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070016821 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
16822 dsl_binding[2].descriptorCount = 1;
16823 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
16824 dsl_binding[2].pImmutableSamplers = NULL;
16825
16826 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
16827 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
16828 ds_layout_ci.pNext = NULL;
16829 ds_layout_ci.bindingCount = BINDING_COUNT;
16830 ds_layout_ci.pBindings = dsl_binding;
16831 VkDescriptorSetLayout ds_layout;
16832 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
16833 ASSERT_VK_SUCCESS(err);
16834
16835 VkDescriptorSet descriptor_set;
16836 VkDescriptorSetAllocateInfo alloc_info = {};
16837 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
16838 alloc_info.descriptorSetCount = 1;
16839 alloc_info.descriptorPool = ds_pool;
16840 alloc_info.pSetLayouts = &ds_layout;
16841 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
16842 ASSERT_VK_SUCCESS(err);
16843
16844 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
16845 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
16846 pipeline_layout_ci.pNext = NULL;
16847 pipeline_layout_ci.setLayoutCount = 1;
16848 pipeline_layout_ci.pSetLayouts = &ds_layout;
16849
16850 VkPipelineLayout pipeline_layout;
16851 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
16852 ASSERT_VK_SUCCESS(err);
16853
16854 // Create two buffers to update the descriptors with
16855 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
16856 uint32_t qfi = 0;
16857 VkBufferCreateInfo buffCI = {};
16858 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
16859 buffCI.size = 2048;
16860 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
16861 buffCI.queueFamilyIndexCount = 1;
16862 buffCI.pQueueFamilyIndices = &qfi;
16863
16864 VkBuffer dyub1;
16865 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
16866 ASSERT_VK_SUCCESS(err);
16867 // buffer2
16868 buffCI.size = 1024;
16869 VkBuffer dyub2;
16870 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
16871 ASSERT_VK_SUCCESS(err);
16872 // Allocate memory and bind to buffers
16873 VkMemoryAllocateInfo mem_alloc[2] = {};
16874 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16875 mem_alloc[0].pNext = NULL;
16876 mem_alloc[0].memoryTypeIndex = 0;
16877 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16878 mem_alloc[1].pNext = NULL;
16879 mem_alloc[1].memoryTypeIndex = 0;
16880
16881 VkMemoryRequirements mem_reqs1;
16882 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
16883 VkMemoryRequirements mem_reqs2;
16884 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
16885 mem_alloc[0].allocationSize = mem_reqs1.size;
16886 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
16887 mem_alloc[1].allocationSize = mem_reqs2.size;
16888 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
16889 if (!pass) {
16890 vkDestroyBuffer(m_device->device(), dyub1, NULL);
16891 vkDestroyBuffer(m_device->device(), dyub2, NULL);
16892 return;
16893 }
16894
16895 VkDeviceMemory mem1;
16896 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
16897 ASSERT_VK_SUCCESS(err);
16898 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
16899 ASSERT_VK_SUCCESS(err);
16900 VkDeviceMemory mem2;
16901 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
16902 ASSERT_VK_SUCCESS(err);
16903 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
16904 ASSERT_VK_SUCCESS(err);
16905 // Update descriptors
16906 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
16907 buff_info[0].buffer = dyub1;
16908 buff_info[0].offset = 0;
16909 buff_info[0].range = 256;
16910 buff_info[1].buffer = dyub1;
16911 buff_info[1].offset = 256;
16912 buff_info[1].range = 512;
16913 buff_info[2].buffer = dyub2;
16914 buff_info[2].offset = 0;
16915 buff_info[2].range = 512;
16916
16917 VkWriteDescriptorSet descriptor_write;
16918 memset(&descriptor_write, 0, sizeof(descriptor_write));
16919 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
16920 descriptor_write.dstSet = descriptor_set;
16921 descriptor_write.dstBinding = 0;
16922 descriptor_write.descriptorCount = BINDING_COUNT;
16923 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
16924 descriptor_write.pBufferInfo = buff_info;
16925
16926 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
16927
16928 BeginCommandBuffer();
16929
16930 // Create PSO to be used for draw-time errors below
16931 char const *vsSource = "#version 450\n"
16932 "\n"
16933 "out gl_PerVertex { \n"
16934 " vec4 gl_Position;\n"
16935 "};\n"
16936 "void main(){\n"
16937 " gl_Position = vec4(1);\n"
16938 "}\n";
16939 char const *fsSource = "#version 450\n"
16940 "\n"
16941 "layout(location=0) out vec4 x;\n"
16942 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
16943 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
16944 "void main(){\n"
16945 " x = vec4(bar1.y) + vec4(bar2.y);\n"
16946 "}\n";
16947 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16948 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16949 VkPipelineObj pipe(m_device);
16950 pipe.SetViewport(m_viewports);
16951 pipe.SetScissor(m_scissors);
16952 pipe.AddShader(&vs);
16953 pipe.AddShader(&fs);
16954 pipe.AddColorAttachment();
16955 pipe.CreateVKPipeline(pipeline_layout, renderPass());
16956
16957 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
16958 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
16959 // we used to have a bug in this case.
16960 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
16961 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
16962 &descriptor_set, BINDING_COUNT, dyn_off);
16963 Draw(1, 0, 0, 0);
16964 m_errorMonitor->VerifyNotFound();
16965
16966 vkDestroyBuffer(m_device->device(), dyub1, NULL);
16967 vkDestroyBuffer(m_device->device(), dyub2, NULL);
16968 vkFreeMemory(m_device->device(), mem1, NULL);
16969 vkFreeMemory(m_device->device(), mem2, NULL);
16970
16971 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
16972 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
16973 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
16974}
16975
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016976TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
16977
16978 TEST_DESCRIPTION("Ensure that validations handling of non-coherent memory "
16979 "mapping while using VK_WHOLE_SIZE does not cause access "
16980 "violations");
16981 VkResult err;
16982 uint8_t *pData;
16983 ASSERT_NO_FATAL_FAILURE(InitState());
16984
16985 VkDeviceMemory mem;
16986 VkMemoryRequirements mem_reqs;
16987 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070016988 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016989 VkMemoryAllocateInfo alloc_info = {};
16990 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16991 alloc_info.pNext = NULL;
16992 alloc_info.memoryTypeIndex = 0;
16993
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070016994 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060016995 alloc_info.allocationSize = allocation_size;
16996
16997 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
16998 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
16999 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
17000 if (!pass) {
17001 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
17002 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
17003 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
17004 if (!pass) {
17005 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
17006 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
17007 VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
17008 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
17009 if (!pass) {
17010 return;
17011 }
17012 }
17013 }
17014
17015 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
17016 ASSERT_VK_SUCCESS(err);
17017
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017018 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017019 m_errorMonitor->ExpectSuccess();
17020 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
17021 ASSERT_VK_SUCCESS(err);
17022 VkMappedMemoryRange mmr = {};
17023 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
17024 mmr.memory = mem;
17025 mmr.offset = 0;
17026 mmr.size = VK_WHOLE_SIZE;
17027 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
17028 ASSERT_VK_SUCCESS(err);
17029 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
17030 ASSERT_VK_SUCCESS(err);
17031 m_errorMonitor->VerifyNotFound();
17032 vkUnmapMemory(m_device->device(), mem);
17033
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017034 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017035 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017036 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017037 ASSERT_VK_SUCCESS(err);
17038 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
17039 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017040 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017041 mmr.size = VK_WHOLE_SIZE;
17042 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
17043 ASSERT_VK_SUCCESS(err);
17044 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
17045 ASSERT_VK_SUCCESS(err);
17046 m_errorMonitor->VerifyNotFound();
17047 vkUnmapMemory(m_device->device(), mem);
17048
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017049 // Map with offset and size
17050 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017051 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017052 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017053 ASSERT_VK_SUCCESS(err);
17054 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
17055 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017056 mmr.offset = 4 * atom_size;
17057 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017058 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
17059 ASSERT_VK_SUCCESS(err);
17060 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
17061 ASSERT_VK_SUCCESS(err);
17062 m_errorMonitor->VerifyNotFound();
17063 vkUnmapMemory(m_device->device(), mem);
17064
17065 // Map without offset and flush WHOLE_SIZE with two separate offsets
17066 m_errorMonitor->ExpectSuccess();
17067 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
17068 ASSERT_VK_SUCCESS(err);
17069 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
17070 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017071 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017072 mmr.size = VK_WHOLE_SIZE;
17073 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
17074 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070017075 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017076 mmr.size = VK_WHOLE_SIZE;
17077 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
17078 ASSERT_VK_SUCCESS(err);
17079 m_errorMonitor->VerifyNotFound();
17080 vkUnmapMemory(m_device->device(), mem);
17081
17082 vkFreeMemory(m_device->device(), mem, NULL);
17083}
17084
17085// This is a positive test. We used to expect error in this case but spec now allows it
17086TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
17087 m_errorMonitor->ExpectSuccess();
17088 vk_testing::Fence testFence;
17089 VkFenceCreateInfo fenceInfo = {};
17090 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
17091 fenceInfo.pNext = NULL;
17092
17093 ASSERT_NO_FATAL_FAILURE(InitState());
17094 testFence.init(*m_device, fenceInfo);
17095 VkFence fences[1] = { testFence.handle() };
17096 VkResult result = vkResetFences(m_device->device(), 1, fences);
17097 ASSERT_VK_SUCCESS(result);
17098
17099 m_errorMonitor->VerifyNotFound();
17100}
17101
17102TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
17103 m_errorMonitor->ExpectSuccess();
17104
17105 ASSERT_NO_FATAL_FAILURE(InitState());
17106 VkResult err;
17107
17108 // Record (empty!) command buffer that can be submitted multiple times
17109 // simultaneously.
17110 VkCommandBufferBeginInfo cbbi = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
17111 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr };
17112 m_commandBuffer->BeginCommandBuffer(&cbbi);
17113 m_commandBuffer->EndCommandBuffer();
17114
17115 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
17116 VkFence fence;
17117 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
17118 ASSERT_VK_SUCCESS(err);
17119
17120 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
17121 VkSemaphore s1, s2;
17122 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
17123 ASSERT_VK_SUCCESS(err);
17124 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
17125 ASSERT_VK_SUCCESS(err);
17126
17127 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
17128 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1 };
17129 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
17130 ASSERT_VK_SUCCESS(err);
17131
17132 // Submit CB again, signaling s2.
17133 si.pSignalSemaphores = &s2;
17134 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
17135 ASSERT_VK_SUCCESS(err);
17136
17137 // Wait for fence.
17138 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
17139 ASSERT_VK_SUCCESS(err);
17140
17141 // CB is still in flight from second submission, but semaphore s1 is no
17142 // longer in flight. delete it.
17143 vkDestroySemaphore(m_device->device(), s1, nullptr);
17144
17145 m_errorMonitor->VerifyNotFound();
17146
17147 // Force device idle and clean up remaining objects
17148 vkDeviceWaitIdle(m_device->device());
17149 vkDestroySemaphore(m_device->device(), s2, nullptr);
17150 vkDestroyFence(m_device->device(), fence, nullptr);
17151}
17152
17153TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
17154 m_errorMonitor->ExpectSuccess();
17155
17156 ASSERT_NO_FATAL_FAILURE(InitState());
17157 VkResult err;
17158
17159 // A fence created signaled
17160 VkFenceCreateInfo fci1 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT };
17161 VkFence f1;
17162 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
17163 ASSERT_VK_SUCCESS(err);
17164
17165 // A fence created not
17166 VkFenceCreateInfo fci2 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
17167 VkFence f2;
17168 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
17169 ASSERT_VK_SUCCESS(err);
17170
17171 // Submit the unsignaled fence
17172 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr };
17173 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
17174
17175 // Wait on both fences, with signaled first.
17176 VkFence fences[] = { f1, f2 };
17177 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
17178
17179 // Should have both retired!
17180 vkDestroyFence(m_device->device(), f1, nullptr);
17181 vkDestroyFence(m_device->device(), f2, nullptr);
17182
17183 m_errorMonitor->VerifyNotFound();
17184}
17185
17186TEST_F(VkPositiveLayerTest, ValidUsage) {
17187 TEST_DESCRIPTION("Verify that creating an image view from an image with valid usage "
17188 "doesn't generate validation errors");
17189
17190 ASSERT_NO_FATAL_FAILURE(InitState());
17191
17192 m_errorMonitor->ExpectSuccess();
17193 // Verify that we can create a view with usage INPUT_ATTACHMENT
17194 VkImageObj image(m_device);
17195 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
17196 ASSERT_TRUE(image.initialized());
17197 VkImageView imageView;
17198 VkImageViewCreateInfo ivci = {};
17199 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
17200 ivci.image = image.handle();
17201 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
17202 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
17203 ivci.subresourceRange.layerCount = 1;
17204 ivci.subresourceRange.baseMipLevel = 0;
17205 ivci.subresourceRange.levelCount = 1;
17206 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17207
17208 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
17209 m_errorMonitor->VerifyNotFound();
17210 vkDestroyImageView(m_device->device(), imageView, NULL);
17211}
17212
17213// This is a positive test. No failures are expected.
17214TEST_F(VkPositiveLayerTest, BindSparse) {
17215 TEST_DESCRIPTION("Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
17216 "and then free the memory");
17217
17218 ASSERT_NO_FATAL_FAILURE(InitState());
17219
17220 auto index = m_device->graphics_queue_node_index_;
17221 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT))
17222 return;
17223
17224 m_errorMonitor->ExpectSuccess();
17225
17226 VkImage image;
17227 VkImageCreateInfo image_create_info = {};
17228 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17229 image_create_info.pNext = NULL;
17230 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17231 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17232 image_create_info.extent.width = 64;
17233 image_create_info.extent.height = 64;
17234 image_create_info.extent.depth = 1;
17235 image_create_info.mipLevels = 1;
17236 image_create_info.arrayLayers = 1;
17237 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17238 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17239 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
17240 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
17241 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
17242 ASSERT_VK_SUCCESS(err);
17243
17244 VkMemoryRequirements memory_reqs;
17245 VkDeviceMemory memory_one, memory_two;
17246 bool pass;
17247 VkMemoryAllocateInfo memory_info = {};
17248 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17249 memory_info.pNext = NULL;
17250 memory_info.allocationSize = 0;
17251 memory_info.memoryTypeIndex = 0;
17252 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
17253 // Find an image big enough to allow sparse mapping of 2 memory regions
17254 // Increase the image size until it is at least twice the
17255 // size of the required alignment, to ensure we can bind both
17256 // allocated memory blocks to the image on aligned offsets.
17257 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
17258 vkDestroyImage(m_device->device(), image, nullptr);
17259 image_create_info.extent.width *= 2;
17260 image_create_info.extent.height *= 2;
17261 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
17262 ASSERT_VK_SUCCESS(err);
17263 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
17264 }
17265 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
17266 // at the end of the first
17267 memory_info.allocationSize = memory_reqs.alignment;
17268 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
17269 ASSERT_TRUE(pass);
17270 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
17271 ASSERT_VK_SUCCESS(err);
17272 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
17273 ASSERT_VK_SUCCESS(err);
17274 VkSparseMemoryBind binds[2];
17275 binds[0].flags = 0;
17276 binds[0].memory = memory_one;
17277 binds[0].memoryOffset = 0;
17278 binds[0].resourceOffset = 0;
17279 binds[0].size = memory_info.allocationSize;
17280 binds[1].flags = 0;
17281 binds[1].memory = memory_two;
17282 binds[1].memoryOffset = 0;
17283 binds[1].resourceOffset = memory_info.allocationSize;
17284 binds[1].size = memory_info.allocationSize;
17285
17286 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
17287 opaqueBindInfo.image = image;
17288 opaqueBindInfo.bindCount = 2;
17289 opaqueBindInfo.pBinds = binds;
17290
17291 VkFence fence = VK_NULL_HANDLE;
17292 VkBindSparseInfo bindSparseInfo = {};
17293 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
17294 bindSparseInfo.imageOpaqueBindCount = 1;
17295 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
17296
17297 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
17298 vkQueueWaitIdle(m_device->m_queue);
17299 vkDestroyImage(m_device->device(), image, NULL);
17300 vkFreeMemory(m_device->device(), memory_one, NULL);
17301 vkFreeMemory(m_device->device(), memory_two, NULL);
17302 m_errorMonitor->VerifyNotFound();
17303}
17304
17305TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
17306 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass with an attachment's "
17307 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
17308 "the command buffer has prior knowledge of that "
17309 "attachment's layout.");
17310
17311 m_errorMonitor->ExpectSuccess();
17312
17313 ASSERT_NO_FATAL_FAILURE(InitState());
17314
17315 // A renderpass with one color attachment.
17316 VkAttachmentDescription attachment = { 0,
17317 VK_FORMAT_R8G8B8A8_UNORM,
17318 VK_SAMPLE_COUNT_1_BIT,
17319 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17320 VK_ATTACHMENT_STORE_OP_STORE,
17321 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17322 VK_ATTACHMENT_STORE_OP_DONT_CARE,
17323 VK_IMAGE_LAYOUT_UNDEFINED,
17324 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17325
17326 VkAttachmentReference att_ref = { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17327
17328 VkSubpassDescription subpass = { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr };
17329
17330 VkRenderPassCreateInfo rpci = { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr };
17331
17332 VkRenderPass rp;
17333 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
17334 ASSERT_VK_SUCCESS(err);
17335
17336 // A compatible framebuffer.
17337 VkImageObj image(m_device);
17338 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
17339 ASSERT_TRUE(image.initialized());
17340
17341 VkImageViewCreateInfo ivci = {
17342 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
17343 nullptr,
17344 0,
17345 image.handle(),
17346 VK_IMAGE_VIEW_TYPE_2D,
17347 VK_FORMAT_R8G8B8A8_UNORM,
17348 { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
17349 VK_COMPONENT_SWIZZLE_IDENTITY },
17350 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 },
17351 };
17352 VkImageView view;
17353 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
17354 ASSERT_VK_SUCCESS(err);
17355
17356 VkFramebufferCreateInfo fci = { VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1 };
17357 VkFramebuffer fb;
17358 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
17359 ASSERT_VK_SUCCESS(err);
17360
17361 // Record a single command buffer which uses this renderpass twice. The
17362 // bug is triggered at the beginning of the second renderpass, when the
17363 // command buffer already has a layout recorded for the attachment.
17364 VkRenderPassBeginInfo rpbi = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb,{ { 0, 0 },{ 32, 32 } }, 0, nullptr };
17365 BeginCommandBuffer();
17366 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17367 vkCmdEndRenderPass(m_commandBuffer->handle());
17368 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17369
17370 m_errorMonitor->VerifyNotFound();
17371
17372 vkCmdEndRenderPass(m_commandBuffer->handle());
17373 EndCommandBuffer();
17374
17375 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17376 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17377 vkDestroyImageView(m_device->device(), view, nullptr);
17378}
17379
17380TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
17381 TEST_DESCRIPTION("This test should pass. Create a Framebuffer and "
17382 "command buffer, bind them together, then destroy "
17383 "command pool and framebuffer and verify there are no "
17384 "errors.");
17385
17386 m_errorMonitor->ExpectSuccess();
17387
17388 ASSERT_NO_FATAL_FAILURE(InitState());
17389
17390 // A renderpass with one color attachment.
17391 VkAttachmentDescription attachment = { 0,
17392 VK_FORMAT_R8G8B8A8_UNORM,
17393 VK_SAMPLE_COUNT_1_BIT,
17394 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17395 VK_ATTACHMENT_STORE_OP_STORE,
17396 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17397 VK_ATTACHMENT_STORE_OP_DONT_CARE,
17398 VK_IMAGE_LAYOUT_UNDEFINED,
17399 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17400
17401 VkAttachmentReference att_ref = { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17402
17403 VkSubpassDescription subpass = { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr };
17404
17405 VkRenderPassCreateInfo rpci = { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr };
17406
17407 VkRenderPass rp;
17408 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
17409 ASSERT_VK_SUCCESS(err);
17410
17411 // A compatible framebuffer.
17412 VkImageObj image(m_device);
17413 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
17414 ASSERT_TRUE(image.initialized());
17415
17416 VkImageViewCreateInfo ivci = {
17417 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
17418 nullptr,
17419 0,
17420 image.handle(),
17421 VK_IMAGE_VIEW_TYPE_2D,
17422 VK_FORMAT_R8G8B8A8_UNORM,
17423 { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
17424 VK_COMPONENT_SWIZZLE_IDENTITY },
17425 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 },
17426 };
17427 VkImageView view;
17428 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
17429 ASSERT_VK_SUCCESS(err);
17430
17431 VkFramebufferCreateInfo fci = { VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1 };
17432 VkFramebuffer fb;
17433 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
17434 ASSERT_VK_SUCCESS(err);
17435
17436 // Explicitly create a command buffer to bind the FB to so that we can then
17437 // destroy the command pool in order to implicitly free command buffer
17438 VkCommandPool command_pool;
17439 VkCommandPoolCreateInfo pool_create_info{};
17440 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
17441 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
17442 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
17443 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
17444
17445 VkCommandBuffer command_buffer;
17446 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
17447 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
17448 command_buffer_allocate_info.commandPool = command_pool;
17449 command_buffer_allocate_info.commandBufferCount = 1;
17450 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
17451 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
17452
17453 // Begin our cmd buffer with renderpass using our framebuffer
17454 VkRenderPassBeginInfo rpbi = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb,{ { 0, 0 },{ 32, 32 } }, 0, nullptr };
17455 VkCommandBufferBeginInfo begin_info{};
17456 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
17457 vkBeginCommandBuffer(command_buffer, &begin_info);
17458
17459 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17460 vkCmdEndRenderPass(command_buffer);
17461 vkEndCommandBuffer(command_buffer);
17462 vkDestroyImageView(m_device->device(), view, nullptr);
17463 // Destroy command pool to implicitly free command buffer
17464 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
17465 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17466 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17467 m_errorMonitor->VerifyNotFound();
17468}
17469
17470TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
17471 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass applies the layout "
17472 "transitions for the first subpass");
17473
17474 m_errorMonitor->ExpectSuccess();
17475
17476 ASSERT_NO_FATAL_FAILURE(InitState());
17477
17478 // A renderpass with one color attachment.
17479 VkAttachmentDescription attachment = { 0,
17480 VK_FORMAT_R8G8B8A8_UNORM,
17481 VK_SAMPLE_COUNT_1_BIT,
17482 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17483 VK_ATTACHMENT_STORE_OP_STORE,
17484 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17485 VK_ATTACHMENT_STORE_OP_DONT_CARE,
17486 VK_IMAGE_LAYOUT_UNDEFINED,
17487 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17488
17489 VkAttachmentReference att_ref = { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17490
17491 VkSubpassDescription subpass = { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr };
17492
17493 VkSubpassDependency dep = { 0,
17494 0,
17495 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17496 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17497 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17498 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17499 VK_DEPENDENCY_BY_REGION_BIT };
17500
17501 VkRenderPassCreateInfo rpci = { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep };
17502
17503 VkResult err;
17504 VkRenderPass rp;
17505 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
17506 ASSERT_VK_SUCCESS(err);
17507
17508 // A compatible framebuffer.
17509 VkImageObj image(m_device);
17510 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
17511 ASSERT_TRUE(image.initialized());
17512
17513 VkImageViewCreateInfo ivci = {
17514 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
17515 nullptr,
17516 0,
17517 image.handle(),
17518 VK_IMAGE_VIEW_TYPE_2D,
17519 VK_FORMAT_R8G8B8A8_UNORM,
17520 { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
17521 VK_COMPONENT_SWIZZLE_IDENTITY },
17522 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 },
17523 };
17524 VkImageView view;
17525 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
17526 ASSERT_VK_SUCCESS(err);
17527
17528 VkFramebufferCreateInfo fci = { VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1 };
17529 VkFramebuffer fb;
17530 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
17531 ASSERT_VK_SUCCESS(err);
17532
17533 // Record a single command buffer which issues a pipeline barrier w/
17534 // image memory barrier for the attachment. This detects the previously
17535 // missing tracking of the subpass layout by throwing a validation error
17536 // if it doesn't occur.
17537 VkRenderPassBeginInfo rpbi = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb,{ { 0, 0 },{ 32, 32 } }, 0, nullptr };
17538 BeginCommandBuffer();
17539 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17540
17541 VkImageMemoryBarrier imb = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
17542 nullptr,
17543 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17544 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17545 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
17546 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
17547 VK_QUEUE_FAMILY_IGNORED,
17548 VK_QUEUE_FAMILY_IGNORED,
17549 image.handle(),
17550 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 } };
17551 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17552 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
17553 &imb);
17554
17555 vkCmdEndRenderPass(m_commandBuffer->handle());
17556 m_errorMonitor->VerifyNotFound();
17557 EndCommandBuffer();
17558
17559 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17560 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17561 vkDestroyImageView(m_device->device(), view, nullptr);
17562}
17563
17564TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
17565 TEST_DESCRIPTION("Validate that when an imageView of a depth/stencil image "
17566 "is used as a depth/stencil framebuffer attachment, the "
17567 "aspectMask is ignored and both depth and stencil image "
17568 "subresources are used.");
17569
17570 VkFormatProperties format_properties;
17571 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
17572 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
17573 return;
17574 }
17575
17576 m_errorMonitor->ExpectSuccess();
17577
17578 ASSERT_NO_FATAL_FAILURE(InitState());
17579
17580 VkAttachmentDescription attachment = { 0,
17581 VK_FORMAT_D32_SFLOAT_S8_UINT,
17582 VK_SAMPLE_COUNT_1_BIT,
17583 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17584 VK_ATTACHMENT_STORE_OP_STORE,
17585 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
17586 VK_ATTACHMENT_STORE_OP_DONT_CARE,
17587 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
17588 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL };
17589
17590 VkAttachmentReference att_ref = { 0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL };
17591
17592 VkSubpassDescription subpass = { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr };
17593
17594 VkSubpassDependency dep = { 0,
17595 0,
17596 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17597 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17598 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17599 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
17600 VK_DEPENDENCY_BY_REGION_BIT};
17601
17602 VkRenderPassCreateInfo rpci = { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep };
17603
17604 VkResult err;
17605 VkRenderPass rp;
17606 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
17607 ASSERT_VK_SUCCESS(err);
17608
17609 VkImageObj image(m_device);
17610 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
17611 0x26, // usage
17612 VK_IMAGE_TILING_OPTIMAL, 0);
17613 ASSERT_TRUE(image.initialized());
17614 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
17615
17616 VkImageViewCreateInfo ivci = {
17617 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
17618 nullptr,
17619 0,
17620 image.handle(),
17621 VK_IMAGE_VIEW_TYPE_2D,
17622 VK_FORMAT_D32_SFLOAT_S8_UINT,
17623 { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A },
17624 { 0x2, 0, 1, 0, 1 },
17625 };
17626 VkImageView view;
17627 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
17628 ASSERT_VK_SUCCESS(err);
17629
17630 VkFramebufferCreateInfo fci = { VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1 };
17631 VkFramebuffer fb;
17632 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
17633 ASSERT_VK_SUCCESS(err);
17634
17635 VkRenderPassBeginInfo rpbi = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb,{ { 0, 0 },{ 32, 32 } }, 0, nullptr };
17636 BeginCommandBuffer();
17637 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17638
17639 VkImageMemoryBarrier imb = {};
17640 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17641 imb.pNext = nullptr;
17642 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
17643 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
17644 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17645 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
17646 imb.srcQueueFamilyIndex = 0;
17647 imb.dstQueueFamilyIndex = 0;
17648 imb.image = image.handle();
17649 imb.subresourceRange.aspectMask = 0x6;
17650 imb.subresourceRange.baseMipLevel = 0;
17651 imb.subresourceRange.levelCount = 0x1;
17652 imb.subresourceRange.baseArrayLayer = 0;
17653 imb.subresourceRange.layerCount = 0x1;
17654
17655 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
17656 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
17657 &imb);
17658
17659 vkCmdEndRenderPass(m_commandBuffer->handle());
17660 EndCommandBuffer();
17661 QueueCommandBuffer(false);
17662 m_errorMonitor->VerifyNotFound();
17663
17664 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17665 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17666 vkDestroyImageView(m_device->device(), view, nullptr);
17667}
17668
17669TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
17670 TEST_DESCRIPTION("Ensure that layout transitions work correctly without "
17671 "errors, when an attachment reference is "
17672 "VK_ATTACHMENT_UNUSED");
17673
17674 m_errorMonitor->ExpectSuccess();
17675
17676 ASSERT_NO_FATAL_FAILURE(InitState());
17677
17678 // A renderpass with no attachments
17679 VkAttachmentReference att_ref = { VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
17680
17681 VkSubpassDescription subpass = { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr };
17682
17683 VkRenderPassCreateInfo rpci = { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr };
17684
17685 VkRenderPass rp;
17686 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
17687 ASSERT_VK_SUCCESS(err);
17688
17689 // A compatible framebuffer.
17690 VkFramebufferCreateInfo fci = { VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1 };
17691 VkFramebuffer fb;
17692 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
17693 ASSERT_VK_SUCCESS(err);
17694
17695 // Record a command buffer which just begins and ends the renderpass. The
17696 // bug manifests in BeginRenderPass.
17697 VkRenderPassBeginInfo rpbi = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb,{ { 0, 0 },{ 32, 32 } }, 0, nullptr };
17698 BeginCommandBuffer();
17699 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
17700 vkCmdEndRenderPass(m_commandBuffer->handle());
17701 m_errorMonitor->VerifyNotFound();
17702 EndCommandBuffer();
17703
17704 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17705 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17706}
17707
17708// This is a positive test. No errors are expected.
17709TEST_F(VkPositiveLayerTest, StencilLoadOp) {
17710 TEST_DESCRIPTION("Create a stencil-only attachment with a LOAD_OP set to "
17711 "CLEAR. stencil[Load|Store]Op used to be ignored.");
17712 VkResult result = VK_SUCCESS;
17713 VkImageFormatProperties formatProps;
17714 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
17715 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
17716 &formatProps);
17717 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
17718 return;
17719 }
17720
17721 ASSERT_NO_FATAL_FAILURE(InitState());
17722 VkFormat depth_stencil_fmt = VK_FORMAT_D24_UNORM_S8_UINT;
17723 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
17724 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
17725 VkAttachmentDescription att = {};
17726 VkAttachmentReference ref = {};
17727 att.format = depth_stencil_fmt;
17728 att.samples = VK_SAMPLE_COUNT_1_BIT;
17729 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
17730 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
17731 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
17732 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
17733 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17734 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17735
17736 VkClearValue clear;
17737 clear.depthStencil.depth = 1.0;
17738 clear.depthStencil.stencil = 0;
17739 ref.attachment = 0;
17740 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17741
17742 VkSubpassDescription subpass = {};
17743 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
17744 subpass.flags = 0;
17745 subpass.inputAttachmentCount = 0;
17746 subpass.pInputAttachments = NULL;
17747 subpass.colorAttachmentCount = 0;
17748 subpass.pColorAttachments = NULL;
17749 subpass.pResolveAttachments = NULL;
17750 subpass.pDepthStencilAttachment = &ref;
17751 subpass.preserveAttachmentCount = 0;
17752 subpass.pPreserveAttachments = NULL;
17753
17754 VkRenderPass rp;
17755 VkRenderPassCreateInfo rp_info = {};
17756 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
17757 rp_info.attachmentCount = 1;
17758 rp_info.pAttachments = &att;
17759 rp_info.subpassCount = 1;
17760 rp_info.pSubpasses = &subpass;
17761 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
17762 ASSERT_VK_SUCCESS(result);
17763
17764 VkImageView *depthView = m_depthStencil->BindInfo();
17765 VkFramebufferCreateInfo fb_info = {};
17766 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
17767 fb_info.pNext = NULL;
17768 fb_info.renderPass = rp;
17769 fb_info.attachmentCount = 1;
17770 fb_info.pAttachments = depthView;
17771 fb_info.width = 100;
17772 fb_info.height = 100;
17773 fb_info.layers = 1;
17774 VkFramebuffer fb;
17775 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
17776 ASSERT_VK_SUCCESS(result);
17777
17778 VkRenderPassBeginInfo rpbinfo = {};
17779 rpbinfo.clearValueCount = 1;
17780 rpbinfo.pClearValues = &clear;
17781 rpbinfo.pNext = NULL;
17782 rpbinfo.renderPass = rp;
17783 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
17784 rpbinfo.renderArea.extent.width = 100;
17785 rpbinfo.renderArea.extent.height = 100;
17786 rpbinfo.renderArea.offset.x = 0;
17787 rpbinfo.renderArea.offset.y = 0;
17788 rpbinfo.framebuffer = fb;
17789
17790 VkFence fence = {};
17791 VkFenceCreateInfo fence_ci = {};
17792 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
17793 fence_ci.pNext = nullptr;
17794 fence_ci.flags = 0;
17795 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
17796 ASSERT_VK_SUCCESS(result);
17797
17798 m_commandBuffer->BeginCommandBuffer();
17799 m_commandBuffer->BeginRenderPass(rpbinfo);
17800 m_commandBuffer->EndRenderPass();
17801 m_commandBuffer->EndCommandBuffer();
17802 m_commandBuffer->QueueCommandBuffer(fence);
17803
17804 VkImageObj destImage(m_device);
17805 destImage.init(100, 100, depth_stencil_fmt, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17806 VK_IMAGE_TILING_OPTIMAL, 0);
17807 VkImageMemoryBarrier barrier = {};
17808 VkImageSubresourceRange range;
17809 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17810 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
17811 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
17812 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
17813 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
17814 barrier.image = m_depthStencil->handle();
17815 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
17816 range.baseMipLevel = 0;
17817 range.levelCount = 1;
17818 range.baseArrayLayer = 0;
17819 range.layerCount = 1;
17820 barrier.subresourceRange = range;
17821 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
17822 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
17823 cmdbuf.BeginCommandBuffer();
17824 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
17825 &barrier);
17826 barrier.srcAccessMask = 0;
17827 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17828 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
17829 barrier.image = destImage.handle();
17830 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
17831 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
17832 &barrier);
17833 VkImageCopy cregion;
17834 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
17835 cregion.srcSubresource.mipLevel = 0;
17836 cregion.srcSubresource.baseArrayLayer = 0;
17837 cregion.srcSubresource.layerCount = 1;
17838 cregion.srcOffset.x = 0;
17839 cregion.srcOffset.y = 0;
17840 cregion.srcOffset.z = 0;
17841 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
17842 cregion.dstSubresource.mipLevel = 0;
17843 cregion.dstSubresource.baseArrayLayer = 0;
17844 cregion.dstSubresource.layerCount = 1;
17845 cregion.dstOffset.x = 0;
17846 cregion.dstOffset.y = 0;
17847 cregion.dstOffset.z = 0;
17848 cregion.extent.width = 100;
17849 cregion.extent.height = 100;
17850 cregion.extent.depth = 1;
17851 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
17852 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
17853 cmdbuf.EndCommandBuffer();
17854
17855 VkSubmitInfo submit_info;
17856 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
17857 submit_info.pNext = NULL;
17858 submit_info.waitSemaphoreCount = 0;
17859 submit_info.pWaitSemaphores = NULL;
17860 submit_info.pWaitDstStageMask = NULL;
17861 submit_info.commandBufferCount = 1;
17862 submit_info.pCommandBuffers = &cmdbuf.handle();
17863 submit_info.signalSemaphoreCount = 0;
17864 submit_info.pSignalSemaphores = NULL;
17865
17866 m_errorMonitor->ExpectSuccess();
17867 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
17868 m_errorMonitor->VerifyNotFound();
17869
17870 vkQueueWaitIdle(m_device->m_queue);
17871 vkDestroyFence(m_device->device(), fence, nullptr);
17872 vkDestroyRenderPass(m_device->device(), rp, nullptr);
17873 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
17874}
17875
17876// This is a positive test. No errors should be generated.
17877TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
17878 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
17879
17880 m_errorMonitor->ExpectSuccess();
17881 ASSERT_NO_FATAL_FAILURE(InitState());
17882
17883 VkEvent event;
17884 VkEventCreateInfo event_create_info{};
17885 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
17886 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
17887
17888 VkCommandPool command_pool;
17889 VkCommandPoolCreateInfo pool_create_info{};
17890 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
17891 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
17892 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
17893 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
17894
17895 VkCommandBuffer command_buffer;
17896 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
17897 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
17898 command_buffer_allocate_info.commandPool = command_pool;
17899 command_buffer_allocate_info.commandBufferCount = 1;
17900 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
17901 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
17902
17903 VkQueue queue = VK_NULL_HANDLE;
17904 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
17905
17906 {
17907 VkCommandBufferBeginInfo begin_info{};
17908 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
17909 vkBeginCommandBuffer(command_buffer, &begin_info);
17910
17911 vkCmdWaitEvents(command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
17912 nullptr, 0, nullptr);
17913 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
17914 vkEndCommandBuffer(command_buffer);
17915 }
17916 {
17917 VkSubmitInfo submit_info{};
17918 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
17919 submit_info.commandBufferCount = 1;
17920 submit_info.pCommandBuffers = &command_buffer;
17921 submit_info.signalSemaphoreCount = 0;
17922 submit_info.pSignalSemaphores = nullptr;
17923 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
17924 }
17925 { vkSetEvent(m_device->device(), event); }
17926
17927 vkQueueWaitIdle(queue);
17928
17929 vkDestroyEvent(m_device->device(), event, nullptr);
17930 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
17931 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
17932
17933 m_errorMonitor->VerifyNotFound();
17934}
17935// This is a positive test. No errors should be generated.
17936TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
17937 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
17938
17939 ASSERT_NO_FATAL_FAILURE(InitState());
17940 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
17941 return;
17942
17943 m_errorMonitor->ExpectSuccess();
17944
17945 VkQueryPool query_pool;
17946 VkQueryPoolCreateInfo query_pool_create_info{};
17947 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
17948 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
17949 query_pool_create_info.queryCount = 1;
17950 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
17951
17952 VkCommandPool command_pool;
17953 VkCommandPoolCreateInfo pool_create_info{};
17954 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
17955 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
17956 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
17957 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
17958
17959 VkCommandBuffer command_buffer;
17960 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
17961 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
17962 command_buffer_allocate_info.commandPool = command_pool;
17963 command_buffer_allocate_info.commandBufferCount = 1;
17964 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
17965 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
17966
17967 VkCommandBuffer secondary_command_buffer;
17968 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
17969 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
17970
17971 VkQueue queue = VK_NULL_HANDLE;
17972 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
17973
17974 uint32_t qfi = 0;
17975 VkBufferCreateInfo buff_create_info = {};
17976 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
17977 buff_create_info.size = 1024;
17978 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
17979 buff_create_info.queueFamilyIndexCount = 1;
17980 buff_create_info.pQueueFamilyIndices = &qfi;
17981
17982 VkResult err;
17983 VkBuffer buffer;
17984 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
17985 ASSERT_VK_SUCCESS(err);
17986 VkMemoryAllocateInfo mem_alloc = {};
17987 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17988 mem_alloc.pNext = NULL;
17989 mem_alloc.allocationSize = 1024;
17990 mem_alloc.memoryTypeIndex = 0;
17991
17992 VkMemoryRequirements memReqs;
17993 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
17994 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
17995 if (!pass) {
17996 vkDestroyBuffer(m_device->device(), buffer, NULL);
17997 return;
17998 }
17999
18000 VkDeviceMemory mem;
18001 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
18002 ASSERT_VK_SUCCESS(err);
18003 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
18004 ASSERT_VK_SUCCESS(err);
18005
18006 VkCommandBufferInheritanceInfo hinfo = {};
18007 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18008 hinfo.renderPass = VK_NULL_HANDLE;
18009 hinfo.subpass = 0;
18010 hinfo.framebuffer = VK_NULL_HANDLE;
18011 hinfo.occlusionQueryEnable = VK_FALSE;
18012 hinfo.queryFlags = 0;
18013 hinfo.pipelineStatistics = 0;
18014
18015 {
18016 VkCommandBufferBeginInfo begin_info{};
18017 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18018 begin_info.pInheritanceInfo = &hinfo;
18019 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
18020
18021 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
18022 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
18023
18024 vkEndCommandBuffer(secondary_command_buffer);
18025
18026 begin_info.pInheritanceInfo = nullptr;
18027 vkBeginCommandBuffer(command_buffer, &begin_info);
18028
18029 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
18030 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
18031
18032 vkEndCommandBuffer(command_buffer);
18033 }
18034 {
18035 VkSubmitInfo submit_info{};
18036 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18037 submit_info.commandBufferCount = 1;
18038 submit_info.pCommandBuffers = &command_buffer;
18039 submit_info.signalSemaphoreCount = 0;
18040 submit_info.pSignalSemaphores = nullptr;
18041 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18042 }
18043
18044 vkQueueWaitIdle(queue);
18045
18046 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
18047 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
18048 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
18049 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18050 vkDestroyBuffer(m_device->device(), buffer, NULL);
18051 vkFreeMemory(m_device->device(), mem, NULL);
18052
18053 m_errorMonitor->VerifyNotFound();
18054}
18055
18056// This is a positive test. No errors should be generated.
18057TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
18058 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
18059
18060 ASSERT_NO_FATAL_FAILURE(InitState());
18061 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
18062 return;
18063
18064 m_errorMonitor->ExpectSuccess();
18065
18066 VkQueryPool query_pool;
18067 VkQueryPoolCreateInfo query_pool_create_info{};
18068 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
18069 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
18070 query_pool_create_info.queryCount = 1;
18071 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
18072
18073 VkCommandPool command_pool;
18074 VkCommandPoolCreateInfo pool_create_info{};
18075 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18076 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18077 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18078 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18079
18080 VkCommandBuffer command_buffer[2];
18081 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18082 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18083 command_buffer_allocate_info.commandPool = command_pool;
18084 command_buffer_allocate_info.commandBufferCount = 2;
18085 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18086 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18087
18088 VkQueue queue = VK_NULL_HANDLE;
18089 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
18090
18091 uint32_t qfi = 0;
18092 VkBufferCreateInfo buff_create_info = {};
18093 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18094 buff_create_info.size = 1024;
18095 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
18096 buff_create_info.queueFamilyIndexCount = 1;
18097 buff_create_info.pQueueFamilyIndices = &qfi;
18098
18099 VkResult err;
18100 VkBuffer buffer;
18101 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
18102 ASSERT_VK_SUCCESS(err);
18103 VkMemoryAllocateInfo mem_alloc = {};
18104 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18105 mem_alloc.pNext = NULL;
18106 mem_alloc.allocationSize = 1024;
18107 mem_alloc.memoryTypeIndex = 0;
18108
18109 VkMemoryRequirements memReqs;
18110 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
18111 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
18112 if (!pass) {
18113 vkDestroyBuffer(m_device->device(), buffer, NULL);
18114 return;
18115 }
18116
18117 VkDeviceMemory mem;
18118 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
18119 ASSERT_VK_SUCCESS(err);
18120 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
18121 ASSERT_VK_SUCCESS(err);
18122
18123 {
18124 VkCommandBufferBeginInfo begin_info{};
18125 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18126 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18127
18128 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
18129 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
18130
18131 vkEndCommandBuffer(command_buffer[0]);
18132
18133 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18134
18135 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
18136
18137 vkEndCommandBuffer(command_buffer[1]);
18138 }
18139 {
18140 VkSubmitInfo submit_info{};
18141 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18142 submit_info.commandBufferCount = 2;
18143 submit_info.pCommandBuffers = command_buffer;
18144 submit_info.signalSemaphoreCount = 0;
18145 submit_info.pSignalSemaphores = nullptr;
18146 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18147 }
18148
18149 vkQueueWaitIdle(queue);
18150
18151 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
18152 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
18153 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18154 vkDestroyBuffer(m_device->device(), buffer, NULL);
18155 vkFreeMemory(m_device->device(), mem, NULL);
18156
18157 m_errorMonitor->VerifyNotFound();
18158}
18159
Tony Barbourc46924f2016-11-04 11:49:52 -060018160TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018161 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
18162
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018163 ASSERT_NO_FATAL_FAILURE(InitState());
18164 VkEvent event;
18165 VkEventCreateInfo event_create_info{};
18166 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
18167 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
18168
18169 VkCommandPool command_pool;
18170 VkCommandPoolCreateInfo pool_create_info{};
18171 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18172 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18173 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18174 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18175
18176 VkCommandBuffer command_buffer;
18177 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18178 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18179 command_buffer_allocate_info.commandPool = command_pool;
18180 command_buffer_allocate_info.commandBufferCount = 1;
18181 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18182 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
18183
18184 VkQueue queue = VK_NULL_HANDLE;
18185 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
18186
18187 {
18188 VkCommandBufferBeginInfo begin_info{};
18189 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18190 vkBeginCommandBuffer(command_buffer, &begin_info);
18191
18192 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018193 vkEndCommandBuffer(command_buffer);
18194 }
18195 {
18196 VkSubmitInfo submit_info{};
18197 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18198 submit_info.commandBufferCount = 1;
18199 submit_info.pCommandBuffers = &command_buffer;
18200 submit_info.signalSemaphoreCount = 0;
18201 submit_info.pSignalSemaphores = nullptr;
18202 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18203 }
18204 {
18205 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is already in use by a "
18206 "command buffer.");
18207 vkSetEvent(m_device->device(), event);
18208 m_errorMonitor->VerifyFound();
18209 }
18210
18211 vkQueueWaitIdle(queue);
18212
18213 vkDestroyEvent(m_device->device(), event, nullptr);
18214 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
18215 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18216}
18217
18218// This is a positive test. No errors should be generated.
18219TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
18220 TEST_DESCRIPTION("Two command buffers with two separate fences are each "
18221 "run through a Submit & WaitForFences cycle 3 times. This "
18222 "previously revealed a bug so running this positive test "
18223 "to prevent a regression.");
18224 m_errorMonitor->ExpectSuccess();
18225
18226 ASSERT_NO_FATAL_FAILURE(InitState());
18227 VkQueue queue = VK_NULL_HANDLE;
18228 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
18229
18230 static const uint32_t NUM_OBJECTS = 2;
18231 static const uint32_t NUM_FRAMES = 3;
18232 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
18233 VkFence fences[NUM_OBJECTS] = {};
18234
18235 VkCommandPool cmd_pool;
18236 VkCommandPoolCreateInfo cmd_pool_ci = {};
18237 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18238 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
18239 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18240 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
18241 ASSERT_VK_SUCCESS(err);
18242
18243 VkCommandBufferAllocateInfo cmd_buf_info = {};
18244 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18245 cmd_buf_info.commandPool = cmd_pool;
18246 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18247 cmd_buf_info.commandBufferCount = 1;
18248
18249 VkFenceCreateInfo fence_ci = {};
18250 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18251 fence_ci.pNext = nullptr;
18252 fence_ci.flags = 0;
18253
18254 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
18255 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
18256 ASSERT_VK_SUCCESS(err);
18257 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
18258 ASSERT_VK_SUCCESS(err);
18259 }
18260
18261 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
18262 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
18263 // Create empty cmd buffer
18264 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
18265 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18266
18267 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
18268 ASSERT_VK_SUCCESS(err);
18269 err = vkEndCommandBuffer(cmd_buffers[obj]);
18270 ASSERT_VK_SUCCESS(err);
18271
18272 VkSubmitInfo submit_info = {};
18273 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18274 submit_info.commandBufferCount = 1;
18275 submit_info.pCommandBuffers = &cmd_buffers[obj];
18276 // Submit cmd buffer and wait for fence
18277 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
18278 ASSERT_VK_SUCCESS(err);
18279 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
18280 ASSERT_VK_SUCCESS(err);
18281 err = vkResetFences(m_device->device(), 1, &fences[obj]);
18282 ASSERT_VK_SUCCESS(err);
18283 }
18284 }
18285 m_errorMonitor->VerifyNotFound();
18286 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
18287 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
18288 vkDestroyFence(m_device->device(), fences[i], nullptr);
18289 }
18290}
18291// This is a positive test. No errors should be generated.
18292TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
18293
18294 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
18295 "submitted on separate queues followed by a QueueWaitIdle.");
18296
18297 ASSERT_NO_FATAL_FAILURE(InitState());
18298 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
18299 return;
18300
18301 m_errorMonitor->ExpectSuccess();
18302
18303 VkSemaphore semaphore;
18304 VkSemaphoreCreateInfo semaphore_create_info{};
18305 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
18306 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
18307
18308 VkCommandPool command_pool;
18309 VkCommandPoolCreateInfo pool_create_info{};
18310 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18311 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18312 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18313 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18314
18315 VkCommandBuffer command_buffer[2];
18316 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18317 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18318 command_buffer_allocate_info.commandPool = command_pool;
18319 command_buffer_allocate_info.commandBufferCount = 2;
18320 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18321 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18322
18323 VkQueue queue = VK_NULL_HANDLE;
18324 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
18325
18326 {
18327 VkCommandBufferBeginInfo begin_info{};
18328 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18329 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18330
18331 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
18332 nullptr, 0, nullptr, 0, nullptr);
18333
18334 VkViewport viewport{};
18335 viewport.maxDepth = 1.0f;
18336 viewport.minDepth = 0.0f;
18337 viewport.width = 512;
18338 viewport.height = 512;
18339 viewport.x = 0;
18340 viewport.y = 0;
18341 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18342 vkEndCommandBuffer(command_buffer[0]);
18343 }
18344 {
18345 VkCommandBufferBeginInfo begin_info{};
18346 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18347 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18348
18349 VkViewport viewport{};
18350 viewport.maxDepth = 1.0f;
18351 viewport.minDepth = 0.0f;
18352 viewport.width = 512;
18353 viewport.height = 512;
18354 viewport.x = 0;
18355 viewport.y = 0;
18356 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
18357 vkEndCommandBuffer(command_buffer[1]);
18358 }
18359 {
18360 VkSubmitInfo submit_info{};
18361 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18362 submit_info.commandBufferCount = 1;
18363 submit_info.pCommandBuffers = &command_buffer[0];
18364 submit_info.signalSemaphoreCount = 1;
18365 submit_info.pSignalSemaphores = &semaphore;
18366 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18367 }
18368 {
18369 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
18370 VkSubmitInfo submit_info{};
18371 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18372 submit_info.commandBufferCount = 1;
18373 submit_info.pCommandBuffers = &command_buffer[1];
18374 submit_info.waitSemaphoreCount = 1;
18375 submit_info.pWaitSemaphores = &semaphore;
18376 submit_info.pWaitDstStageMask = flags;
18377 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18378 }
18379
18380 vkQueueWaitIdle(m_device->m_queue);
18381
18382 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
18383 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
18384 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18385
18386 m_errorMonitor->VerifyNotFound();
18387}
18388
18389// This is a positive test. No errors should be generated.
18390TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
18391
18392 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
18393 "submitted on separate queues, the second having a fence"
18394 "followed by a QueueWaitIdle.");
18395
18396 ASSERT_NO_FATAL_FAILURE(InitState());
18397 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
18398 return;
18399
18400 m_errorMonitor->ExpectSuccess();
18401
18402 VkFence fence;
18403 VkFenceCreateInfo fence_create_info{};
18404 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18405 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
18406
18407 VkSemaphore semaphore;
18408 VkSemaphoreCreateInfo semaphore_create_info{};
18409 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
18410 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
18411
18412 VkCommandPool command_pool;
18413 VkCommandPoolCreateInfo pool_create_info{};
18414 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18415 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18416 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18417 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18418
18419 VkCommandBuffer command_buffer[2];
18420 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18421 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18422 command_buffer_allocate_info.commandPool = command_pool;
18423 command_buffer_allocate_info.commandBufferCount = 2;
18424 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18425 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18426
18427 VkQueue queue = VK_NULL_HANDLE;
18428 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
18429
18430 {
18431 VkCommandBufferBeginInfo begin_info{};
18432 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18433 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18434
18435 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
18436 nullptr, 0, nullptr, 0, nullptr);
18437
18438 VkViewport viewport{};
18439 viewport.maxDepth = 1.0f;
18440 viewport.minDepth = 0.0f;
18441 viewport.width = 512;
18442 viewport.height = 512;
18443 viewport.x = 0;
18444 viewport.y = 0;
18445 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18446 vkEndCommandBuffer(command_buffer[0]);
18447 }
18448 {
18449 VkCommandBufferBeginInfo begin_info{};
18450 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18451 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18452
18453 VkViewport viewport{};
18454 viewport.maxDepth = 1.0f;
18455 viewport.minDepth = 0.0f;
18456 viewport.width = 512;
18457 viewport.height = 512;
18458 viewport.x = 0;
18459 viewport.y = 0;
18460 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
18461 vkEndCommandBuffer(command_buffer[1]);
18462 }
18463 {
18464 VkSubmitInfo submit_info{};
18465 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18466 submit_info.commandBufferCount = 1;
18467 submit_info.pCommandBuffers = &command_buffer[0];
18468 submit_info.signalSemaphoreCount = 1;
18469 submit_info.pSignalSemaphores = &semaphore;
18470 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18471 }
18472 {
18473 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
18474 VkSubmitInfo submit_info{};
18475 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18476 submit_info.commandBufferCount = 1;
18477 submit_info.pCommandBuffers = &command_buffer[1];
18478 submit_info.waitSemaphoreCount = 1;
18479 submit_info.pWaitSemaphores = &semaphore;
18480 submit_info.pWaitDstStageMask = flags;
18481 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
18482 }
18483
18484 vkQueueWaitIdle(m_device->m_queue);
18485
18486 vkDestroyFence(m_device->device(), fence, nullptr);
18487 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
18488 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
18489 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18490
18491 m_errorMonitor->VerifyNotFound();
18492}
18493
18494// This is a positive test. No errors should be generated.
18495TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
18496
18497 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
18498 "submitted on separate queues, the second having a fence"
18499 "followed by two consecutive WaitForFences calls on the same fence.");
18500
18501 ASSERT_NO_FATAL_FAILURE(InitState());
18502 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
18503 return;
18504
18505 m_errorMonitor->ExpectSuccess();
18506
18507 VkFence fence;
18508 VkFenceCreateInfo fence_create_info{};
18509 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18510 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
18511
18512 VkSemaphore semaphore;
18513 VkSemaphoreCreateInfo semaphore_create_info{};
18514 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
18515 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
18516
18517 VkCommandPool command_pool;
18518 VkCommandPoolCreateInfo pool_create_info{};
18519 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18520 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18521 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18522 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18523
18524 VkCommandBuffer command_buffer[2];
18525 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18526 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18527 command_buffer_allocate_info.commandPool = command_pool;
18528 command_buffer_allocate_info.commandBufferCount = 2;
18529 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18530 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18531
18532 VkQueue queue = VK_NULL_HANDLE;
18533 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
18534
18535 {
18536 VkCommandBufferBeginInfo begin_info{};
18537 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18538 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18539
18540 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
18541 nullptr, 0, nullptr, 0, nullptr);
18542
18543 VkViewport viewport{};
18544 viewport.maxDepth = 1.0f;
18545 viewport.minDepth = 0.0f;
18546 viewport.width = 512;
18547 viewport.height = 512;
18548 viewport.x = 0;
18549 viewport.y = 0;
18550 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18551 vkEndCommandBuffer(command_buffer[0]);
18552 }
18553 {
18554 VkCommandBufferBeginInfo begin_info{};
18555 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18556 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18557
18558 VkViewport viewport{};
18559 viewport.maxDepth = 1.0f;
18560 viewport.minDepth = 0.0f;
18561 viewport.width = 512;
18562 viewport.height = 512;
18563 viewport.x = 0;
18564 viewport.y = 0;
18565 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
18566 vkEndCommandBuffer(command_buffer[1]);
18567 }
18568 {
18569 VkSubmitInfo submit_info{};
18570 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18571 submit_info.commandBufferCount = 1;
18572 submit_info.pCommandBuffers = &command_buffer[0];
18573 submit_info.signalSemaphoreCount = 1;
18574 submit_info.pSignalSemaphores = &semaphore;
18575 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18576 }
18577 {
18578 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
18579 VkSubmitInfo submit_info{};
18580 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18581 submit_info.commandBufferCount = 1;
18582 submit_info.pCommandBuffers = &command_buffer[1];
18583 submit_info.waitSemaphoreCount = 1;
18584 submit_info.pWaitSemaphores = &semaphore;
18585 submit_info.pWaitDstStageMask = flags;
18586 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
18587 }
18588
18589 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18590 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18591
18592 vkDestroyFence(m_device->device(), fence, nullptr);
18593 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
18594 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
18595 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18596
18597 m_errorMonitor->VerifyNotFound();
18598}
18599
18600TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
18601
18602 ASSERT_NO_FATAL_FAILURE(InitState());
18603 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
18604 printf("Test requires two queues, skipping\n");
18605 return;
18606 }
18607
18608 VkResult err;
18609
18610 m_errorMonitor->ExpectSuccess();
18611
18612 VkQueue q0 = m_device->m_queue;
18613 VkQueue q1 = nullptr;
18614 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
18615 ASSERT_NE(q1, nullptr);
18616
18617 // An (empty) command buffer. We must have work in the first submission --
18618 // the layer treats unfenced work differently from fenced work.
18619 VkCommandPoolCreateInfo cpci = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0 };
18620 VkCommandPool pool;
18621 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
18622 ASSERT_VK_SUCCESS(err);
18623 VkCommandBufferAllocateInfo cbai = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
18624 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1 };
18625 VkCommandBuffer cb;
18626 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
18627 ASSERT_VK_SUCCESS(err);
18628 VkCommandBufferBeginInfo cbbi = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr };
18629 err = vkBeginCommandBuffer(cb, &cbbi);
18630 ASSERT_VK_SUCCESS(err);
18631 err = vkEndCommandBuffer(cb);
18632 ASSERT_VK_SUCCESS(err);
18633
18634 // A semaphore
18635 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
18636 VkSemaphore s;
18637 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
18638 ASSERT_VK_SUCCESS(err);
18639
18640 // First submission, to q0
18641 VkSubmitInfo s0 = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s };
18642
18643 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
18644 ASSERT_VK_SUCCESS(err);
18645
18646 // Second submission, to q1, waiting on s
18647 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
18648 VkSubmitInfo s1 = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr };
18649
18650 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
18651 ASSERT_VK_SUCCESS(err);
18652
18653 // Wait for q0 idle
18654 err = vkQueueWaitIdle(q0);
18655 ASSERT_VK_SUCCESS(err);
18656
18657 // Command buffer should have been completed (it was on q0); reset the pool.
18658 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
18659
18660 m_errorMonitor->VerifyNotFound();
18661
18662 // Force device completely idle and clean up resources
18663 vkDeviceWaitIdle(m_device->device());
18664 vkDestroyCommandPool(m_device->device(), pool, nullptr);
18665 vkDestroySemaphore(m_device->device(), s, nullptr);
18666}
18667
18668// This is a positive test. No errors should be generated.
18669TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
18670
18671 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
18672 "submitted on separate queues, the second having a fence, "
18673 "followed by a WaitForFences call.");
18674
18675 ASSERT_NO_FATAL_FAILURE(InitState());
18676 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
18677 return;
18678
18679 m_errorMonitor->ExpectSuccess();
18680
18681 ASSERT_NO_FATAL_FAILURE(InitState());
18682 VkFence fence;
18683 VkFenceCreateInfo fence_create_info{};
18684 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18685 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
18686
18687 VkSemaphore semaphore;
18688 VkSemaphoreCreateInfo semaphore_create_info{};
18689 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
18690 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
18691
18692 VkCommandPool command_pool;
18693 VkCommandPoolCreateInfo pool_create_info{};
18694 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18695 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18696 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18697 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18698
18699 VkCommandBuffer command_buffer[2];
18700 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18701 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18702 command_buffer_allocate_info.commandPool = command_pool;
18703 command_buffer_allocate_info.commandBufferCount = 2;
18704 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18705 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18706
18707 VkQueue queue = VK_NULL_HANDLE;
18708 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
18709
18710 {
18711 VkCommandBufferBeginInfo begin_info{};
18712 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18713 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18714
18715 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
18716 nullptr, 0, nullptr, 0, nullptr);
18717
18718 VkViewport viewport{};
18719 viewport.maxDepth = 1.0f;
18720 viewport.minDepth = 0.0f;
18721 viewport.width = 512;
18722 viewport.height = 512;
18723 viewport.x = 0;
18724 viewport.y = 0;
18725 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18726 vkEndCommandBuffer(command_buffer[0]);
18727 }
18728 {
18729 VkCommandBufferBeginInfo begin_info{};
18730 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18731 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18732
18733 VkViewport viewport{};
18734 viewport.maxDepth = 1.0f;
18735 viewport.minDepth = 0.0f;
18736 viewport.width = 512;
18737 viewport.height = 512;
18738 viewport.x = 0;
18739 viewport.y = 0;
18740 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
18741 vkEndCommandBuffer(command_buffer[1]);
18742 }
18743 {
18744 VkSubmitInfo submit_info{};
18745 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18746 submit_info.commandBufferCount = 1;
18747 submit_info.pCommandBuffers = &command_buffer[0];
18748 submit_info.signalSemaphoreCount = 1;
18749 submit_info.pSignalSemaphores = &semaphore;
18750 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
18751 }
18752 {
18753 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
18754 VkSubmitInfo submit_info{};
18755 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18756 submit_info.commandBufferCount = 1;
18757 submit_info.pCommandBuffers = &command_buffer[1];
18758 submit_info.waitSemaphoreCount = 1;
18759 submit_info.pWaitSemaphores = &semaphore;
18760 submit_info.pWaitDstStageMask = flags;
18761 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
18762 }
18763
18764 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18765
18766 vkDestroyFence(m_device->device(), fence, nullptr);
18767 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
18768 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
18769 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18770
18771 m_errorMonitor->VerifyNotFound();
18772}
18773
18774// This is a positive test. No errors should be generated.
18775TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
18776
18777 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
18778 "on the same queue, sharing a signal/wait semaphore, the "
18779 "second having a fence, "
18780 "followed by a WaitForFences call.");
18781
18782 m_errorMonitor->ExpectSuccess();
18783
18784 ASSERT_NO_FATAL_FAILURE(InitState());
18785 VkFence fence;
18786 VkFenceCreateInfo fence_create_info{};
18787 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18788 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
18789
18790 VkSemaphore semaphore;
18791 VkSemaphoreCreateInfo semaphore_create_info{};
18792 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
18793 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
18794
18795 VkCommandPool command_pool;
18796 VkCommandPoolCreateInfo pool_create_info{};
18797 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18798 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18799 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18800 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18801
18802 VkCommandBuffer command_buffer[2];
18803 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18804 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18805 command_buffer_allocate_info.commandPool = command_pool;
18806 command_buffer_allocate_info.commandBufferCount = 2;
18807 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18808 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18809
18810 {
18811 VkCommandBufferBeginInfo begin_info{};
18812 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18813 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18814
18815 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
18816 nullptr, 0, nullptr, 0, nullptr);
18817
18818 VkViewport viewport{};
18819 viewport.maxDepth = 1.0f;
18820 viewport.minDepth = 0.0f;
18821 viewport.width = 512;
18822 viewport.height = 512;
18823 viewport.x = 0;
18824 viewport.y = 0;
18825 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18826 vkEndCommandBuffer(command_buffer[0]);
18827 }
18828 {
18829 VkCommandBufferBeginInfo begin_info{};
18830 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18831 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18832
18833 VkViewport viewport{};
18834 viewport.maxDepth = 1.0f;
18835 viewport.minDepth = 0.0f;
18836 viewport.width = 512;
18837 viewport.height = 512;
18838 viewport.x = 0;
18839 viewport.y = 0;
18840 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
18841 vkEndCommandBuffer(command_buffer[1]);
18842 }
18843 {
18844 VkSubmitInfo submit_info{};
18845 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18846 submit_info.commandBufferCount = 1;
18847 submit_info.pCommandBuffers = &command_buffer[0];
18848 submit_info.signalSemaphoreCount = 1;
18849 submit_info.pSignalSemaphores = &semaphore;
18850 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18851 }
18852 {
18853 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
18854 VkSubmitInfo submit_info{};
18855 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18856 submit_info.commandBufferCount = 1;
18857 submit_info.pCommandBuffers = &command_buffer[1];
18858 submit_info.waitSemaphoreCount = 1;
18859 submit_info.pWaitSemaphores = &semaphore;
18860 submit_info.pWaitDstStageMask = flags;
18861 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
18862 }
18863
18864 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18865
18866 vkDestroyFence(m_device->device(), fence, nullptr);
18867 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
18868 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
18869 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18870
18871 m_errorMonitor->VerifyNotFound();
18872}
18873
18874// This is a positive test. No errors should be generated.
18875TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
18876
18877 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
18878 "on the same queue, no fences, followed by a third QueueSubmit with NO "
18879 "SubmitInfos but with a fence, followed by a WaitForFences call.");
18880
18881 m_errorMonitor->ExpectSuccess();
18882
18883 ASSERT_NO_FATAL_FAILURE(InitState());
18884 VkFence fence;
18885 VkFenceCreateInfo fence_create_info{};
18886 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18887 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
18888
18889 VkCommandPool command_pool;
18890 VkCommandPoolCreateInfo pool_create_info{};
18891 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18892 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18893 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18894 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18895
18896 VkCommandBuffer command_buffer[2];
18897 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18898 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18899 command_buffer_allocate_info.commandPool = command_pool;
18900 command_buffer_allocate_info.commandBufferCount = 2;
18901 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18902 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18903
18904 {
18905 VkCommandBufferBeginInfo begin_info{};
18906 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18907 vkBeginCommandBuffer(command_buffer[0], &begin_info);
18908
18909 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
18910 nullptr, 0, nullptr, 0, nullptr);
18911
18912 VkViewport viewport{};
18913 viewport.maxDepth = 1.0f;
18914 viewport.minDepth = 0.0f;
18915 viewport.width = 512;
18916 viewport.height = 512;
18917 viewport.x = 0;
18918 viewport.y = 0;
18919 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
18920 vkEndCommandBuffer(command_buffer[0]);
18921 }
18922 {
18923 VkCommandBufferBeginInfo begin_info{};
18924 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18925 vkBeginCommandBuffer(command_buffer[1], &begin_info);
18926
18927 VkViewport viewport{};
18928 viewport.maxDepth = 1.0f;
18929 viewport.minDepth = 0.0f;
18930 viewport.width = 512;
18931 viewport.height = 512;
18932 viewport.x = 0;
18933 viewport.y = 0;
18934 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
18935 vkEndCommandBuffer(command_buffer[1]);
18936 }
18937 {
18938 VkSubmitInfo submit_info{};
18939 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18940 submit_info.commandBufferCount = 1;
18941 submit_info.pCommandBuffers = &command_buffer[0];
18942 submit_info.signalSemaphoreCount = 0;
18943 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
18944 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18945 }
18946 {
18947 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
18948 VkSubmitInfo submit_info{};
18949 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18950 submit_info.commandBufferCount = 1;
18951 submit_info.pCommandBuffers = &command_buffer[1];
18952 submit_info.waitSemaphoreCount = 0;
18953 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
18954 submit_info.pWaitDstStageMask = flags;
18955 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18956 }
18957
18958 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
18959
18960 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
18961 ASSERT_VK_SUCCESS(err);
18962
18963 vkDestroyFence(m_device->device(), fence, nullptr);
18964 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
18965 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18966
18967 m_errorMonitor->VerifyNotFound();
18968}
18969
18970// This is a positive test. No errors should be generated.
18971TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
18972
18973 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
18974 "on the same queue, the second having a fence, followed "
18975 "by a WaitForFences call.");
18976
18977 m_errorMonitor->ExpectSuccess();
18978
18979 ASSERT_NO_FATAL_FAILURE(InitState());
18980 VkFence fence;
18981 VkFenceCreateInfo fence_create_info{};
18982 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
18983 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
18984
18985 VkCommandPool command_pool;
18986 VkCommandPoolCreateInfo pool_create_info{};
18987 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18988 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18989 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18990 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18991
18992 VkCommandBuffer command_buffer[2];
18993 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18994 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18995 command_buffer_allocate_info.commandPool = command_pool;
18996 command_buffer_allocate_info.commandBufferCount = 2;
18997 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18998 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
18999
19000 {
19001 VkCommandBufferBeginInfo begin_info{};
19002 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19003 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19004
19005 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
19006 nullptr, 0, nullptr, 0, nullptr);
19007
19008 VkViewport viewport{};
19009 viewport.maxDepth = 1.0f;
19010 viewport.minDepth = 0.0f;
19011 viewport.width = 512;
19012 viewport.height = 512;
19013 viewport.x = 0;
19014 viewport.y = 0;
19015 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19016 vkEndCommandBuffer(command_buffer[0]);
19017 }
19018 {
19019 VkCommandBufferBeginInfo begin_info{};
19020 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19021 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19022
19023 VkViewport viewport{};
19024 viewport.maxDepth = 1.0f;
19025 viewport.minDepth = 0.0f;
19026 viewport.width = 512;
19027 viewport.height = 512;
19028 viewport.x = 0;
19029 viewport.y = 0;
19030 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19031 vkEndCommandBuffer(command_buffer[1]);
19032 }
19033 {
19034 VkSubmitInfo submit_info{};
19035 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19036 submit_info.commandBufferCount = 1;
19037 submit_info.pCommandBuffers = &command_buffer[0];
19038 submit_info.signalSemaphoreCount = 0;
19039 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
19040 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19041 }
19042 {
19043 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
19044 VkSubmitInfo submit_info{};
19045 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19046 submit_info.commandBufferCount = 1;
19047 submit_info.pCommandBuffers = &command_buffer[1];
19048 submit_info.waitSemaphoreCount = 0;
19049 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
19050 submit_info.pWaitDstStageMask = flags;
19051 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
19052 }
19053
19054 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19055
19056 vkDestroyFence(m_device->device(), fence, nullptr);
19057 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19058 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19059
19060 m_errorMonitor->VerifyNotFound();
19061}
19062
19063// This is a positive test. No errors should be generated.
19064TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
19065
19066 TEST_DESCRIPTION("Two command buffers each in a separate SubmitInfo sent in a single "
19067 "QueueSubmit call followed by a WaitForFences call.");
19068 ASSERT_NO_FATAL_FAILURE(InitState());
19069
19070 m_errorMonitor->ExpectSuccess();
19071
19072 VkFence fence;
19073 VkFenceCreateInfo fence_create_info{};
19074 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19075 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
19076
19077 VkSemaphore semaphore;
19078 VkSemaphoreCreateInfo semaphore_create_info{};
19079 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19080 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
19081
19082 VkCommandPool command_pool;
19083 VkCommandPoolCreateInfo pool_create_info{};
19084 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19085 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19086 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19087 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19088
19089 VkCommandBuffer command_buffer[2];
19090 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19091 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19092 command_buffer_allocate_info.commandPool = command_pool;
19093 command_buffer_allocate_info.commandBufferCount = 2;
19094 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19095 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
19096
19097 {
19098 VkCommandBufferBeginInfo begin_info{};
19099 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19100 vkBeginCommandBuffer(command_buffer[0], &begin_info);
19101
19102 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
19103 nullptr, 0, nullptr, 0, nullptr);
19104
19105 VkViewport viewport{};
19106 viewport.maxDepth = 1.0f;
19107 viewport.minDepth = 0.0f;
19108 viewport.width = 512;
19109 viewport.height = 512;
19110 viewport.x = 0;
19111 viewport.y = 0;
19112 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
19113 vkEndCommandBuffer(command_buffer[0]);
19114 }
19115 {
19116 VkCommandBufferBeginInfo begin_info{};
19117 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19118 vkBeginCommandBuffer(command_buffer[1], &begin_info);
19119
19120 VkViewport viewport{};
19121 viewport.maxDepth = 1.0f;
19122 viewport.minDepth = 0.0f;
19123 viewport.width = 512;
19124 viewport.height = 512;
19125 viewport.x = 0;
19126 viewport.y = 0;
19127 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
19128 vkEndCommandBuffer(command_buffer[1]);
19129 }
19130 {
19131 VkSubmitInfo submit_info[2];
19132 VkPipelineStageFlags flags[]{ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT };
19133
19134 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19135 submit_info[0].pNext = NULL;
19136 submit_info[0].commandBufferCount = 1;
19137 submit_info[0].pCommandBuffers = &command_buffer[0];
19138 submit_info[0].signalSemaphoreCount = 1;
19139 submit_info[0].pSignalSemaphores = &semaphore;
19140 submit_info[0].waitSemaphoreCount = 0;
19141 submit_info[0].pWaitSemaphores = NULL;
19142 submit_info[0].pWaitDstStageMask = 0;
19143
19144 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19145 submit_info[1].pNext = NULL;
19146 submit_info[1].commandBufferCount = 1;
19147 submit_info[1].pCommandBuffers = &command_buffer[1];
19148 submit_info[1].waitSemaphoreCount = 1;
19149 submit_info[1].pWaitSemaphores = &semaphore;
19150 submit_info[1].pWaitDstStageMask = flags;
19151 submit_info[1].signalSemaphoreCount = 0;
19152 submit_info[1].pSignalSemaphores = NULL;
19153 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
19154 }
19155
19156 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19157
19158 vkDestroyFence(m_device->device(), fence, nullptr);
19159 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
19160 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19161 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
19162
19163 m_errorMonitor->VerifyNotFound();
19164}
19165
19166TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
19167 m_errorMonitor->ExpectSuccess();
19168
19169 ASSERT_NO_FATAL_FAILURE(InitState());
19170 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19171
19172 BeginCommandBuffer(); // Framework implicitly begins the renderpass.
19173 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // End implicit.
19174
19175 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
19176 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
19177 m_errorMonitor->VerifyNotFound();
19178 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
19179 m_errorMonitor->VerifyNotFound();
19180 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
19181 m_errorMonitor->VerifyNotFound();
19182
19183 m_commandBuffer->EndCommandBuffer();
19184 m_errorMonitor->VerifyNotFound();
19185}
19186
19187TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
19188 TEST_DESCRIPTION("Positive test where we create a renderpass with an "
19189 "attachment that uses LOAD_OP_CLEAR, the first subpass "
19190 "has a valid layout, and a second subpass then uses a "
19191 "valid *READ_ONLY* layout.");
19192 m_errorMonitor->ExpectSuccess();
19193 ASSERT_NO_FATAL_FAILURE(InitState());
19194
19195 VkAttachmentReference attach[2] = {};
19196 attach[0].attachment = 0;
19197 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19198 attach[1].attachment = 0;
19199 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
19200 VkSubpassDescription subpasses[2] = {};
19201 // First subpass clears DS attach on load
19202 subpasses[0].pDepthStencilAttachment = &attach[0];
19203 // 2nd subpass reads in DS as input attachment
19204 subpasses[1].inputAttachmentCount = 1;
19205 subpasses[1].pInputAttachments = &attach[1];
19206 VkAttachmentDescription attach_desc = {};
19207 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
19208 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
19209 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
19210 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
19211 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
19212 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
19213 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19214 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
19215 VkRenderPassCreateInfo rpci = {};
19216 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
19217 rpci.attachmentCount = 1;
19218 rpci.pAttachments = &attach_desc;
19219 rpci.subpassCount = 2;
19220 rpci.pSubpasses = subpasses;
19221
19222 // Now create RenderPass and verify no errors
19223 VkRenderPass rp;
19224 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
19225 m_errorMonitor->VerifyNotFound();
19226
19227 vkDestroyRenderPass(m_device->device(), rp, NULL);
19228}
19229
19230TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
19231 TEST_DESCRIPTION("Test that pipeline validation accepts matrices passed "
19232 "as vertex attributes");
19233 m_errorMonitor->ExpectSuccess();
19234
19235 ASSERT_NO_FATAL_FAILURE(InitState());
19236 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19237
19238 VkVertexInputBindingDescription input_binding;
19239 memset(&input_binding, 0, sizeof(input_binding));
19240
19241 VkVertexInputAttributeDescription input_attribs[2];
19242 memset(input_attribs, 0, sizeof(input_attribs));
19243
19244 for (int i = 0; i < 2; i++) {
19245 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
19246 input_attribs[i].location = i;
19247 }
19248
19249 char const *vsSource = "#version 450\n"
19250 "\n"
19251 "layout(location=0) in mat2x4 x;\n"
19252 "out gl_PerVertex {\n"
19253 " vec4 gl_Position;\n"
19254 "};\n"
19255 "void main(){\n"
19256 " gl_Position = x[0] + x[1];\n"
19257 "}\n";
19258 char const *fsSource = "#version 450\n"
19259 "\n"
19260 "layout(location=0) out vec4 color;\n"
19261 "void main(){\n"
19262 " color = vec4(1);\n"
19263 "}\n";
19264
19265 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19266 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19267
19268 VkPipelineObj pipe(m_device);
19269 pipe.AddColorAttachment();
19270 pipe.AddShader(&vs);
19271 pipe.AddShader(&fs);
19272
19273 pipe.AddVertexInputBindings(&input_binding, 1);
19274 pipe.AddVertexInputAttribs(input_attribs, 2);
19275
19276 VkDescriptorSetObj descriptorSet(m_device);
19277 descriptorSet.AppendDummy();
19278 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19279
19280 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19281
19282 /* expect success */
19283 m_errorMonitor->VerifyNotFound();
19284}
19285
19286TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
19287 m_errorMonitor->ExpectSuccess();
19288
19289 ASSERT_NO_FATAL_FAILURE(InitState());
19290 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19291
19292 VkVertexInputBindingDescription input_binding;
19293 memset(&input_binding, 0, sizeof(input_binding));
19294
19295 VkVertexInputAttributeDescription input_attribs[2];
19296 memset(input_attribs, 0, sizeof(input_attribs));
19297
19298 for (int i = 0; i < 2; i++) {
19299 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
19300 input_attribs[i].location = i;
19301 }
19302
19303 char const *vsSource = "#version 450\n"
19304 "\n"
19305 "layout(location=0) in vec4 x[2];\n"
19306 "out gl_PerVertex {\n"
19307 " vec4 gl_Position;\n"
19308 "};\n"
19309 "void main(){\n"
19310 " gl_Position = x[0] + x[1];\n"
19311 "}\n";
19312 char const *fsSource = "#version 450\n"
19313 "\n"
19314 "layout(location=0) out vec4 color;\n"
19315 "void main(){\n"
19316 " color = vec4(1);\n"
19317 "}\n";
19318
19319 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19320 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19321
19322 VkPipelineObj pipe(m_device);
19323 pipe.AddColorAttachment();
19324 pipe.AddShader(&vs);
19325 pipe.AddShader(&fs);
19326
19327 pipe.AddVertexInputBindings(&input_binding, 1);
19328 pipe.AddVertexInputAttribs(input_attribs, 2);
19329
19330 VkDescriptorSetObj descriptorSet(m_device);
19331 descriptorSet.AppendDummy();
19332 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19333
19334 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19335
19336 m_errorMonitor->VerifyNotFound();
19337}
19338
19339TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
19340 TEST_DESCRIPTION("Test that pipeline validation accepts consuming a vertex attribute "
19341 "through multiple vertex shader inputs, each consuming a different "
19342 "subset of the components.");
19343 m_errorMonitor->ExpectSuccess();
19344
19345 ASSERT_NO_FATAL_FAILURE(InitState());
19346 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19347
19348 VkVertexInputBindingDescription input_binding;
19349 memset(&input_binding, 0, sizeof(input_binding));
19350
19351 VkVertexInputAttributeDescription input_attribs[3];
19352 memset(input_attribs, 0, sizeof(input_attribs));
19353
19354 for (int i = 0; i < 3; i++) {
19355 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
19356 input_attribs[i].location = i;
19357 }
19358
19359 char const *vsSource = "#version 450\n"
19360 "\n"
19361 "layout(location=0) in vec4 x;\n"
19362 "layout(location=1) in vec3 y1;\n"
19363 "layout(location=1, component=3) in float y2;\n"
19364 "layout(location=2) in vec4 z;\n"
19365 "out gl_PerVertex {\n"
19366 " vec4 gl_Position;\n"
19367 "};\n"
19368 "void main(){\n"
19369 " gl_Position = x + vec4(y1, y2) + z;\n"
19370 "}\n";
19371 char const *fsSource = "#version 450\n"
19372 "\n"
19373 "layout(location=0) out vec4 color;\n"
19374 "void main(){\n"
19375 " color = vec4(1);\n"
19376 "}\n";
19377
19378 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19379 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19380
19381 VkPipelineObj pipe(m_device);
19382 pipe.AddColorAttachment();
19383 pipe.AddShader(&vs);
19384 pipe.AddShader(&fs);
19385
19386 pipe.AddVertexInputBindings(&input_binding, 1);
19387 pipe.AddVertexInputAttribs(input_attribs, 3);
19388
19389 VkDescriptorSetObj descriptorSet(m_device);
19390 descriptorSet.AppendDummy();
19391 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19392
19393 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19394
19395 m_errorMonitor->VerifyNotFound();
19396}
19397
19398TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
19399 m_errorMonitor->ExpectSuccess();
19400
19401 ASSERT_NO_FATAL_FAILURE(InitState());
19402 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19403
19404 char const *vsSource = "#version 450\n"
19405 "out gl_PerVertex {\n"
19406 " vec4 gl_Position;\n"
19407 "};\n"
19408 "void main(){\n"
19409 " gl_Position = vec4(0);\n"
19410 "}\n";
19411 char const *fsSource = "#version 450\n"
19412 "\n"
19413 "layout(location=0) out vec4 color;\n"
19414 "void main(){\n"
19415 " color = vec4(1);\n"
19416 "}\n";
19417
19418 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19419 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19420
19421 VkPipelineObj pipe(m_device);
19422 pipe.AddColorAttachment();
19423 pipe.AddShader(&vs);
19424 pipe.AddShader(&fs);
19425
19426 VkDescriptorSetObj descriptorSet(m_device);
19427 descriptorSet.AppendDummy();
19428 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19429
19430 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19431
19432 m_errorMonitor->VerifyNotFound();
19433}
19434
19435TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
19436 TEST_DESCRIPTION("Test that pipeline validation accepts the relaxed type matching rules "
19437 "set out in 14.1.3: fundamental type must match, and producer side must "
19438 "have at least as many components");
19439 m_errorMonitor->ExpectSuccess();
19440
19441 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
19442
19443 ASSERT_NO_FATAL_FAILURE(InitState());
19444 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19445
19446 char const *vsSource = "#version 450\n"
19447 "out gl_PerVertex {\n"
19448 " vec4 gl_Position;\n"
19449 "};\n"
19450 "layout(location=0) out vec3 x;\n"
19451 "layout(location=1) out ivec3 y;\n"
19452 "layout(location=2) out vec3 z;\n"
19453 "void main(){\n"
19454 " gl_Position = vec4(0);\n"
19455 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
19456 "}\n";
19457 char const *fsSource = "#version 450\n"
19458 "\n"
19459 "layout(location=0) out vec4 color;\n"
19460 "layout(location=0) in float x;\n"
19461 "layout(location=1) flat in int y;\n"
19462 "layout(location=2) in vec2 z;\n"
19463 "void main(){\n"
19464 " color = vec4(1 + x + y + z.x);\n"
19465 "}\n";
19466
19467 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19468 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19469
19470 VkPipelineObj pipe(m_device);
19471 pipe.AddColorAttachment();
19472 pipe.AddShader(&vs);
19473 pipe.AddShader(&fs);
19474
19475 VkDescriptorSetObj descriptorSet(m_device);
19476 descriptorSet.AppendDummy();
19477 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19478
19479 VkResult err = VK_SUCCESS;
19480 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19481 ASSERT_VK_SUCCESS(err);
19482
19483 m_errorMonitor->VerifyNotFound();
19484}
19485
19486TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
19487 TEST_DESCRIPTION("Test that pipeline validation accepts per-vertex variables "
19488 "passed between the TCS and TES stages");
19489 m_errorMonitor->ExpectSuccess();
19490
19491 ASSERT_NO_FATAL_FAILURE(InitState());
19492 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19493
19494 if (!m_device->phy().features().tessellationShader) {
19495 printf("Device does not support tessellation shaders; skipped.\n");
19496 return;
19497 }
19498
19499 char const *vsSource = "#version 450\n"
19500 "void main(){}\n";
19501 char const *tcsSource = "#version 450\n"
19502 "layout(location=0) out int x[];\n"
19503 "layout(vertices=3) out;\n"
19504 "void main(){\n"
19505 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
19506 " gl_TessLevelInner[0] = 1;\n"
19507 " x[gl_InvocationID] = gl_InvocationID;\n"
19508 "}\n";
19509 char const *tesSource = "#version 450\n"
19510 "layout(triangles, equal_spacing, cw) in;\n"
19511 "layout(location=0) in int x[];\n"
19512 "out gl_PerVertex { vec4 gl_Position; };\n"
19513 "void main(){\n"
19514 " gl_Position.xyz = gl_TessCoord;\n"
19515 " gl_Position.w = x[0] + x[1] + x[2];\n"
19516 "}\n";
19517 char const *fsSource = "#version 450\n"
19518 "layout(location=0) out vec4 color;\n"
19519 "void main(){\n"
19520 " color = vec4(1);\n"
19521 "}\n";
19522
19523 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19524 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
19525 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
19526 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19527
19528 VkPipelineInputAssemblyStateCreateInfo iasci{ VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
19529 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE };
19530
19531 VkPipelineTessellationStateCreateInfo tsci{ VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3 };
19532
19533 VkPipelineObj pipe(m_device);
19534 pipe.SetInputAssembly(&iasci);
19535 pipe.SetTessellation(&tsci);
19536 pipe.AddColorAttachment();
19537 pipe.AddShader(&vs);
19538 pipe.AddShader(&tcs);
19539 pipe.AddShader(&tes);
19540 pipe.AddShader(&fs);
19541
19542 VkDescriptorSetObj descriptorSet(m_device);
19543 descriptorSet.AppendDummy();
19544 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19545
19546 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19547
19548 m_errorMonitor->VerifyNotFound();
19549}
19550
19551TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
19552 TEST_DESCRIPTION("Test that pipeline validation accepts a user-defined "
19553 "interface block passed into the geometry shader. This "
19554 "is interesting because the 'extra' array level is not "
19555 "present on the member type, but on the block instance.");
19556 m_errorMonitor->ExpectSuccess();
19557
19558 ASSERT_NO_FATAL_FAILURE(InitState());
19559 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19560
19561 if (!m_device->phy().features().geometryShader) {
19562 printf("Device does not support geometry shaders; skipped.\n");
19563 return;
19564 }
19565
19566 char const *vsSource = "#version 450\n"
19567 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
19568 "void main(){\n"
19569 " vs_out.x = vec4(1);\n"
19570 "}\n";
19571 char const *gsSource = "#version 450\n"
19572 "layout(triangles) in;\n"
19573 "layout(triangle_strip, max_vertices=3) out;\n"
19574 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
19575 "out gl_PerVertex { vec4 gl_Position; };\n"
19576 "void main() {\n"
19577 " gl_Position = gs_in[0].x;\n"
19578 " EmitVertex();\n"
19579 "}\n";
19580 char const *fsSource = "#version 450\n"
19581 "layout(location=0) out vec4 color;\n"
19582 "void main(){\n"
19583 " color = vec4(1);\n"
19584 "}\n";
19585
19586 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19587 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
19588 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19589
19590 VkPipelineObj pipe(m_device);
19591 pipe.AddColorAttachment();
19592 pipe.AddShader(&vs);
19593 pipe.AddShader(&gs);
19594 pipe.AddShader(&fs);
19595
19596 VkDescriptorSetObj descriptorSet(m_device);
19597 descriptorSet.AppendDummy();
19598 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19599
19600 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19601
19602 m_errorMonitor->VerifyNotFound();
19603}
19604
19605TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
19606 TEST_DESCRIPTION("Test that pipeline validation accepts basic use of 64bit vertex "
19607 "attributes. This is interesting because they consume multiple "
19608 "locations.");
19609 m_errorMonitor->ExpectSuccess();
19610
19611 ASSERT_NO_FATAL_FAILURE(InitState());
19612 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19613
19614 if (!m_device->phy().features().shaderFloat64) {
19615 printf("Device does not support 64bit vertex attributes; skipped.\n");
19616 return;
19617 }
19618
19619 VkVertexInputBindingDescription input_bindings[1];
19620 memset(input_bindings, 0, sizeof(input_bindings));
19621
19622 VkVertexInputAttributeDescription input_attribs[4];
19623 memset(input_attribs, 0, sizeof(input_attribs));
19624 input_attribs[0].location = 0;
19625 input_attribs[0].offset = 0;
19626 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
19627 input_attribs[1].location = 2;
19628 input_attribs[1].offset = 32;
19629 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
19630 input_attribs[2].location = 4;
19631 input_attribs[2].offset = 64;
19632 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
19633 input_attribs[3].location = 6;
19634 input_attribs[3].offset = 96;
19635 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
19636
19637 char const *vsSource = "#version 450\n"
19638 "\n"
19639 "layout(location=0) in dmat4 x;\n"
19640 "out gl_PerVertex {\n"
19641 " vec4 gl_Position;\n"
19642 "};\n"
19643 "void main(){\n"
19644 " gl_Position = vec4(x[0][0]);\n"
19645 "}\n";
19646 char const *fsSource = "#version 450\n"
19647 "\n"
19648 "layout(location=0) out vec4 color;\n"
19649 "void main(){\n"
19650 " color = vec4(1);\n"
19651 "}\n";
19652
19653 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19654 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19655
19656 VkPipelineObj pipe(m_device);
19657 pipe.AddColorAttachment();
19658 pipe.AddShader(&vs);
19659 pipe.AddShader(&fs);
19660
19661 pipe.AddVertexInputBindings(input_bindings, 1);
19662 pipe.AddVertexInputAttribs(input_attribs, 4);
19663
19664 VkDescriptorSetObj descriptorSet(m_device);
19665 descriptorSet.AppendDummy();
19666 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19667
19668 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
19669
19670 m_errorMonitor->VerifyNotFound();
19671}
19672
19673TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
19674 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
19675 m_errorMonitor->ExpectSuccess();
19676
19677 ASSERT_NO_FATAL_FAILURE(InitState());
19678
19679 char const *vsSource = "#version 450\n"
19680 "\n"
19681 "out gl_PerVertex {\n"
19682 " vec4 gl_Position;\n"
19683 "};\n"
19684 "void main(){\n"
19685 " gl_Position = vec4(1);\n"
19686 "}\n";
19687 char const *fsSource = "#version 450\n"
19688 "\n"
19689 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
19690 "layout(location=0) out vec4 color;\n"
19691 "void main() {\n"
19692 " color = subpassLoad(x);\n"
19693 "}\n";
19694
19695 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19696 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19697
19698 VkPipelineObj pipe(m_device);
19699 pipe.AddShader(&vs);
19700 pipe.AddShader(&fs);
19701 pipe.AddColorAttachment();
19702 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19703
19704 VkDescriptorSetLayoutBinding dslb = { 0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr };
19705 VkDescriptorSetLayoutCreateInfo dslci = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb };
19706 VkDescriptorSetLayout dsl;
19707 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
19708 ASSERT_VK_SUCCESS(err);
19709
19710 VkPipelineLayoutCreateInfo plci = { VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr };
19711 VkPipelineLayout pl;
19712 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
19713 ASSERT_VK_SUCCESS(err);
19714
19715 VkAttachmentDescription descs[2] = {
19716 { 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
19717 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
19718 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL },
19719 { 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
19720 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL },
19721 };
19722 VkAttachmentReference color = {
19723 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
19724 };
19725 VkAttachmentReference input = {
19726 1, VK_IMAGE_LAYOUT_GENERAL,
19727 };
19728
19729 VkSubpassDescription sd = { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr };
19730
19731 VkRenderPassCreateInfo rpci = { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr };
19732 VkRenderPass rp;
19733 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
19734 ASSERT_VK_SUCCESS(err);
19735
19736 // should be OK. would go wrong here if it's going to...
19737 pipe.CreateVKPipeline(pl, rp);
19738
19739 m_errorMonitor->VerifyNotFound();
19740
19741 vkDestroyRenderPass(m_device->device(), rp, nullptr);
19742 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
19743 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
19744}
19745
19746TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
19747 TEST_DESCRIPTION("Test that pipeline validation accepts a compute pipeline which declares a "
19748 "descriptor-backed resource which is not provided, but the shader does not "
19749 "statically use it. This is interesting because it requires compute pipelines "
19750 "to have a proper descriptor use walk, which they didn't for some time.");
19751 m_errorMonitor->ExpectSuccess();
19752
19753 ASSERT_NO_FATAL_FAILURE(InitState());
19754
19755 char const *csSource = "#version 450\n"
19756 "\n"
19757 "layout(local_size_x=1) in;\n"
19758 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
19759 "void main(){\n"
19760 " // x is not used.\n"
19761 "}\n";
19762
19763 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
19764
19765 VkDescriptorSetObj descriptorSet(m_device);
19766 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
19767
19768 VkComputePipelineCreateInfo cpci = { VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
19769 nullptr,
19770 0,
19771 { VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
19772 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr },
19773 descriptorSet.GetPipelineLayout(),
19774 VK_NULL_HANDLE,
19775 -1 };
19776
19777 VkPipeline pipe;
19778 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
19779
19780 m_errorMonitor->VerifyNotFound();
19781
19782 if (err == VK_SUCCESS) {
19783 vkDestroyPipeline(m_device->device(), pipe, nullptr);
19784 }
19785}
19786
19787TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
19788 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
19789 "sampler portion of a combined image + sampler");
19790 m_errorMonitor->ExpectSuccess();
19791
19792 ASSERT_NO_FATAL_FAILURE(InitState());
19793
19794 VkDescriptorSetLayoutBinding bindings[] = {
19795 { 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19796 { 1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19797 { 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19798 };
19799 VkDescriptorSetLayoutCreateInfo dslci = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings };
19800 VkDescriptorSetLayout dsl;
19801 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
19802 ASSERT_VK_SUCCESS(err);
19803
19804 VkPipelineLayoutCreateInfo plci = { VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr };
19805 VkPipelineLayout pl;
19806 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
19807 ASSERT_VK_SUCCESS(err);
19808
19809 char const *csSource = "#version 450\n"
19810 "\n"
19811 "layout(local_size_x=1) in;\n"
19812 "layout(set=0, binding=0) uniform sampler s;\n"
19813 "layout(set=0, binding=1) uniform texture2D t;\n"
19814 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
19815 "void main() {\n"
19816 " x = texture(sampler2D(t, s), vec2(0));\n"
19817 "}\n";
19818 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
19819
19820 VkComputePipelineCreateInfo cpci = { VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
19821 nullptr,
19822 0,
19823 { VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
19824 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr },
19825 pl,
19826 VK_NULL_HANDLE,
19827 -1 };
19828
19829 VkPipeline pipe;
19830 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
19831
19832 m_errorMonitor->VerifyNotFound();
19833
19834 if (err == VK_SUCCESS) {
19835 vkDestroyPipeline(m_device->device(), pipe, nullptr);
19836 }
19837
19838 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
19839 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
19840}
19841
19842TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
19843 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
19844 "image portion of a combined image + sampler");
19845 m_errorMonitor->ExpectSuccess();
19846
19847 ASSERT_NO_FATAL_FAILURE(InitState());
19848
19849 VkDescriptorSetLayoutBinding bindings[] = {
19850 { 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19851 { 1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19852 { 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19853 };
19854 VkDescriptorSetLayoutCreateInfo dslci = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings };
19855 VkDescriptorSetLayout dsl;
19856 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
19857 ASSERT_VK_SUCCESS(err);
19858
19859 VkPipelineLayoutCreateInfo plci = { VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr };
19860 VkPipelineLayout pl;
19861 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
19862 ASSERT_VK_SUCCESS(err);
19863
19864 char const *csSource = "#version 450\n"
19865 "\n"
19866 "layout(local_size_x=1) in;\n"
19867 "layout(set=0, binding=0) uniform texture2D t;\n"
19868 "layout(set=0, binding=1) uniform sampler s;\n"
19869 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
19870 "void main() {\n"
19871 " x = texture(sampler2D(t, s), vec2(0));\n"
19872 "}\n";
19873 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
19874
19875 VkComputePipelineCreateInfo cpci = { VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
19876 nullptr,
19877 0,
19878 { VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
19879 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr },
19880 pl,
19881 VK_NULL_HANDLE,
19882 -1 };
19883
19884 VkPipeline pipe;
19885 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
19886
19887 m_errorMonitor->VerifyNotFound();
19888
19889 if (err == VK_SUCCESS) {
19890 vkDestroyPipeline(m_device->device(), pipe, nullptr);
19891 }
19892
19893 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
19894 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
19895}
19896
19897TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
19898 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming "
19899 "both the sampler and the image of a combined image+sampler "
19900 "but via separate variables");
19901 m_errorMonitor->ExpectSuccess();
19902
19903 ASSERT_NO_FATAL_FAILURE(InitState());
19904
19905 VkDescriptorSetLayoutBinding bindings[] = {
19906 { 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19907 { 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
19908 };
19909 VkDescriptorSetLayoutCreateInfo dslci = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings };
19910 VkDescriptorSetLayout dsl;
19911 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
19912 ASSERT_VK_SUCCESS(err);
19913
19914 VkPipelineLayoutCreateInfo plci = { VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr };
19915 VkPipelineLayout pl;
19916 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
19917 ASSERT_VK_SUCCESS(err);
19918
19919 char const *csSource = "#version 450\n"
19920 "\n"
19921 "layout(local_size_x=1) in;\n"
19922 "layout(set=0, binding=0) uniform texture2D t;\n"
19923 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
19924 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
19925 "void main() {\n"
19926 " x = texture(sampler2D(t, s), vec2(0));\n"
19927 "}\n";
19928 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
19929
19930 VkComputePipelineCreateInfo cpci = { VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
19931 nullptr,
19932 0,
19933 { VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
19934 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr },
19935 pl,
19936 VK_NULL_HANDLE,
19937 -1 };
19938
19939 VkPipeline pipe;
19940 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
19941
19942 m_errorMonitor->VerifyNotFound();
19943
19944 if (err == VK_SUCCESS) {
19945 vkDestroyPipeline(m_device->device(), pipe, nullptr);
19946 }
19947
19948 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
19949 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
19950}
19951
19952TEST_F(VkPositiveLayerTest, ValidStructPNext) {
19953 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
19954
19955 ASSERT_NO_FATAL_FAILURE(InitState());
19956
19957 // Positive test to check parameter_validation and unique_objects support
19958 // for NV_dedicated_allocation
19959 uint32_t extension_count = 0;
19960 bool supports_nv_dedicated_allocation = false;
19961 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
19962 ASSERT_VK_SUCCESS(err);
19963
19964 if (extension_count > 0) {
19965 std::vector<VkExtensionProperties> available_extensions(extension_count);
19966
19967 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
19968 ASSERT_VK_SUCCESS(err);
19969
19970 for (const auto &extension_props : available_extensions) {
19971 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
19972 supports_nv_dedicated_allocation = true;
19973 }
19974 }
19975 }
19976
19977 if (supports_nv_dedicated_allocation) {
19978 m_errorMonitor->ExpectSuccess();
19979
19980 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
19981 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
19982 dedicated_buffer_create_info.pNext = nullptr;
19983 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
19984
19985 uint32_t queue_family_index = 0;
19986 VkBufferCreateInfo buffer_create_info = {};
19987 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19988 buffer_create_info.pNext = &dedicated_buffer_create_info;
19989 buffer_create_info.size = 1024;
19990 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19991 buffer_create_info.queueFamilyIndexCount = 1;
19992 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
19993
19994 VkBuffer buffer;
19995 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
19996 ASSERT_VK_SUCCESS(err);
19997
19998 VkMemoryRequirements memory_reqs;
19999 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
20000
20001 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
20002 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
20003 dedicated_memory_info.pNext = nullptr;
20004 dedicated_memory_info.buffer = buffer;
20005 dedicated_memory_info.image = VK_NULL_HANDLE;
20006
20007 VkMemoryAllocateInfo memory_info = {};
20008 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20009 memory_info.pNext = &dedicated_memory_info;
20010 memory_info.allocationSize = memory_reqs.size;
20011
20012 bool pass;
20013 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
20014 ASSERT_TRUE(pass);
20015
20016 VkDeviceMemory buffer_memory;
20017 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
20018 ASSERT_VK_SUCCESS(err);
20019
20020 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
20021 ASSERT_VK_SUCCESS(err);
20022
20023 vkDestroyBuffer(m_device->device(), buffer, NULL);
20024 vkFreeMemory(m_device->device(), buffer_memory, NULL);
20025
20026 m_errorMonitor->VerifyNotFound();
20027 }
20028}
20029
20030TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
20031 VkResult err;
20032
20033 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
20034
20035 ASSERT_NO_FATAL_FAILURE(InitState());
20036 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20037
20038 std::vector<const char *> device_extension_names;
20039 auto features = m_device->phy().features();
20040 // Artificially disable support for non-solid fill modes
20041 features.fillModeNonSolid = false;
20042 // The sacrificial device object
20043 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
20044
20045 VkRenderpassObj render_pass(&test_device);
20046
20047 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
20048 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
20049 pipeline_layout_ci.setLayoutCount = 0;
20050 pipeline_layout_ci.pSetLayouts = NULL;
20051
20052 VkPipelineLayout pipeline_layout;
20053 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
20054 ASSERT_VK_SUCCESS(err);
20055
20056 VkPipelineRasterizationStateCreateInfo rs_ci = {};
20057 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
20058 rs_ci.pNext = nullptr;
20059 rs_ci.lineWidth = 1.0f;
20060 rs_ci.rasterizerDiscardEnable = true;
20061
20062 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
20063 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20064
20065 // Set polygonMode=FILL. No error is expected
20066 m_errorMonitor->ExpectSuccess();
20067 {
20068 VkPipelineObj pipe(&test_device);
20069 pipe.AddShader(&vs);
20070 pipe.AddShader(&fs);
20071 pipe.AddColorAttachment();
20072 // Set polygonMode to a good value
20073 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
20074 pipe.SetRasterization(&rs_ci);
20075 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
20076 }
20077 m_errorMonitor->VerifyNotFound();
20078
20079 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
20080}
20081
20082TEST_F(VkPositiveLayerTest, ValidPushConstants) {
20083 VkResult err;
20084 ASSERT_NO_FATAL_FAILURE(InitState());
20085 ASSERT_NO_FATAL_FAILURE(InitViewport());
20086 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20087
20088 VkPipelineLayout pipeline_layout;
20089 VkPushConstantRange pc_range = {};
20090 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
20091 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
20092 pipeline_layout_ci.pushConstantRangeCount = 1;
20093 pipeline_layout_ci.pPushConstantRanges = &pc_range;
20094
20095 //
20096 // Check for invalid push constant ranges in pipeline layouts.
20097 //
20098 struct PipelineLayoutTestCase {
20099 VkPushConstantRange const range;
20100 char const *msg;
20101 };
20102
20103 // Check for overlapping ranges
20104 const uint32_t ranges_per_test = 5;
20105 struct OverlappingRangeTestCase {
20106 VkPushConstantRange const ranges[ranges_per_test];
20107 char const *msg;
20108 };
20109
20110 // Run some positive tests to make sure overlap checking in the layer is OK
20111 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos = { { { { { VK_SHADER_STAGE_VERTEX_BIT, 0, 4 },
20112 { VK_SHADER_STAGE_VERTEX_BIT, 4, 4 },
20113 { VK_SHADER_STAGE_VERTEX_BIT, 8, 4 },
20114 { VK_SHADER_STAGE_VERTEX_BIT, 12, 4 },
20115 { VK_SHADER_STAGE_VERTEX_BIT, 16, 4 } },
20116 "" },
20117 { { { VK_SHADER_STAGE_VERTEX_BIT, 92, 24 },
20118 { VK_SHADER_STAGE_VERTEX_BIT, 80, 4 },
20119 { VK_SHADER_STAGE_VERTEX_BIT, 64, 8 },
20120 { VK_SHADER_STAGE_VERTEX_BIT, 4, 16 },
20121 { VK_SHADER_STAGE_VERTEX_BIT, 0, 4 } },
20122 "" } } };
20123 for (const auto &iter : overlapping_range_tests_pos) {
20124 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
20125 m_errorMonitor->ExpectSuccess();
20126 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
20127 m_errorMonitor->VerifyNotFound();
20128 if (VK_SUCCESS == err) {
20129 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
20130 }
20131 }
20132
20133 //
20134 // CmdPushConstants tests
20135 //
20136 const uint8_t dummy_values[100] = {};
20137
20138 BeginCommandBuffer();
20139
20140 // positive overlapping range tests with cmd
20141 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = { {
20142 { { VK_SHADER_STAGE_VERTEX_BIT, 0, 16 }, "" },
20143 { { VK_SHADER_STAGE_VERTEX_BIT, 0, 4 }, "" },
20144 { { VK_SHADER_STAGE_VERTEX_BIT, 20, 12 }, "" },
20145 { { VK_SHADER_STAGE_VERTEX_BIT, 56, 36 }, "" },
20146 } };
20147
20148 // Setup ranges: [0,16) [20,36) [36,44) [44,52) [56,80) [80,92)
20149 const VkPushConstantRange pc_range4[] = {
20150 { VK_SHADER_STAGE_VERTEX_BIT, 20, 16 },{ VK_SHADER_STAGE_VERTEX_BIT, 0, 16 },{ VK_SHADER_STAGE_VERTEX_BIT, 44, 8 },
20151 { VK_SHADER_STAGE_VERTEX_BIT, 80, 12 },{ VK_SHADER_STAGE_VERTEX_BIT, 36, 8 },{ VK_SHADER_STAGE_VERTEX_BIT, 56, 24 },
20152 };
20153
20154 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range4) / sizeof(VkPushConstantRange);
20155 pipeline_layout_ci.pPushConstantRanges = pc_range4;
20156 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
20157 ASSERT_VK_SUCCESS(err);
20158 for (const auto &iter : cmd_overlap_tests_pos) {
20159 m_errorMonitor->ExpectSuccess();
20160 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
20161 iter.range.size, dummy_values);
20162 m_errorMonitor->VerifyNotFound();
20163 }
20164 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
20165
20166 EndCommandBuffer();
20167}
20168
20169
20170
20171
20172
20173
20174
20175#if 0 // A few devices have issues with this test so disabling for now
20176TEST_F(VkPositiveLayerTest, LongFenceChain)
20177{
20178 m_errorMonitor->ExpectSuccess();
20179
20180 ASSERT_NO_FATAL_FAILURE(InitState());
20181 VkResult err;
20182
20183 std::vector<VkFence> fences;
20184
20185 const int chainLength = 32768;
20186
20187 for (int i = 0; i < chainLength; i++) {
20188 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
20189 VkFence fence;
20190 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
20191 ASSERT_VK_SUCCESS(err);
20192
20193 fences.push_back(fence);
20194
20195 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
20196 0, nullptr, 0, nullptr };
20197 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
20198 ASSERT_VK_SUCCESS(err);
20199
20200 }
20201
20202 // BOOM, stack overflow.
20203 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
20204
20205 for (auto fence : fences)
20206 vkDestroyFence(m_device->device(), fence, nullptr);
20207
20208 m_errorMonitor->VerifyNotFound();
20209}
20210#endif
20211
20212
Cody Northrop1242dfd2016-07-13 17:24:59 -060020213#if defined(ANDROID) && defined(VALIDATION_APK)
20214static bool initialized = false;
20215static bool active = false;
20216
20217// Convert Intents to argv
20218// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020219std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060020220 std::vector<std::string> args;
20221 JavaVM &vm = *app.activity->vm;
20222 JNIEnv *p_env;
20223 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK)
20224 return args;
20225
20226 JNIEnv &env = *p_env;
20227 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020228 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060020229 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020230 jmethodID get_string_extra_method =
20231 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060020232 jvalue get_string_extra_args;
20233 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020234 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060020235
20236 std::string args_str;
20237 if (extra_str) {
20238 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
20239 args_str = extra_utf;
20240 env.ReleaseStringUTFChars(extra_str, extra_utf);
20241 env.DeleteLocalRef(extra_str);
20242 }
20243
20244 env.DeleteLocalRef(get_string_extra_args.l);
20245 env.DeleteLocalRef(intent);
20246 vm.DetachCurrentThread();
20247
20248 // split args_str
20249 std::stringstream ss(args_str);
20250 std::string arg;
20251 while (std::getline(ss, arg, ' ')) {
20252 if (!arg.empty())
20253 args.push_back(arg);
20254 }
20255
20256 return args;
20257}
20258
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020259static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060020260
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020261static void processCommand(struct android_app *app, int32_t cmd) {
20262 switch (cmd) {
20263 case APP_CMD_INIT_WINDOW: {
20264 if (app->window) {
20265 initialized = true;
Cody Northrop1242dfd2016-07-13 17:24:59 -060020266 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020267 break;
20268 }
20269 case APP_CMD_GAINED_FOCUS: {
20270 active = true;
20271 break;
20272 }
20273 case APP_CMD_LOST_FOCUS: {
20274 active = false;
20275 break;
20276 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060020277 }
20278}
20279
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020280void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060020281 app_dummy();
20282
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020283 const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060020284
20285 int vulkanSupport = InitVulkan();
20286 if (vulkanSupport == 0) {
20287 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
20288 return;
20289 }
20290
20291 app->onAppCmd = processCommand;
20292 app->onInputEvent = processInput;
20293
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020294 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060020295 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020296 struct android_poll_source *source;
20297 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060020298 if (source) {
20299 source->process(app, source);
20300 }
20301
20302 if (app->destroyRequested != 0) {
20303 VkTestFramework::Finish();
20304 return;
20305 }
20306 }
20307
20308 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020309 // Use the following key to send arguments to gtest, i.e.
20310 // --es args "--gtest_filter=-VkLayerTest.foo"
20311 const char key[] = "args";
20312 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020313
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020314 std::string filter = "";
20315 if (args.size() > 0) {
20316 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
20317 filter += args[0];
20318 } else {
20319 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
20320 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060020321
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020322 int argc = 2;
20323 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
20324 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020325
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020326 // Route output to files until we can override the gtest output
20327 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
20328 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020329
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020330 ::testing::InitGoogleTest(&argc, argv);
20331 VkTestFramework::InitArgs(&argc, argv);
20332 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020333
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020334 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060020335
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020336 if (result != 0) {
20337 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
20338 } else {
20339 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
20340 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060020341
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020342 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060020343
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020344 fclose(stdout);
20345 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020346
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020347 ANativeActivity_finish(app->activity);
Cody Northrop1242dfd2016-07-13 17:24:59 -060020348
Mark Lobodzinskice751c62016-09-08 10:45:35 -060020349 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060020350 }
20351 }
20352}
20353#endif
20354
Tony Barbour300a6082015-04-07 13:44:53 -060020355int main(int argc, char **argv) {
20356 int result;
20357
Cody Northrop8e54a402016-03-08 22:25:52 -070020358#ifdef ANDROID
20359 int vulkanSupport = InitVulkan();
20360 if (vulkanSupport == 0)
20361 return 1;
20362#endif
20363
Tony Barbour300a6082015-04-07 13:44:53 -060020364 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060020365 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060020366
20367 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
20368
20369 result = RUN_ALL_TESTS();
20370
Tony Barbour6918cd52015-04-09 12:58:51 -060020371 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060020372 return result;
20373}