blob: e37bc02d25ae56213873c6403dfae6f8b8396399 [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
2 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
Michael Lentine0a369f62016-02-03 16:51:46 -06005 * Copyright (c) 2015-2016 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Cody Northrop1242dfd2016-07-13 17:24:59 -060020 * Author: Cody Northrop <cnorthrop@google.com>
Karl Schultz6addd812016-02-02 17:17:23 -070021 */
Tony Barbour65c48b32015-11-17 10:02:56 -070022
Cody Northrop8e54a402016-03-08 22:25:52 -070023#ifdef ANDROID
24#include "vulkan_wrapper.h"
25#else
David Pinedo9316d3b2015-11-06 12:54:48 -070026#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070027#endif
Cody Northrop1242dfd2016-07-13 17:24:59 -060028
29#if defined(ANDROID) && defined(VALIDATION_APK)
30#include <android/log.h>
31#include <android_native_app_glue.h>
32#endif
33
Jon Ashburn7fa7e222016-02-02 12:08:10 -070034#include "icd-spv.h"
Mark Lobodzinskice751c62016-09-08 10:45:35 -060035#include "test_common.h"
36#include "vk_layer_config.h"
37#include "vkrenderframework.h"
Tobin Ehlise2eeffa2016-09-21 17:32:26 -060038#include <unordered_set>
Tony Barbour300a6082015-04-07 13:44:53 -060039
Mark Lobodzinski3780e142015-05-14 15:08:13 -050040#define GLM_FORCE_RADIANS
41#include "glm/glm.hpp"
42#include <glm/gtc/matrix_transform.hpp>
43
Dustin Gravesffa90fa2016-05-06 11:20:38 -060044#define PARAMETER_VALIDATION_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060045#define MEM_TRACKER_TESTS 1
46#define OBJ_TRACKER_TESTS 1
47#define DRAW_STATE_TESTS 1
48#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120049#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060050#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060051#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060052
Mark Lobodzinski3780e142015-05-14 15:08:13 -050053//--------------------------------------------------------------------------------------
54// Mesh and VertexFormat Data
55//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070056struct Vertex {
57 float posX, posY, posZ, posW; // Position data
58 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050059};
60
Karl Schultz6addd812016-02-02 17:17:23 -070061#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050062
63typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070064 BsoFailNone = 0x00000000,
65 BsoFailLineWidth = 0x00000001,
66 BsoFailDepthBias = 0x00000002,
67 BsoFailViewport = 0x00000004,
68 BsoFailScissor = 0x00000008,
69 BsoFailBlend = 0x00000010,
70 BsoFailDepthBounds = 0x00000020,
71 BsoFailStencilReadMask = 0x00000040,
72 BsoFailStencilWriteMask = 0x00000080,
73 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060074 BsoFailCmdClearAttachments = 0x00000200,
Tobin Ehlis379ba3b2016-07-19 11:22:29 -060075 BsoFailIndexBuffer = 0x00000400,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050076} BsoFailSelect;
77
78struct vktriangle_vs_uniform {
79 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070080 float mvp[4][4];
81 float position[3][4];
82 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050083};
84
Mark Lobodzinskice751c62016-09-08 10:45:35 -060085static const char bindStateVertShaderText[] = "#version 450\n"
86 "vec2 vertices[3];\n"
87 "out gl_PerVertex {\n"
88 " vec4 gl_Position;\n"
89 "};\n"
90 "void main() {\n"
91 " vertices[0] = vec2(-1.0, -1.0);\n"
92 " vertices[1] = vec2( 1.0, -1.0);\n"
93 " vertices[2] = vec2( 0.0, 1.0);\n"
94 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
95 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050096
Mark Lobodzinskice751c62016-09-08 10:45:35 -060097static const char bindStateFragShaderText[] = "#version 450\n"
98 "\n"
99 "layout(location = 0) out vec4 uFragColor;\n"
100 "void main(){\n"
101 " uFragColor = vec4(0,1,0,1);\n"
102 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500103
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600104static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
105 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
106 void *pUserData);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600107
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600108// ********************************************************
109// ErrorMonitor Usage:
110//
111// Call SetDesiredFailureMsg with a string to be compared against all
112// encountered log messages. Passing NULL will match all log messages.
113// logMsg will return true for skipCall only if msg is matched or NULL.
114//
115// Call DesiredMsgFound to determine if the desired failure message
116// was encountered.
117
Tony Barbour300a6082015-04-07 13:44:53 -0600118class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700119 public:
120 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600121 test_platform_thread_create_mutex(&m_mutex);
122 test_platform_thread_lock_mutex(&m_mutex);
Chris Forbes17756132016-09-16 14:36:39 +1200123 m_msgFlags = VK_DEBUG_REPORT_ERROR_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700124 m_bailout = NULL;
Chris Forbes17756132016-09-16 14:36:39 +1200125 m_desiredMsgSet = false;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600126 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600127 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600128
Dustin Graves48458142016-04-29 16:11:55 -0600129 ~ErrorMonitor() { test_platform_thread_delete_mutex(&m_mutex); }
130
Karl Schultz6addd812016-02-02 17:17:23 -0700131 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200132 // also discard all collected messages to this point
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600133 test_platform_thread_lock_mutex(&m_mutex);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600134 m_failureMsgs.clear();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600135 m_otherMsgs.clear();
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600136 m_desiredMsgs.insert(msgString);
Karl Schultz6addd812016-02-02 17:17:23 -0700137 m_msgFound = VK_FALSE;
138 m_msgFlags = msgFlags;
Chris Forbes17756132016-09-16 14:36:39 +1200139 m_desiredMsgSet = true;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600140 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600141 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600142
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600143 VkBool32 CheckForDesiredMsg(const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600144 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600145 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600146 if (m_bailout != NULL) {
147 *m_bailout = true;
148 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600149 string errorString(msgString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600150 bool found_expected = false;
151 for (auto desired_msg : m_desiredMsgs) {
152 if (errorString.find(desired_msg) != string::npos) {
153 found_expected = true;
154 m_failureMsgs.insert(errorString);
155 m_msgFound = VK_TRUE;
156 result = VK_TRUE;
157 // We only want one match for each expected error so remove from set here
158 // Since we're about the break the loop it's ok to remove from set we're iterating over
159 m_desiredMsgs.erase(desired_msg);
160 break;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600161 }
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600162 }
163 if (!found_expected) {
Chris Forbes5b9442b2016-09-13 16:49:57 +1200164 printf("Unexpected: %s\n", msgString);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600165 m_otherMsgs.push_back(errorString);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600166 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600167 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600168 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600169 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600170
Karl Schultz6addd812016-02-02 17:17:23 -0700171 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600172
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600173 VkDebugReportFlagsEXT GetMessageFlags(void) { return m_msgFlags; }
174
Karl Schultz6addd812016-02-02 17:17:23 -0700175 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600176
Karl Schultz6addd812016-02-02 17:17:23 -0700177 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600178
Karl Schultz6addd812016-02-02 17:17:23 -0700179 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600180 vector<string> otherMsgs = GetOtherFailureMsgs();
181 cout << "Other error messages logged for this test were:" << endl;
182 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
183 cout << " " << *iter << endl;
184 }
185 }
186
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600187 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200188
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600189 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
190 void ExpectSuccess(VkDebugReportFlagsEXT message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
191 m_msgFlags = message_flag_mask;
192 // Match ANY message matching specified type
193 SetDesiredFailureMsg(message_flag_mask, "");
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200194 }
195
196 void VerifyFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600197 // Not seeing the desired message is a failure. /Before/ throwing, dump any other messages.
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200198 if (!DesiredMsgFound()) {
199 DumpFailureMsgs();
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600200 for (auto desired_msg : m_desiredMsgs) {
201 FAIL() << "Did not receive expected error '" << desired_msg << "'";
202 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200203 }
204 }
205
206 void VerifyNotFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600207 // ExpectSuccess() configured us to match anything. Any error is a failure.
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200208 if (DesiredMsgFound()) {
209 DumpFailureMsgs();
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600210 for (auto msg : m_failureMsgs) {
211 FAIL() << "Expected to succeed but got error: " << msg;
212 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200213 }
214 }
215
Karl Schultz6addd812016-02-02 17:17:23 -0700216 private:
217 VkFlags m_msgFlags;
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600218 std::unordered_set<string> m_desiredMsgs;
219 std::unordered_set<string> m_failureMsgs;
Karl Schultz6addd812016-02-02 17:17:23 -0700220 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600221 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700222 bool *m_bailout;
223 VkBool32 m_msgFound;
Chris Forbes17756132016-09-16 14:36:39 +1200224 bool m_desiredMsgSet;
Tony Barbour300a6082015-04-07 13:44:53 -0600225};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500226
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600227static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
228 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
229 void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600230 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
231 if (msgFlags & errMonitor->GetMessageFlags()) {
232 return errMonitor->CheckForDesiredMsg(pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600233 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600234 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600235}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500236
Karl Schultz6addd812016-02-02 17:17:23 -0700237class VkLayerTest : public VkRenderFramework {
238 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800239 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
240 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600241 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
242 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
Karl Schultz6addd812016-02-02 17:17:23 -0700243 BsoFailSelect failMask);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600244 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
245 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, failMask);
Karl Schultz6addd812016-02-02 17:17:23 -0700246 }
Tony Barbour300a6082015-04-07 13:44:53 -0600247
Tony Barbourfe3351b2015-07-28 10:17:20 -0600248 /* Convenience functions that use built-in command buffer */
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600249 VkResult BeginCommandBuffer() { return BeginCommandBuffer(*m_commandBuffer); }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800250 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600251 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
252 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700253 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600254 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
Karl Schultz6addd812016-02-02 17:17:23 -0700255 uint32_t firstInstance) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600256 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700257 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600258 void QueueCommandBuffer(bool checkSuccess = true) { m_commandBuffer->QueueCommandBuffer(checkSuccess); }
259 void QueueCommandBuffer(const VkFence &fence) { m_commandBuffer->QueueCommandBuffer(fence); }
260 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding) {
Karl Schultz6addd812016-02-02 17:17:23 -0700261 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
262 }
263 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
264 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
265 }
266
267 protected:
268 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600269 bool m_enableWSI;
Tony Barbour300a6082015-04-07 13:44:53 -0600270
271 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600272 std::vector<const char *> instance_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600273 std::vector<const char *> instance_extension_names;
274 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600275
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700276 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600277 /*
278 * Since CreateDbgMsgCallback is an instance level extension call
279 * any extension / layer that utilizes that feature also needs
280 * to be enabled at create instance time.
281 */
Karl Schultz6addd812016-02-02 17:17:23 -0700282 // Use Threading layer first to protect others from
283 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700284 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600285 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800286 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700287 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800288 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600289 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700290 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600291
Ian Elliott2c1daf52016-05-12 09:41:46 -0600292 if (m_enableWSI) {
293 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
294 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
295#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
296#if defined(VK_USE_PLATFORM_ANDROID_KHR)
297 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
298#endif // VK_USE_PLATFORM_ANDROID_KHR
299#if defined(VK_USE_PLATFORM_MIR_KHR)
300 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
301#endif // VK_USE_PLATFORM_MIR_KHR
302#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
303 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
304#endif // VK_USE_PLATFORM_WAYLAND_KHR
305#if defined(VK_USE_PLATFORM_WIN32_KHR)
306 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
307#endif // VK_USE_PLATFORM_WIN32_KHR
308#endif // NEED_TO_TEST_THIS_ON_PLATFORM
309#if defined(VK_USE_PLATFORM_XCB_KHR)
310 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
311#elif defined(VK_USE_PLATFORM_XLIB_KHR)
312 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
313#endif // VK_USE_PLATFORM_XLIB_KHR
314 }
315
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600316 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600317 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800318 this->app_info.pApplicationName = "layer_tests";
319 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600320 this->app_info.pEngineName = "unittest";
321 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600322 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600323
Tony Barbour15524c32015-04-29 17:34:29 -0600324 m_errorMonitor = new ErrorMonitor;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600325 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600326 }
327
328 virtual void TearDown() {
329 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600330 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600331 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600332 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600333
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600334 VkLayerTest() { m_enableWSI = false; }
Tony Barbour300a6082015-04-07 13:44:53 -0600335};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500336
Karl Schultz6addd812016-02-02 17:17:23 -0700337VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600338 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600339
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800340 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600341
342 /*
343 * For render test all drawing happens in a single render pass
344 * on a single command buffer.
345 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200346 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800347 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600348 }
349
350 return result;
351}
352
Karl Schultz6addd812016-02-02 17:17:23 -0700353VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600354 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600355
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200356 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800357 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200358 }
Tony Barbour300a6082015-04-07 13:44:53 -0600359
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800360 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600361
362 return result;
363}
364
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600365void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500366 // Create identity matrix
367 int i;
368 struct vktriangle_vs_uniform data;
369
370 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700371 glm::mat4 View = glm::mat4(1.0f);
372 glm::mat4 Model = glm::mat4(1.0f);
373 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500374 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700375 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500376
377 memcpy(&data.mvp, &MVP[0][0], matrixSize);
378
Karl Schultz6addd812016-02-02 17:17:23 -0700379 static const Vertex tri_data[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600380 {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 -0500381 };
382
Karl Schultz6addd812016-02-02 17:17:23 -0700383 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500384 data.position[i][0] = tri_data[i].posX;
385 data.position[i][1] = tri_data[i].posY;
386 data.position[i][2] = tri_data[i].posZ;
387 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700388 data.color[i][0] = tri_data[i].r;
389 data.color[i][1] = tri_data[i].g;
390 data.color[i][2] = tri_data[i].b;
391 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500392 }
393
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500394 ASSERT_NO_FATAL_FAILURE(InitViewport());
395
Chris Forbesbcfaadd2016-09-16 14:13:53 +1200396 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), (const void *)&data,
397 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500398
Karl Schultz6addd812016-02-02 17:17:23 -0700399 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600400 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500401
402 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800403 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500404 pipelineobj.AddShader(&vs);
405 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600406 if (failMask & BsoFailLineWidth) {
407 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600408 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600409 ia_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600410 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
411 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600412 }
413 if (failMask & BsoFailDepthBias) {
414 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600415 VkPipelineRasterizationStateCreateInfo rs_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600416 rs_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600417 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600418 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600419 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600420 }
Karl Schultz6addd812016-02-02 17:17:23 -0700421 // Viewport and scissors must stay in synch or other errors will occur than
422 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600423 if (failMask & BsoFailViewport) {
424 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
425 }
426 if (failMask & BsoFailScissor) {
427 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
428 }
429 if (failMask & BsoFailBlend) {
430 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600431 VkPipelineColorBlendAttachmentState att_state = {};
432 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
433 att_state.blendEnable = VK_TRUE;
434 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600435 }
436 if (failMask & BsoFailDepthBounds) {
437 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
438 }
439 if (failMask & BsoFailStencilReadMask) {
440 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
441 }
442 if (failMask & BsoFailStencilWriteMask) {
443 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
444 }
445 if (failMask & BsoFailStencilReference) {
446 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
447 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500448
449 VkDescriptorSetObj descriptorSet(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600450 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500451
452 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600453 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500454
Tony Barbourfe3351b2015-07-28 10:17:20 -0600455 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500456
457 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600458 if (failMask & BsoFailIndexBuffer) {
459 // Use DrawIndexed w/o an index buffer bound
460 DrawIndexed(3, 1, 0, 0, 0);
461 } else {
462 Draw(3, 1, 0, 0);
463 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500464
Mark Muellerd4914412016-06-13 17:52:06 -0600465 if (failMask & BsoFailCmdClearAttachments) {
466 VkClearAttachment color_attachment = {};
467 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
468 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
469 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
470
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600471 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Muellerd4914412016-06-13 17:52:06 -0600472 }
473
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500474 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600475 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500476
Tony Barbourfe3351b2015-07-28 10:17:20 -0600477 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500478}
479
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600480void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj,
481 VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500482 if (m_depthStencil->Initialized()) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600483 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500484 } else {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600485 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500486 }
487
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800488 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700489 // Make sure depthWriteEnable is set so that Depth fail test will work
490 // correctly
491 // Make sure stencilTestEnable is set so that Stencil fail test will work
492 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600493 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800494 stencil.failOp = VK_STENCIL_OP_KEEP;
495 stencil.passOp = VK_STENCIL_OP_KEEP;
496 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
497 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600498
499 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
500 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600501 ds_ci.pNext = NULL;
502 ds_ci.depthTestEnable = VK_FALSE;
503 ds_ci.depthWriteEnable = VK_TRUE;
504 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
505 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600506 if (failMask & BsoFailDepthBounds) {
507 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600508 ds_ci.maxDepthBounds = 0.0f;
509 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600510 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600511 ds_ci.stencilTestEnable = VK_TRUE;
512 ds_ci.front = stencil;
513 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600514
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600515 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600516 pipelineobj.SetViewport(m_viewports);
517 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800518 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600519 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600520 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800521 commandBuffer->BindPipeline(pipelineobj);
522 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500523}
524
Ian Elliott2c1daf52016-05-12 09:41:46 -0600525class VkWsiEnabledLayerTest : public VkLayerTest {
526 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600527 protected:
528 VkWsiEnabledLayerTest() { m_enableWSI = true; }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600529};
530
Mark Muellerdfe37552016-07-07 14:47:42 -0600531class VkBufferTest {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600532 public:
Mark Muellerdfe37552016-07-07 14:47:42 -0600533 enum eTestEnFlags {
534 eDoubleDelete,
535 eInvalidDeviceOffset,
536 eInvalidMemoryOffset,
537 eBindNullBuffer,
538 eFreeInvalidHandle,
Mark Mueller4042b652016-09-05 22:52:21 -0600539 eNone,
Mark Muellerdfe37552016-07-07 14:47:42 -0600540 };
541
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600542 enum eTestConditions { eOffsetAlignment = 1 };
Mark Muellerdfe37552016-07-07 14:47:42 -0600543
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600544 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage = 0) {
545 if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600546 return true;
547 }
548 VkDeviceSize offset_limit = 0;
549 if (eInvalidMemoryOffset == aTestFlag) {
550 VkBuffer vulkanBuffer;
551 VkBufferCreateInfo buffer_create_info = {};
552 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
553 buffer_create_info.size = 32;
554 buffer_create_info.usage = aBufferUsage;
555
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600556 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr, &vulkanBuffer);
Mark Mueller4042b652016-09-05 22:52:21 -0600557 VkMemoryRequirements memory_reqs = {};
Mark Muellerdfe37552016-07-07 14:47:42 -0600558
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600559 vkGetBufferMemoryRequirements(aVulkanDevice->device(), vulkanBuffer, &memory_reqs);
Mark Muellerdfe37552016-07-07 14:47:42 -0600560 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
561 offset_limit = memory_reqs.alignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600562 } else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
563 offset_limit = aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600564 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600565 offset_limit = aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600566 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600567 offset_limit = aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600568 }
569 if (eOffsetAlignment < offset_limit) {
570 return true;
571 }
572 return false;
573 }
574
575 // A constructor which performs validation tests within construction.
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600576 VkBufferTest(VkDeviceObj *aVulkanDevice, VkBufferUsageFlags aBufferUsage, eTestEnFlags aTestFlag = eNone)
577 : AllocateCurrent(false), BoundCurrent(false), CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600578
579 if (eBindNullBuffer == aTestFlag) {
580 VulkanMemory = 0;
581 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
582 } else {
583 VkBufferCreateInfo buffer_create_info = {};
584 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
585 buffer_create_info.size = 32;
586 buffer_create_info.usage = aBufferUsage;
587
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600588 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr, &VulkanBuffer);
Mark Muellerdfe37552016-07-07 14:47:42 -0600589
590 CreateCurrent = true;
591
592 VkMemoryRequirements memory_requirements;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600593 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer, &memory_requirements);
Mark Muellerdfe37552016-07-07 14:47:42 -0600594
595 VkMemoryAllocateInfo memory_allocate_info = {};
596 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
597 memory_allocate_info.allocationSize = memory_requirements.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600598 bool pass = aVulkanDevice->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info,
599 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Muellerdfe37552016-07-07 14:47:42 -0600600 if (!pass) {
601 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
602 return;
603 }
604
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600605 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL, &VulkanMemory);
Mark Muellerdfe37552016-07-07 14:47:42 -0600606 AllocateCurrent = true;
607 // NB: 1 is intentionally an invalid offset value
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600608 const bool offset_en = eInvalidDeviceOffset == aTestFlag || eInvalidMemoryOffset == aTestFlag;
609 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, offset_en ? eOffsetAlignment : 0);
Mark Muellerdfe37552016-07-07 14:47:42 -0600610 BoundCurrent = true;
611
612 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
613 }
614 }
615
616 ~VkBufferTest() {
617 if (CreateCurrent) {
618 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
619 }
620 if (AllocateCurrent) {
621 if (InvalidDeleteEn) {
622 union {
623 VkDeviceMemory device_memory;
624 unsigned long long index_access;
625 } bad_index;
626
627 bad_index.device_memory = VulkanMemory;
628 bad_index.index_access++;
629
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600630 vkFreeMemory(VulkanDevice, bad_index.device_memory, nullptr);
Mark Muellerdfe37552016-07-07 14:47:42 -0600631 }
632 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
633 }
634 }
635
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600636 bool GetBufferCurrent() { return AllocateCurrent && BoundCurrent && CreateCurrent; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600637
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600638 const VkBuffer &GetBuffer() { return VulkanBuffer; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600639
640 void TestDoubleDestroy() {
641 // Destroy the buffer but leave the flag set, which will cause
642 // the buffer to be destroyed again in the destructor.
643 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
644 }
645
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600646 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600647 bool AllocateCurrent;
648 bool BoundCurrent;
649 bool CreateCurrent;
650 bool InvalidDeleteEn;
651
652 VkBuffer VulkanBuffer;
653 VkDevice VulkanDevice;
654 VkDeviceMemory VulkanMemory;
Mark Muellerdfe37552016-07-07 14:47:42 -0600655};
656
657class VkVerticesObj {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600658 public:
659 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount, unsigned aBindingCount, unsigned aByteStride,
Mark Muellerdfe37552016-07-07 14:47:42 -0600660 VkDeviceSize aVertexCount, const float *aVerticies)
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600661 : BoundCurrent(false), AttributeCount(aAttributeCount), BindingCount(aBindingCount), BindId(BindIdGenerator),
Mark Muellerdfe37552016-07-07 14:47:42 -0600662 PipelineVertexInputStateCreateInfo(),
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600663 VulkanMemoryBuffer(aVulkanDevice, 1, static_cast<int>(aByteStride * aVertexCount),
664 reinterpret_cast<const void *>(aVerticies), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600665 BindIdGenerator++; // NB: This can wrap w/misuse
666
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600667 VertexInputAttributeDescription = new VkVertexInputAttributeDescription[AttributeCount];
668 VertexInputBindingDescription = new VkVertexInputBindingDescription[BindingCount];
Mark Muellerdfe37552016-07-07 14:47:42 -0600669
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600670 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = VertexInputAttributeDescription;
671 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = AttributeCount;
672 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = VertexInputBindingDescription;
673 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = BindingCount;
674 PipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -0600675
676 unsigned i = 0;
677 do {
678 VertexInputAttributeDescription[i].binding = BindId;
679 VertexInputAttributeDescription[i].location = i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600680 VertexInputAttributeDescription[i].format = VK_FORMAT_R32G32B32_SFLOAT;
681 VertexInputAttributeDescription[i].offset = sizeof(float) * aByteStride;
Mark Muellerdfe37552016-07-07 14:47:42 -0600682 i++;
683 } while (AttributeCount < i);
684
685 i = 0;
686 do {
687 VertexInputBindingDescription[i].binding = BindId;
688 VertexInputBindingDescription[i].stride = aByteStride;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600689 VertexInputBindingDescription[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
Mark Muellerdfe37552016-07-07 14:47:42 -0600690 i++;
691 } while (BindingCount < i);
692 }
693
694 ~VkVerticesObj() {
695 if (VertexInputAttributeDescription) {
696 delete[] VertexInputAttributeDescription;
697 }
698 if (VertexInputBindingDescription) {
699 delete[] VertexInputBindingDescription;
700 }
701 }
702
703 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600704 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription, AttributeCount);
705 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription, BindingCount);
Mark Muellerdfe37552016-07-07 14:47:42 -0600706 return true;
707 }
708
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600709 void BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount = 0, VkDeviceSize *aOffsetList = nullptr) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600710 VkDeviceSize *offsetList;
711 unsigned offsetCount;
712
713 if (aOffsetCount) {
714 offsetList = aOffsetList;
715 offsetCount = aOffsetCount;
716 } else {
717 offsetList = new VkDeviceSize[1]();
718 offsetCount = 1;
719 }
720
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600721 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount, &VulkanMemoryBuffer.handle(), offsetList);
Mark Muellerdfe37552016-07-07 14:47:42 -0600722 BoundCurrent = true;
723
724 if (!aOffsetCount) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600725 delete[] offsetList;
Mark Muellerdfe37552016-07-07 14:47:42 -0600726 }
727 }
728
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600729 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600730 static uint32_t BindIdGenerator;
731
732 bool BoundCurrent;
733 unsigned AttributeCount;
734 unsigned BindingCount;
735 uint32_t BindId;
736
737 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
738 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
739 VkVertexInputBindingDescription *VertexInputBindingDescription;
740 VkConstantBufferObj VulkanMemoryBuffer;
741};
742
743uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500744// ********************************************************************************************************************
745// ********************************************************************************************************************
746// ********************************************************************************************************************
747// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600748#if PARAMETER_VALIDATION_TESTS
749TEST_F(VkLayerTest, RequiredParameter) {
750 TEST_DESCRIPTION("Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
751 "pointer, array, and array count parameters");
752
753 ASSERT_NO_FATAL_FAILURE(InitState());
754
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600755 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600756 // Specify NULL for a pointer to a handle
757 // Expected to trigger an error with
758 // parameter_validation::validate_required_pointer
759 vkGetPhysicalDeviceFeatures(gpu(), NULL);
760 m_errorMonitor->VerifyFound();
761
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600762 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
763 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600764 // Specify NULL for pointer to array count
765 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600766 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600767 m_errorMonitor->VerifyFound();
768
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600769 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter viewportCount must be greater than 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600770 // Specify 0 for a required array count
771 // Expected to trigger an error with parameter_validation::validate_array
772 VkViewport view_port = {};
773 m_commandBuffer->SetViewport(0, 0, &view_port);
774 m_errorMonitor->VerifyFound();
775
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600776 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pViewports specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600777 // Specify NULL for a required array
778 // Expected to trigger an error with parameter_validation::validate_array
779 m_commandBuffer->SetViewport(0, 1, NULL);
780 m_errorMonitor->VerifyFound();
781
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600782 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600783 // Specify VK_NULL_HANDLE for a required handle
784 // Expected to trigger an error with
785 // parameter_validation::validate_required_handle
786 vkUnmapMemory(device(), VK_NULL_HANDLE);
787 m_errorMonitor->VerifyFound();
788
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600789 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
790 "required parameter pFences[0] specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600791 // Specify VK_NULL_HANDLE for a required handle array entry
792 // Expected to trigger an error with
793 // parameter_validation::validate_required_handle_array
794 VkFence fence = VK_NULL_HANDLE;
795 vkResetFences(device(), 1, &fence);
796 m_errorMonitor->VerifyFound();
797
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600798 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600799 // Specify NULL for a required struct pointer
800 // Expected to trigger an error with
801 // parameter_validation::validate_struct_type
802 VkDeviceMemory memory = VK_NULL_HANDLE;
803 vkAllocateMemory(device(), NULL, NULL, &memory);
804 m_errorMonitor->VerifyFound();
805
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600807 // Specify 0 for a required VkFlags parameter
808 // Expected to trigger an error with parameter_validation::validate_flags
809 m_commandBuffer->SetStencilReference(0, 0);
810 m_errorMonitor->VerifyFound();
811
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600812 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 -0600813 // Specify 0 for a required VkFlags array entry
814 // Expected to trigger an error with
815 // parameter_validation::validate_flags_array
816 VkSemaphore semaphore = VK_NULL_HANDLE;
817 VkPipelineStageFlags stageFlags = 0;
818 VkSubmitInfo submitInfo = {};
819 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
820 submitInfo.waitSemaphoreCount = 1;
821 submitInfo.pWaitSemaphores = &semaphore;
822 submitInfo.pWaitDstStageMask = &stageFlags;
823 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
824 m_errorMonitor->VerifyFound();
825}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600826
Dustin Gravesfce74c02016-05-10 11:42:58 -0600827TEST_F(VkLayerTest, ReservedParameter) {
828 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
829
830 ASSERT_NO_FATAL_FAILURE(InitState());
831
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600832 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
Dustin Gravesfce74c02016-05-10 11:42:58 -0600833 // Specify 0 for a reserved VkFlags parameter
834 // Expected to trigger an error with
835 // parameter_validation::validate_reserved_flags
836 VkEvent event_handle = VK_NULL_HANDLE;
837 VkEventCreateInfo event_info = {};
838 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
839 event_info.flags = 1;
840 vkCreateEvent(device(), &event_info, NULL, &event_handle);
841 m_errorMonitor->VerifyFound();
842}
843
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600844TEST_F(VkLayerTest, InvalidStructSType) {
845 TEST_DESCRIPTION("Specify an invalid VkStructureType for a Vulkan "
846 "structure's sType field");
847
848 ASSERT_NO_FATAL_FAILURE(InitState());
849
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600850 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600851 // Zero struct memory, effectively setting sType to
852 // VK_STRUCTURE_TYPE_APPLICATION_INFO
853 // Expected to trigger an error with
854 // parameter_validation::validate_struct_type
855 VkMemoryAllocateInfo alloc_info = {};
856 VkDeviceMemory memory = VK_NULL_HANDLE;
857 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
858 m_errorMonitor->VerifyFound();
859
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600861 // Zero struct memory, effectively setting sType to
862 // VK_STRUCTURE_TYPE_APPLICATION_INFO
863 // Expected to trigger an error with
864 // parameter_validation::validate_struct_type_array
865 VkSubmitInfo submit_info = {};
866 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
867 m_errorMonitor->VerifyFound();
868}
869
870TEST_F(VkLayerTest, InvalidStructPNext) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600871 TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600872
873 ASSERT_NO_FATAL_FAILURE(InitState());
874
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600875 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600876 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be
Karl Schultz38b50992016-07-11 16:09:09 -0600877 // NULL.
878 // Need to pick a function that has no allowed pNext structure types.
879 // Expected to trigger an error with
880 // parameter_validation::validate_struct_pnext
881 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600882 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600883 // Zero-initialization will provide the correct sType
884 VkApplicationInfo app_info = {};
885 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
886 event_alloc_info.pNext = &app_info;
887 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
888 m_errorMonitor->VerifyFound();
889
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600890 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
891 " chain includes a structure with unexpected VkStructureType ");
Karl Schultz38b50992016-07-11 16:09:09 -0600892 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
893 // a function that has allowed pNext structure types and specify
894 // a structure type that is not allowed.
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600895 // Expected to trigger an error with
896 // parameter_validation::validate_struct_pnext
897 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -0600898 VkMemoryAllocateInfo memory_alloc_info = {};
899 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
900 memory_alloc_info.pNext = &app_info;
901 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600902 m_errorMonitor->VerifyFound();
903
Dustin Gravesfd1c8fe2016-07-15 11:40:20 -0600904 // Positive test to check parameter_validation and unique_objects support
905 // for NV_dedicated_allocation
906 uint32_t extension_count = 0;
907 bool supports_nv_dedicated_allocation = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600908 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
Dustin Gravesfd1c8fe2016-07-15 11:40:20 -0600909 ASSERT_VK_SUCCESS(err);
910
911 if (extension_count > 0) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600912 std::vector<VkExtensionProperties> available_extensions(extension_count);
Dustin Gravesfd1c8fe2016-07-15 11:40:20 -0600913
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600914 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
Dustin Gravesfd1c8fe2016-07-15 11:40:20 -0600915 ASSERT_VK_SUCCESS(err);
916
917 for (const auto &extension_props : available_extensions) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600918 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
Dustin Gravesfd1c8fe2016-07-15 11:40:20 -0600919 supports_nv_dedicated_allocation = true;
920 }
921 }
922 }
923
924 if (supports_nv_dedicated_allocation) {
925 m_errorMonitor->ExpectSuccess();
926
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600927 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
928 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
Dustin Gravesfd1c8fe2016-07-15 11:40:20 -0600929 dedicated_buffer_create_info.pNext = nullptr;
930 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
931
932 uint32_t queue_family_index = 0;
933 VkBufferCreateInfo buffer_create_info = {};
934 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
935 buffer_create_info.pNext = &dedicated_buffer_create_info;
936 buffer_create_info.size = 1024;
937 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
938 buffer_create_info.queueFamilyIndexCount = 1;
939 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
940
941 VkBuffer buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600942 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Dustin Gravesfd1c8fe2016-07-15 11:40:20 -0600943 ASSERT_VK_SUCCESS(err);
944
945 VkMemoryRequirements memory_reqs;
946 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
947
948 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600949 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
Dustin Gravesfd1c8fe2016-07-15 11:40:20 -0600950 dedicated_memory_info.pNext = nullptr;
951 dedicated_memory_info.buffer = buffer;
952 dedicated_memory_info.image = VK_NULL_HANDLE;
953
954 VkMemoryAllocateInfo memory_info = {};
955 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
956 memory_info.pNext = &dedicated_memory_info;
957 memory_info.allocationSize = memory_reqs.size;
958
959 bool pass;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600960 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Dustin Gravesfd1c8fe2016-07-15 11:40:20 -0600961 ASSERT_TRUE(pass);
962
963 VkDeviceMemory buffer_memory;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600964 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
Dustin Gravesfd1c8fe2016-07-15 11:40:20 -0600965 ASSERT_VK_SUCCESS(err);
966
967 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
968 ASSERT_VK_SUCCESS(err);
969
970 vkDestroyBuffer(m_device->device(), buffer, NULL);
971 vkFreeMemory(m_device->device(), buffer_memory, NULL);
972
973 m_errorMonitor->VerifyNotFound();
974 }
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600975}
Dustin Graves5d33d532016-05-09 16:21:12 -0600976
977TEST_F(VkLayerTest, UnrecognizedValue) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600978 TEST_DESCRIPTION("Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
Dustin Graves5d33d532016-05-09 16:21:12 -0600979
980 ASSERT_NO_FATAL_FAILURE(InitState());
981
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600982 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not fall within the begin..end "
983 "range of the core VkFormat "
984 "enumeration tokens");
Dustin Graves5d33d532016-05-09 16:21:12 -0600985 // Specify an invalid VkFormat value
986 // Expected to trigger an error with
987 // parameter_validation::validate_ranged_enum
988 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600989 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -0600990 m_errorMonitor->VerifyFound();
991
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600992 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 -0600993 // Specify an invalid VkFlags bitmask value
994 // Expected to trigger an error with parameter_validation::validate_flags
995 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600996 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
997 static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -0600998 m_errorMonitor->VerifyFound();
999
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001000 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 -06001001 // Specify an invalid VkFlags array entry
1002 // Expected to trigger an error with
1003 // parameter_validation::validate_flags_array
1004 VkSemaphore semaphore = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001005 VkPipelineStageFlags stage_flags = static_cast<VkPipelineStageFlags>(1 << 25);
Dustin Graves5d33d532016-05-09 16:21:12 -06001006 VkSubmitInfo submit_info = {};
1007 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1008 submit_info.waitSemaphoreCount = 1;
1009 submit_info.pWaitSemaphores = &semaphore;
1010 submit_info.pWaitDstStageMask = &stage_flags;
1011 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1012 m_errorMonitor->VerifyFound();
1013
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001014 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
Dustin Graves5d33d532016-05-09 16:21:12 -06001015 // Specify an invalid VkBool32 value
1016 // Expected to trigger a warning with
1017 // parameter_validation::validate_bool32
1018 VkSampler sampler = VK_NULL_HANDLE;
1019 VkSamplerCreateInfo sampler_info = {};
1020 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1021 sampler_info.pNext = NULL;
1022 sampler_info.magFilter = VK_FILTER_NEAREST;
1023 sampler_info.minFilter = VK_FILTER_NEAREST;
1024 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1025 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1026 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1027 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1028 sampler_info.mipLodBias = 1.0;
1029 sampler_info.maxAnisotropy = 1;
1030 sampler_info.compareEnable = VK_FALSE;
1031 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1032 sampler_info.minLod = 1.0;
1033 sampler_info.maxLod = 1.0;
1034 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1035 sampler_info.unnormalizedCoordinates = VK_FALSE;
1036 // Not VK_TRUE or VK_FALSE
1037 sampler_info.anisotropyEnable = 3;
1038 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1039 m_errorMonitor->VerifyFound();
1040}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001041
1042TEST_F(VkLayerTest, FailedReturnValue) {
1043 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1044
1045 ASSERT_NO_FATAL_FAILURE(InitState());
1046
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001047 // Find an unsupported image format
1048 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1049 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1050 VkFormat format = static_cast<VkFormat>(f);
1051 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001052 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001053 unsupported = format;
1054 break;
1055 }
1056 }
1057
1058 if (unsupported != VK_FORMAT_UNDEFINED) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001059 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1060 "the requested format is not supported on this device");
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001061 // Specify an unsupported VkFormat value to generate a
1062 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1063 // Expected to trigger a warning from
1064 // parameter_validation::validate_result
1065 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001066 VkResult err = vkGetPhysicalDeviceImageFormatProperties(gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1067 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001068 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1069 m_errorMonitor->VerifyFound();
1070 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001071}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001072
1073TEST_F(VkLayerTest, UpdateBufferAlignment) {
1074 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001075 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001076
1077 ASSERT_NO_FATAL_FAILURE(InitState());
1078
1079 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1080 vk_testing::Buffer buffer;
1081 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1082
1083 BeginCommandBuffer();
1084 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001085 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001086 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1087 m_errorMonitor->VerifyFound();
1088
1089 // Introduce failure by using dataSize that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001090 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001091 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1092 m_errorMonitor->VerifyFound();
1093
1094 // Introduce failure by using dataSize that is < 0
1095 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001096 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001097 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1098 m_errorMonitor->VerifyFound();
1099
1100 // Introduce failure by using dataSize that is > 65536
1101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001102 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001103 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1104 m_errorMonitor->VerifyFound();
1105
1106 EndCommandBuffer();
1107}
1108
1109TEST_F(VkLayerTest, FillBufferAlignment) {
1110 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1111
1112 ASSERT_NO_FATAL_FAILURE(InitState());
1113
1114 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1115 vk_testing::Buffer buffer;
1116 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1117
1118 BeginCommandBuffer();
1119
1120 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001121 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001122 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1123 m_errorMonitor->VerifyFound();
1124
1125 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001126 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001127 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1128 m_errorMonitor->VerifyFound();
1129
1130 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001131 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001132 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1133 m_errorMonitor->VerifyFound();
1134
1135 EndCommandBuffer();
1136}
Dustin Graves40f35822016-06-23 11:12:53 -06001137
1138// This is a positive test. No failures are expected.
1139TEST_F(VkLayerTest, IgnoreUnrelatedDescriptor) {
1140 TEST_DESCRIPTION("Ensure that the vkUpdateDescriptorSet validation code "
1141 "is ignoring VkWriteDescriptorSet members that are not "
1142 "related to the descriptor type specified by "
1143 "VkWriteDescriptorSet::descriptorType. Correct "
1144 "validation behavior will result in the test running to "
1145 "completion without validation errors.");
1146
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001147 const uintptr_t invalid_ptr = 0xcdcdcdcd;
1148
Dustin Graves40f35822016-06-23 11:12:53 -06001149 ASSERT_NO_FATAL_FAILURE(InitState());
1150
1151 // Image Case
1152 {
1153 m_errorMonitor->ExpectSuccess();
1154
1155 VkImage image;
1156 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1157 const int32_t tex_width = 32;
1158 const int32_t tex_height = 32;
1159 VkImageCreateInfo image_create_info = {};
1160 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1161 image_create_info.pNext = NULL;
1162 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1163 image_create_info.format = tex_format;
1164 image_create_info.extent.width = tex_width;
1165 image_create_info.extent.height = tex_height;
1166 image_create_info.extent.depth = 1;
1167 image_create_info.mipLevels = 1;
1168 image_create_info.arrayLayers = 1;
1169 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis51cde412016-07-11 16:08:30 -06001170 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Dustin Graves40f35822016-06-23 11:12:53 -06001171 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1172 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001173 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Dustin Graves40f35822016-06-23 11:12:53 -06001174 ASSERT_VK_SUCCESS(err);
1175
1176 VkMemoryRequirements memory_reqs;
1177 VkDeviceMemory image_memory;
1178 bool pass;
1179 VkMemoryAllocateInfo memory_info = {};
1180 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1181 memory_info.pNext = NULL;
1182 memory_info.allocationSize = 0;
1183 memory_info.memoryTypeIndex = 0;
1184 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
1185 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001186 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Dustin Graves40f35822016-06-23 11:12:53 -06001187 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001188 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Dustin Graves40f35822016-06-23 11:12:53 -06001189 ASSERT_VK_SUCCESS(err);
1190 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
1191 ASSERT_VK_SUCCESS(err);
1192
1193 VkImageViewCreateInfo image_view_create_info = {};
1194 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
1195 image_view_create_info.image = image;
1196 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
1197 image_view_create_info.format = tex_format;
1198 image_view_create_info.subresourceRange.layerCount = 1;
1199 image_view_create_info.subresourceRange.baseMipLevel = 0;
1200 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001201 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Dustin Graves40f35822016-06-23 11:12:53 -06001202
1203 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001204 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Dustin Graves40f35822016-06-23 11:12:53 -06001205 ASSERT_VK_SUCCESS(err);
1206
1207 VkDescriptorPoolSize ds_type_count = {};
1208 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1209 ds_type_count.descriptorCount = 1;
1210
1211 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1212 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1213 ds_pool_ci.pNext = NULL;
1214 ds_pool_ci.maxSets = 1;
1215 ds_pool_ci.poolSizeCount = 1;
1216 ds_pool_ci.pPoolSizes = &ds_type_count;
1217
1218 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001219 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Dustin Graves40f35822016-06-23 11:12:53 -06001220 ASSERT_VK_SUCCESS(err);
1221
1222 VkDescriptorSetLayoutBinding dsl_binding = {};
1223 dsl_binding.binding = 0;
1224 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1225 dsl_binding.descriptorCount = 1;
1226 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1227 dsl_binding.pImmutableSamplers = NULL;
1228
1229 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001230 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Dustin Graves40f35822016-06-23 11:12:53 -06001231 ds_layout_ci.pNext = NULL;
1232 ds_layout_ci.bindingCount = 1;
1233 ds_layout_ci.pBindings = &dsl_binding;
1234 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001235 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Dustin Graves40f35822016-06-23 11:12:53 -06001236 ASSERT_VK_SUCCESS(err);
1237
1238 VkDescriptorSet descriptor_set;
1239 VkDescriptorSetAllocateInfo alloc_info = {};
1240 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1241 alloc_info.descriptorSetCount = 1;
1242 alloc_info.descriptorPool = ds_pool;
1243 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001244 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Dustin Graves40f35822016-06-23 11:12:53 -06001245 ASSERT_VK_SUCCESS(err);
1246
1247 VkDescriptorImageInfo image_info = {};
1248 image_info.imageView = view;
1249 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
1250
1251 VkWriteDescriptorSet descriptor_write;
1252 memset(&descriptor_write, 0, sizeof(descriptor_write));
1253 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1254 descriptor_write.dstSet = descriptor_set;
1255 descriptor_write.dstBinding = 0;
1256 descriptor_write.descriptorCount = 1;
1257 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1258 descriptor_write.pImageInfo = &image_info;
1259
1260 // Set pBufferInfo and pTexelBufferView to invalid values, which should
1261 // be
1262 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
1263 // This will most likely produce a crash if the parameter_validation
1264 // layer
1265 // does not correctly ignore pBufferInfo.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001266 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
1267 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001268
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001269 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Dustin Graves40f35822016-06-23 11:12:53 -06001270
1271 m_errorMonitor->VerifyNotFound();
1272
Dustin Graves40f35822016-06-23 11:12:53 -06001273 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1274 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1275 vkDestroyImageView(m_device->device(), view, NULL);
1276 vkDestroyImage(m_device->device(), image, NULL);
1277 vkFreeMemory(m_device->device(), image_memory, NULL);
1278 }
1279
1280 // Buffer Case
1281 {
1282 m_errorMonitor->ExpectSuccess();
1283
1284 VkBuffer buffer;
1285 uint32_t queue_family_index = 0;
1286 VkBufferCreateInfo buffer_create_info = {};
1287 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1288 buffer_create_info.size = 1024;
1289 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1290 buffer_create_info.queueFamilyIndexCount = 1;
1291 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1292
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001293 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Dustin Graves40f35822016-06-23 11:12:53 -06001294 ASSERT_VK_SUCCESS(err);
1295
1296 VkMemoryRequirements memory_reqs;
1297 VkDeviceMemory buffer_memory;
1298 bool pass;
1299 VkMemoryAllocateInfo memory_info = {};
1300 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1301 memory_info.pNext = NULL;
1302 memory_info.allocationSize = 0;
1303 memory_info.memoryTypeIndex = 0;
1304
1305 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1306 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001307 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Dustin Graves40f35822016-06-23 11:12:53 -06001308 ASSERT_TRUE(pass);
1309
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001310 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
Dustin Graves40f35822016-06-23 11:12:53 -06001311 ASSERT_VK_SUCCESS(err);
1312 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1313 ASSERT_VK_SUCCESS(err);
1314
1315 VkDescriptorPoolSize ds_type_count = {};
1316 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1317 ds_type_count.descriptorCount = 1;
1318
1319 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1320 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1321 ds_pool_ci.pNext = NULL;
1322 ds_pool_ci.maxSets = 1;
1323 ds_pool_ci.poolSizeCount = 1;
1324 ds_pool_ci.pPoolSizes = &ds_type_count;
1325
1326 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001327 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Dustin Graves40f35822016-06-23 11:12:53 -06001328 ASSERT_VK_SUCCESS(err);
1329
1330 VkDescriptorSetLayoutBinding dsl_binding = {};
1331 dsl_binding.binding = 0;
1332 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1333 dsl_binding.descriptorCount = 1;
1334 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1335 dsl_binding.pImmutableSamplers = NULL;
1336
1337 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001338 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Dustin Graves40f35822016-06-23 11:12:53 -06001339 ds_layout_ci.pNext = NULL;
1340 ds_layout_ci.bindingCount = 1;
1341 ds_layout_ci.pBindings = &dsl_binding;
1342 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001343 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Dustin Graves40f35822016-06-23 11:12:53 -06001344 ASSERT_VK_SUCCESS(err);
1345
1346 VkDescriptorSet descriptor_set;
1347 VkDescriptorSetAllocateInfo alloc_info = {};
1348 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1349 alloc_info.descriptorSetCount = 1;
1350 alloc_info.descriptorPool = ds_pool;
1351 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001352 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Dustin Graves40f35822016-06-23 11:12:53 -06001353 ASSERT_VK_SUCCESS(err);
1354
1355 VkDescriptorBufferInfo buffer_info = {};
1356 buffer_info.buffer = buffer;
1357 buffer_info.offset = 0;
1358 buffer_info.range = 1024;
1359
1360 VkWriteDescriptorSet descriptor_write;
1361 memset(&descriptor_write, 0, sizeof(descriptor_write));
1362 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1363 descriptor_write.dstSet = descriptor_set;
1364 descriptor_write.dstBinding = 0;
1365 descriptor_write.descriptorCount = 1;
1366 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1367 descriptor_write.pBufferInfo = &buffer_info;
1368
1369 // Set pImageInfo and pTexelBufferView to invalid values, which should
1370 // be
1371 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
1372 // This will most likely produce a crash if the parameter_validation
1373 // layer
1374 // does not correctly ignore pImageInfo.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001375 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
1376 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001377
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001378 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Dustin Graves40f35822016-06-23 11:12:53 -06001379
1380 m_errorMonitor->VerifyNotFound();
1381
1382 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
1383 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1384 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1385 vkDestroyBuffer(m_device->device(), buffer, NULL);
1386 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1387 }
1388
1389 // Texel Buffer Case
1390 {
1391 m_errorMonitor->ExpectSuccess();
1392
1393 VkBuffer buffer;
1394 uint32_t queue_family_index = 0;
1395 VkBufferCreateInfo buffer_create_info = {};
1396 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1397 buffer_create_info.size = 1024;
1398 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
1399 buffer_create_info.queueFamilyIndexCount = 1;
1400 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1401
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001402 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Dustin Graves40f35822016-06-23 11:12:53 -06001403 ASSERT_VK_SUCCESS(err);
1404
1405 VkMemoryRequirements memory_reqs;
1406 VkDeviceMemory buffer_memory;
1407 bool pass;
1408 VkMemoryAllocateInfo memory_info = {};
1409 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1410 memory_info.pNext = NULL;
1411 memory_info.allocationSize = 0;
1412 memory_info.memoryTypeIndex = 0;
1413
1414 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1415 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001416 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Dustin Graves40f35822016-06-23 11:12:53 -06001417 ASSERT_TRUE(pass);
1418
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001419 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
Dustin Graves40f35822016-06-23 11:12:53 -06001420 ASSERT_VK_SUCCESS(err);
1421 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1422 ASSERT_VK_SUCCESS(err);
1423
1424 VkBufferViewCreateInfo buff_view_ci = {};
1425 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
1426 buff_view_ci.buffer = buffer;
1427 buff_view_ci.format = VK_FORMAT_R8_UNORM;
1428 buff_view_ci.range = VK_WHOLE_SIZE;
1429 VkBufferView buffer_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001430 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
Dustin Graves40f35822016-06-23 11:12:53 -06001431
1432 VkDescriptorPoolSize ds_type_count = {};
1433 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1434 ds_type_count.descriptorCount = 1;
1435
1436 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1437 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1438 ds_pool_ci.pNext = NULL;
1439 ds_pool_ci.maxSets = 1;
1440 ds_pool_ci.poolSizeCount = 1;
1441 ds_pool_ci.pPoolSizes = &ds_type_count;
1442
1443 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001444 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Dustin Graves40f35822016-06-23 11:12:53 -06001445 ASSERT_VK_SUCCESS(err);
1446
1447 VkDescriptorSetLayoutBinding dsl_binding = {};
1448 dsl_binding.binding = 0;
1449 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1450 dsl_binding.descriptorCount = 1;
1451 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1452 dsl_binding.pImmutableSamplers = NULL;
1453
1454 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001455 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Dustin Graves40f35822016-06-23 11:12:53 -06001456 ds_layout_ci.pNext = NULL;
1457 ds_layout_ci.bindingCount = 1;
1458 ds_layout_ci.pBindings = &dsl_binding;
1459 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001460 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Dustin Graves40f35822016-06-23 11:12:53 -06001461 ASSERT_VK_SUCCESS(err);
1462
1463 VkDescriptorSet descriptor_set;
1464 VkDescriptorSetAllocateInfo alloc_info = {};
1465 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1466 alloc_info.descriptorSetCount = 1;
1467 alloc_info.descriptorPool = ds_pool;
1468 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001469 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Dustin Graves40f35822016-06-23 11:12:53 -06001470 ASSERT_VK_SUCCESS(err);
1471
1472 VkWriteDescriptorSet descriptor_write;
1473 memset(&descriptor_write, 0, sizeof(descriptor_write));
1474 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1475 descriptor_write.dstSet = descriptor_set;
1476 descriptor_write.dstBinding = 0;
1477 descriptor_write.descriptorCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001478 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Dustin Graves40f35822016-06-23 11:12:53 -06001479 descriptor_write.pTexelBufferView = &buffer_view;
1480
1481 // Set pImageInfo and pBufferInfo to invalid values, which should be
1482 // ignored for descriptorType ==
1483 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
1484 // This will most likely produce a crash if the parameter_validation
1485 // layer
1486 // does not correctly ignore pImageInfo and pBufferInfo.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001487 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
1488 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001489
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001490 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Dustin Graves40f35822016-06-23 11:12:53 -06001491
1492 m_errorMonitor->VerifyNotFound();
1493
1494 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
1495 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1496 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1497 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
1498 vkDestroyBuffer(m_device->device(), buffer, NULL);
1499 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1500 }
1501}
Cortd889ff92016-07-27 09:51:27 -07001502
1503TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1504 VkResult err;
1505
1506 TEST_DESCRIPTION("Attempt to use a non-solid polygon fill mode in a "
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001507 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001508
1509 ASSERT_NO_FATAL_FAILURE(InitState());
1510 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1511
1512 std::vector<const char *> device_extension_names;
1513 auto features = m_device->phy().features();
1514 // Artificially disable support for non-solid fill modes
1515 features.fillModeNonSolid = false;
1516 // The sacrificial device object
1517 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1518
1519 VkRenderpassObj render_pass(&test_device);
1520
1521 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1522 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1523 pipeline_layout_ci.setLayoutCount = 0;
1524 pipeline_layout_ci.pSetLayouts = NULL;
1525
1526 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001527 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001528 ASSERT_VK_SUCCESS(err);
1529
1530 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1531 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1532 rs_ci.pNext = nullptr;
1533 rs_ci.lineWidth = 1.0f;
1534 rs_ci.rasterizerDiscardEnable = true;
1535
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001536 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1537 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001538
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001539 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001540 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1541 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001542 {
1543 VkPipelineObj pipe(&test_device);
1544 pipe.AddShader(&vs);
1545 pipe.AddShader(&fs);
1546 pipe.AddColorAttachment();
1547 // Introduce failure by setting unsupported polygon mode
1548 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1549 pipe.SetRasterization(&rs_ci);
1550 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1551 }
1552 m_errorMonitor->VerifyFound();
1553
1554 // Try again with polygonMode=LINE, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001555 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1556 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001557 {
1558 VkPipelineObj pipe(&test_device);
1559 pipe.AddShader(&vs);
1560 pipe.AddShader(&fs);
1561 pipe.AddColorAttachment();
1562 // Introduce failure by setting unsupported polygon mode
1563 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1564 pipe.SetRasterization(&rs_ci);
1565 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1566 }
1567 m_errorMonitor->VerifyFound();
1568
1569 // Try again with polygonMode=FILL. No error is expected
1570 m_errorMonitor->ExpectSuccess();
1571 {
1572 VkPipelineObj pipe(&test_device);
1573 pipe.AddShader(&vs);
1574 pipe.AddShader(&fs);
1575 pipe.AddColorAttachment();
1576 // Set polygonMode to a good value
1577 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
1578 pipe.SetRasterization(&rs_ci);
1579 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1580 }
1581 m_errorMonitor->VerifyNotFound();
1582
1583 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1584}
1585
Dustin Gravesffa90fa2016-05-06 11:20:38 -06001586#endif // PARAMETER_VALIDATION_TESTS
1587
Tobin Ehlis0788f522015-05-26 16:11:58 -06001588#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001589#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001590TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001591{
1592 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001593 VkFenceCreateInfo fenceInfo = {};
1594 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1595 fenceInfo.pNext = NULL;
1596 fenceInfo.flags = 0;
1597
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001598 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001599
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001600 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001601
1602 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1603 vk_testing::Buffer buffer;
1604 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001605
Tony Barbourfe3351b2015-07-28 10:17:20 -06001606 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001607 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001608 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001609
1610 testFence.init(*m_device, fenceInfo);
1611
1612 // Bypass framework since it does the waits automatically
1613 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001614 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001615 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1616 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001617 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001618 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001619 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001620 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001621 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001622 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001623 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001624
1625 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001626 ASSERT_VK_SUCCESS( err );
1627
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001628 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001629 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001630
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001631 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001632}
1633
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001634TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001635{
1636 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001637 VkFenceCreateInfo fenceInfo = {};
1638 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1639 fenceInfo.pNext = NULL;
1640 fenceInfo.flags = 0;
1641
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001642 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001643
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001644 ASSERT_NO_FATAL_FAILURE(InitState());
1645 ASSERT_NO_FATAL_FAILURE(InitViewport());
1646 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1647
Tony Barbourfe3351b2015-07-28 10:17:20 -06001648 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001649 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001650 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001651
1652 testFence.init(*m_device, fenceInfo);
1653
1654 // Bypass framework since it does the waits automatically
1655 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001656 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001657 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1658 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001659 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001660 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001661 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001662 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001663 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001664 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001665 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001666
1667 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001668 ASSERT_VK_SUCCESS( err );
1669
Jon Ashburnf19916e2016-01-11 13:12:43 -07001670 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001671 VkCommandBufferBeginInfo info = {};
1672 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1673 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001674 info.renderPass = VK_NULL_HANDLE;
1675 info.subpass = 0;
1676 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001677 info.occlusionQueryEnable = VK_FALSE;
1678 info.queryFlags = 0;
1679 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001680
1681 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001682 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001683
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001684 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001685}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001686#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001687
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001688// This is a positive test. No failures are expected.
1689TEST_F(VkLayerTest, TestAliasedMemoryTracking) {
1690 VkResult err;
1691 bool pass;
1692
1693 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
1694 "the buffer, create an image, and bind the same memory to "
1695 "it");
1696
1697 m_errorMonitor->ExpectSuccess();
1698
1699 ASSERT_NO_FATAL_FAILURE(InitState());
1700
1701 VkBuffer buffer;
1702 VkImage image;
1703 VkDeviceMemory mem;
1704 VkMemoryRequirements mem_reqs;
1705
1706 VkBufferCreateInfo buf_info = {};
1707 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1708 buf_info.pNext = NULL;
1709 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1710 buf_info.size = 256;
1711 buf_info.queueFamilyIndexCount = 0;
1712 buf_info.pQueueFamilyIndices = NULL;
1713 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1714 buf_info.flags = 0;
1715 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1716 ASSERT_VK_SUCCESS(err);
1717
1718 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1719
1720 VkMemoryAllocateInfo alloc_info = {};
1721 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1722 alloc_info.pNext = NULL;
1723 alloc_info.memoryTypeIndex = 0;
1724
1725 // Ensure memory is big enough for both bindings
1726 alloc_info.allocationSize = 0x10000;
1727
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001728 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001729 if (!pass) {
1730 vkDestroyBuffer(m_device->device(), buffer, NULL);
1731 return;
1732 }
1733
1734 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1735 ASSERT_VK_SUCCESS(err);
1736
1737 uint8_t *pData;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001738 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001739 ASSERT_VK_SUCCESS(err);
1740
Mark Lobodzinski2abefa92016-05-05 11:45:57 -06001741 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001742
1743 vkUnmapMemory(m_device->device(), mem);
1744
1745 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1746 ASSERT_VK_SUCCESS(err);
1747
1748 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
1749 // memory. In fact, it was never used by the GPU.
1750 // Just be be sure, wait for idle.
1751 vkDestroyBuffer(m_device->device(), buffer, NULL);
1752 vkDeviceWaitIdle(m_device->device());
1753
1754 VkImageCreateInfo image_create_info = {};
1755 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1756 image_create_info.pNext = NULL;
1757 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1758 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1759 image_create_info.extent.width = 64;
1760 image_create_info.extent.height = 64;
1761 image_create_info.extent.depth = 1;
1762 image_create_info.mipLevels = 1;
1763 image_create_info.arrayLayers = 1;
1764 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1765 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1766 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1767 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1768 image_create_info.queueFamilyIndexCount = 0;
1769 image_create_info.pQueueFamilyIndices = NULL;
1770 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1771 image_create_info.flags = 0;
1772
1773 VkMemoryAllocateInfo mem_alloc = {};
1774 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1775 mem_alloc.pNext = NULL;
1776 mem_alloc.allocationSize = 0;
1777 mem_alloc.memoryTypeIndex = 0;
1778
1779 /* Create a mappable image. It will be the texture if linear images are ok
1780 * to be textures or it will be the staging image if they are not.
1781 */
1782 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1783 ASSERT_VK_SUCCESS(err);
1784
1785 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
1786
1787 mem_alloc.allocationSize = mem_reqs.size;
1788
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001789 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001790 if (!pass) {
1791 vkDestroyImage(m_device->device(), image, NULL);
1792 return;
1793 }
1794
Tobin Ehlis077ded32016-05-12 17:39:13 -06001795 // VALIDATION FAILURE:
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001796 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1797 ASSERT_VK_SUCCESS(err);
1798
1799 m_errorMonitor->VerifyNotFound();
1800
Tony Barbourdf4c0042016-06-01 15:55:43 -06001801 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001802 vkDestroyBuffer(m_device->device(), buffer, NULL);
1803 vkDestroyImage(m_device->device(), image, NULL);
1804}
1805
Tobin Ehlisf11be982016-05-11 13:52:53 -06001806TEST_F(VkLayerTest, InvalidMemoryAliasing) {
1807 TEST_DESCRIPTION("Create a buffer and image, allocate memory, and bind the "
1808 "buffer and image to memory such that they will alias.");
1809 VkResult err;
1810 bool pass;
1811 ASSERT_NO_FATAL_FAILURE(InitState());
1812
Tobin Ehlis077ded32016-05-12 17:39:13 -06001813 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001814 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001815 VkImage image2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001816 VkDeviceMemory mem; // buffer will be bound first
1817 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001818 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001819
1820 VkBufferCreateInfo buf_info = {};
1821 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1822 buf_info.pNext = NULL;
1823 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1824 buf_info.size = 256;
1825 buf_info.queueFamilyIndexCount = 0;
1826 buf_info.pQueueFamilyIndices = NULL;
1827 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1828 buf_info.flags = 0;
1829 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1830 ASSERT_VK_SUCCESS(err);
1831
Tobin Ehlis077ded32016-05-12 17:39:13 -06001832 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001833
1834 VkImageCreateInfo image_create_info = {};
1835 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1836 image_create_info.pNext = NULL;
1837 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1838 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1839 image_create_info.extent.width = 64;
1840 image_create_info.extent.height = 64;
1841 image_create_info.extent.depth = 1;
1842 image_create_info.mipLevels = 1;
1843 image_create_info.arrayLayers = 1;
1844 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001845 // Image tiling must be optimal to trigger error when aliasing linear buffer
1846 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001847 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1848 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1849 image_create_info.queueFamilyIndexCount = 0;
1850 image_create_info.pQueueFamilyIndices = NULL;
1851 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1852 image_create_info.flags = 0;
1853
Tobin Ehlisf11be982016-05-11 13:52:53 -06001854 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1855 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001856 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1857 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001858
Tobin Ehlis077ded32016-05-12 17:39:13 -06001859 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1860
1861 VkMemoryAllocateInfo alloc_info = {};
1862 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1863 alloc_info.pNext = NULL;
1864 alloc_info.memoryTypeIndex = 0;
1865 // Ensure memory is big enough for both bindings
1866 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001867 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1868 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001869 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001870 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001871 vkDestroyImage(m_device->device(), image, NULL);
1872 return;
1873 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001874 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1875 ASSERT_VK_SUCCESS(err);
1876 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1877 ASSERT_VK_SUCCESS(err);
1878
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001879 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001880 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001881 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1882 m_errorMonitor->VerifyFound();
1883
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001884 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001885 // aliasing buffer2
1886 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1887 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001888 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1889 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001890 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001891 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is aliased with non-linear image 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001893 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001894 m_errorMonitor->VerifyFound();
1895
1896 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001897 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001898 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001899 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001900 vkFreeMemory(m_device->device(), mem, NULL);
1901 vkFreeMemory(m_device->device(), mem_img, NULL);
1902}
1903
Tobin Ehlis35372522016-05-12 08:32:31 -06001904TEST_F(VkLayerTest, InvalidMemoryMapping) {
1905 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1906 VkResult err;
1907 bool pass;
1908 ASSERT_NO_FATAL_FAILURE(InitState());
1909
1910 VkBuffer buffer;
1911 VkDeviceMemory mem;
1912 VkMemoryRequirements mem_reqs;
1913
1914 VkBufferCreateInfo buf_info = {};
1915 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1916 buf_info.pNext = NULL;
1917 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1918 buf_info.size = 256;
1919 buf_info.queueFamilyIndexCount = 0;
1920 buf_info.pQueueFamilyIndices = NULL;
1921 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1922 buf_info.flags = 0;
1923 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1924 ASSERT_VK_SUCCESS(err);
1925
1926 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1927 VkMemoryAllocateInfo alloc_info = {};
1928 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1929 alloc_info.pNext = NULL;
1930 alloc_info.memoryTypeIndex = 0;
1931
1932 // Ensure memory is big enough for both bindings
1933 static const VkDeviceSize allocation_size = 0x10000;
1934 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001935 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 -06001936 if (!pass) {
1937 vkDestroyBuffer(m_device->device(), buffer, NULL);
1938 return;
1939 }
1940 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1941 ASSERT_VK_SUCCESS(err);
1942
1943 uint8_t *pData;
1944 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001945 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 -06001946 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1947 m_errorMonitor->VerifyFound();
1948 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001949 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001950 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001951 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1952 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1953 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001954 m_errorMonitor->VerifyFound();
1955
1956 // Unmap the memory to avoid re-map error
1957 vkUnmapMemory(m_device->device(), mem);
1958 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1960 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1961 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001962 m_errorMonitor->VerifyFound();
1963 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001964 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1965 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001966 m_errorMonitor->VerifyFound();
1967 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001968 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001969 vkUnmapMemory(m_device->device(), mem);
1970 m_errorMonitor->VerifyFound();
1971 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001972 err = vkMapMemory(m_device->device(), mem, 16, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001973 ASSERT_VK_SUCCESS(err);
1974 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001975 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001976 mmr.memory = mem;
1977 mmr.offset = 15; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001978 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, ") is less than Memory Object's offset (");
Tobin Ehlis35372522016-05-12 08:32:31 -06001979 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1980 m_errorMonitor->VerifyFound();
1981 // Now flush range that oversteps mapped range
1982 vkUnmapMemory(m_device->device(), mem);
1983 err = vkMapMemory(m_device->device(), mem, 0, 256, 0, (void **)&pData);
1984 ASSERT_VK_SUCCESS(err);
1985 mmr.offset = 16;
1986 mmr.size = 256; // flushing bounds (272) exceed mapped bounds (256)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001987 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, ") exceeds the Memory Object's upper-bound (");
Tobin Ehlis35372522016-05-12 08:32:31 -06001988 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1989 m_errorMonitor->VerifyFound();
1990
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001991 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1992 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001993 if (!pass) {
1994 vkFreeMemory(m_device->device(), mem, NULL);
1995 vkDestroyBuffer(m_device->device(), buffer, NULL);
1996 return;
1997 }
1998 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1999 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
2000
2001 vkDestroyBuffer(m_device->device(), buffer, NULL);
2002 vkFreeMemory(m_device->device(), mem, NULL);
2003}
2004
Mark Lobodzinski1f515922016-08-16 10:03:30 -06002005TEST_F(VkLayerTest, NonCoherentMemoryMapping) {
2006
2007 TEST_DESCRIPTION("Ensure that validations handling of non-coherent memory "
2008 "mapping while using VK_WHOLE_SIZE does not cause access "
2009 "violations");
2010 VkResult err;
2011 uint8_t *pData;
2012 ASSERT_NO_FATAL_FAILURE(InitState());
2013
2014 VkDeviceMemory mem;
2015 VkMemoryRequirements mem_reqs;
2016 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
2017 VkMemoryAllocateInfo alloc_info = {};
2018 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2019 alloc_info.pNext = NULL;
2020 alloc_info.memoryTypeIndex = 0;
2021
2022 static const VkDeviceSize allocation_size = 0x1000;
2023 alloc_info.allocationSize = allocation_size;
2024
2025 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002026 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
2027 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski1f515922016-08-16 10:03:30 -06002028 if (!pass) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002029 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
2030 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
2031 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski1f515922016-08-16 10:03:30 -06002032 if (!pass) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002033 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
2034 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
2035 VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
2036 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski1f515922016-08-16 10:03:30 -06002037 if (!pass) {
2038 return;
2039 }
2040 }
2041 }
2042
2043 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
2044 ASSERT_VK_SUCCESS(err);
2045
2046 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire
2047 // mapped range
2048 m_errorMonitor->ExpectSuccess();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002049 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski1f515922016-08-16 10:03:30 -06002050 ASSERT_VK_SUCCESS(err);
2051 VkMappedMemoryRange mmr = {};
2052 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
2053 mmr.memory = mem;
2054 mmr.offset = 0;
2055 mmr.size = VK_WHOLE_SIZE;
2056 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2057 ASSERT_VK_SUCCESS(err);
2058 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
2059 ASSERT_VK_SUCCESS(err);
2060 m_errorMonitor->VerifyNotFound();
2061 vkUnmapMemory(m_device->device(), mem);
2062
2063 // Map/Flush/Invalidate using WHOLE_SIZE and a prime offset and entire
2064 // mapped range
2065 m_errorMonitor->ExpectSuccess();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002066 err = vkMapMemory(m_device->device(), mem, 13, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski1f515922016-08-16 10:03:30 -06002067 ASSERT_VK_SUCCESS(err);
2068 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
2069 mmr.memory = mem;
2070 mmr.offset = 13;
2071 mmr.size = VK_WHOLE_SIZE;
2072 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2073 ASSERT_VK_SUCCESS(err);
2074 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
2075 ASSERT_VK_SUCCESS(err);
2076 m_errorMonitor->VerifyNotFound();
2077 vkUnmapMemory(m_device->device(), mem);
2078
2079 // Map with prime offset and size
2080 // Flush/Invalidate subrange of mapped area with prime offset and size
2081 m_errorMonitor->ExpectSuccess();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002082 err = vkMapMemory(m_device->device(), mem, allocation_size - 137, 109, 0, (void **)&pData);
Mark Lobodzinski1f515922016-08-16 10:03:30 -06002083 ASSERT_VK_SUCCESS(err);
2084 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
2085 mmr.memory = mem;
2086 mmr.offset = allocation_size - 107;
2087 mmr.size = 61;
2088 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2089 ASSERT_VK_SUCCESS(err);
2090 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
2091 ASSERT_VK_SUCCESS(err);
2092 m_errorMonitor->VerifyNotFound();
2093 vkUnmapMemory(m_device->device(), mem);
2094
Tobin Ehlisec19d472016-10-05 15:07:24 -06002095 // Map without offset and flush WHOLE_SIZE with two separate offsets
2096 m_errorMonitor->ExpectSuccess();
2097 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
2098 ASSERT_VK_SUCCESS(err);
2099 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
2100 mmr.memory = mem;
2101 mmr.offset = allocation_size - 100;
2102 mmr.size = VK_WHOLE_SIZE;
2103 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2104 ASSERT_VK_SUCCESS(err);
2105 mmr.offset = allocation_size - 200;
2106 mmr.size = VK_WHOLE_SIZE;
2107 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2108 ASSERT_VK_SUCCESS(err);
2109 m_errorMonitor->VerifyNotFound();
2110 vkUnmapMemory(m_device->device(), mem);
2111
Mark Lobodzinski1f515922016-08-16 10:03:30 -06002112 vkFreeMemory(m_device->device(), mem, NULL);
2113}
2114
Ian Elliott1c32c772016-04-28 14:47:13 -06002115TEST_F(VkLayerTest, EnableWsiBeforeUse) {
2116 VkResult err;
2117 bool pass;
2118
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002119 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
2120 // following declaration (which is temporarily being moved below):
2121 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002122 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2123 VkSwapchainCreateInfoKHR swapchain_create_info = {};
2124 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002125 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06002126 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002127 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06002128
2129 ASSERT_NO_FATAL_FAILURE(InitState());
2130
Ian Elliott3f06ce52016-04-29 14:46:21 -06002131#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
2132#if defined(VK_USE_PLATFORM_ANDROID_KHR)
2133 // Use the functions from the VK_KHR_android_surface extension without
2134 // enabling that extension:
2135
2136 // Create a surface:
2137 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002138 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
2139 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06002140 pass = (err != VK_SUCCESS);
2141 ASSERT_TRUE(pass);
2142 m_errorMonitor->VerifyFound();
2143#endif // VK_USE_PLATFORM_ANDROID_KHR
2144
Ian Elliott3f06ce52016-04-29 14:46:21 -06002145#if defined(VK_USE_PLATFORM_MIR_KHR)
2146 // Use the functions from the VK_KHR_mir_surface extension without enabling
2147 // that extension:
2148
2149 // Create a surface:
2150 VkMirSurfaceCreateInfoKHR mir_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002151 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06002152 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
2153 pass = (err != VK_SUCCESS);
2154 ASSERT_TRUE(pass);
2155 m_errorMonitor->VerifyFound();
2156
2157 // Tell whether an mir_connection supports presentation:
2158 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002159 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
2160 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06002161 m_errorMonitor->VerifyFound();
2162#endif // VK_USE_PLATFORM_MIR_KHR
2163
Ian Elliott3f06ce52016-04-29 14:46:21 -06002164#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
2165 // Use the functions from the VK_KHR_wayland_surface extension without
2166 // enabling that extension:
2167
2168 // Create a surface:
2169 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002170 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
2171 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06002172 pass = (err != VK_SUCCESS);
2173 ASSERT_TRUE(pass);
2174 m_errorMonitor->VerifyFound();
2175
2176 // Tell whether an wayland_display supports presentation:
2177 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002178 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
2179 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06002180 m_errorMonitor->VerifyFound();
2181#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -06002182#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06002183
Ian Elliott3f06ce52016-04-29 14:46:21 -06002184#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002185 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2186 // TO NON-LINUX PLATFORMS:
2187 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06002188 // Use the functions from the VK_KHR_win32_surface extension without
2189 // enabling that extension:
2190
2191 // Create a surface:
2192 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002193 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
2194 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06002195 pass = (err != VK_SUCCESS);
2196 ASSERT_TRUE(pass);
2197 m_errorMonitor->VerifyFound();
2198
2199 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002200 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06002201 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06002202 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002203// Set this (for now, until all platforms are supported and tested):
2204#define NEED_TO_TEST_THIS_ON_PLATFORM
2205#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06002206
Ian Elliott1c32c772016-04-28 14:47:13 -06002207#if defined(VK_USE_PLATFORM_XCB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002208 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2209 // TO NON-LINUX PLATFORMS:
2210 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002211 // Use the functions from the VK_KHR_xcb_surface extension without enabling
2212 // that extension:
2213
2214 // Create a surface:
2215 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002216 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06002217 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2218 pass = (err != VK_SUCCESS);
2219 ASSERT_TRUE(pass);
2220 m_errorMonitor->VerifyFound();
2221
2222 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06002223 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06002224 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
2226 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06002227 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002228// Set this (for now, until all platforms are supported and tested):
2229#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002230#endif // VK_USE_PLATFORM_XCB_KHR
2231
Ian Elliott12630812016-04-29 14:35:43 -06002232#if defined(VK_USE_PLATFORM_XLIB_KHR)
2233 // Use the functions from the VK_KHR_xlib_surface extension without enabling
2234 // that extension:
2235
2236 // Create a surface:
2237 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002238 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06002239 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
2240 pass = (err != VK_SUCCESS);
2241 ASSERT_TRUE(pass);
2242 m_errorMonitor->VerifyFound();
2243
2244 // Tell whether an Xlib VisualID supports presentation:
2245 Display *dpy = NULL;
2246 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06002248 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
2249 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002250// Set this (for now, until all platforms are supported and tested):
2251#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06002252#endif // VK_USE_PLATFORM_XLIB_KHR
2253
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002254// Use the functions from the VK_KHR_surface extension without enabling
2255// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06002256
Ian Elliott489eec02016-05-05 14:12:44 -06002257#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002258 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002259 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06002260 vkDestroySurfaceKHR(instance(), surface, NULL);
2261 m_errorMonitor->VerifyFound();
2262
2263 // Check if surface supports presentation:
2264 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002265 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06002266 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2267 pass = (err != VK_SUCCESS);
2268 ASSERT_TRUE(pass);
2269 m_errorMonitor->VerifyFound();
2270
2271 // Check surface capabilities:
2272 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002273 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
2274 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06002275 pass = (err != VK_SUCCESS);
2276 ASSERT_TRUE(pass);
2277 m_errorMonitor->VerifyFound();
2278
2279 // Check surface formats:
2280 uint32_t format_count = 0;
2281 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
2283 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06002284 pass = (err != VK_SUCCESS);
2285 ASSERT_TRUE(pass);
2286 m_errorMonitor->VerifyFound();
2287
2288 // Check surface present modes:
2289 uint32_t present_mode_count = 0;
2290 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002291 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
2292 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06002293 pass = (err != VK_SUCCESS);
2294 ASSERT_TRUE(pass);
2295 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002296#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002297
Ian Elliott1c32c772016-04-28 14:47:13 -06002298 // Use the functions from the VK_KHR_swapchain extension without enabling
2299 // that extension:
2300
2301 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002302 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06002303 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2304 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002305 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06002306 pass = (err != VK_SUCCESS);
2307 ASSERT_TRUE(pass);
2308 m_errorMonitor->VerifyFound();
2309
2310 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002311 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
2312 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06002313 pass = (err != VK_SUCCESS);
2314 ASSERT_TRUE(pass);
2315 m_errorMonitor->VerifyFound();
2316
Chris Forbeseb7d5502016-09-13 18:19:21 +12002317 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
2318 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
2319 VkFence fence;
2320 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
2321
Ian Elliott1c32c772016-04-28 14:47:13 -06002322 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002323 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12002324 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06002325 pass = (err != VK_SUCCESS);
2326 ASSERT_TRUE(pass);
2327 m_errorMonitor->VerifyFound();
2328
Chris Forbeseb7d5502016-09-13 18:19:21 +12002329 vkDestroyFence(m_device->device(), fence, nullptr);
2330
Ian Elliott1c32c772016-04-28 14:47:13 -06002331 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002332 //
2333 // NOTE: Currently can't test this because a real swapchain is needed (as
2334 // opposed to the fake one we created) in order for the layer to lookup the
2335 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06002336
2337 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002338 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06002339 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
2340 m_errorMonitor->VerifyFound();
2341}
2342
Ian Elliott2c1daf52016-05-12 09:41:46 -06002343TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
Ian Elliott2c1daf52016-05-12 09:41:46 -06002344
Dustin Graves6c6d8982016-05-17 10:09:21 -06002345#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott2c1daf52016-05-12 09:41:46 -06002346 VkSurfaceKHR surface = VK_NULL_HANDLE;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002347
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002348 VkResult err;
2349 bool pass;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002350 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2351 VkSwapchainCreateInfoKHR swapchain_create_info = {};
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002352 // uint32_t swapchain_image_count = 0;
2353 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
2354 // uint32_t image_index = 0;
2355 // VkPresentInfoKHR present_info = {};
Ian Elliott2c1daf52016-05-12 09:41:46 -06002356
2357 ASSERT_NO_FATAL_FAILURE(InitState());
2358
2359 // Use the create function from one of the VK_KHR_*_surface extension in
2360 // order to create a surface, testing all known errors in the process,
2361 // before successfully creating a surface:
2362 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002363 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002364 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
2365 pass = (err != VK_SUCCESS);
2366 ASSERT_TRUE(pass);
2367 m_errorMonitor->VerifyFound();
2368
2369 // Next, try to create a surface with the wrong
2370 // VkXcbSurfaceCreateInfoKHR::sType:
2371 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
2372 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002373 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002374 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2375 pass = (err != VK_SUCCESS);
2376 ASSERT_TRUE(pass);
2377 m_errorMonitor->VerifyFound();
2378
Ian Elliott2c1daf52016-05-12 09:41:46 -06002379 // Create a native window, and then correctly create a surface:
2380 xcb_connection_t *connection;
2381 xcb_screen_t *screen;
2382 xcb_window_t xcb_window;
2383 xcb_intern_atom_reply_t *atom_wm_delete_window;
2384
2385 const xcb_setup_t *setup;
2386 xcb_screen_iterator_t iter;
2387 int scr;
2388 uint32_t value_mask, value_list[32];
2389 int width = 1;
2390 int height = 1;
2391
2392 connection = xcb_connect(NULL, &scr);
2393 ASSERT_TRUE(connection != NULL);
2394 setup = xcb_get_setup(connection);
2395 iter = xcb_setup_roots_iterator(setup);
2396 while (scr-- > 0)
2397 xcb_screen_next(&iter);
2398 screen = iter.data;
2399
2400 xcb_window = xcb_generate_id(connection);
2401
2402 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
2403 value_list[0] = screen->black_pixel;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002404 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002405
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002406 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
2407 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002408
2409 /* Magic code that will send notification when window is destroyed */
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002410 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
2411 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002412
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002413 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002414 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002415 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002416 free(reply);
2417
2418 xcb_map_window(connection, xcb_window);
2419
2420 // Force the x/y coordinates to 100,100 results are identical in consecutive
2421 // runs
2422 const uint32_t coords[] = {100, 100};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002423 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002424
Ian Elliott2c1daf52016-05-12 09:41:46 -06002425 // Finally, try to correctly create a surface:
2426 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
2427 xcb_create_info.pNext = NULL;
2428 xcb_create_info.flags = 0;
2429 xcb_create_info.connection = connection;
2430 xcb_create_info.window = xcb_window;
2431 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2432 pass = (err == VK_SUCCESS);
2433 ASSERT_TRUE(pass);
2434
Ian Elliott2c1daf52016-05-12 09:41:46 -06002435 // Check if surface supports presentation:
2436
2437 // 1st, do so without having queried the queue families:
2438 VkBool32 supported = false;
2439 // TODO: Get the following error to come out:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002440 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2441 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
2442 "function");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002443 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2444 pass = (err != VK_SUCCESS);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002445 // ASSERT_TRUE(pass);
2446 // m_errorMonitor->VerifyFound();
Ian Elliott2c1daf52016-05-12 09:41:46 -06002447
2448 // Next, query a queue family index that's too large:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002449 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
2450 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002451 pass = (err != VK_SUCCESS);
2452 ASSERT_TRUE(pass);
2453 m_errorMonitor->VerifyFound();
2454
2455 // Finally, do so correctly:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002456 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2457 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002458 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2459 pass = (err == VK_SUCCESS);
2460 ASSERT_TRUE(pass);
2461
Ian Elliott2c1daf52016-05-12 09:41:46 -06002462 // Before proceeding, try to create a swapchain without having called
2463 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
2464 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2465 swapchain_create_info.pNext = NULL;
2466 swapchain_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002467 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2468 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
2469 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002470 pass = (err != VK_SUCCESS);
2471 ASSERT_TRUE(pass);
2472 m_errorMonitor->VerifyFound();
2473
Ian Elliott2c1daf52016-05-12 09:41:46 -06002474 // Get the surface capabilities:
2475 VkSurfaceCapabilitiesKHR surface_capabilities;
2476
2477 // Do so correctly (only error logged by this entrypoint is if the
2478 // extension isn't enabled):
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002479 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002480 pass = (err == VK_SUCCESS);
2481 ASSERT_TRUE(pass);
2482
Ian Elliott2c1daf52016-05-12 09:41:46 -06002483 // Get the surface formats:
2484 uint32_t surface_format_count;
2485
2486 // First, try without a pointer to surface_format_count:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002487 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
2488 "specified as NULL");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002489 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
2490 pass = (err == VK_SUCCESS);
2491 ASSERT_TRUE(pass);
2492 m_errorMonitor->VerifyFound();
2493
2494 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
2495 // correctly done a 1st try (to get the count):
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002496 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002497 surface_format_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002498 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002499 pass = (err == VK_SUCCESS);
2500 ASSERT_TRUE(pass);
2501 m_errorMonitor->VerifyFound();
2502
2503 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002504 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002505 pass = (err == VK_SUCCESS);
2506 ASSERT_TRUE(pass);
2507
2508 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002509 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002510
2511 // Next, do a 2nd try with surface_format_count being set too high:
2512 surface_format_count += 5;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002513 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
2514 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002515 pass = (err == VK_SUCCESS);
2516 ASSERT_TRUE(pass);
2517 m_errorMonitor->VerifyFound();
2518
2519 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002520 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002521 pass = (err == VK_SUCCESS);
2522 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002523 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002524 pass = (err == VK_SUCCESS);
2525 ASSERT_TRUE(pass);
2526
Ian Elliott2c1daf52016-05-12 09:41:46 -06002527 // Get the surface present modes:
2528 uint32_t surface_present_mode_count;
2529
2530 // First, try without a pointer to surface_format_count:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002531 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
2532 "specified as NULL");
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002533
Ian Elliott2c1daf52016-05-12 09:41:46 -06002534 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
2535 pass = (err == VK_SUCCESS);
2536 ASSERT_TRUE(pass);
2537 m_errorMonitor->VerifyFound();
2538
2539 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
2540 // correctly done a 1st try (to get the count):
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002541 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002542 surface_present_mode_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002543 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
2544 (VkPresentModeKHR *)&surface_present_mode_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002545 pass = (err == VK_SUCCESS);
2546 ASSERT_TRUE(pass);
2547 m_errorMonitor->VerifyFound();
2548
2549 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002550 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002551 pass = (err == VK_SUCCESS);
2552 ASSERT_TRUE(pass);
2553
2554 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002555 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002556
2557 // Next, do a 2nd try with surface_format_count being set too high:
2558 surface_present_mode_count += 5;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002559 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
2560 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002561 pass = (err == VK_SUCCESS);
2562 ASSERT_TRUE(pass);
2563 m_errorMonitor->VerifyFound();
2564
2565 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002566 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002567 pass = (err == VK_SUCCESS);
2568 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002569 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002570 pass = (err == VK_SUCCESS);
2571 ASSERT_TRUE(pass);
2572
Ian Elliott2c1daf52016-05-12 09:41:46 -06002573 // Create a swapchain:
2574
2575 // First, try without a pointer to swapchain_create_info:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002576 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
2577 "specified as NULL");
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002578
Ian Elliott2c1daf52016-05-12 09:41:46 -06002579 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
2580 pass = (err != VK_SUCCESS);
2581 ASSERT_TRUE(pass);
2582 m_errorMonitor->VerifyFound();
2583
2584 // Next, call with a non-NULL swapchain_create_info, that has the wrong
2585 // sType:
2586 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002587 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002588
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002589 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002590 pass = (err != VK_SUCCESS);
2591 ASSERT_TRUE(pass);
2592 m_errorMonitor->VerifyFound();
2593
2594 // Next, call with a NULL swapchain pointer:
2595 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2596 swapchain_create_info.pNext = NULL;
2597 swapchain_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002598 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
2599 "specified as NULL");
Mark Lobodzinskib02ea642016-08-17 13:03:57 -06002600
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002601 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002602 pass = (err != VK_SUCCESS);
2603 ASSERT_TRUE(pass);
2604 m_errorMonitor->VerifyFound();
2605
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002606 // TODO: Enhance swapchain layer so that
2607 // swapchain_create_info.queueFamilyIndexCount is checked against something?
Ian Elliott2c1daf52016-05-12 09:41:46 -06002608
2609 // Next, call with a queue family index that's too large:
2610 uint32_t queueFamilyIndex[2] = {100000, 0};
2611 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2612 swapchain_create_info.queueFamilyIndexCount = 2;
2613 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002614 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
2615 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002616 pass = (err != VK_SUCCESS);
2617 ASSERT_TRUE(pass);
2618 m_errorMonitor->VerifyFound();
2619
2620 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
2621 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2622 swapchain_create_info.queueFamilyIndexCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002623 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2624 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
2625 "pCreateInfo->pQueueFamilyIndices).");
2626 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002627 pass = (err != VK_SUCCESS);
2628 ASSERT_TRUE(pass);
2629 m_errorMonitor->VerifyFound();
2630
2631 // Next, call with an invalid imageSharingMode:
2632 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
2633 swapchain_create_info.queueFamilyIndexCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002634 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2635 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
2636 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002637 pass = (err != VK_SUCCESS);
2638 ASSERT_TRUE(pass);
2639 m_errorMonitor->VerifyFound();
2640 // Fix for the future:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002641 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2642 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002643 swapchain_create_info.queueFamilyIndexCount = 0;
2644 queueFamilyIndex[0] = 0;
2645 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
2646
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002647 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
Ian Elliott2c1daf52016-05-12 09:41:46 -06002648 // Get the images from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002649 // Acquire an image from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002650 // Present an image to a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002651 // Destroy the swapchain:
2652
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002653 // TODOs:
2654 //
2655 // - Try destroying the device without first destroying the swapchain
2656 //
2657 // - Try destroying the device without first destroying the surface
2658 //
2659 // - Try destroying the surface without first destroying the swapchain
Ian Elliott2c1daf52016-05-12 09:41:46 -06002660
2661 // Destroy the surface:
2662 vkDestroySurfaceKHR(instance(), surface, NULL);
2663
Ian Elliott2c1daf52016-05-12 09:41:46 -06002664 // Tear down the window:
2665 xcb_destroy_window(connection, xcb_window);
2666 xcb_disconnect(connection);
2667
2668#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002669 return;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002670#endif // VK_USE_PLATFORM_XCB_KHR
2671}
2672
Karl Schultz6addd812016-02-02 17:17:23 -07002673TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
2674 VkResult err;
2675 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002676
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002677 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2678 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002679
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002680 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002681
2682 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002683 VkImage image;
2684 VkDeviceMemory mem;
2685 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002686
Karl Schultz6addd812016-02-02 17:17:23 -07002687 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2688 const int32_t tex_width = 32;
2689 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002690
Tony Barboureb254902015-07-15 12:50:33 -06002691 VkImageCreateInfo image_create_info = {};
2692 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002693 image_create_info.pNext = NULL;
2694 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2695 image_create_info.format = tex_format;
2696 image_create_info.extent.width = tex_width;
2697 image_create_info.extent.height = tex_height;
2698 image_create_info.extent.depth = 1;
2699 image_create_info.mipLevels = 1;
2700 image_create_info.arrayLayers = 1;
2701 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2702 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2703 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2704 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12002705 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002706
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002707 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002708 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002709 mem_alloc.pNext = NULL;
2710 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002711
Chia-I Wuf7458c52015-10-26 21:10:41 +08002712 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002713 ASSERT_VK_SUCCESS(err);
2714
Karl Schultz6addd812016-02-02 17:17:23 -07002715 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002716
Mark Lobodzinski23065352015-05-29 09:32:35 -05002717 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002718
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002719 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 -07002720 if (!pass) { // If we can't find any unmappable memory this test doesn't
2721 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002722 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002723 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002724 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002725
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002726 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002727 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002728 ASSERT_VK_SUCCESS(err);
2729
2730 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002731 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002732 ASSERT_VK_SUCCESS(err);
2733
2734 // Map memory as if to initialize the image
2735 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002736 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002737
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002738 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002739
Chia-I Wuf7458c52015-10-26 21:10:41 +08002740 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002741 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002742}
2743
Karl Schultz6addd812016-02-02 17:17:23 -07002744TEST_F(VkLayerTest, RebindMemory) {
2745 VkResult err;
2746 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002747
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002748 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002749
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002750 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002751
2752 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002753 VkImage image;
2754 VkDeviceMemory mem1;
2755 VkDeviceMemory mem2;
2756 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002757
Karl Schultz6addd812016-02-02 17:17:23 -07002758 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2759 const int32_t tex_width = 32;
2760 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002761
Tony Barboureb254902015-07-15 12:50:33 -06002762 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002763 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2764 image_create_info.pNext = NULL;
2765 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2766 image_create_info.format = tex_format;
2767 image_create_info.extent.width = tex_width;
2768 image_create_info.extent.height = tex_height;
2769 image_create_info.extent.depth = 1;
2770 image_create_info.mipLevels = 1;
2771 image_create_info.arrayLayers = 1;
2772 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2773 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2774 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2775 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002776
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002777 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002778 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2779 mem_alloc.pNext = NULL;
2780 mem_alloc.allocationSize = 0;
2781 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002782
Karl Schultz6addd812016-02-02 17:17:23 -07002783 // Introduce failure, do NOT set memProps to
2784 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002785 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002786 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002787 ASSERT_VK_SUCCESS(err);
2788
Karl Schultz6addd812016-02-02 17:17:23 -07002789 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002790
2791 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002792 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002793 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002794
2795 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002796 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002797 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002798 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002799 ASSERT_VK_SUCCESS(err);
2800
2801 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002802 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002803 ASSERT_VK_SUCCESS(err);
2804
Karl Schultz6addd812016-02-02 17:17:23 -07002805 // Introduce validation failure, try to bind a different memory object to
2806 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002807 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002808
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002809 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002810
Chia-I Wuf7458c52015-10-26 21:10:41 +08002811 vkDestroyImage(m_device->device(), image, NULL);
2812 vkFreeMemory(m_device->device(), mem1, NULL);
2813 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002814}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002815
Karl Schultz6addd812016-02-02 17:17:23 -07002816TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002817 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002818
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
2820 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002821
2822 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002823 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2824 fenceInfo.pNext = NULL;
2825 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002826
Tony Barbour300a6082015-04-07 13:44:53 -06002827 ASSERT_NO_FATAL_FAILURE(InitState());
2828 ASSERT_NO_FATAL_FAILURE(InitViewport());
2829 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2830
Tony Barbourfe3351b2015-07-28 10:17:20 -06002831 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002832 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06002833 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002834
2835 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002836
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002837 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002838 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2839 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002840 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002841 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002842 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002843 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002844 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002845 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002846 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002847
2848 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002849 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002850
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002851 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002852}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002853// This is a positive test. We used to expect error in this case but spec now
2854// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07002855TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002856 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002857 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002858 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002859 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2860 fenceInfo.pNext = NULL;
2861
Tony Barbour0b4d9562015-04-09 10:48:04 -06002862 ASSERT_NO_FATAL_FAILURE(InitState());
2863 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08002864 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002865 VkResult result = vkResetFences(m_device->device(), 1, fences);
2866 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06002867
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002868 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06002869}
Tobin Ehlis56ab9022016-08-17 17:59:31 -06002870#if 0 // A few devices have issues with this test so disabling for now
Chris Forbese70b7d32016-06-15 15:49:12 +12002871TEST_F(VkLayerTest, LongFenceChain)
2872{
2873 m_errorMonitor->ExpectSuccess();
2874
2875 ASSERT_NO_FATAL_FAILURE(InitState());
2876 VkResult err;
2877
2878 std::vector<VkFence> fences;
2879
2880 const int chainLength = 32768;
2881
2882 for (int i = 0; i < chainLength; i++) {
2883 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
2884 VkFence fence;
2885 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
2886 ASSERT_VK_SUCCESS(err);
2887
2888 fences.push_back(fence);
2889
2890 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
2891 0, nullptr, 0, nullptr };
2892 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
2893 ASSERT_VK_SUCCESS(err);
2894
2895 }
2896
2897 // BOOM, stack overflow.
2898 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
2899
2900 for (auto fence : fences)
2901 vkDestroyFence(m_device->device(), fence, nullptr);
2902
2903 m_errorMonitor->VerifyNotFound();
2904}
Tobin Ehlis56ab9022016-08-17 17:59:31 -06002905#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002906TEST_F(VkLayerTest, CommandBufferSimultaneousUseSync) {
Chris Forbes18127d12016-06-08 16:52:28 +12002907 m_errorMonitor->ExpectSuccess();
2908
2909 ASSERT_NO_FATAL_FAILURE(InitState());
2910 VkResult err;
2911
2912 // Record (empty!) command buffer that can be submitted multiple times
2913 // simultaneously.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002914 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
2915 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Chris Forbes18127d12016-06-08 16:52:28 +12002916 m_commandBuffer->BeginCommandBuffer(&cbbi);
2917 m_commandBuffer->EndCommandBuffer();
2918
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002919 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Chris Forbes18127d12016-06-08 16:52:28 +12002920 VkFence fence;
2921 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
2922 ASSERT_VK_SUCCESS(err);
2923
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002924 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Chris Forbes18127d12016-06-08 16:52:28 +12002925 VkSemaphore s1, s2;
2926 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
2927 ASSERT_VK_SUCCESS(err);
2928 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
2929 ASSERT_VK_SUCCESS(err);
2930
2931 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002932 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Chris Forbes18127d12016-06-08 16:52:28 +12002933 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
2934 ASSERT_VK_SUCCESS(err);
2935
2936 // Submit CB again, signaling s2.
2937 si.pSignalSemaphores = &s2;
2938 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
2939 ASSERT_VK_SUCCESS(err);
2940
2941 // Wait for fence.
2942 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
2943 ASSERT_VK_SUCCESS(err);
2944
2945 // CB is still in flight from second submission, but semaphore s1 is no
2946 // longer in flight. delete it.
2947 vkDestroySemaphore(m_device->device(), s1, nullptr);
2948
2949 m_errorMonitor->VerifyNotFound();
2950
2951 // Force device idle and clean up remaining objects
2952 vkDeviceWaitIdle(m_device->device());
2953 vkDestroySemaphore(m_device->device(), s2, nullptr);
2954 vkDestroyFence(m_device->device(), fence, nullptr);
2955}
2956
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002957TEST_F(VkLayerTest, FenceCreateSignaledWaitHandling) {
Chris Forbes4e44c912016-06-16 10:20:00 +12002958 m_errorMonitor->ExpectSuccess();
2959
2960 ASSERT_NO_FATAL_FAILURE(InitState());
2961 VkResult err;
2962
2963 // A fence created signaled
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002964 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Chris Forbes4e44c912016-06-16 10:20:00 +12002965 VkFence f1;
2966 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
2967 ASSERT_VK_SUCCESS(err);
2968
2969 // A fence created not
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002970 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Chris Forbes4e44c912016-06-16 10:20:00 +12002971 VkFence f2;
2972 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
2973 ASSERT_VK_SUCCESS(err);
2974
2975 // Submit the unsignaled fence
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002976 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Chris Forbes4e44c912016-06-16 10:20:00 +12002977 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
2978
2979 // Wait on both fences, with signaled first.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002980 VkFence fences[] = {f1, f2};
Chris Forbes4e44c912016-06-16 10:20:00 +12002981 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
2982
2983 // Should have both retired!
2984 vkDestroyFence(m_device->device(), f1, nullptr);
2985 vkDestroyFence(m_device->device(), f2, nullptr);
2986
2987 m_errorMonitor->VerifyNotFound();
2988}
2989
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002990TEST_F(VkLayerTest, InvalidUsageBits) {
2991 TEST_DESCRIPTION("Specify wrong usage for image then create conflicting view of image "
2992 "Initialize buffer with wrong usage then perform copy expecting errors "
2993 "from both the image and the buffer (2 calls)");
2994 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002995
2996 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06002997 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06002998 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002999 image.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06003000 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06003001
Tony Barbourf92621a2016-05-02 14:28:12 -06003002 VkImageView dsv;
3003 VkImageViewCreateInfo dsvci = {};
3004 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3005 dsvci.image = image.handle();
3006 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3007 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
3008 dsvci.subresourceRange.layerCount = 1;
3009 dsvci.subresourceRange.baseMipLevel = 0;
3010 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003011 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06003012
Tony Barbourf92621a2016-05-02 14:28:12 -06003013 // Create a view with depth / stencil aspect for image with different usage
3014 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003015
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003016 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06003017
3018 // Initialize buffer with TRANSFER_DST usage
3019 vk_testing::Buffer buffer;
3020 VkMemoryPropertyFlags reqs = 0;
3021 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3022 VkBufferImageCopy region = {};
3023 region.bufferRowLength = 128;
3024 region.bufferImageHeight = 128;
3025 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3026 region.imageSubresource.layerCount = 1;
3027 region.imageExtent.height = 16;
3028 region.imageExtent.width = 16;
3029 region.imageExtent.depth = 1;
3030
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003031 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for buffer ");
Tony Barbourf92621a2016-05-02 14:28:12 -06003032 // Buffer usage not set to TRANSFER_SRC and image usage not set to
3033 // TRANSFER_DST
3034 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003035 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
3036 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06003037 m_errorMonitor->VerifyFound();
3038
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003039 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for image ");
3040 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
3041 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06003042 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06003043}
Tony Barbour75d79f02016-08-30 09:39:07 -06003044
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003045TEST_F(VkLayerTest, ValidUsage) {
3046 TEST_DESCRIPTION("Verify that creating an image view from an image with valid usage "
3047 "doesn't generate validation errors");
Tony Barbour75d79f02016-08-30 09:39:07 -06003048
3049 ASSERT_NO_FATAL_FAILURE(InitState());
3050
3051 m_errorMonitor->ExpectSuccess();
3052 // Verify that we can create a view with usage INPUT_ATTACHMENT
3053 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003054 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour75d79f02016-08-30 09:39:07 -06003055 ASSERT_TRUE(image.initialized());
3056 VkImageView imageView;
3057 VkImageViewCreateInfo ivci = {};
3058 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3059 ivci.image = image.handle();
3060 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3061 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
3062 ivci.subresourceRange.layerCount = 1;
3063 ivci.subresourceRange.baseMipLevel = 0;
3064 ivci.subresourceRange.levelCount = 1;
3065 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3066
3067 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
3068 m_errorMonitor->VerifyNotFound();
3069 vkDestroyImageView(m_device->device(), imageView, NULL);
3070}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003071#endif // MEM_TRACKER_TESTS
3072
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06003073#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003074
3075TEST_F(VkLayerTest, LeakAnObject) {
3076 VkResult err;
3077
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003078 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003079
3080 // Note that we have to create a new device since destroying the
3081 // framework's device causes Teardown() to fail and just calling Teardown
3082 // will destroy the errorMonitor.
3083
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003084 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003085
3086 ASSERT_NO_FATAL_FAILURE(InitState());
3087
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003088 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003089 std::vector<VkDeviceQueueCreateInfo> queue_info;
3090 queue_info.reserve(queue_props.size());
3091 std::vector<std::vector<float>> queue_priorities;
3092 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
3093 VkDeviceQueueCreateInfo qi = {};
3094 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
3095 qi.pNext = NULL;
3096 qi.queueFamilyIndex = i;
3097 qi.queueCount = queue_props[i].queueCount;
3098 queue_priorities.emplace_back(qi.queueCount, 0.0f);
3099 qi.pQueuePriorities = queue_priorities[i].data();
3100 queue_info.push_back(qi);
3101 }
3102
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003103 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003104
3105 // The sacrificial device object
3106 VkDevice testDevice;
3107 VkDeviceCreateInfo device_create_info = {};
3108 auto features = m_device->phy().features();
3109 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
3110 device_create_info.pNext = NULL;
3111 device_create_info.queueCreateInfoCount = queue_info.size();
3112 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06003113 device_create_info.enabledLayerCount = 0;
3114 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003115 device_create_info.pEnabledFeatures = &features;
3116 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
3117 ASSERT_VK_SUCCESS(err);
3118
3119 VkFence fence;
3120 VkFenceCreateInfo fence_create_info = {};
3121 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3122 fence_create_info.pNext = NULL;
3123 fence_create_info.flags = 0;
3124 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
3125 ASSERT_VK_SUCCESS(err);
3126
3127 // Induce failure by not calling vkDestroyFence
3128 vkDestroyDevice(testDevice, NULL);
3129 m_errorMonitor->VerifyFound();
3130}
3131
3132TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
3133
3134 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
3135 "attempt to delete them from another.");
3136
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003137 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003138
Cody Northropc31a84f2016-08-22 10:41:47 -06003139 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003140 VkCommandPool command_pool_one;
3141 VkCommandPool command_pool_two;
3142
3143 VkCommandPoolCreateInfo pool_create_info{};
3144 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3145 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3146 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3147
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003148 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003149
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003150 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003151
3152 VkCommandBuffer command_buffer[9];
3153 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003154 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003155 command_buffer_allocate_info.commandPool = command_pool_one;
3156 command_buffer_allocate_info.commandBufferCount = 9;
3157 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003158 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003159
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003160 vkFreeCommandBuffers(m_device->device(), command_pool_two, 4, &command_buffer[3]);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003161
3162 m_errorMonitor->VerifyFound();
3163
3164 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
3165 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
3166}
3167
3168TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
3169 VkResult err;
3170
3171 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003172 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003173
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003174 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003175
3176 ASSERT_NO_FATAL_FAILURE(InitState());
3177 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3178
3179 VkDescriptorPoolSize ds_type_count = {};
3180 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
3181 ds_type_count.descriptorCount = 1;
3182
3183 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3184 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3185 ds_pool_ci.pNext = NULL;
3186 ds_pool_ci.flags = 0;
3187 ds_pool_ci.maxSets = 1;
3188 ds_pool_ci.poolSizeCount = 1;
3189 ds_pool_ci.pPoolSizes = &ds_type_count;
3190
3191 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003192 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003193 ASSERT_VK_SUCCESS(err);
3194
3195 // Create a second descriptor pool
3196 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003197 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003198 ASSERT_VK_SUCCESS(err);
3199
3200 VkDescriptorSetLayoutBinding dsl_binding = {};
3201 dsl_binding.binding = 0;
3202 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3203 dsl_binding.descriptorCount = 1;
3204 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3205 dsl_binding.pImmutableSamplers = NULL;
3206
3207 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3208 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3209 ds_layout_ci.pNext = NULL;
3210 ds_layout_ci.bindingCount = 1;
3211 ds_layout_ci.pBindings = &dsl_binding;
3212
3213 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003214 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003215 ASSERT_VK_SUCCESS(err);
3216
3217 VkDescriptorSet descriptorSet;
3218 VkDescriptorSetAllocateInfo alloc_info = {};
3219 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3220 alloc_info.descriptorSetCount = 1;
3221 alloc_info.descriptorPool = ds_pool_one;
3222 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003223 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003224 ASSERT_VK_SUCCESS(err);
3225
3226 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
3227
3228 m_errorMonitor->VerifyFound();
3229
3230 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3231 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
3232 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
3233}
3234
3235TEST_F(VkLayerTest, CreateUnknownObject) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003236 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid Image Object ");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003237
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003238 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003239
3240 ASSERT_NO_FATAL_FAILURE(InitState());
3241
3242 // Pass bogus handle into GetImageMemoryRequirements
3243 VkMemoryRequirements mem_reqs;
3244 uint64_t fakeImageHandle = 0xCADECADE;
3245 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
3246
3247 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
3248
3249 m_errorMonitor->VerifyFound();
3250}
3251
Karl Schultz6addd812016-02-02 17:17:23 -07003252TEST_F(VkLayerTest, PipelineNotBound) {
3253 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003254
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003255 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003256
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003257 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid Pipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003258
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003259 ASSERT_NO_FATAL_FAILURE(InitState());
3260 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003261
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003262 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003263 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3264 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003265
3266 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003267 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3268 ds_pool_ci.pNext = NULL;
3269 ds_pool_ci.maxSets = 1;
3270 ds_pool_ci.poolSizeCount = 1;
3271 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003272
3273 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003274 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003275 ASSERT_VK_SUCCESS(err);
3276
3277 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003278 dsl_binding.binding = 0;
3279 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3280 dsl_binding.descriptorCount = 1;
3281 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3282 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003283
3284 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003285 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3286 ds_layout_ci.pNext = NULL;
3287 ds_layout_ci.bindingCount = 1;
3288 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003289
3290 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003291 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003292 ASSERT_VK_SUCCESS(err);
3293
3294 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003295 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003296 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003297 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003298 alloc_info.descriptorPool = ds_pool;
3299 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003300 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003301 ASSERT_VK_SUCCESS(err);
3302
3303 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003304 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3305 pipeline_layout_ci.pNext = NULL;
3306 pipeline_layout_ci.setLayoutCount = 1;
3307 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003308
3309 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003310 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003311 ASSERT_VK_SUCCESS(err);
3312
Mark Youngad779052016-01-06 14:26:04 -07003313 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003314
3315 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003316 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003317
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003318 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003319
Chia-I Wuf7458c52015-10-26 21:10:41 +08003320 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3321 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3322 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003323}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003324
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003325TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
3326 VkResult err;
3327
3328 TEST_DESCRIPTION("Test validation check for an invalid memory type index "
3329 "during bind[Buffer|Image]Memory time");
3330
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003331 ASSERT_NO_FATAL_FAILURE(InitState());
3332
3333 // Create an image, allocate memory, set a bad typeIndex and then try to
3334 // bind it
3335 VkImage image;
3336 VkDeviceMemory mem;
3337 VkMemoryRequirements mem_reqs;
3338 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3339 const int32_t tex_width = 32;
3340 const int32_t tex_height = 32;
3341
3342 VkImageCreateInfo image_create_info = {};
3343 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3344 image_create_info.pNext = NULL;
3345 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3346 image_create_info.format = tex_format;
3347 image_create_info.extent.width = tex_width;
3348 image_create_info.extent.height = tex_height;
3349 image_create_info.extent.depth = 1;
3350 image_create_info.mipLevels = 1;
3351 image_create_info.arrayLayers = 1;
3352 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3353 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3354 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3355 image_create_info.flags = 0;
3356
3357 VkMemoryAllocateInfo mem_alloc = {};
3358 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3359 mem_alloc.pNext = NULL;
3360 mem_alloc.allocationSize = 0;
3361 mem_alloc.memoryTypeIndex = 0;
3362
3363 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3364 ASSERT_VK_SUCCESS(err);
3365
3366 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
3367 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003368
3369 // Introduce Failure, select invalid TypeIndex
3370 VkPhysicalDeviceMemoryProperties memory_info;
3371
3372 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
3373 unsigned int i;
3374 for (i = 0; i < memory_info.memoryTypeCount; i++) {
3375 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
3376 mem_alloc.memoryTypeIndex = i;
3377 break;
3378 }
3379 }
3380 if (i >= memory_info.memoryTypeCount) {
3381 printf("No invalid memory type index could be found; skipped.\n");
3382 vkDestroyImage(m_device->device(), image, NULL);
3383 return;
3384 }
3385
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003386 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 -06003387
3388 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
3389 ASSERT_VK_SUCCESS(err);
3390
3391 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3392 (void)err;
3393
3394 m_errorMonitor->VerifyFound();
3395
3396 vkDestroyImage(m_device->device(), image, NULL);
3397 vkFreeMemory(m_device->device(), mem, NULL);
3398}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003399
Karl Schultz6addd812016-02-02 17:17:23 -07003400TEST_F(VkLayerTest, BindInvalidMemory) {
3401 VkResult err;
3402 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003403
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003404 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid Device Memory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003405
Tobin Ehlisec598302015-09-15 15:02:17 -06003406 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003407
3408 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07003409 VkImage image;
3410 VkDeviceMemory mem;
3411 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003412
Karl Schultz6addd812016-02-02 17:17:23 -07003413 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3414 const int32_t tex_width = 32;
3415 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003416
3417 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003418 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3419 image_create_info.pNext = NULL;
3420 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3421 image_create_info.format = tex_format;
3422 image_create_info.extent.width = tex_width;
3423 image_create_info.extent.height = tex_height;
3424 image_create_info.extent.depth = 1;
3425 image_create_info.mipLevels = 1;
3426 image_create_info.arrayLayers = 1;
3427 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3428 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3429 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3430 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003431
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003432 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003433 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3434 mem_alloc.pNext = NULL;
3435 mem_alloc.allocationSize = 0;
3436 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003437
Chia-I Wuf7458c52015-10-26 21:10:41 +08003438 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003439 ASSERT_VK_SUCCESS(err);
3440
Karl Schultz6addd812016-02-02 17:17:23 -07003441 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003442
3443 mem_alloc.allocationSize = mem_reqs.size;
3444
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003445 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003446 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003447
3448 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003449 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003450 ASSERT_VK_SUCCESS(err);
3451
3452 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003453 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003454
3455 // Try to bind free memory that has been freed
3456 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3457 // This may very well return an error.
3458 (void)err;
3459
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003460 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003461
Chia-I Wuf7458c52015-10-26 21:10:41 +08003462 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003463}
3464
Karl Schultz6addd812016-02-02 17:17:23 -07003465TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
3466 VkResult err;
3467 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003468
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003469 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid Image Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003470
Tobin Ehlisec598302015-09-15 15:02:17 -06003471 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003472
Karl Schultz6addd812016-02-02 17:17:23 -07003473 // Create an image object, allocate memory, destroy the object and then try
3474 // to bind it
3475 VkImage image;
3476 VkDeviceMemory mem;
3477 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003478
Karl Schultz6addd812016-02-02 17:17:23 -07003479 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3480 const int32_t tex_width = 32;
3481 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003482
3483 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003484 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3485 image_create_info.pNext = NULL;
3486 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3487 image_create_info.format = tex_format;
3488 image_create_info.extent.width = tex_width;
3489 image_create_info.extent.height = tex_height;
3490 image_create_info.extent.depth = 1;
3491 image_create_info.mipLevels = 1;
3492 image_create_info.arrayLayers = 1;
3493 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3494 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3495 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3496 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003497
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003498 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003499 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3500 mem_alloc.pNext = NULL;
3501 mem_alloc.allocationSize = 0;
3502 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003503
Chia-I Wuf7458c52015-10-26 21:10:41 +08003504 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003505 ASSERT_VK_SUCCESS(err);
3506
Karl Schultz6addd812016-02-02 17:17:23 -07003507 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003508
3509 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003510 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003511 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003512
3513 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003514 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003515 ASSERT_VK_SUCCESS(err);
3516
3517 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003518 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003519 ASSERT_VK_SUCCESS(err);
3520
3521 // Now Try to bind memory to this destroyed object
3522 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3523 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07003524 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06003525
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003526 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003527
Chia-I Wuf7458c52015-10-26 21:10:41 +08003528 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003529}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003530
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003531#endif // OBJ_TRACKER_TESTS
3532
Tobin Ehlis0788f522015-05-26 16:11:58 -06003533#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06003534
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003535TEST_F(VkLayerTest, ImageSampleCounts) {
3536
3537 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger "
3538 "validation errors.");
3539 ASSERT_NO_FATAL_FAILURE(InitState());
3540
3541 VkMemoryPropertyFlags reqs = 0;
3542 VkImageCreateInfo image_create_info = {};
3543 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3544 image_create_info.pNext = NULL;
3545 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3546 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3547 image_create_info.extent.width = 256;
3548 image_create_info.extent.height = 256;
3549 image_create_info.extent.depth = 1;
3550 image_create_info.mipLevels = 1;
3551 image_create_info.arrayLayers = 1;
3552 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3553 image_create_info.flags = 0;
3554
3555 VkImageBlit blit_region = {};
3556 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3557 blit_region.srcSubresource.baseArrayLayer = 0;
3558 blit_region.srcSubresource.layerCount = 1;
3559 blit_region.srcSubresource.mipLevel = 0;
3560 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3561 blit_region.dstSubresource.baseArrayLayer = 0;
3562 blit_region.dstSubresource.layerCount = 1;
3563 blit_region.dstSubresource.mipLevel = 0;
3564
3565 // Create two images, the source with sampleCount = 2, and attempt to blit
3566 // between them
3567 {
3568 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003569 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003570 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003571 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003572 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003573 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003574 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003575 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003576 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003577 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was created with a sample count "
3578 "of VK_SAMPLE_COUNT_2_BIT but "
3579 "must be VK_SAMPLE_COUNT_1_BIT");
3580 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3581 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003582 m_errorMonitor->VerifyFound();
3583 m_commandBuffer->EndCommandBuffer();
3584 }
3585
3586 // Create two images, the dest with sampleCount = 4, and attempt to blit
3587 // between them
3588 {
3589 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003590 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003591 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003592 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003593 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003594 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003595 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003596 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003597 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003598 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was created with a sample count "
3599 "of VK_SAMPLE_COUNT_4_BIT but "
3600 "must be VK_SAMPLE_COUNT_1_BIT");
3601 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3602 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003603 m_errorMonitor->VerifyFound();
3604 m_commandBuffer->EndCommandBuffer();
3605 }
3606
3607 VkBufferImageCopy copy_region = {};
3608 copy_region.bufferRowLength = 128;
3609 copy_region.bufferImageHeight = 128;
3610 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3611 copy_region.imageSubresource.layerCount = 1;
3612 copy_region.imageExtent.height = 64;
3613 copy_region.imageExtent.width = 64;
3614 copy_region.imageExtent.depth = 1;
3615
3616 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
3617 // buffer to image
3618 {
3619 vk_testing::Buffer src_buffer;
3620 VkMemoryPropertyFlags reqs = 0;
3621 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
3622 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003623 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003624 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003625 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003626 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003627 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was created with a sample count "
3628 "of VK_SAMPLE_COUNT_8_BIT but "
3629 "must be VK_SAMPLE_COUNT_1_BIT");
3630 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
3631 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003632 m_errorMonitor->VerifyFound();
3633 m_commandBuffer->EndCommandBuffer();
3634 }
3635
3636 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
3637 // image to buffer
3638 {
3639 vk_testing::Buffer dst_buffer;
3640 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
3641 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003642 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003643 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003644 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003645 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003646 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "was created with a sample count "
3647 "of VK_SAMPLE_COUNT_2_BIT but "
3648 "must be VK_SAMPLE_COUNT_1_BIT");
3649 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003650 dst_buffer.handle(), 1, &copy_region);
3651 m_errorMonitor->VerifyFound();
3652 m_commandBuffer->EndCommandBuffer();
3653 }
3654}
3655
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003656TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
3657 VkResult err;
3658 bool pass;
3659
3660 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
3661 ASSERT_NO_FATAL_FAILURE(InitState());
3662
3663 // If w/d/h granularity is 1, test is not meaningful
3664 // TODO: When virtual device limits are available, create a set of limits for this test that
3665 // will always have a granularity of > 1 for w, h, and d
3666 auto index = m_device->graphics_queue_node_index_;
3667 auto queue_family_properties = m_device->phy().queue_properties();
3668
3669 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
3670 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
3671 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
3672 return;
3673 }
3674
3675 // Create two images of different types and try to copy between them
3676 VkImage srcImage;
3677 VkImage dstImage;
3678 VkDeviceMemory srcMem;
3679 VkDeviceMemory destMem;
3680 VkMemoryRequirements memReqs;
3681
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003682 VkImageCreateInfo image_create_info = {};
3683 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3684 image_create_info.pNext = NULL;
3685 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3686 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3687 image_create_info.extent.width = 32;
3688 image_create_info.extent.height = 32;
3689 image_create_info.extent.depth = 1;
3690 image_create_info.mipLevels = 1;
3691 image_create_info.arrayLayers = 4;
3692 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3693 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3694 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3695 image_create_info.flags = 0;
3696
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003697 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003698 ASSERT_VK_SUCCESS(err);
3699
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003700 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003701 ASSERT_VK_SUCCESS(err);
3702
3703 // Allocate memory
3704 VkMemoryAllocateInfo memAlloc = {};
3705 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3706 memAlloc.pNext = NULL;
3707 memAlloc.allocationSize = 0;
3708 memAlloc.memoryTypeIndex = 0;
3709
3710 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
3711 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003712 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003713 ASSERT_TRUE(pass);
3714 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
3715 ASSERT_VK_SUCCESS(err);
3716
3717 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
3718 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003719 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003720 ASSERT_VK_SUCCESS(err);
3721 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
3722 ASSERT_VK_SUCCESS(err);
3723
3724 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
3725 ASSERT_VK_SUCCESS(err);
3726 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
3727 ASSERT_VK_SUCCESS(err);
3728
3729 BeginCommandBuffer();
3730 VkImageCopy copyRegion;
3731 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3732 copyRegion.srcSubresource.mipLevel = 0;
3733 copyRegion.srcSubresource.baseArrayLayer = 0;
3734 copyRegion.srcSubresource.layerCount = 1;
3735 copyRegion.srcOffset.x = 0;
3736 copyRegion.srcOffset.y = 0;
3737 copyRegion.srcOffset.z = 0;
3738 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3739 copyRegion.dstSubresource.mipLevel = 0;
3740 copyRegion.dstSubresource.baseArrayLayer = 0;
3741 copyRegion.dstSubresource.layerCount = 1;
3742 copyRegion.dstOffset.x = 0;
3743 copyRegion.dstOffset.y = 0;
3744 copyRegion.dstOffset.z = 0;
3745 copyRegion.extent.width = 1;
3746 copyRegion.extent.height = 1;
3747 copyRegion.extent.depth = 1;
3748
3749 // Introduce failure by setting srcOffset to a bad granularity value
3750 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003751 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3752 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003753 m_errorMonitor->VerifyFound();
3754
3755 // Introduce failure by setting extent to a bad granularity value
3756 copyRegion.srcOffset.y = 0;
3757 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003758 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3759 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003760 m_errorMonitor->VerifyFound();
3761
3762 // Now do some buffer/image copies
3763 vk_testing::Buffer buffer;
3764 VkMemoryPropertyFlags reqs = 0;
3765 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3766 VkBufferImageCopy region = {};
3767 region.bufferOffset = 0;
3768 region.bufferRowLength = 3;
3769 region.bufferImageHeight = 128;
3770 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3771 region.imageSubresource.layerCount = 1;
3772 region.imageExtent.height = 16;
3773 region.imageExtent.width = 16;
3774 region.imageExtent.depth = 1;
3775 region.imageOffset.x = 0;
3776 region.imageOffset.y = 0;
3777 region.imageOffset.z = 0;
3778
3779 // Introduce failure by setting bufferRowLength to a bad granularity value
3780 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003781 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3782 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3783 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003784 m_errorMonitor->VerifyFound();
3785 region.bufferRowLength = 128;
3786
3787 // Introduce failure by setting bufferOffset to a bad granularity value
3788 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003789 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3790 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3791 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003792 m_errorMonitor->VerifyFound();
3793 region.bufferOffset = 0;
3794
3795 // Introduce failure by setting bufferImageHeight to a bad granularity value
3796 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003797 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3798 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3799 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003800 m_errorMonitor->VerifyFound();
3801 region.bufferImageHeight = 128;
3802
3803 // Introduce failure by setting imageExtent to a bad granularity value
3804 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3806 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3807 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003808 m_errorMonitor->VerifyFound();
3809 region.imageExtent.width = 16;
3810
3811 // Introduce failure by setting imageOffset to a bad granularity value
3812 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003813 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3814 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3815 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003816 m_errorMonitor->VerifyFound();
3817
3818 EndCommandBuffer();
3819
3820 vkDestroyImage(m_device->device(), srcImage, NULL);
3821 vkDestroyImage(m_device->device(), dstImage, NULL);
3822 vkFreeMemory(m_device->device(), srcMem, NULL);
3823 vkFreeMemory(m_device->device(), destMem, NULL);
3824}
3825
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003826TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003827 TEST_DESCRIPTION("Submit command buffer created using one queue family and "
3828 "attempt to submit them on a queue created in a different "
3829 "queue family.");
3830
Cody Northropc31a84f2016-08-22 10:41:47 -06003831 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003832 // This test is meaningless unless we have multiple queue families
3833 auto queue_family_properties = m_device->phy().queue_properties();
3834 if (queue_family_properties.size() < 2) {
3835 return;
3836 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003837 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003838 // Get safe index of another queue family
3839 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
3840 ASSERT_NO_FATAL_FAILURE(InitState());
3841 // Create a second queue using a different queue family
3842 VkQueue other_queue;
3843 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3844
3845 // Record an empty cmd buffer
3846 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3847 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3848 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3849 vkEndCommandBuffer(m_commandBuffer->handle());
3850
3851 // And submit on the wrong queue
3852 VkSubmitInfo submit_info = {};
3853 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3854 submit_info.commandBufferCount = 1;
3855 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003856 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003857
3858 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003859}
3860
Chris Forbes48a53902016-06-30 11:46:27 +12003861TEST_F(VkLayerTest, RenderPassInitialLayoutUndefined) {
3862 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass with an attachment's "
3863 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
3864 "the command buffer has prior knowledge of that "
3865 "attachment's layout.");
3866
3867 m_errorMonitor->ExpectSuccess();
3868
3869 ASSERT_NO_FATAL_FAILURE(InitState());
3870
3871 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003872 VkAttachmentDescription attachment = {0,
3873 VK_FORMAT_R8G8B8A8_UNORM,
3874 VK_SAMPLE_COUNT_1_BIT,
3875 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
3876 VK_ATTACHMENT_STORE_OP_STORE,
3877 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
3878 VK_ATTACHMENT_STORE_OP_DONT_CARE,
3879 VK_IMAGE_LAYOUT_UNDEFINED,
3880 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes48a53902016-06-30 11:46:27 +12003881
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003882 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes48a53902016-06-30 11:46:27 +12003883
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003884 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Chris Forbes48a53902016-06-30 11:46:27 +12003885
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003886 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Chris Forbes48a53902016-06-30 11:46:27 +12003887
3888 VkRenderPass rp;
3889 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3890 ASSERT_VK_SUCCESS(err);
3891
3892 // A compatible framebuffer.
3893 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003894 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Chris Forbes48a53902016-06-30 11:46:27 +12003895 ASSERT_TRUE(image.initialized());
3896
3897 VkImageViewCreateInfo ivci = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003898 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
3899 nullptr,
3900 0,
3901 image.handle(),
3902 VK_IMAGE_VIEW_TYPE_2D,
3903 VK_FORMAT_R8G8B8A8_UNORM,
3904 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
3905 VK_COMPONENT_SWIZZLE_IDENTITY},
3906 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Chris Forbes48a53902016-06-30 11:46:27 +12003907 };
3908 VkImageView view;
3909 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3910 ASSERT_VK_SUCCESS(err);
3911
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003912 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Chris Forbes48a53902016-06-30 11:46:27 +12003913 VkFramebuffer fb;
3914 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3915 ASSERT_VK_SUCCESS(err);
3916
3917 // Record a single command buffer which uses this renderpass twice. The
3918 // bug is triggered at the beginning of the second renderpass, when the
3919 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003920 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
Chris Forbes48a53902016-06-30 11:46:27 +12003921 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003922 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
Chris Forbes48a53902016-06-30 11:46:27 +12003923 vkCmdEndRenderPass(m_commandBuffer->handle());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003924 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
Chris Forbes48a53902016-06-30 11:46:27 +12003925
3926 m_errorMonitor->VerifyNotFound();
3927
3928 vkCmdEndRenderPass(m_commandBuffer->handle());
3929 EndCommandBuffer();
3930
3931 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3932 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3933 vkDestroyImageView(m_device->device(), view, nullptr);
3934}
3935
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06003936TEST_F(VkLayerTest, FramebufferBindingDestroyCommandPool) {
3937 TEST_DESCRIPTION("This test should pass. Create a Framebuffer and "
3938 "command buffer, bind them together, then destroy "
3939 "command pool and framebuffer and verify there are no "
3940 "errors.");
3941
3942 m_errorMonitor->ExpectSuccess();
3943
3944 ASSERT_NO_FATAL_FAILURE(InitState());
3945
3946 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003947 VkAttachmentDescription attachment = {0,
3948 VK_FORMAT_R8G8B8A8_UNORM,
3949 VK_SAMPLE_COUNT_1_BIT,
3950 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
3951 VK_ATTACHMENT_STORE_OP_STORE,
3952 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
3953 VK_ATTACHMENT_STORE_OP_DONT_CARE,
3954 VK_IMAGE_LAYOUT_UNDEFINED,
3955 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06003956
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003957 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06003958
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003959 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06003960
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003961 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06003962
3963 VkRenderPass rp;
3964 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3965 ASSERT_VK_SUCCESS(err);
3966
3967 // A compatible framebuffer.
3968 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003969 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06003970 ASSERT_TRUE(image.initialized());
3971
3972 VkImageViewCreateInfo ivci = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003973 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
3974 nullptr,
3975 0,
3976 image.handle(),
3977 VK_IMAGE_VIEW_TYPE_2D,
3978 VK_FORMAT_R8G8B8A8_UNORM,
3979 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
3980 VK_COMPONENT_SWIZZLE_IDENTITY},
3981 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06003982 };
3983 VkImageView view;
3984 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3985 ASSERT_VK_SUCCESS(err);
3986
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003987 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06003988 VkFramebuffer fb;
3989 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3990 ASSERT_VK_SUCCESS(err);
3991
3992 // Explicitly create a command buffer to bind the FB to so that we can then
3993 // destroy the command pool in order to implicitly free command buffer
3994 VkCommandPool command_pool;
3995 VkCommandPoolCreateInfo pool_create_info{};
3996 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3997 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3998 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003999 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06004000
4001 VkCommandBuffer command_buffer;
4002 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004003 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06004004 command_buffer_allocate_info.commandPool = command_pool;
4005 command_buffer_allocate_info.commandBufferCount = 1;
4006 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004007 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06004008
4009 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004010 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06004011 VkCommandBufferBeginInfo begin_info{};
4012 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4013 vkBeginCommandBuffer(command_buffer, &begin_info);
4014
4015 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
4016 vkCmdEndRenderPass(command_buffer);
4017 vkEndCommandBuffer(command_buffer);
Mark Lobodzinski7d10a822016-08-03 14:08:40 -06004018 vkDestroyImageView(m_device->device(), view, nullptr);
Tobin Ehlis75ac37b2016-07-29 10:55:41 -06004019 // Destroy command pool to implicitly free command buffer
4020 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
4021 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4022 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4023 m_errorMonitor->VerifyNotFound();
4024}
4025
Chris Forbes51bf7c92016-06-30 15:22:08 +12004026TEST_F(VkLayerTest, RenderPassSubpassZeroTransitionsApplied) {
4027 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass applies the layout "
4028 "transitions for the first subpass");
4029
4030 m_errorMonitor->ExpectSuccess();
4031
4032 ASSERT_NO_FATAL_FAILURE(InitState());
4033
4034 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004035 VkAttachmentDescription attachment = {0,
4036 VK_FORMAT_R8G8B8A8_UNORM,
4037 VK_SAMPLE_COUNT_1_BIT,
4038 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4039 VK_ATTACHMENT_STORE_OP_STORE,
4040 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4041 VK_ATTACHMENT_STORE_OP_DONT_CARE,
4042 VK_IMAGE_LAYOUT_UNDEFINED,
4043 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes51bf7c92016-06-30 15:22:08 +12004044
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004045 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes51bf7c92016-06-30 15:22:08 +12004046
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004047 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Chris Forbes51bf7c92016-06-30 15:22:08 +12004048
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004049 VkSubpassDependency dep = {0,
4050 0,
4051 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4052 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4053 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4054 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4055 VK_DEPENDENCY_BY_REGION_BIT};
Chris Forbes51bf7c92016-06-30 15:22:08 +12004056
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004057 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Chris Forbes51bf7c92016-06-30 15:22:08 +12004058
4059 VkResult err;
4060 VkRenderPass rp;
4061 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4062 ASSERT_VK_SUCCESS(err);
4063
4064 // A compatible framebuffer.
4065 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004066 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Chris Forbes51bf7c92016-06-30 15:22:08 +12004067 ASSERT_TRUE(image.initialized());
4068
4069 VkImageViewCreateInfo ivci = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004070 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4071 nullptr,
4072 0,
4073 image.handle(),
4074 VK_IMAGE_VIEW_TYPE_2D,
4075 VK_FORMAT_R8G8B8A8_UNORM,
4076 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
4077 VK_COMPONENT_SWIZZLE_IDENTITY},
4078 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Chris Forbes51bf7c92016-06-30 15:22:08 +12004079 };
4080 VkImageView view;
4081 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4082 ASSERT_VK_SUCCESS(err);
4083
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004084 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Chris Forbes51bf7c92016-06-30 15:22:08 +12004085 VkFramebuffer fb;
4086 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4087 ASSERT_VK_SUCCESS(err);
4088
4089 // Record a single command buffer which issues a pipeline barrier w/
4090 // image memory barrier for the attachment. This detects the previously
4091 // missing tracking of the subpass layout by throwing a validation error
4092 // if it doesn't occur.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004093 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
Chris Forbes51bf7c92016-06-30 15:22:08 +12004094 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004095 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
Chris Forbes51bf7c92016-06-30 15:22:08 +12004096
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004097 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
4098 nullptr,
4099 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4100 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4101 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4102 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4103 VK_QUEUE_FAMILY_IGNORED,
4104 VK_QUEUE_FAMILY_IGNORED,
4105 image.handle(),
4106 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
4107 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4108 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
4109 &imb);
Chris Forbes51bf7c92016-06-30 15:22:08 +12004110
4111 vkCmdEndRenderPass(m_commandBuffer->handle());
4112 m_errorMonitor->VerifyNotFound();
4113 EndCommandBuffer();
4114
4115 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4116 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4117 vkDestroyImageView(m_device->device(), view, nullptr);
4118}
4119
Chris Forbesa58c4522016-09-28 15:19:39 +13004120TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
4121 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
4122 ASSERT_NO_FATAL_FAILURE(InitState());
4123
4124 // A renderpass with two subpasses, both writing the same attachment.
4125 VkAttachmentDescription attach[] = {
4126 { 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
4127 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4128 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4129 VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4130 },
4131 };
4132 VkAttachmentReference ref = { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
4133 VkSubpassDescription subpasses[] = {
4134 { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
4135 1, &ref, nullptr, nullptr, 0, nullptr },
4136 { 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
4137 1, &ref, nullptr, nullptr, 0, nullptr },
4138 };
4139 VkSubpassDependency dep = {
4140 0, 1,
4141 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4142 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4143 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4144 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4145 VK_DEPENDENCY_BY_REGION_BIT
4146 };
4147 VkRenderPassCreateInfo rpci = {
4148 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4149 0, 1, attach, 2, subpasses, 1, &dep
4150 };
4151 VkRenderPass rp;
4152 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4153 ASSERT_VK_SUCCESS(err);
4154
4155 VkImageObj image(m_device);
4156 image.init_no_layout(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
4157 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
4158 VK_IMAGE_TILING_OPTIMAL, 0);
4159 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
4160
4161 VkFramebufferCreateInfo fbci = {
4162 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
4163 0, rp, 1, &imageView, 32, 32, 1
4164 };
4165 VkFramebuffer fb;
4166 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
4167 ASSERT_VK_SUCCESS(err);
4168
4169 char const *vsSource =
4170 "#version 450\n"
4171 "void main() { gl_Position = vec4(1); }\n";
4172 char const *fsSource =
4173 "#version 450\n"
4174 "layout(location=0) out vec4 color;\n"
4175 "void main() { color = vec4(1); }\n";
4176
4177 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4178 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4179 VkPipelineObj pipe(m_device);
4180 pipe.AddColorAttachment();
4181 pipe.AddShader(&vs);
4182 pipe.AddShader(&fs);
4183 VkViewport view_port = {};
4184 m_viewports.push_back(view_port);
4185 pipe.SetViewport(m_viewports);
4186 VkRect2D rect = {};
4187 m_scissors.push_back(rect);
4188 pipe.SetScissor(m_scissors);
4189
4190 VkPipelineLayoutCreateInfo plci = {
4191 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
4192 0, 0, nullptr, 0, nullptr
4193 };
4194 VkPipelineLayout pl;
4195 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
4196 ASSERT_VK_SUCCESS(err);
4197 pipe.CreateVKPipeline(pl, rp);
4198
4199 BeginCommandBuffer();
4200
4201 VkRenderPassBeginInfo rpbi = {
4202 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
4203 rp, fb, { { 0, 0, }, { 32, 32 } }, 0, nullptr
4204 };
4205
4206 // subtest 1: bind in the wrong subpass
4207 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
4208 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
4209 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4210 "built for subpass 0 but used in subpass 1");
4211 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4212 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
4213 m_errorMonitor->VerifyFound();
4214
4215 vkCmdEndRenderPass(m_commandBuffer->handle());
4216
4217 // subtest 2: bind in correct subpass, then transition to next subpass
4218 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
4219 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4220 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
4221 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4222 "built for subpass 0 but used in subpass 1");
4223 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
4224 m_errorMonitor->VerifyFound();
4225
4226 vkCmdEndRenderPass(m_commandBuffer->handle());
4227
4228 EndCommandBuffer();
4229
4230 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
4231 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4232 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4233}
4234
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06004235TEST_F(VkLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
4236 TEST_DESCRIPTION("Validate that when an imageView of a depth/stencil image "
4237 "is used as a depth/stencil framebuffer attachment, the "
4238 "aspectMask is ignored and both depth and stencil image "
4239 "subresources are used.");
4240
4241 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004242 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
4243 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06004244 return;
4245 }
4246
4247 m_errorMonitor->ExpectSuccess();
4248
4249 ASSERT_NO_FATAL_FAILURE(InitState());
4250
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004251 VkAttachmentDescription attachment = {0,
4252 VK_FORMAT_D32_SFLOAT_S8_UINT,
4253 VK_SAMPLE_COUNT_1_BIT,
4254 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4255 VK_ATTACHMENT_STORE_OP_STORE,
4256 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
4257 VK_ATTACHMENT_STORE_OP_DONT_CARE,
4258 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
4259 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06004260
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004261 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06004262
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004263 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06004264
4265 VkSubpassDependency dep = {0,
4266 0,
4267 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4268 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4269 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4270 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4271 VK_DEPENDENCY_BY_REGION_BIT};
4272
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004273 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06004274
4275 VkResult err;
4276 VkRenderPass rp;
4277 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4278 ASSERT_VK_SUCCESS(err);
4279
4280 VkImageObj image(m_device);
4281 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
4282 0x26, // usage
4283 VK_IMAGE_TILING_OPTIMAL, 0);
4284 ASSERT_TRUE(image.initialized());
4285 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
4286
4287 VkImageViewCreateInfo ivci = {
4288 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
4289 nullptr,
4290 0,
4291 image.handle(),
4292 VK_IMAGE_VIEW_TYPE_2D,
4293 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004294 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06004295 {0x2, 0, 1, 0, 1},
4296 };
4297 VkImageView view;
4298 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
4299 ASSERT_VK_SUCCESS(err);
4300
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004301 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06004302 VkFramebuffer fb;
4303 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4304 ASSERT_VK_SUCCESS(err);
4305
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004306 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06004307 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004308 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06004309
4310 VkImageMemoryBarrier imb = {};
4311 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
4312 imb.pNext = nullptr;
4313 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4314 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
4315 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4316 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4317 imb.srcQueueFamilyIndex = 0;
4318 imb.dstQueueFamilyIndex = 0;
4319 imb.image = image.handle();
4320 imb.subresourceRange.aspectMask = 0x6;
4321 imb.subresourceRange.baseMipLevel = 0;
4322 imb.subresourceRange.levelCount = 0x1;
4323 imb.subresourceRange.baseArrayLayer = 0;
4324 imb.subresourceRange.layerCount = 0x1;
4325
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004326 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4327 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
Mark Lobodzinski77a5d6f2016-08-05 09:38:18 -06004328 &imb);
4329
4330 vkCmdEndRenderPass(m_commandBuffer->handle());
4331 EndCommandBuffer();
4332 QueueCommandBuffer(false);
4333 m_errorMonitor->VerifyNotFound();
4334
4335 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4336 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4337 vkDestroyImageView(m_device->device(), view, nullptr);
4338}
Tony Barbourd5f7b822016-08-02 15:39:33 -06004339
Tony Barbour4e919972016-08-09 13:27:40 -06004340TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
4341 TEST_DESCRIPTION("Generate INVALID_RENDER_AREA error by beginning renderpass"
4342 "with extent outside of framebuffer");
4343 ASSERT_NO_FATAL_FAILURE(InitState());
4344 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4345
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004346 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot execute a render pass with renderArea "
4347 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06004348
4349 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
4350 m_renderPassBeginInfo.renderArea.extent.width = 257;
4351 m_renderPassBeginInfo.renderArea.extent.height = 257;
4352 BeginCommandBuffer();
4353 m_errorMonitor->VerifyFound();
4354}
4355
4356TEST_F(VkLayerTest, DisabledIndependentBlend) {
4357 TEST_DESCRIPTION("Generate INDEPENDENT_BLEND by disabling independent "
4358 "blend and then specifying different blend states for two "
4359 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06004360 VkPhysicalDeviceFeatures features = {};
4361 features.independentBlend = VK_FALSE;
Cody Northropc31a84f2016-08-22 10:41:47 -06004362 ASSERT_NO_FATAL_FAILURE(InitState(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06004363
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004364 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4365 "Invalid Pipeline CreateInfo: If independent blend feature not "
4366 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06004367
Cody Northropc31a84f2016-08-22 10:41:47 -06004368 VkDescriptorSetObj descriptorSet(m_device);
4369 descriptorSet.AppendDummy();
4370 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06004371
Cody Northropc31a84f2016-08-22 10:41:47 -06004372 VkPipelineObj pipeline(m_device);
4373 VkRenderpassObj renderpass(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004374 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06004375 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06004376
Cody Northropc31a84f2016-08-22 10:41:47 -06004377 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
4378 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
4379 att_state1.blendEnable = VK_TRUE;
4380 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
4381 att_state2.blendEnable = VK_FALSE;
4382 pipeline.AddColorAttachment(0, &att_state1);
4383 pipeline.AddColorAttachment(1, &att_state2);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004384 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass.handle());
Cody Northropc31a84f2016-08-22 10:41:47 -06004385 m_errorMonitor->VerifyFound();
Tony Barbour4e919972016-08-09 13:27:40 -06004386}
4387
4388TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
4389 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
4390 "depth attachments in subpass");
Cody Northropc31a84f2016-08-22 10:41:47 -06004391 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbour4e919972016-08-09 13:27:40 -06004392
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004393 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4394 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
Tony Barbour4e919972016-08-09 13:27:40 -06004395
4396 // Create a renderPass with a single color attachment
4397 VkAttachmentReference attach = {};
4398 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4399 VkSubpassDescription subpass = {};
4400 VkRenderPassCreateInfo rpci = {};
4401 rpci.subpassCount = 1;
4402 rpci.pSubpasses = &subpass;
4403 rpci.attachmentCount = 1;
4404 VkAttachmentDescription attach_desc = {};
4405 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
4406 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4407 rpci.pAttachments = &attach_desc;
4408 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4409 VkRenderPass rp;
4410 subpass.pDepthStencilAttachment = &attach;
4411 subpass.pColorAttachments = NULL;
4412 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4413 m_errorMonitor->VerifyFound();
4414}
4415
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004416TEST_F(VkLayerTest, RenderPassTransitionsAttachmentUnused) {
4417 TEST_DESCRIPTION("Ensure that layout transitions work correctly without "
4418 "errors, when an attachment reference is "
4419 "VK_ATTACHMENT_UNUSED");
4420
4421 m_errorMonitor->ExpectSuccess();
4422
4423 ASSERT_NO_FATAL_FAILURE(InitState());
4424
4425 // A renderpass with no attachments
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004426 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004427
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004428 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004429
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004430 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004431
4432 VkRenderPass rp;
4433 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4434 ASSERT_VK_SUCCESS(err);
4435
4436 // A compatible framebuffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004437 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004438 VkFramebuffer fb;
4439 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4440 ASSERT_VK_SUCCESS(err);
4441
4442 // Record a command buffer which just begins and ends the renderpass. The
4443 // bug manifests in BeginRenderPass.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004444 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004445 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004446 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004447 vkCmdEndRenderPass(m_commandBuffer->handle());
4448 m_errorMonitor->VerifyNotFound();
4449 EndCommandBuffer();
4450
4451 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4452 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4453}
4454
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004455// This is a positive test. No errors are expected.
4456TEST_F(VkLayerTest, StencilLoadOp) {
4457 TEST_DESCRIPTION("Create a stencil-only attachment with a LOAD_OP set to "
4458 "CLEAR. stencil[Load|Store]Op used to be ignored.");
4459 VkResult result = VK_SUCCESS;
4460 VkImageFormatProperties formatProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004461 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
4462 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
4463 &formatProps);
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004464 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
4465 return;
4466 }
4467
4468 ASSERT_NO_FATAL_FAILURE(InitState());
4469 VkFormat depth_stencil_fmt = VK_FORMAT_D24_UNORM_S8_UINT;
4470 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004471 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004472 VkAttachmentDescription att = {};
4473 VkAttachmentReference ref = {};
4474 att.format = depth_stencil_fmt;
Chris Forbes787b4532016-09-16 16:45:16 +12004475 att.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004476 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
4477 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
4478 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
4479 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
4480 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4481 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4482
4483 VkClearValue clear;
4484 clear.depthStencil.depth = 1.0;
4485 clear.depthStencil.stencil = 0;
4486 ref.attachment = 0;
4487 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4488
4489 VkSubpassDescription subpass = {};
4490 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
4491 subpass.flags = 0;
4492 subpass.inputAttachmentCount = 0;
4493 subpass.pInputAttachments = NULL;
4494 subpass.colorAttachmentCount = 0;
4495 subpass.pColorAttachments = NULL;
4496 subpass.pResolveAttachments = NULL;
4497 subpass.pDepthStencilAttachment = &ref;
4498 subpass.preserveAttachmentCount = 0;
4499 subpass.pPreserveAttachments = NULL;
4500
4501 VkRenderPass rp;
4502 VkRenderPassCreateInfo rp_info = {};
4503 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4504 rp_info.attachmentCount = 1;
4505 rp_info.pAttachments = &att;
4506 rp_info.subpassCount = 1;
4507 rp_info.pSubpasses = &subpass;
4508 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
4509 ASSERT_VK_SUCCESS(result);
4510
4511 VkImageView *depthView = m_depthStencil->BindInfo();
4512 VkFramebufferCreateInfo fb_info = {};
4513 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4514 fb_info.pNext = NULL;
4515 fb_info.renderPass = rp;
4516 fb_info.attachmentCount = 1;
4517 fb_info.pAttachments = depthView;
4518 fb_info.width = 100;
4519 fb_info.height = 100;
4520 fb_info.layers = 1;
4521 VkFramebuffer fb;
4522 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4523 ASSERT_VK_SUCCESS(result);
4524
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004525 VkRenderPassBeginInfo rpbinfo = {};
4526 rpbinfo.clearValueCount = 1;
4527 rpbinfo.pClearValues = &clear;
4528 rpbinfo.pNext = NULL;
4529 rpbinfo.renderPass = rp;
4530 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4531 rpbinfo.renderArea.extent.width = 100;
4532 rpbinfo.renderArea.extent.height = 100;
4533 rpbinfo.renderArea.offset.x = 0;
4534 rpbinfo.renderArea.offset.y = 0;
4535 rpbinfo.framebuffer = fb;
4536
4537 VkFence fence = {};
4538 VkFenceCreateInfo fence_ci = {};
4539 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4540 fence_ci.pNext = nullptr;
4541 fence_ci.flags = 0;
4542 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
4543 ASSERT_VK_SUCCESS(result);
4544
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004545 m_commandBuffer->BeginCommandBuffer();
4546 m_commandBuffer->BeginRenderPass(rpbinfo);
4547 m_commandBuffer->EndRenderPass();
4548 m_commandBuffer->EndCommandBuffer();
4549 m_commandBuffer->QueueCommandBuffer(fence);
4550
4551 VkImageObj destImage(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004552 destImage.init(100, 100, depth_stencil_fmt, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004553 VK_IMAGE_TILING_OPTIMAL, 0);
4554 VkImageMemoryBarrier barrier = {};
4555 VkImageSubresourceRange range;
4556 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004557 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4558 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004559 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4560 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
4561 barrier.image = m_depthStencil->handle();
4562 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4563 range.baseMipLevel = 0;
4564 range.levelCount = 1;
4565 range.baseArrayLayer = 0;
4566 range.layerCount = 1;
4567 barrier.subresourceRange = range;
4568 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
4569 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
4570 cmdbuf.BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004571 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
4572 &barrier);
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004573 barrier.srcAccessMask = 0;
4574 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4575 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
4576 barrier.image = destImage.handle();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004577 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4578 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
4579 &barrier);
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004580 VkImageCopy cregion;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004581 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004582 cregion.srcSubresource.mipLevel = 0;
4583 cregion.srcSubresource.baseArrayLayer = 0;
4584 cregion.srcSubresource.layerCount = 1;
4585 cregion.srcOffset.x = 0;
4586 cregion.srcOffset.y = 0;
4587 cregion.srcOffset.z = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004588 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004589 cregion.dstSubresource.mipLevel = 0;
4590 cregion.dstSubresource.baseArrayLayer = 0;
4591 cregion.dstSubresource.layerCount = 1;
4592 cregion.dstOffset.x = 0;
4593 cregion.dstOffset.y = 0;
4594 cregion.dstOffset.z = 0;
4595 cregion.extent.width = 100;
4596 cregion.extent.height = 100;
4597 cregion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004598 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004599 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
4600 cmdbuf.EndCommandBuffer();
4601
4602 VkSubmitInfo submit_info;
4603 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4604 submit_info.pNext = NULL;
4605 submit_info.waitSemaphoreCount = 0;
4606 submit_info.pWaitSemaphores = NULL;
4607 submit_info.pWaitDstStageMask = NULL;
4608 submit_info.commandBufferCount = 1;
4609 submit_info.pCommandBuffers = &cmdbuf.handle();
4610 submit_info.signalSemaphoreCount = 0;
4611 submit_info.pSignalSemaphores = NULL;
4612
4613 m_errorMonitor->ExpectSuccess();
4614 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4615 m_errorMonitor->VerifyNotFound();
4616
Mark Lobodzinskid0440da2016-06-17 15:10:03 -06004617 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004618 vkDestroyFence(m_device->device(), fence, nullptr);
4619 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4620 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4621}
4622
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004623TEST_F(VkLayerTest, UnusedPreserveAttachment) {
4624 TEST_DESCRIPTION("Create a framebuffer where a subpass has a preserve "
4625 "attachment reference of VK_ATTACHMENT_UNUSED");
4626
4627 ASSERT_NO_FATAL_FAILURE(InitState());
4628 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4629
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004630 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must not be VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004631
4632 VkAttachmentReference color_attach = {};
4633 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4634 color_attach.attachment = 0;
4635 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
4636 VkSubpassDescription subpass = {};
4637 subpass.colorAttachmentCount = 1;
4638 subpass.pColorAttachments = &color_attach;
4639 subpass.preserveAttachmentCount = 1;
4640 subpass.pPreserveAttachments = &preserve_attachment;
4641
4642 VkRenderPassCreateInfo rpci = {};
4643 rpci.subpassCount = 1;
4644 rpci.pSubpasses = &subpass;
4645 rpci.attachmentCount = 1;
4646 VkAttachmentDescription attach_desc = {};
4647 attach_desc.format = VK_FORMAT_UNDEFINED;
4648 rpci.pAttachments = &attach_desc;
4649 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4650 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004651 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004652
4653 m_errorMonitor->VerifyFound();
4654
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004655 if (result == VK_SUCCESS) {
4656 vkDestroyRenderPass(m_device->device(), rp, NULL);
4657 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004658}
4659
Chris Forbesc5389742016-06-29 11:49:23 +12004660TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004661 TEST_DESCRIPTION("Ensure that CreateRenderPass produces a validation error "
4662 "when the source of a subpass multisample resolve "
4663 "does not have multiple samples.");
4664
Chris Forbesc5389742016-06-29 11:49:23 +12004665 ASSERT_NO_FATAL_FAILURE(InitState());
4666
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004667 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4668 "Subpass 0 requests multisample resolve from attachment 0 which has "
4669 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12004670
4671 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004672 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4673 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4674 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
4675 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4676 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4677 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12004678 };
4679
4680 VkAttachmentReference color = {
4681 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4682 };
4683
4684 VkAttachmentReference resolve = {
4685 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4686 };
4687
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004688 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12004689
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004690 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12004691
4692 VkRenderPass rp;
4693 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4694
4695 m_errorMonitor->VerifyFound();
4696
4697 if (err == VK_SUCCESS)
4698 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4699}
4700
4701TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004702 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4703 "when a subpass multisample resolve operation is "
4704 "requested, and the destination of that resolve has "
4705 "multiple samples.");
4706
Chris Forbesc5389742016-06-29 11:49:23 +12004707 ASSERT_NO_FATAL_FAILURE(InitState());
4708
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004709 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4710 "Subpass 0 requests multisample resolve into attachment 1, which "
4711 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12004712
4713 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004714 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4715 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4716 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
4717 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4718 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4719 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12004720 };
4721
4722 VkAttachmentReference color = {
4723 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4724 };
4725
4726 VkAttachmentReference resolve = {
4727 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4728 };
4729
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004730 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12004731
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004732 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12004733
4734 VkRenderPass rp;
4735 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4736
4737 m_errorMonitor->VerifyFound();
4738
4739 if (err == VK_SUCCESS)
4740 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4741}
4742
Chris Forbes3f128ef2016-06-29 14:58:53 +12004743TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004744 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4745 "when the color and depth attachments used by a subpass "
4746 "have inconsistent sample counts");
4747
Chris Forbes3f128ef2016-06-29 14:58:53 +12004748 ASSERT_NO_FATAL_FAILURE(InitState());
4749
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004750 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4751 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
Chris Forbes3f128ef2016-06-29 14:58:53 +12004752
4753 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004754 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4755 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4756 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
4757 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4758 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4759 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbes3f128ef2016-06-29 14:58:53 +12004760 };
4761
4762 VkAttachmentReference color[] = {
4763 {
4764 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4765 },
4766 {
4767 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4768 },
4769 };
4770
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004771 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, color, nullptr, nullptr, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12004772
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004773 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12004774
4775 VkRenderPass rp;
4776 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4777
4778 m_errorMonitor->VerifyFound();
4779
4780 if (err == VK_SUCCESS)
4781 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4782}
4783
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004784TEST_F(VkLayerTest, FramebufferCreateErrors) {
4785 TEST_DESCRIPTION("Hit errors when attempting to create a framebuffer :\n"
4786 " 1. Mismatch between fb & renderPass attachmentCount\n"
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004787 " 2. Use a color image as depthStencil attachment\n"
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004788 " 3. Mismatch fb & renderPass attachment formats\n"
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004789 " 4. Mismatch fb & renderPass attachment #samples\n"
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004790 " 5. FB attachment w/ non-1 mip-levels\n"
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004791 " 6. FB attachment where dimensions don't match\n"
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004792 " 7. FB attachment w/o identity swizzle\n"
4793 " 8. FB dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004794
4795 ASSERT_NO_FATAL_FAILURE(InitState());
4796 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4797
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004798 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4799 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 "
4800 "does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004801
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004802 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004803 VkAttachmentReference attach = {};
4804 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4805 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004806 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004807 VkRenderPassCreateInfo rpci = {};
4808 rpci.subpassCount = 1;
4809 rpci.pSubpasses = &subpass;
4810 rpci.attachmentCount = 1;
4811 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004812 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004813 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004814 rpci.pAttachments = &attach_desc;
4815 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4816 VkRenderPass rp;
4817 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4818 ASSERT_VK_SUCCESS(err);
4819
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004820 VkImageView ivs[2];
4821 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
4822 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004823 VkFramebufferCreateInfo fb_info = {};
4824 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4825 fb_info.pNext = NULL;
4826 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004827 // Set mis-matching attachmentCount
4828 fb_info.attachmentCount = 2;
4829 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004830 fb_info.width = 100;
4831 fb_info.height = 100;
4832 fb_info.layers = 1;
4833
4834 VkFramebuffer fb;
4835 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4836
4837 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004838 if (err == VK_SUCCESS) {
4839 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4840 }
4841 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004842
4843 // Create a renderPass with a depth-stencil attachment created with
4844 // IMAGE_USAGE_COLOR_ATTACHMENT
4845 // Add our color attachment to pDepthStencilAttachment
4846 subpass.pDepthStencilAttachment = &attach;
4847 subpass.pColorAttachments = NULL;
4848 VkRenderPass rp_ds;
4849 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
4850 ASSERT_VK_SUCCESS(err);
4851 // Set correct attachment count, but attachment has COLOR usage bit set
4852 fb_info.attachmentCount = 1;
4853 fb_info.renderPass = rp_ds;
4854
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004855 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " conflicts with the image's IMAGE_USAGE flags ");
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004856 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4857
4858 m_errorMonitor->VerifyFound();
4859 if (err == VK_SUCCESS) {
4860 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4861 }
4862 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004863
4864 // Create new renderpass with alternate attachment format from fb
4865 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
4866 subpass.pDepthStencilAttachment = NULL;
4867 subpass.pColorAttachments = &attach;
4868 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4869 ASSERT_VK_SUCCESS(err);
4870
4871 // Cause error due to mis-matched formats between rp & fb
4872 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
4873 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4875 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004876 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4877
4878 m_errorMonitor->VerifyFound();
4879 if (err == VK_SUCCESS) {
4880 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4881 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004882 vkDestroyRenderPass(m_device->device(), rp, NULL);
4883
4884 // Create new renderpass with alternate sample count from fb
4885 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
4886 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
4887 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4888 ASSERT_VK_SUCCESS(err);
4889
4890 // Cause error due to mis-matched sample count between rp & fb
4891 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has VK_SAMPLE_COUNT_1_BIT samples "
4893 "that do not match the "
4894 "VK_SAMPLE_COUNT_4_BIT ");
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004895 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4896
4897 m_errorMonitor->VerifyFound();
4898 if (err == VK_SUCCESS) {
4899 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4900 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004901
4902 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004903
4904 // Create a custom imageView with non-1 mip levels
4905 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004906 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 -06004907 ASSERT_TRUE(image.initialized());
4908
4909 VkImageView view;
4910 VkImageViewCreateInfo ivci = {};
4911 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4912 ivci.image = image.handle();
4913 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4914 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4915 ivci.subresourceRange.layerCount = 1;
4916 ivci.subresourceRange.baseMipLevel = 0;
4917 // Set level count 2 (only 1 is allowed for FB attachment)
4918 ivci.subresourceRange.levelCount = 2;
4919 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4920 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4921 ASSERT_VK_SUCCESS(err);
4922 // Re-create renderpass to have matching sample count
4923 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4924 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4925 ASSERT_VK_SUCCESS(err);
4926
4927 fb_info.renderPass = rp;
4928 fb_info.pAttachments = &view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has mip levelCount of 2 but only ");
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004930 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4931
4932 m_errorMonitor->VerifyFound();
4933 if (err == VK_SUCCESS) {
4934 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4935 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004936 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004937 // Update view to original color buffer and grow FB dimensions too big
4938 fb_info.pAttachments = ivs;
4939 fb_info.height = 1024;
4940 fb_info.width = 1024;
4941 fb_info.layers = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " Attachment dimensions must be at "
4943 "least as large. ");
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004944 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4945
4946 m_errorMonitor->VerifyFound();
4947 if (err == VK_SUCCESS) {
4948 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4949 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004950 // Create view attachment with non-identity swizzle
4951 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4952 ivci.image = image.handle();
4953 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4954 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4955 ivci.subresourceRange.layerCount = 1;
4956 ivci.subresourceRange.baseMipLevel = 0;
4957 ivci.subresourceRange.levelCount = 1;
4958 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4959 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4960 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4961 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4962 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4963 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4964 ASSERT_VK_SUCCESS(err);
4965
4966 fb_info.pAttachments = &view;
4967 fb_info.height = 100;
4968 fb_info.width = 100;
4969 fb_info.layers = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has non-identy swizzle. All "
4971 "framebuffer attachments must have "
4972 "been created with the identity "
4973 "swizzle. ");
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004974 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4975
4976 m_errorMonitor->VerifyFound();
4977 if (err == VK_SUCCESS) {
4978 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4979 }
4980 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004981 // Request fb that exceeds max dimensions
4982 // reset attachment to color attachment
4983 fb_info.pAttachments = ivs;
4984 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
4985 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
4986 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004987 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " Requested VkFramebufferCreateInfo "
4988 "dimensions exceed physical device "
4989 "limits. ");
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004990 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4991
4992 m_errorMonitor->VerifyFound();
4993 if (err == VK_SUCCESS) {
4994 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4995 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004996
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004997 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004998}
4999
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005000// This is a positive test. No errors should be generated.
Michael Lentine860b0fe2016-05-20 10:14:00 -05005001TEST_F(VkLayerTest, WaitEventThenSet) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005002 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
Michael Lentine860b0fe2016-05-20 10:14:00 -05005003
Michael Lentine860b0fe2016-05-20 10:14:00 -05005004 m_errorMonitor->ExpectSuccess();
Cody Northropc31a84f2016-08-22 10:41:47 -06005005 ASSERT_NO_FATAL_FAILURE(InitState());
Michael Lentine860b0fe2016-05-20 10:14:00 -05005006
5007 VkEvent event;
5008 VkEventCreateInfo event_create_info{};
5009 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5010 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
5011
5012 VkCommandPool command_pool;
5013 VkCommandPoolCreateInfo pool_create_info{};
5014 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5015 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5016 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005017 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
Michael Lentine860b0fe2016-05-20 10:14:00 -05005018
5019 VkCommandBuffer command_buffer;
5020 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005021 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Michael Lentine860b0fe2016-05-20 10:14:00 -05005022 command_buffer_allocate_info.commandPool = command_pool;
5023 command_buffer_allocate_info.commandBufferCount = 1;
5024 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005025 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
Michael Lentine860b0fe2016-05-20 10:14:00 -05005026
5027 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005028 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05005029
5030 {
5031 VkCommandBufferBeginInfo begin_info{};
5032 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5033 vkBeginCommandBuffer(command_buffer, &begin_info);
5034
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005035 vkCmdWaitEvents(command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
Michael Lentine860b0fe2016-05-20 10:14:00 -05005036 nullptr, 0, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005037 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Michael Lentine860b0fe2016-05-20 10:14:00 -05005038 vkEndCommandBuffer(command_buffer);
5039 }
5040 {
5041 VkSubmitInfo submit_info{};
5042 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5043 submit_info.commandBufferCount = 1;
5044 submit_info.pCommandBuffers = &command_buffer;
5045 submit_info.signalSemaphoreCount = 0;
5046 submit_info.pSignalSemaphores = nullptr;
5047 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5048 }
5049 { vkSetEvent(m_device->device(), event); }
5050
5051 vkQueueWaitIdle(queue);
5052
5053 vkDestroyEvent(m_device->device(), event, nullptr);
5054 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
5055 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5056
5057 m_errorMonitor->VerifyNotFound();
5058}
Michael Lentine5627e692016-05-20 17:45:02 -05005059// This is a positive test. No errors should be generated.
Michael Lentinef01fb382016-07-21 17:24:56 -05005060TEST_F(VkLayerTest, QueryAndCopySecondaryCommandBuffers) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005061 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
Michael Lentinef01fb382016-07-21 17:24:56 -05005062
Cody Northropc31a84f2016-08-22 10:41:47 -06005063 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005064 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
Michael Lentinef01fb382016-07-21 17:24:56 -05005065 return;
5066
5067 m_errorMonitor->ExpectSuccess();
5068
5069 VkQueryPool query_pool;
5070 VkQueryPoolCreateInfo query_pool_create_info{};
5071 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5072 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
5073 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005074 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Michael Lentinef01fb382016-07-21 17:24:56 -05005075
5076 VkCommandPool command_pool;
5077 VkCommandPoolCreateInfo pool_create_info{};
5078 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5079 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5080 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005081 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
Michael Lentinef01fb382016-07-21 17:24:56 -05005082
5083 VkCommandBuffer command_buffer;
5084 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005085 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Michael Lentinef01fb382016-07-21 17:24:56 -05005086 command_buffer_allocate_info.commandPool = command_pool;
5087 command_buffer_allocate_info.commandBufferCount = 1;
5088 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005089 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
Michael Lentinef01fb382016-07-21 17:24:56 -05005090
5091 VkCommandBuffer secondary_command_buffer;
5092 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005093 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
Michael Lentinef01fb382016-07-21 17:24:56 -05005094
5095 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005096 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
Michael Lentinef01fb382016-07-21 17:24:56 -05005097
5098 uint32_t qfi = 0;
5099 VkBufferCreateInfo buff_create_info = {};
5100 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5101 buff_create_info.size = 1024;
5102 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
5103 buff_create_info.queueFamilyIndexCount = 1;
5104 buff_create_info.pQueueFamilyIndices = &qfi;
5105
5106 VkResult err;
5107 VkBuffer buffer;
5108 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
5109 ASSERT_VK_SUCCESS(err);
5110 VkMemoryAllocateInfo mem_alloc = {};
5111 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5112 mem_alloc.pNext = NULL;
5113 mem_alloc.allocationSize = 1024;
5114 mem_alloc.memoryTypeIndex = 0;
5115
5116 VkMemoryRequirements memReqs;
5117 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005118 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Michael Lentinef01fb382016-07-21 17:24:56 -05005119 if (!pass) {
5120 vkDestroyBuffer(m_device->device(), buffer, NULL);
5121 return;
5122 }
5123
5124 VkDeviceMemory mem;
5125 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5126 ASSERT_VK_SUCCESS(err);
5127 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5128 ASSERT_VK_SUCCESS(err);
5129
5130 VkCommandBufferInheritanceInfo hinfo = {};
5131 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
5132 hinfo.renderPass = VK_NULL_HANDLE;
5133 hinfo.subpass = 0;
5134 hinfo.framebuffer = VK_NULL_HANDLE;
5135 hinfo.occlusionQueryEnable = VK_FALSE;
5136 hinfo.queryFlags = 0;
5137 hinfo.pipelineStatistics = 0;
5138
5139 {
5140 VkCommandBufferBeginInfo begin_info{};
5141 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5142 begin_info.pInheritanceInfo = &hinfo;
5143 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
5144
5145 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005146 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
Michael Lentinef01fb382016-07-21 17:24:56 -05005147
5148 vkEndCommandBuffer(secondary_command_buffer);
5149
5150 begin_info.pInheritanceInfo = nullptr;
5151 vkBeginCommandBuffer(command_buffer, &begin_info);
5152
5153 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005154 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
Michael Lentinef01fb382016-07-21 17:24:56 -05005155
5156 vkEndCommandBuffer(command_buffer);
5157 }
5158 {
5159 VkSubmitInfo submit_info{};
5160 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5161 submit_info.commandBufferCount = 1;
5162 submit_info.pCommandBuffers = &command_buffer;
5163 submit_info.signalSemaphoreCount = 0;
5164 submit_info.pSignalSemaphores = nullptr;
5165 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5166 }
5167
5168 vkQueueWaitIdle(queue);
5169
5170 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
5171 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
5172 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
5173 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5174 vkDestroyBuffer(m_device->device(), buffer, NULL);
5175 vkFreeMemory(m_device->device(), mem, NULL);
5176
5177 m_errorMonitor->VerifyNotFound();
5178}
5179
5180// This is a positive test. No errors should be generated.
Michael Lentine5627e692016-05-20 17:45:02 -05005181TEST_F(VkLayerTest, QueryAndCopyMultipleCommandBuffers) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005182 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
Michael Lentine5627e692016-05-20 17:45:02 -05005183
Cody Northropc31a84f2016-08-22 10:41:47 -06005184 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005185 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
Michael Lentine5627e692016-05-20 17:45:02 -05005186 return;
5187
5188 m_errorMonitor->ExpectSuccess();
5189
5190 VkQueryPool query_pool;
5191 VkQueryPoolCreateInfo query_pool_create_info{};
5192 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5193 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
5194 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005195 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Michael Lentine5627e692016-05-20 17:45:02 -05005196
5197 VkCommandPool command_pool;
5198 VkCommandPoolCreateInfo pool_create_info{};
5199 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5200 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5201 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005202 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
Michael Lentine5627e692016-05-20 17:45:02 -05005203
5204 VkCommandBuffer command_buffer[2];
5205 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005206 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Michael Lentine5627e692016-05-20 17:45:02 -05005207 command_buffer_allocate_info.commandPool = command_pool;
5208 command_buffer_allocate_info.commandBufferCount = 2;
5209 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005210 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
Michael Lentine5627e692016-05-20 17:45:02 -05005211
5212 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005213 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
Michael Lentine5627e692016-05-20 17:45:02 -05005214
5215 uint32_t qfi = 0;
5216 VkBufferCreateInfo buff_create_info = {};
5217 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5218 buff_create_info.size = 1024;
5219 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
5220 buff_create_info.queueFamilyIndexCount = 1;
5221 buff_create_info.pQueueFamilyIndices = &qfi;
5222
5223 VkResult err;
5224 VkBuffer buffer;
5225 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
5226 ASSERT_VK_SUCCESS(err);
5227 VkMemoryAllocateInfo mem_alloc = {};
5228 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5229 mem_alloc.pNext = NULL;
5230 mem_alloc.allocationSize = 1024;
5231 mem_alloc.memoryTypeIndex = 0;
5232
5233 VkMemoryRequirements memReqs;
5234 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005235 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Michael Lentine5627e692016-05-20 17:45:02 -05005236 if (!pass) {
5237 vkDestroyBuffer(m_device->device(), buffer, NULL);
5238 return;
5239 }
5240
5241 VkDeviceMemory mem;
5242 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5243 ASSERT_VK_SUCCESS(err);
5244 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5245 ASSERT_VK_SUCCESS(err);
5246
5247 {
5248 VkCommandBufferBeginInfo begin_info{};
5249 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5250 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5251
5252 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005253 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
Michael Lentine5627e692016-05-20 17:45:02 -05005254
5255 vkEndCommandBuffer(command_buffer[0]);
5256
5257 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5258
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005259 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
Michael Lentine5627e692016-05-20 17:45:02 -05005260
5261 vkEndCommandBuffer(command_buffer[1]);
5262 }
5263 {
5264 VkSubmitInfo submit_info{};
5265 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5266 submit_info.commandBufferCount = 2;
5267 submit_info.pCommandBuffers = command_buffer;
5268 submit_info.signalSemaphoreCount = 0;
5269 submit_info.pSignalSemaphores = nullptr;
5270 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5271 }
5272
5273 vkQueueWaitIdle(queue);
5274
5275 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
5276 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
5277 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06005278 vkDestroyBuffer(m_device->device(), buffer, NULL);
5279 vkFreeMemory(m_device->device(), mem, NULL);
Michael Lentine5627e692016-05-20 17:45:02 -05005280
5281 m_errorMonitor->VerifyNotFound();
5282}
Michael Lentine860b0fe2016-05-20 10:14:00 -05005283
5284TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005285 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
Michael Lentine860b0fe2016-05-20 10:14:00 -05005286
Michael Lentine860b0fe2016-05-20 10:14:00 -05005287 m_errorMonitor->ExpectSuccess();
5288
Cody Northropc31a84f2016-08-22 10:41:47 -06005289 ASSERT_NO_FATAL_FAILURE(InitState());
Michael Lentine860b0fe2016-05-20 10:14:00 -05005290 VkEvent event;
5291 VkEventCreateInfo event_create_info{};
5292 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5293 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
5294
5295 VkCommandPool command_pool;
5296 VkCommandPoolCreateInfo pool_create_info{};
5297 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5298 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5299 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005300 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
Michael Lentine860b0fe2016-05-20 10:14:00 -05005301
5302 VkCommandBuffer command_buffer;
5303 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005304 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Michael Lentine860b0fe2016-05-20 10:14:00 -05005305 command_buffer_allocate_info.commandPool = command_pool;
5306 command_buffer_allocate_info.commandBufferCount = 1;
5307 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005308 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
Michael Lentine860b0fe2016-05-20 10:14:00 -05005309
5310 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005311 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05005312
5313 {
5314 VkCommandBufferBeginInfo begin_info{};
5315 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5316 vkBeginCommandBuffer(command_buffer, &begin_info);
5317
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005318 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
5319 vkCmdWaitEvents(command_buffer, 1, &event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
5320 nullptr, 0, nullptr, 0, nullptr);
Michael Lentine860b0fe2016-05-20 10:14:00 -05005321 vkEndCommandBuffer(command_buffer);
5322 }
5323 {
5324 VkSubmitInfo submit_info{};
5325 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5326 submit_info.commandBufferCount = 1;
5327 submit_info.pCommandBuffers = &command_buffer;
5328 submit_info.signalSemaphoreCount = 0;
5329 submit_info.pSignalSemaphores = nullptr;
5330 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5331 }
5332 {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005333 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is already in use by a "
5334 "command buffer.");
Michael Lentine860b0fe2016-05-20 10:14:00 -05005335 vkSetEvent(m_device->device(), event);
5336 m_errorMonitor->VerifyFound();
5337 }
5338
5339 vkQueueWaitIdle(queue);
5340
5341 vkDestroyEvent(m_device->device(), event, nullptr);
5342 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
5343 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5344}
5345
5346// This is a positive test. No errors should be generated.
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005347TEST_F(VkLayerTest, TwoFencesThreeFrames) {
5348 TEST_DESCRIPTION("Two command buffers with two separate fences are each "
5349 "run through a Submit & WaitForFences cycle 3 times. This "
5350 "previously revealed a bug so running this positive test "
5351 "to prevent a regression.");
5352 m_errorMonitor->ExpectSuccess();
5353
5354 ASSERT_NO_FATAL_FAILURE(InitState());
5355 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005356 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005357
5358 static const uint32_t NUM_OBJECTS = 2;
5359 static const uint32_t NUM_FRAMES = 3;
5360 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
5361 VkFence fences[NUM_OBJECTS] = {};
5362
5363 VkCommandPool cmd_pool;
5364 VkCommandPoolCreateInfo cmd_pool_ci = {};
5365 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5366 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
5367 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005368 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005369 ASSERT_VK_SUCCESS(err);
5370
5371 VkCommandBufferAllocateInfo cmd_buf_info = {};
5372 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5373 cmd_buf_info.commandPool = cmd_pool;
5374 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5375 cmd_buf_info.commandBufferCount = 1;
5376
5377 VkFenceCreateInfo fence_ci = {};
5378 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5379 fence_ci.pNext = nullptr;
5380 fence_ci.flags = 0;
5381
5382 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005383 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005384 ASSERT_VK_SUCCESS(err);
5385 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
5386 ASSERT_VK_SUCCESS(err);
5387 }
5388
5389 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
Tobin Ehlisf9025162016-05-26 06:55:21 -06005390 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
5391 // Create empty cmd buffer
5392 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
5393 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005394
Tobin Ehlisf9025162016-05-26 06:55:21 -06005395 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
5396 ASSERT_VK_SUCCESS(err);
5397 err = vkEndCommandBuffer(cmd_buffers[obj]);
5398 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005399
Tobin Ehlisf9025162016-05-26 06:55:21 -06005400 VkSubmitInfo submit_info = {};
5401 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5402 submit_info.commandBufferCount = 1;
5403 submit_info.pCommandBuffers = &cmd_buffers[obj];
5404 // Submit cmd buffer and wait for fence
5405 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
5406 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005407 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
Tobin Ehlisf9025162016-05-26 06:55:21 -06005408 ASSERT_VK_SUCCESS(err);
5409 err = vkResetFences(m_device->device(), 1, &fences[obj]);
5410 ASSERT_VK_SUCCESS(err);
5411 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005412 }
5413 m_errorMonitor->VerifyNotFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06005414 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
5415 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
5416 vkDestroyFence(m_device->device(), fences[i], nullptr);
5417 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06005418}
5419// This is a positive test. No errors should be generated.
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005420TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
5421
5422 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005423 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005424
Cody Northropc31a84f2016-08-22 10:41:47 -06005425 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005426 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005427 return;
5428
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005429 m_errorMonitor->ExpectSuccess();
5430
5431 VkSemaphore semaphore;
5432 VkSemaphoreCreateInfo semaphore_create_info{};
5433 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005434 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005435
5436 VkCommandPool command_pool;
5437 VkCommandPoolCreateInfo pool_create_info{};
5438 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5439 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5440 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005441 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005442
5443 VkCommandBuffer command_buffer[2];
5444 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005445 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005446 command_buffer_allocate_info.commandPool = command_pool;
5447 command_buffer_allocate_info.commandBufferCount = 2;
5448 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005449 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005450
5451 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005452 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005453
5454 {
5455 VkCommandBufferBeginInfo begin_info{};
5456 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5457 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5458
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005459 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
5460 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005461
5462 VkViewport viewport{};
5463 viewport.maxDepth = 1.0f;
5464 viewport.minDepth = 0.0f;
5465 viewport.width = 512;
5466 viewport.height = 512;
5467 viewport.x = 0;
5468 viewport.y = 0;
5469 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5470 vkEndCommandBuffer(command_buffer[0]);
5471 }
5472 {
5473 VkCommandBufferBeginInfo begin_info{};
5474 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5475 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5476
5477 VkViewport viewport{};
5478 viewport.maxDepth = 1.0f;
5479 viewport.minDepth = 0.0f;
5480 viewport.width = 512;
5481 viewport.height = 512;
5482 viewport.x = 0;
5483 viewport.y = 0;
5484 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5485 vkEndCommandBuffer(command_buffer[1]);
5486 }
5487 {
5488 VkSubmitInfo submit_info{};
5489 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5490 submit_info.commandBufferCount = 1;
5491 submit_info.pCommandBuffers = &command_buffer[0];
5492 submit_info.signalSemaphoreCount = 1;
5493 submit_info.pSignalSemaphores = &semaphore;
5494 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5495 }
5496 {
5497 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5498 VkSubmitInfo submit_info{};
5499 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5500 submit_info.commandBufferCount = 1;
5501 submit_info.pCommandBuffers = &command_buffer[1];
5502 submit_info.waitSemaphoreCount = 1;
5503 submit_info.pWaitSemaphores = &semaphore;
5504 submit_info.pWaitDstStageMask = flags;
5505 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5506 }
5507
5508 vkQueueWaitIdle(m_device->m_queue);
5509
5510 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005511 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005512 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5513
5514 m_errorMonitor->VerifyNotFound();
5515}
5516
5517// This is a positive test. No errors should be generated.
5518TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
5519
5520 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5521 "submitted on separate queues, the second having a fence"
5522 "followed by a QueueWaitIdle.");
5523
Cody Northropc31a84f2016-08-22 10:41:47 -06005524 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005525 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005526 return;
5527
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005528 m_errorMonitor->ExpectSuccess();
5529
5530 VkFence fence;
5531 VkFenceCreateInfo fence_create_info{};
5532 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5533 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5534
5535 VkSemaphore semaphore;
5536 VkSemaphoreCreateInfo semaphore_create_info{};
5537 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005538 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005539
5540 VkCommandPool command_pool;
5541 VkCommandPoolCreateInfo pool_create_info{};
5542 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5543 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5544 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005545 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005546
5547 VkCommandBuffer command_buffer[2];
5548 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005549 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005550 command_buffer_allocate_info.commandPool = command_pool;
5551 command_buffer_allocate_info.commandBufferCount = 2;
5552 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005553 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005554
5555 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005556 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005557
5558 {
5559 VkCommandBufferBeginInfo begin_info{};
5560 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5561 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5562
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005563 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
5564 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005565
5566 VkViewport viewport{};
5567 viewport.maxDepth = 1.0f;
5568 viewport.minDepth = 0.0f;
5569 viewport.width = 512;
5570 viewport.height = 512;
5571 viewport.x = 0;
5572 viewport.y = 0;
5573 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5574 vkEndCommandBuffer(command_buffer[0]);
5575 }
5576 {
5577 VkCommandBufferBeginInfo begin_info{};
5578 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5579 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5580
5581 VkViewport viewport{};
5582 viewport.maxDepth = 1.0f;
5583 viewport.minDepth = 0.0f;
5584 viewport.width = 512;
5585 viewport.height = 512;
5586 viewport.x = 0;
5587 viewport.y = 0;
5588 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5589 vkEndCommandBuffer(command_buffer[1]);
5590 }
5591 {
5592 VkSubmitInfo submit_info{};
5593 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5594 submit_info.commandBufferCount = 1;
5595 submit_info.pCommandBuffers = &command_buffer[0];
5596 submit_info.signalSemaphoreCount = 1;
5597 submit_info.pSignalSemaphores = &semaphore;
5598 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5599 }
5600 {
5601 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5602 VkSubmitInfo submit_info{};
5603 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5604 submit_info.commandBufferCount = 1;
5605 submit_info.pCommandBuffers = &command_buffer[1];
5606 submit_info.waitSemaphoreCount = 1;
5607 submit_info.pWaitSemaphores = &semaphore;
5608 submit_info.pWaitDstStageMask = flags;
5609 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5610 }
5611
5612 vkQueueWaitIdle(m_device->m_queue);
5613
5614 vkDestroyFence(m_device->device(), fence, nullptr);
5615 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005616 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005617 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5618
5619 m_errorMonitor->VerifyNotFound();
5620}
5621
5622// This is a positive test. No errors should be generated.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005623TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005624
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005625 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5626 "submitted on separate queues, the second having a fence"
5627 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005628
Cody Northropc31a84f2016-08-22 10:41:47 -06005629 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005630 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005631 return;
5632
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005633 m_errorMonitor->ExpectSuccess();
5634
5635 VkFence fence;
5636 VkFenceCreateInfo fence_create_info{};
5637 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5638 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5639
5640 VkSemaphore semaphore;
5641 VkSemaphoreCreateInfo semaphore_create_info{};
5642 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005643 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005644
5645 VkCommandPool command_pool;
5646 VkCommandPoolCreateInfo pool_create_info{};
5647 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5648 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5649 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005650 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005651
5652 VkCommandBuffer command_buffer[2];
5653 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005654 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005655 command_buffer_allocate_info.commandPool = command_pool;
5656 command_buffer_allocate_info.commandBufferCount = 2;
5657 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005658 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005659
5660 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005661 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005662
5663 {
5664 VkCommandBufferBeginInfo begin_info{};
5665 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5666 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5667
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005668 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
5669 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005670
5671 VkViewport viewport{};
5672 viewport.maxDepth = 1.0f;
5673 viewport.minDepth = 0.0f;
5674 viewport.width = 512;
5675 viewport.height = 512;
5676 viewport.x = 0;
5677 viewport.y = 0;
5678 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5679 vkEndCommandBuffer(command_buffer[0]);
5680 }
5681 {
5682 VkCommandBufferBeginInfo begin_info{};
5683 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5684 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5685
5686 VkViewport viewport{};
5687 viewport.maxDepth = 1.0f;
5688 viewport.minDepth = 0.0f;
5689 viewport.width = 512;
5690 viewport.height = 512;
5691 viewport.x = 0;
5692 viewport.y = 0;
5693 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5694 vkEndCommandBuffer(command_buffer[1]);
5695 }
5696 {
5697 VkSubmitInfo submit_info{};
5698 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5699 submit_info.commandBufferCount = 1;
5700 submit_info.pCommandBuffers = &command_buffer[0];
5701 submit_info.signalSemaphoreCount = 1;
5702 submit_info.pSignalSemaphores = &semaphore;
5703 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5704 }
5705 {
5706 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5707 VkSubmitInfo submit_info{};
5708 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5709 submit_info.commandBufferCount = 1;
5710 submit_info.pCommandBuffers = &command_buffer[1];
5711 submit_info.waitSemaphoreCount = 1;
5712 submit_info.pWaitSemaphores = &semaphore;
5713 submit_info.pWaitDstStageMask = flags;
5714 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5715 }
5716
5717 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5718 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5719
5720 vkDestroyFence(m_device->device(), fence, nullptr);
5721 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005722 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005723 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5724
5725 m_errorMonitor->VerifyNotFound();
5726}
5727
Chris Forbes0f8126b2016-06-20 17:48:22 +12005728TEST_F(VkLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Cody Northropc31a84f2016-08-22 10:41:47 -06005729
5730 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005731 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Chris Forbes0f8126b2016-06-20 17:48:22 +12005732 printf("Test requires two queues, skipping\n");
5733 return;
5734 }
5735
5736 VkResult err;
5737
5738 m_errorMonitor->ExpectSuccess();
5739
5740 VkQueue q0 = m_device->m_queue;
5741 VkQueue q1 = nullptr;
5742 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
5743 ASSERT_NE(q1, nullptr);
5744
5745 // An (empty) command buffer. We must have work in the first submission --
5746 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005747 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Chris Forbes0f8126b2016-06-20 17:48:22 +12005748 VkCommandPool pool;
5749 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
5750 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005751 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
5752 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Chris Forbes0f8126b2016-06-20 17:48:22 +12005753 VkCommandBuffer cb;
5754 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
5755 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005756 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes0f8126b2016-06-20 17:48:22 +12005757 err = vkBeginCommandBuffer(cb, &cbbi);
5758 ASSERT_VK_SUCCESS(err);
5759 err = vkEndCommandBuffer(cb);
5760 ASSERT_VK_SUCCESS(err);
5761
5762 // A semaphore
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005763 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Chris Forbes0f8126b2016-06-20 17:48:22 +12005764 VkSemaphore s;
5765 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
5766 ASSERT_VK_SUCCESS(err);
5767
5768 // First submission, to q0
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005769 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Chris Forbes0f8126b2016-06-20 17:48:22 +12005770
5771 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
5772 ASSERT_VK_SUCCESS(err);
5773
5774 // Second submission, to q1, waiting on s
5775 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005776 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Chris Forbes0f8126b2016-06-20 17:48:22 +12005777
5778 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
5779 ASSERT_VK_SUCCESS(err);
5780
5781 // Wait for q0 idle
5782 err = vkQueueWaitIdle(q0);
5783 ASSERT_VK_SUCCESS(err);
5784
5785 // Command buffer should have been completed (it was on q0); reset the pool.
5786 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
5787
5788 m_errorMonitor->VerifyNotFound();
5789
5790 // Force device completely idle and clean up resources
5791 vkDeviceWaitIdle(m_device->device());
5792 vkDestroyCommandPool(m_device->device(), pool, nullptr);
5793 vkDestroySemaphore(m_device->device(), s, nullptr);
5794}
Chris Forbes0f8126b2016-06-20 17:48:22 +12005795
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005796// This is a positive test. No errors should be generated.
5797TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
5798
5799 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5800 "submitted on separate queues, the second having a fence, "
5801 "followed by a WaitForFences call.");
5802
Cody Northropc31a84f2016-08-22 10:41:47 -06005803 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005804 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005805 return;
5806
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005807 m_errorMonitor->ExpectSuccess();
5808
Cody Northropc31a84f2016-08-22 10:41:47 -06005809 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005810 VkFence fence;
5811 VkFenceCreateInfo fence_create_info{};
5812 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5813 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5814
5815 VkSemaphore semaphore;
5816 VkSemaphoreCreateInfo semaphore_create_info{};
5817 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005818 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005819
5820 VkCommandPool command_pool;
5821 VkCommandPoolCreateInfo pool_create_info{};
5822 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5823 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5824 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005825 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005826
5827 VkCommandBuffer command_buffer[2];
5828 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005829 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005830 command_buffer_allocate_info.commandPool = command_pool;
5831 command_buffer_allocate_info.commandBufferCount = 2;
5832 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005833 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005834
5835 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005836 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005837
5838 {
5839 VkCommandBufferBeginInfo begin_info{};
5840 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5841 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5842
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005843 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
5844 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005845
5846 VkViewport viewport{};
5847 viewport.maxDepth = 1.0f;
5848 viewport.minDepth = 0.0f;
5849 viewport.width = 512;
5850 viewport.height = 512;
5851 viewport.x = 0;
5852 viewport.y = 0;
5853 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5854 vkEndCommandBuffer(command_buffer[0]);
5855 }
5856 {
5857 VkCommandBufferBeginInfo begin_info{};
5858 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5859 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5860
5861 VkViewport viewport{};
5862 viewport.maxDepth = 1.0f;
5863 viewport.minDepth = 0.0f;
5864 viewport.width = 512;
5865 viewport.height = 512;
5866 viewport.x = 0;
5867 viewport.y = 0;
5868 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5869 vkEndCommandBuffer(command_buffer[1]);
5870 }
5871 {
5872 VkSubmitInfo submit_info{};
5873 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5874 submit_info.commandBufferCount = 1;
5875 submit_info.pCommandBuffers = &command_buffer[0];
5876 submit_info.signalSemaphoreCount = 1;
5877 submit_info.pSignalSemaphores = &semaphore;
5878 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5879 }
5880 {
5881 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5882 VkSubmitInfo submit_info{};
5883 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5884 submit_info.commandBufferCount = 1;
5885 submit_info.pCommandBuffers = &command_buffer[1];
5886 submit_info.waitSemaphoreCount = 1;
5887 submit_info.pWaitSemaphores = &semaphore;
5888 submit_info.pWaitDstStageMask = flags;
5889 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5890 }
5891
5892 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5893
5894 vkDestroyFence(m_device->device(), fence, nullptr);
5895 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005896 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005897 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5898
5899 m_errorMonitor->VerifyNotFound();
5900}
5901
5902// This is a positive test. No errors should be generated.
5903TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
5904
5905 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5906 "on the same queue, sharing a signal/wait semaphore, the "
5907 "second having a fence, "
5908 "followed by a WaitForFences call.");
5909
5910 m_errorMonitor->ExpectSuccess();
5911
Cody Northropc31a84f2016-08-22 10:41:47 -06005912 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005913 VkFence fence;
5914 VkFenceCreateInfo fence_create_info{};
5915 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5916 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5917
5918 VkSemaphore semaphore;
5919 VkSemaphoreCreateInfo semaphore_create_info{};
5920 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005921 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005922
5923 VkCommandPool command_pool;
5924 VkCommandPoolCreateInfo pool_create_info{};
5925 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5926 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5927 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005928 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005929
5930 VkCommandBuffer command_buffer[2];
5931 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005932 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005933 command_buffer_allocate_info.commandPool = command_pool;
5934 command_buffer_allocate_info.commandBufferCount = 2;
5935 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005936 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005937
5938 {
5939 VkCommandBufferBeginInfo begin_info{};
5940 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5941 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5942
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005943 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
5944 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005945
5946 VkViewport viewport{};
5947 viewport.maxDepth = 1.0f;
5948 viewport.minDepth = 0.0f;
5949 viewport.width = 512;
5950 viewport.height = 512;
5951 viewport.x = 0;
5952 viewport.y = 0;
5953 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5954 vkEndCommandBuffer(command_buffer[0]);
5955 }
5956 {
5957 VkCommandBufferBeginInfo begin_info{};
5958 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5959 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5960
5961 VkViewport viewport{};
5962 viewport.maxDepth = 1.0f;
5963 viewport.minDepth = 0.0f;
5964 viewport.width = 512;
5965 viewport.height = 512;
5966 viewport.x = 0;
5967 viewport.y = 0;
5968 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5969 vkEndCommandBuffer(command_buffer[1]);
5970 }
5971 {
5972 VkSubmitInfo submit_info{};
5973 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5974 submit_info.commandBufferCount = 1;
5975 submit_info.pCommandBuffers = &command_buffer[0];
5976 submit_info.signalSemaphoreCount = 1;
5977 submit_info.pSignalSemaphores = &semaphore;
5978 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5979 }
5980 {
5981 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5982 VkSubmitInfo submit_info{};
5983 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5984 submit_info.commandBufferCount = 1;
5985 submit_info.pCommandBuffers = &command_buffer[1];
5986 submit_info.waitSemaphoreCount = 1;
5987 submit_info.pWaitSemaphores = &semaphore;
5988 submit_info.pWaitDstStageMask = flags;
5989 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5990 }
5991
5992 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5993
5994 vkDestroyFence(m_device->device(), fence, nullptr);
5995 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005996 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005997 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5998
5999 m_errorMonitor->VerifyNotFound();
6000}
6001
6002// This is a positive test. No errors should be generated.
6003TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
6004
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006005 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
6006 "on the same queue, no fences, followed by a third QueueSubmit with NO "
6007 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006008
6009 m_errorMonitor->ExpectSuccess();
6010
Cody Northropc31a84f2016-08-22 10:41:47 -06006011 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006012 VkFence fence;
6013 VkFenceCreateInfo fence_create_info{};
6014 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6015 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6016
6017 VkCommandPool command_pool;
6018 VkCommandPoolCreateInfo pool_create_info{};
6019 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6020 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6021 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006022 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006023
6024 VkCommandBuffer command_buffer[2];
6025 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006026 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006027 command_buffer_allocate_info.commandPool = command_pool;
6028 command_buffer_allocate_info.commandBufferCount = 2;
6029 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006030 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006031
6032 {
6033 VkCommandBufferBeginInfo begin_info{};
6034 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6035 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6036
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006037 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
6038 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006039
6040 VkViewport viewport{};
6041 viewport.maxDepth = 1.0f;
6042 viewport.minDepth = 0.0f;
6043 viewport.width = 512;
6044 viewport.height = 512;
6045 viewport.x = 0;
6046 viewport.y = 0;
6047 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6048 vkEndCommandBuffer(command_buffer[0]);
6049 }
6050 {
6051 VkCommandBufferBeginInfo begin_info{};
6052 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6053 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6054
6055 VkViewport viewport{};
6056 viewport.maxDepth = 1.0f;
6057 viewport.minDepth = 0.0f;
6058 viewport.width = 512;
6059 viewport.height = 512;
6060 viewport.x = 0;
6061 viewport.y = 0;
6062 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6063 vkEndCommandBuffer(command_buffer[1]);
6064 }
6065 {
6066 VkSubmitInfo submit_info{};
6067 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6068 submit_info.commandBufferCount = 1;
6069 submit_info.pCommandBuffers = &command_buffer[0];
6070 submit_info.signalSemaphoreCount = 0;
6071 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
6072 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6073 }
6074 {
6075 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6076 VkSubmitInfo submit_info{};
6077 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6078 submit_info.commandBufferCount = 1;
6079 submit_info.pCommandBuffers = &command_buffer[1];
6080 submit_info.waitSemaphoreCount = 0;
6081 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
6082 submit_info.pWaitDstStageMask = flags;
6083 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6084 }
6085
6086 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
6087
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006088 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
Mike Stroyancd1c3e52016-06-21 09:20:01 -06006089 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006090
6091 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006092 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006093 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
6094
6095 m_errorMonitor->VerifyNotFound();
6096}
6097
6098// This is a positive test. No errors should be generated.
6099TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
6100
6101 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
6102 "on the same queue, the second having a fence, followed "
6103 "by a WaitForFences call.");
6104
6105 m_errorMonitor->ExpectSuccess();
6106
Cody Northropc31a84f2016-08-22 10:41:47 -06006107 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006108 VkFence fence;
6109 VkFenceCreateInfo fence_create_info{};
6110 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6111 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6112
6113 VkCommandPool command_pool;
6114 VkCommandPoolCreateInfo pool_create_info{};
6115 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6116 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6117 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006118 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006119
6120 VkCommandBuffer command_buffer[2];
6121 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006122 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006123 command_buffer_allocate_info.commandPool = command_pool;
6124 command_buffer_allocate_info.commandBufferCount = 2;
6125 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006126 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006127
6128 {
6129 VkCommandBufferBeginInfo begin_info{};
6130 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6131 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6132
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006133 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
6134 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006135
6136 VkViewport viewport{};
6137 viewport.maxDepth = 1.0f;
6138 viewport.minDepth = 0.0f;
6139 viewport.width = 512;
6140 viewport.height = 512;
6141 viewport.x = 0;
6142 viewport.y = 0;
6143 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6144 vkEndCommandBuffer(command_buffer[0]);
6145 }
6146 {
6147 VkCommandBufferBeginInfo begin_info{};
6148 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6149 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6150
6151 VkViewport viewport{};
6152 viewport.maxDepth = 1.0f;
6153 viewport.minDepth = 0.0f;
6154 viewport.width = 512;
6155 viewport.height = 512;
6156 viewport.x = 0;
6157 viewport.y = 0;
6158 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6159 vkEndCommandBuffer(command_buffer[1]);
6160 }
6161 {
6162 VkSubmitInfo submit_info{};
6163 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6164 submit_info.commandBufferCount = 1;
6165 submit_info.pCommandBuffers = &command_buffer[0];
6166 submit_info.signalSemaphoreCount = 0;
6167 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
6168 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6169 }
6170 {
6171 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6172 VkSubmitInfo submit_info{};
6173 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6174 submit_info.commandBufferCount = 1;
6175 submit_info.pCommandBuffers = &command_buffer[1];
6176 submit_info.waitSemaphoreCount = 0;
6177 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
6178 submit_info.pWaitDstStageMask = flags;
6179 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
6180 }
6181
6182 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6183
6184 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006185 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006186 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
6187
6188 m_errorMonitor->VerifyNotFound();
6189}
6190
6191// This is a positive test. No errors should be generated.
6192TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
6193
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006194 TEST_DESCRIPTION("Two command buffers each in a separate SubmitInfo sent in a single "
6195 "QueueSubmit call followed by a WaitForFences call.");
Cody Northropc31a84f2016-08-22 10:41:47 -06006196 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006197
6198 m_errorMonitor->ExpectSuccess();
6199
6200 VkFence fence;
6201 VkFenceCreateInfo fence_create_info{};
6202 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
6203 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
6204
6205 VkSemaphore semaphore;
6206 VkSemaphoreCreateInfo semaphore_create_info{};
6207 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006208 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006209
6210 VkCommandPool command_pool;
6211 VkCommandPoolCreateInfo pool_create_info{};
6212 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6213 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
6214 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006215 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006216
6217 VkCommandBuffer command_buffer[2];
6218 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006219 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006220 command_buffer_allocate_info.commandPool = command_pool;
6221 command_buffer_allocate_info.commandBufferCount = 2;
6222 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006223 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006224
6225 {
6226 VkCommandBufferBeginInfo begin_info{};
6227 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6228 vkBeginCommandBuffer(command_buffer[0], &begin_info);
6229
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006230 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
6231 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006232
6233 VkViewport viewport{};
6234 viewport.maxDepth = 1.0f;
6235 viewport.minDepth = 0.0f;
6236 viewport.width = 512;
6237 viewport.height = 512;
6238 viewport.x = 0;
6239 viewport.y = 0;
6240 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
6241 vkEndCommandBuffer(command_buffer[0]);
6242 }
6243 {
6244 VkCommandBufferBeginInfo begin_info{};
6245 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6246 vkBeginCommandBuffer(command_buffer[1], &begin_info);
6247
6248 VkViewport viewport{};
6249 viewport.maxDepth = 1.0f;
6250 viewport.minDepth = 0.0f;
6251 viewport.width = 512;
6252 viewport.height = 512;
6253 viewport.x = 0;
6254 viewport.y = 0;
6255 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
6256 vkEndCommandBuffer(command_buffer[1]);
6257 }
6258 {
6259 VkSubmitInfo submit_info[2];
6260 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
6261
6262 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6263 submit_info[0].pNext = NULL;
6264 submit_info[0].commandBufferCount = 1;
6265 submit_info[0].pCommandBuffers = &command_buffer[0];
6266 submit_info[0].signalSemaphoreCount = 1;
6267 submit_info[0].pSignalSemaphores = &semaphore;
6268 submit_info[0].waitSemaphoreCount = 0;
6269 submit_info[0].pWaitSemaphores = NULL;
6270 submit_info[0].pWaitDstStageMask = 0;
6271
6272 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6273 submit_info[1].pNext = NULL;
6274 submit_info[1].commandBufferCount = 1;
6275 submit_info[1].pCommandBuffers = &command_buffer[1];
6276 submit_info[1].waitSemaphoreCount = 1;
6277 submit_info[1].pWaitSemaphores = &semaphore;
6278 submit_info[1].pWaitDstStageMask = flags;
6279 submit_info[1].signalSemaphoreCount = 0;
6280 submit_info[1].pSignalSemaphores = NULL;
6281 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
6282 }
6283
6284 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
6285
6286 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006287 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006288 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006289 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06006290
6291 m_errorMonitor->VerifyNotFound();
6292}
6293
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006294TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006295 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Depth Bias dynamic "
6296 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006297
Cody Northropc31a84f2016-08-22 10:41:47 -06006298 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006299 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006300 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
6301 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006302 m_errorMonitor->VerifyFound();
6303}
6304
6305TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006306 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Line Width dynamic "
6307 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006308
Cody Northropc31a84f2016-08-22 10:41:47 -06006309 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006310 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006311 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
6312 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006313 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006314}
6315
6316TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006317 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Viewport dynamic "
6318 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006319
Cody Northropc31a84f2016-08-22 10:41:47 -06006320 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006321 // Dynamic viewport state
Chris Forbesb2ba95b2016-09-16 17:11:50 +12006322 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic viewport(s) 0 are used by PSO, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006323 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006324 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006325}
6326
6327TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006328 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Scissor dynamic "
6329 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006330
Cody Northropc31a84f2016-08-22 10:41:47 -06006331 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006332 // Dynamic scissor state
Chris Forbesb2ba95b2016-09-16 17:11:50 +12006333 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic scissor(s) 0 are used by PSO, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006334 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006335 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006336}
6337
Cortd713fe82016-07-27 09:51:27 -07006338TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006339 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Blend Constants "
6340 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06006341
6342 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis21c88352016-05-26 06:15:45 -06006343 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6345 "Dynamic blend constants state not set for this command buffer");
6346 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06006347 m_errorMonitor->VerifyFound();
6348}
6349
6350TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006351 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Depth Bounds dynamic "
6352 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06006353
6354 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis21c88352016-05-26 06:15:45 -06006355 if (!m_device->phy().features().depthBounds) {
6356 printf("Device does not support depthBounds test; skipped.\n");
6357 return;
6358 }
6359 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006360 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6361 "Dynamic depth bounds state not set for this command buffer");
6362 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006363 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006364}
6365
6366TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006367 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Stencil Read dynamic "
6368 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06006369
6370 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006371 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6373 "Dynamic stencil read mask state not set for this command buffer");
6374 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006375 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006376}
6377
6378TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006379 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Stencil Write dynamic"
6380 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06006381
6382 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006383 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006384 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6385 "Dynamic stencil write mask state not set for this command buffer");
6386 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006387 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006388}
6389
6390TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006391 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Stencil Ref dynamic "
6392 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06006393
6394 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006395 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006396 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6397 "Dynamic stencil reference state not set for this command buffer");
6398 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006399 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06006400}
6401
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06006402TEST_F(VkLayerTest, IndexBufferNotBound) {
6403 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06006404
6405 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006406 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6407 "Index buffer object not bound to this command buffer when Indexed ");
6408 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06006409 m_errorMonitor->VerifyFound();
6410}
6411
Karl Schultz6addd812016-02-02 17:17:23 -07006412TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006413 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6414 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
6415 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006416
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006417 ASSERT_NO_FATAL_FAILURE(InitState());
6418 ASSERT_NO_FATAL_FAILURE(InitViewport());
6419 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6420
Karl Schultz6addd812016-02-02 17:17:23 -07006421 // We luck out b/c by default the framework creates CB w/ the
6422 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006423 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006424 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006425 EndCommandBuffer();
6426
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006427 // Bypass framework since it does the waits automatically
6428 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006429 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08006430 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6431 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006432 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006433 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07006434 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006435 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006436 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08006437 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006438 submit_info.pSignalSemaphores = NULL;
6439
Chris Forbes40028e22016-06-13 09:59:34 +12006440 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07006441 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006442
Karl Schultz6addd812016-02-02 17:17:23 -07006443 // Cause validation error by re-submitting cmd buffer that should only be
6444 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12006445 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006446
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006447 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006448}
6449
Karl Schultz6addd812016-02-02 17:17:23 -07006450TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006451 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07006452 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006453
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006454 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unable to allocate 1 descriptors of "
6455 "type "
6456 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006457
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006458 ASSERT_NO_FATAL_FAILURE(InitState());
6459 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006460
Karl Schultz6addd812016-02-02 17:17:23 -07006461 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
6462 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006463 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006464 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
6465 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006466
6467 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006468 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6469 ds_pool_ci.pNext = NULL;
6470 ds_pool_ci.flags = 0;
6471 ds_pool_ci.maxSets = 1;
6472 ds_pool_ci.poolSizeCount = 1;
6473 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006474
6475 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006476 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006477 ASSERT_VK_SUCCESS(err);
6478
6479 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006480 dsl_binding.binding = 0;
6481 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6482 dsl_binding.descriptorCount = 1;
6483 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6484 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006485
6486 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006487 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6488 ds_layout_ci.pNext = NULL;
6489 ds_layout_ci.bindingCount = 1;
6490 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006491
6492 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006493 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006494 ASSERT_VK_SUCCESS(err);
6495
6496 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006497 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006498 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006499 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006500 alloc_info.descriptorPool = ds_pool;
6501 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006502 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006503
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006504 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006505
Chia-I Wuf7458c52015-10-26 21:10:41 +08006506 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6507 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006508}
6509
Karl Schultz6addd812016-02-02 17:17:23 -07006510TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
6511 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06006512
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006513 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6514 "It is invalid to call vkFreeDescriptorSets() with a pool created "
6515 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006516
Tobin Ehlise735c692015-10-08 13:13:50 -06006517 ASSERT_NO_FATAL_FAILURE(InitState());
6518 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06006519
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006520 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006521 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6522 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06006523
6524 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006525 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6526 ds_pool_ci.pNext = NULL;
6527 ds_pool_ci.maxSets = 1;
6528 ds_pool_ci.poolSizeCount = 1;
6529 ds_pool_ci.flags = 0;
6530 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
6531 // app can only call vkResetDescriptorPool on this pool.;
6532 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06006533
6534 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006535 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06006536 ASSERT_VK_SUCCESS(err);
6537
6538 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006539 dsl_binding.binding = 0;
6540 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6541 dsl_binding.descriptorCount = 1;
6542 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6543 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06006544
6545 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006546 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6547 ds_layout_ci.pNext = NULL;
6548 ds_layout_ci.bindingCount = 1;
6549 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06006550
6551 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006552 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06006553 ASSERT_VK_SUCCESS(err);
6554
6555 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006556 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006557 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006558 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006559 alloc_info.descriptorPool = ds_pool;
6560 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006561 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06006562 ASSERT_VK_SUCCESS(err);
6563
6564 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006565 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06006566
Chia-I Wuf7458c52015-10-26 21:10:41 +08006567 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6568 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06006569}
6570
Karl Schultz6addd812016-02-02 17:17:23 -07006571TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006572 // Attempt to clear Descriptor Pool with bad object.
6573 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06006574
6575 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006576 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid Descriptor Pool Object 0xbaad6001");
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006577 uint64_t fake_pool_handle = 0xbaad6001;
6578 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
6579 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06006580 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006581}
6582
Karl Schultz6addd812016-02-02 17:17:23 -07006583TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006584 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
6585 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006586 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06006587 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006588
6589 uint64_t fake_set_handle = 0xbaad6001;
6590 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006591 VkResult err;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006592 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid Descriptor Set Object 0xbaad6001");
Karl Schultzbdb75952016-04-19 11:36:49 -06006593
6594 ASSERT_NO_FATAL_FAILURE(InitState());
6595
6596 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
6597 layout_bindings[0].binding = 0;
6598 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6599 layout_bindings[0].descriptorCount = 1;
6600 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
6601 layout_bindings[0].pImmutableSamplers = NULL;
6602
6603 VkDescriptorSetLayout descriptor_set_layout;
6604 VkDescriptorSetLayoutCreateInfo dslci = {};
6605 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6606 dslci.pNext = NULL;
6607 dslci.bindingCount = 1;
6608 dslci.pBindings = layout_bindings;
6609 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006610 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006611
6612 VkPipelineLayout pipeline_layout;
6613 VkPipelineLayoutCreateInfo plci = {};
6614 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6615 plci.pNext = NULL;
6616 plci.setLayoutCount = 1;
6617 plci.pSetLayouts = &descriptor_set_layout;
6618 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006619 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006620
6621 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006622 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
6623 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06006624 m_errorMonitor->VerifyFound();
6625 EndCommandBuffer();
6626 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
6627 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006628}
6629
Karl Schultz6addd812016-02-02 17:17:23 -07006630TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006631 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
6632 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006633 uint64_t fake_layout_handle = 0xbaad6001;
6634 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006635 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid Descriptor Set Layout Object 0xbaad6001");
Cody Northropc31a84f2016-08-22 10:41:47 -06006636 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultzbdb75952016-04-19 11:36:49 -06006637 VkPipelineLayout pipeline_layout;
6638 VkPipelineLayoutCreateInfo plci = {};
6639 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6640 plci.pNext = NULL;
6641 plci.setLayoutCount = 1;
6642 plci.pSetLayouts = &bad_layout;
6643 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
6644
6645 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006646}
6647
Mark Muellerd4914412016-06-13 17:52:06 -06006648TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
6649 TEST_DESCRIPTION("This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
6650 "1) A uniform buffer update must have a valid buffer index."
6651 "2) When using an array of descriptors in a single WriteDescriptor,"
6652 " the descriptor types and stageflags must all be the same."
6653 "3) Immutable Sampler state must match across descriptors");
6654
6655 const char *invalid_BufferInfo_ErrorMessage =
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006656 "vkUpdateDescriptorSets: if pDescriptorWrites[0].descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, "
6657 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or "
6658 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pDescriptorWrites[0].pBufferInfo must not be NULL";
6659 const char *stateFlag_ErrorMessage = "Attempting write update to descriptor set ";
6660 const char *immutable_ErrorMessage = "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006661
Mark Muellerd4914412016-06-13 17:52:06 -06006662 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_BufferInfo_ErrorMessage);
6663
6664 ASSERT_NO_FATAL_FAILURE(InitState());
6665 VkDescriptorPoolSize ds_type_count[4] = {};
6666 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6667 ds_type_count[0].descriptorCount = 1;
6668 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6669 ds_type_count[1].descriptorCount = 1;
6670 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6671 ds_type_count[2].descriptorCount = 1;
6672 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
6673 ds_type_count[3].descriptorCount = 1;
6674
6675 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6676 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6677 ds_pool_ci.maxSets = 1;
6678 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
6679 ds_pool_ci.pPoolSizes = ds_type_count;
6680
6681 VkDescriptorPool ds_pool;
6682 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6683 ASSERT_VK_SUCCESS(err);
6684
Mark Muellerb9896722016-06-16 09:54:29 -06006685 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006686 layout_binding[0].binding = 0;
6687 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6688 layout_binding[0].descriptorCount = 1;
6689 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6690 layout_binding[0].pImmutableSamplers = NULL;
6691
6692 layout_binding[1].binding = 1;
6693 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6694 layout_binding[1].descriptorCount = 1;
6695 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6696 layout_binding[1].pImmutableSamplers = NULL;
6697
6698 VkSamplerCreateInfo sampler_ci = {};
6699 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6700 sampler_ci.pNext = NULL;
6701 sampler_ci.magFilter = VK_FILTER_NEAREST;
6702 sampler_ci.minFilter = VK_FILTER_NEAREST;
6703 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6704 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6705 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6706 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6707 sampler_ci.mipLodBias = 1.0;
6708 sampler_ci.anisotropyEnable = VK_FALSE;
6709 sampler_ci.maxAnisotropy = 1;
6710 sampler_ci.compareEnable = VK_FALSE;
6711 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6712 sampler_ci.minLod = 1.0;
6713 sampler_ci.maxLod = 1.0;
6714 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6715 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6716 VkSampler sampler;
6717
6718 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6719 ASSERT_VK_SUCCESS(err);
6720
6721 layout_binding[2].binding = 2;
6722 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6723 layout_binding[2].descriptorCount = 1;
6724 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6725 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
6726
Mark Muellerd4914412016-06-13 17:52:06 -06006727 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6728 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6729 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
6730 ds_layout_ci.pBindings = layout_binding;
6731 VkDescriptorSetLayout ds_layout;
6732 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6733 ASSERT_VK_SUCCESS(err);
6734
6735 VkDescriptorSetAllocateInfo alloc_info = {};
6736 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6737 alloc_info.descriptorSetCount = 1;
6738 alloc_info.descriptorPool = ds_pool;
6739 alloc_info.pSetLayouts = &ds_layout;
6740 VkDescriptorSet descriptorSet;
6741 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6742 ASSERT_VK_SUCCESS(err);
6743
6744 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6745 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6746 pipeline_layout_ci.pNext = NULL;
6747 pipeline_layout_ci.setLayoutCount = 1;
6748 pipeline_layout_ci.pSetLayouts = &ds_layout;
6749
6750 VkPipelineLayout pipeline_layout;
6751 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6752 ASSERT_VK_SUCCESS(err);
6753
Mark Mueller5c838ce2016-06-16 09:54:29 -06006754 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006755 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6756 descriptor_write.dstSet = descriptorSet;
6757 descriptor_write.dstBinding = 0;
6758 descriptor_write.descriptorCount = 1;
6759 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6760
Mark Mueller5c838ce2016-06-16 09:54:29 -06006761 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06006762 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6763 m_errorMonitor->VerifyFound();
6764
6765 // Create a buffer to update the descriptor with
6766 uint32_t qfi = 0;
6767 VkBufferCreateInfo buffCI = {};
6768 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6769 buffCI.size = 1024;
6770 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6771 buffCI.queueFamilyIndexCount = 1;
6772 buffCI.pQueueFamilyIndices = &qfi;
6773
6774 VkBuffer dyub;
6775 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6776 ASSERT_VK_SUCCESS(err);
6777 VkDescriptorBufferInfo buffInfo = {};
6778 buffInfo.buffer = dyub;
6779 buffInfo.offset = 0;
6780 buffInfo.range = 1024;
6781
6782 descriptor_write.pBufferInfo = &buffInfo;
6783 descriptor_write.descriptorCount = 2;
6784
Mark Mueller5c838ce2016-06-16 09:54:29 -06006785 // 2) The stateFlags don't match between the first and second descriptor
Mark Muellerd4914412016-06-13 17:52:06 -06006786 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, stateFlag_ErrorMessage);
6787 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6788 m_errorMonitor->VerifyFound();
6789
Mark Mueller5c838ce2016-06-16 09:54:29 -06006790 // 3) The second descriptor has a null_ptr pImmutableSamplers and
6791 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06006792 descriptor_write.dstBinding = 1;
6793 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06006794
Mark Mueller5c838ce2016-06-16 09:54:29 -06006795 // Make pImageInfo index non-null to avoid complaints of it missing
6796 VkDescriptorImageInfo imageInfo = {};
6797 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6798 descriptor_write.pImageInfo = &imageInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06006799 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, immutable_ErrorMessage);
6800 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6801 m_errorMonitor->VerifyFound();
6802
Mark Muellerd4914412016-06-13 17:52:06 -06006803 vkDestroyBuffer(m_device->device(), dyub, NULL);
6804 vkDestroySampler(m_device->device(), sampler, NULL);
6805 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6806 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6807 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6808}
6809
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06006810TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
6811 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6812 "due to a buffer dependency being destroyed.");
6813 ASSERT_NO_FATAL_FAILURE(InitState());
6814
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06006815 VkBuffer buffer;
6816 VkDeviceMemory mem;
6817 VkMemoryRequirements mem_reqs;
6818
6819 VkBufferCreateInfo buf_info = {};
6820 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12006821 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06006822 buf_info.size = 256;
6823 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6824 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
6825 ASSERT_VK_SUCCESS(err);
6826
6827 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
6828
6829 VkMemoryAllocateInfo alloc_info = {};
6830 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6831 alloc_info.allocationSize = 256;
6832 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006833 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 -06006834 if (!pass) {
6835 vkDestroyBuffer(m_device->device(), buffer, NULL);
6836 return;
6837 }
6838 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
6839 ASSERT_VK_SUCCESS(err);
6840
6841 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
6842 ASSERT_VK_SUCCESS(err);
6843
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06006844 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12006845 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06006846 m_commandBuffer->EndCommandBuffer();
6847
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006848 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06006849 // Destroy buffer dependency prior to submit to cause ERROR
6850 vkDestroyBuffer(m_device->device(), buffer, NULL);
6851
6852 VkSubmitInfo submit_info = {};
6853 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6854 submit_info.commandBufferCount = 1;
6855 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6856 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6857
6858 m_errorMonitor->VerifyFound();
6859 vkFreeMemory(m_device->handle(), mem, NULL);
6860}
6861
Tobin Ehlisea413442016-09-28 10:23:59 -06006862TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
6863 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
6864
6865 ASSERT_NO_FATAL_FAILURE(InitState());
6866 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6867
6868 VkDescriptorPoolSize ds_type_count;
6869 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
6870 ds_type_count.descriptorCount = 1;
6871
6872 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6873 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6874 ds_pool_ci.maxSets = 1;
6875 ds_pool_ci.poolSizeCount = 1;
6876 ds_pool_ci.pPoolSizes = &ds_type_count;
6877
6878 VkDescriptorPool ds_pool;
6879 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6880 ASSERT_VK_SUCCESS(err);
6881
6882 VkDescriptorSetLayoutBinding layout_binding;
6883 layout_binding.binding = 0;
6884 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
6885 layout_binding.descriptorCount = 1;
6886 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6887 layout_binding.pImmutableSamplers = NULL;
6888
6889 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6890 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6891 ds_layout_ci.bindingCount = 1;
6892 ds_layout_ci.pBindings = &layout_binding;
6893 VkDescriptorSetLayout ds_layout;
6894 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6895 ASSERT_VK_SUCCESS(err);
6896
6897 VkDescriptorSetAllocateInfo alloc_info = {};
6898 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6899 alloc_info.descriptorSetCount = 1;
6900 alloc_info.descriptorPool = ds_pool;
6901 alloc_info.pSetLayouts = &ds_layout;
6902 VkDescriptorSet descriptor_set;
6903 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
6904 ASSERT_VK_SUCCESS(err);
6905
6906 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6907 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6908 pipeline_layout_ci.pNext = NULL;
6909 pipeline_layout_ci.setLayoutCount = 1;
6910 pipeline_layout_ci.pSetLayouts = &ds_layout;
6911
6912 VkPipelineLayout pipeline_layout;
6913 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6914 ASSERT_VK_SUCCESS(err);
6915
6916 VkBuffer buffer;
6917 uint32_t queue_family_index = 0;
6918 VkBufferCreateInfo buffer_create_info = {};
6919 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6920 buffer_create_info.size = 1024;
6921 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
6922 buffer_create_info.queueFamilyIndexCount = 1;
6923 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
6924
6925 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
6926 ASSERT_VK_SUCCESS(err);
6927
6928 VkMemoryRequirements memory_reqs;
6929 VkDeviceMemory buffer_memory;
6930
6931 VkMemoryAllocateInfo memory_info = {};
6932 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6933 memory_info.allocationSize = 0;
6934 memory_info.memoryTypeIndex = 0;
6935
6936 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
6937 memory_info.allocationSize = memory_reqs.size;
6938 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6939 ASSERT_TRUE(pass);
6940
6941 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
6942 ASSERT_VK_SUCCESS(err);
6943 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
6944 ASSERT_VK_SUCCESS(err);
6945
6946 VkBufferView view;
6947 VkBufferViewCreateInfo bvci = {};
6948 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6949 bvci.buffer = buffer;
6950 bvci.format = VK_FORMAT_R8_UNORM;
6951 bvci.range = VK_WHOLE_SIZE;
6952
6953 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
6954 ASSERT_VK_SUCCESS(err);
6955
6956 VkWriteDescriptorSet descriptor_write = {};
6957 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6958 descriptor_write.dstSet = descriptor_set;
6959 descriptor_write.dstBinding = 0;
6960 descriptor_write.descriptorCount = 1;
6961 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
6962 descriptor_write.pTexelBufferView = &view;
6963
6964 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6965
6966 char const *vsSource = "#version 450\n"
6967 "\n"
6968 "out gl_PerVertex { \n"
6969 " vec4 gl_Position;\n"
6970 "};\n"
6971 "void main(){\n"
6972 " gl_Position = vec4(1);\n"
6973 "}\n";
6974 char const *fsSource = "#version 450\n"
6975 "\n"
6976 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
6977 "layout(location=0) out vec4 x;\n"
6978 "void main(){\n"
6979 " x = imageLoad(s, 0);\n"
6980 "}\n";
6981 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6982 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6983 VkPipelineObj pipe(m_device);
6984 pipe.AddShader(&vs);
6985 pipe.AddShader(&fs);
6986 pipe.AddColorAttachment();
6987 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6988
6989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot submit cmd buffer using deleted buffer view ");
6990 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer view ");
6991
6992 BeginCommandBuffer();
6993 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6994 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6995 VkRect2D scissor = {{0, 0}, {16, 16}};
6996 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6997 // Bind pipeline to cmd buffer
6998 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6999 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
7000 &descriptor_set, 0, nullptr);
7001 Draw(1, 0, 0, 0);
7002 EndCommandBuffer();
7003
7004 // Delete BufferView in order to invalidate cmd buffer
7005 vkDestroyBufferView(m_device->device(), view, NULL);
7006 // Now attempt submit of cmd buffer
7007 VkSubmitInfo submit_info = {};
7008 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7009 submit_info.commandBufferCount = 1;
7010 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7011 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7012 m_errorMonitor->VerifyFound();
7013
7014 // Clean-up
7015 vkDestroyBuffer(m_device->device(), buffer, NULL);
7016 vkFreeMemory(m_device->device(), buffer_memory, NULL);
7017 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7018 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7019 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7020}
7021
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007022TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
7023 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7024 "due to an image dependency being destroyed.");
7025 ASSERT_NO_FATAL_FAILURE(InitState());
7026
7027 VkImage image;
7028 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7029 VkImageCreateInfo image_create_info = {};
7030 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7031 image_create_info.pNext = NULL;
7032 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7033 image_create_info.format = tex_format;
7034 image_create_info.extent.width = 32;
7035 image_create_info.extent.height = 32;
7036 image_create_info.extent.depth = 1;
7037 image_create_info.mipLevels = 1;
7038 image_create_info.arrayLayers = 1;
7039 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7040 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007041 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007042 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007043 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007044 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06007045 // Have to bind memory to image before recording cmd in cmd buffer using it
7046 VkMemoryRequirements mem_reqs;
7047 VkDeviceMemory image_mem;
7048 bool pass;
7049 VkMemoryAllocateInfo mem_alloc = {};
7050 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7051 mem_alloc.pNext = NULL;
7052 mem_alloc.memoryTypeIndex = 0;
7053 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
7054 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007055 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06007056 ASSERT_TRUE(pass);
7057 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
7058 ASSERT_VK_SUCCESS(err);
7059 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
7060 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007061
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007062 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06007063 VkClearColorValue ccv;
7064 ccv.float32[0] = 1.0f;
7065 ccv.float32[1] = 1.0f;
7066 ccv.float32[2] = 1.0f;
7067 ccv.float32[3] = 1.0f;
7068 VkImageSubresourceRange isr = {};
7069 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06007070 isr.baseArrayLayer = 0;
7071 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06007072 isr.layerCount = 1;
7073 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007074 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007075 m_commandBuffer->EndCommandBuffer();
7076
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007078 // Destroy image dependency prior to submit to cause ERROR
7079 vkDestroyImage(m_device->device(), image, NULL);
7080
7081 VkSubmitInfo submit_info = {};
7082 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7083 submit_info.commandBufferCount = 1;
7084 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7085 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7086
7087 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06007088 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06007089}
7090
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06007091TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
7092 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7093 "due to a framebuffer image dependency being destroyed.");
7094 VkFormatProperties format_properties;
7095 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007096 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
7097 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06007098 return;
7099 }
7100
7101 ASSERT_NO_FATAL_FAILURE(InitState());
7102 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7103
7104 VkImageCreateInfo image_ci = {};
7105 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7106 image_ci.pNext = NULL;
7107 image_ci.imageType = VK_IMAGE_TYPE_2D;
7108 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
7109 image_ci.extent.width = 32;
7110 image_ci.extent.height = 32;
7111 image_ci.extent.depth = 1;
7112 image_ci.mipLevels = 1;
7113 image_ci.arrayLayers = 1;
7114 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
7115 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007116 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06007117 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
7118 image_ci.flags = 0;
7119 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007120 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06007121
7122 VkMemoryRequirements memory_reqs;
7123 VkDeviceMemory image_memory;
7124 bool pass;
7125 VkMemoryAllocateInfo memory_info = {};
7126 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7127 memory_info.pNext = NULL;
7128 memory_info.allocationSize = 0;
7129 memory_info.memoryTypeIndex = 0;
7130 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
7131 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007132 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06007133 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007134 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06007135 ASSERT_VK_SUCCESS(err);
7136 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
7137 ASSERT_VK_SUCCESS(err);
7138
7139 VkImageViewCreateInfo ivci = {
7140 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
7141 nullptr,
7142 0,
7143 image,
7144 VK_IMAGE_VIEW_TYPE_2D,
7145 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007146 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06007147 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
7148 };
7149 VkImageView view;
7150 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
7151 ASSERT_VK_SUCCESS(err);
7152
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007153 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06007154 VkFramebuffer fb;
7155 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
7156 ASSERT_VK_SUCCESS(err);
7157
7158 // Just use default renderpass with our framebuffer
7159 m_renderPassBeginInfo.framebuffer = fb;
7160 // Create Null cmd buffer for submit
7161 BeginCommandBuffer();
7162 EndCommandBuffer();
7163 // Destroy image attached to framebuffer to invalidate cmd buffer
7164 vkDestroyImage(m_device->device(), image, NULL);
7165 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007166 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06007167 QueueCommandBuffer(false);
7168 m_errorMonitor->VerifyFound();
7169
7170 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
7171 vkDestroyImageView(m_device->device(), view, nullptr);
7172 vkFreeMemory(m_device->device(), image_memory, nullptr);
7173}
7174
Tobin Ehlis88becd72016-09-21 14:33:41 -06007175TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
7176 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
7177 VkFormatProperties format_properties;
7178 VkResult err = VK_SUCCESS;
7179 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06007180
7181 ASSERT_NO_FATAL_FAILURE(InitState());
7182 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7183
7184 VkImageCreateInfo image_ci = {};
7185 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7186 image_ci.pNext = NULL;
7187 image_ci.imageType = VK_IMAGE_TYPE_2D;
7188 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
7189 image_ci.extent.width = 256;
7190 image_ci.extent.height = 256;
7191 image_ci.extent.depth = 1;
7192 image_ci.mipLevels = 1;
7193 image_ci.arrayLayers = 1;
7194 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
7195 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06007196 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06007197 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
7198 image_ci.flags = 0;
7199 VkImage image;
7200 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
7201
7202 VkMemoryRequirements memory_reqs;
7203 VkDeviceMemory image_memory;
7204 bool pass;
7205 VkMemoryAllocateInfo memory_info = {};
7206 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7207 memory_info.pNext = NULL;
7208 memory_info.allocationSize = 0;
7209 memory_info.memoryTypeIndex = 0;
7210 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
7211 memory_info.allocationSize = memory_reqs.size;
7212 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
7213 ASSERT_TRUE(pass);
7214 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
7215 ASSERT_VK_SUCCESS(err);
7216 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
7217 ASSERT_VK_SUCCESS(err);
7218
7219 VkImageViewCreateInfo ivci = {
7220 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
7221 nullptr,
7222 0,
7223 image,
7224 VK_IMAGE_VIEW_TYPE_2D,
7225 VK_FORMAT_B8G8R8A8_UNORM,
7226 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
7227 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
7228 };
7229 VkImageView view;
7230 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
7231 ASSERT_VK_SUCCESS(err);
7232
7233 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
7234 VkFramebuffer fb;
7235 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
7236 ASSERT_VK_SUCCESS(err);
7237
7238 // Just use default renderpass with our framebuffer
7239 m_renderPassBeginInfo.framebuffer = fb;
7240 // Create Null cmd buffer for submit
7241 BeginCommandBuffer();
7242 EndCommandBuffer();
7243 // Submit cmd buffer to put it (and attached imageView) in-flight
7244 VkSubmitInfo submit_info = {};
7245 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7246 submit_info.commandBufferCount = 1;
7247 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7248 // Submit cmd buffer to put framebuffer and children in-flight
7249 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7250 // Destroy image attached to framebuffer while in-flight
7251 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete image 0x");
7252 vkDestroyImage(m_device->device(), image, NULL);
7253 m_errorMonitor->VerifyFound();
7254 // Wait for queue to complete so we can safely destroy image and other objects
7255 vkQueueWaitIdle(m_device->m_queue);
7256 vkDestroyImage(m_device->device(), image, NULL);
7257 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
7258 vkDestroyImageView(m_device->device(), view, nullptr);
7259 vkFreeMemory(m_device->device(), image_memory, nullptr);
7260}
7261
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06007262TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007263 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06007264 ASSERT_NO_FATAL_FAILURE(InitState());
7265
7266 VkImage image;
7267 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7268 VkImageCreateInfo image_create_info = {};
7269 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7270 image_create_info.pNext = NULL;
7271 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7272 image_create_info.format = tex_format;
7273 image_create_info.extent.width = 32;
7274 image_create_info.extent.height = 32;
7275 image_create_info.extent.depth = 1;
7276 image_create_info.mipLevels = 1;
7277 image_create_info.arrayLayers = 1;
7278 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7279 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007280 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06007281 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007282 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06007283 ASSERT_VK_SUCCESS(err);
7284 // Have to bind memory to image before recording cmd in cmd buffer using it
7285 VkMemoryRequirements mem_reqs;
7286 VkDeviceMemory image_mem;
7287 bool pass;
7288 VkMemoryAllocateInfo mem_alloc = {};
7289 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7290 mem_alloc.pNext = NULL;
7291 mem_alloc.memoryTypeIndex = 0;
7292 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
7293 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007294 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06007295 ASSERT_TRUE(pass);
7296 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
7297 ASSERT_VK_SUCCESS(err);
7298
Tobin Ehlisfed999f2016-09-21 15:09:45 -06007299 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
7300 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06007301 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06007302
7303 m_commandBuffer->BeginCommandBuffer();
7304 VkClearColorValue ccv;
7305 ccv.float32[0] = 1.0f;
7306 ccv.float32[1] = 1.0f;
7307 ccv.float32[2] = 1.0f;
7308 ccv.float32[3] = 1.0f;
7309 VkImageSubresourceRange isr = {};
7310 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7311 isr.baseArrayLayer = 0;
7312 isr.baseMipLevel = 0;
7313 isr.layerCount = 1;
7314 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007315 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06007316 m_commandBuffer->EndCommandBuffer();
7317
7318 m_errorMonitor->VerifyFound();
7319 vkDestroyImage(m_device->device(), image, NULL);
7320 vkFreeMemory(m_device->device(), image_mem, nullptr);
7321}
7322
7323TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007324 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06007325 ASSERT_NO_FATAL_FAILURE(InitState());
7326
7327 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007328 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 -06007329 VK_IMAGE_TILING_OPTIMAL, 0);
7330 ASSERT_TRUE(image.initialized());
7331
7332 VkBuffer buffer;
7333 VkDeviceMemory mem;
7334 VkMemoryRequirements mem_reqs;
7335
7336 VkBufferCreateInfo buf_info = {};
7337 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12007338 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06007339 buf_info.size = 256;
7340 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7341 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
7342 ASSERT_VK_SUCCESS(err);
7343
7344 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
7345
7346 VkMemoryAllocateInfo alloc_info = {};
7347 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7348 alloc_info.allocationSize = 256;
7349 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007350 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 -06007351 if (!pass) {
7352 vkDestroyBuffer(m_device->device(), buffer, NULL);
7353 return;
7354 }
7355 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
7356 ASSERT_VK_SUCCESS(err);
7357
Tobin Ehlisfed999f2016-09-21 15:09:45 -06007358 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
7359 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06007360 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06007361 VkBufferImageCopy region = {};
7362 region.bufferRowLength = 128;
7363 region.bufferImageHeight = 128;
7364 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
7365
7366 region.imageSubresource.layerCount = 1;
7367 region.imageExtent.height = 4;
7368 region.imageExtent.width = 4;
7369 region.imageExtent.depth = 1;
7370 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007371 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
7372 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06007373 m_commandBuffer->EndCommandBuffer();
7374
7375 m_errorMonitor->VerifyFound();
7376
7377 vkDestroyBuffer(m_device->device(), buffer, NULL);
7378 vkFreeMemory(m_device->handle(), mem, NULL);
7379}
7380
Tobin Ehlis85940f52016-07-07 16:57:21 -06007381TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
7382 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7383 "due to an event dependency being destroyed.");
7384 ASSERT_NO_FATAL_FAILURE(InitState());
7385
7386 VkEvent event;
7387 VkEventCreateInfo evci = {};
7388 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
7389 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
7390 ASSERT_VK_SUCCESS(result);
7391
7392 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007393 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06007394 m_commandBuffer->EndCommandBuffer();
7395
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007396 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06007397 // Destroy event dependency prior to submit to cause ERROR
7398 vkDestroyEvent(m_device->device(), event, NULL);
7399
7400 VkSubmitInfo submit_info = {};
7401 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7402 submit_info.commandBufferCount = 1;
7403 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7404 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7405
7406 m_errorMonitor->VerifyFound();
7407}
7408
Tobin Ehlisdbea7552016-07-08 14:33:31 -06007409TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
7410 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7411 "due to a query pool dependency being destroyed.");
7412 ASSERT_NO_FATAL_FAILURE(InitState());
7413
7414 VkQueryPool query_pool;
7415 VkQueryPoolCreateInfo qpci{};
7416 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
7417 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
7418 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007419 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06007420 ASSERT_VK_SUCCESS(result);
7421
7422 m_commandBuffer->BeginCommandBuffer();
7423 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
7424 m_commandBuffer->EndCommandBuffer();
7425
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound query pool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06007427 // Destroy query pool dependency prior to submit to cause ERROR
7428 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
7429
7430 VkSubmitInfo submit_info = {};
7431 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7432 submit_info.commandBufferCount = 1;
7433 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7434 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7435
7436 m_errorMonitor->VerifyFound();
7437}
7438
Tobin Ehlis24130d92016-07-08 15:50:53 -06007439TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
7440 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7441 "due to a pipeline dependency being destroyed.");
7442 ASSERT_NO_FATAL_FAILURE(InitState());
7443 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7444
7445 VkResult err;
7446
7447 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7448 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7449
7450 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007451 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06007452 ASSERT_VK_SUCCESS(err);
7453
7454 VkPipelineViewportStateCreateInfo vp_state_ci = {};
7455 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7456 vp_state_ci.viewportCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007457 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06007458 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06007459 vp_state_ci.scissorCount = 1;
7460 VkRect2D scissors = {}; // Dummy scissors to point to
7461 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06007462
7463 VkPipelineShaderStageCreateInfo shaderStages[2];
7464 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7465
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007466 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7467 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
7468 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06007469 shaderStages[0] = vs.GetStageCreateInfo();
7470 shaderStages[1] = fs.GetStageCreateInfo();
7471
7472 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7473 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7474
7475 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7476 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7477 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7478
7479 VkPipelineRasterizationStateCreateInfo rs_ci = {};
7480 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12007481 rs_ci.rasterizerDiscardEnable = true;
7482 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06007483
7484 VkPipelineColorBlendAttachmentState att = {};
7485 att.blendEnable = VK_FALSE;
7486 att.colorWriteMask = 0xf;
7487
7488 VkPipelineColorBlendStateCreateInfo cb_ci = {};
7489 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
7490 cb_ci.attachmentCount = 1;
7491 cb_ci.pAttachments = &att;
7492
7493 VkGraphicsPipelineCreateInfo gp_ci = {};
7494 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7495 gp_ci.stageCount = 2;
7496 gp_ci.pStages = shaderStages;
7497 gp_ci.pVertexInputState = &vi_ci;
7498 gp_ci.pInputAssemblyState = &ia_ci;
7499 gp_ci.pViewportState = &vp_state_ci;
7500 gp_ci.pRasterizationState = &rs_ci;
7501 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06007502 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7503 gp_ci.layout = pipeline_layout;
7504 gp_ci.renderPass = renderPass();
7505
7506 VkPipelineCacheCreateInfo pc_ci = {};
7507 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7508
7509 VkPipeline pipeline;
7510 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007511 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06007512 ASSERT_VK_SUCCESS(err);
7513
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007514 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06007515 ASSERT_VK_SUCCESS(err);
7516
7517 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007518 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06007519 m_commandBuffer->EndCommandBuffer();
7520 // Now destroy pipeline in order to cause error when submitting
7521 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
7522
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007523 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06007524
7525 VkSubmitInfo submit_info = {};
7526 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7527 submit_info.commandBufferCount = 1;
7528 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7529 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7530
7531 m_errorMonitor->VerifyFound();
7532 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7533 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7534}
7535
Tobin Ehlis31289162016-08-17 14:57:58 -06007536TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
7537 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7538 "due to a bound descriptor set with a buffer dependency "
7539 "being destroyed.");
7540 ASSERT_NO_FATAL_FAILURE(InitState());
7541 ASSERT_NO_FATAL_FAILURE(InitViewport());
7542 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7543
7544 VkDescriptorPoolSize ds_type_count = {};
7545 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7546 ds_type_count.descriptorCount = 1;
7547
7548 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7549 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7550 ds_pool_ci.pNext = NULL;
7551 ds_pool_ci.maxSets = 1;
7552 ds_pool_ci.poolSizeCount = 1;
7553 ds_pool_ci.pPoolSizes = &ds_type_count;
7554
7555 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007556 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06007557 ASSERT_VK_SUCCESS(err);
7558
7559 VkDescriptorSetLayoutBinding dsl_binding = {};
7560 dsl_binding.binding = 0;
7561 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7562 dsl_binding.descriptorCount = 1;
7563 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7564 dsl_binding.pImmutableSamplers = NULL;
7565
7566 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7567 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7568 ds_layout_ci.pNext = NULL;
7569 ds_layout_ci.bindingCount = 1;
7570 ds_layout_ci.pBindings = &dsl_binding;
7571 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007572 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06007573 ASSERT_VK_SUCCESS(err);
7574
7575 VkDescriptorSet descriptorSet;
7576 VkDescriptorSetAllocateInfo alloc_info = {};
7577 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7578 alloc_info.descriptorSetCount = 1;
7579 alloc_info.descriptorPool = ds_pool;
7580 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007581 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06007582 ASSERT_VK_SUCCESS(err);
7583
7584 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7585 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7586 pipeline_layout_ci.pNext = NULL;
7587 pipeline_layout_ci.setLayoutCount = 1;
7588 pipeline_layout_ci.pSetLayouts = &ds_layout;
7589
7590 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007591 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06007592 ASSERT_VK_SUCCESS(err);
7593
7594 // Create a buffer to update the descriptor with
7595 uint32_t qfi = 0;
7596 VkBufferCreateInfo buffCI = {};
7597 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7598 buffCI.size = 1024;
7599 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7600 buffCI.queueFamilyIndexCount = 1;
7601 buffCI.pQueueFamilyIndices = &qfi;
7602
7603 VkBuffer buffer;
7604 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
7605 ASSERT_VK_SUCCESS(err);
7606 // Allocate memory and bind to buffer so we can make it to the appropriate
7607 // error
7608 VkMemoryAllocateInfo mem_alloc = {};
7609 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7610 mem_alloc.pNext = NULL;
7611 mem_alloc.allocationSize = 1024;
7612 mem_alloc.memoryTypeIndex = 0;
7613
7614 VkMemoryRequirements memReqs;
7615 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007616 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06007617 if (!pass) {
7618 vkDestroyBuffer(m_device->device(), buffer, NULL);
7619 return;
7620 }
7621
7622 VkDeviceMemory mem;
7623 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
7624 ASSERT_VK_SUCCESS(err);
7625 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
7626 ASSERT_VK_SUCCESS(err);
7627 // Correctly update descriptor to avoid "NOT_UPDATED" error
7628 VkDescriptorBufferInfo buffInfo = {};
7629 buffInfo.buffer = buffer;
7630 buffInfo.offset = 0;
7631 buffInfo.range = 1024;
7632
7633 VkWriteDescriptorSet descriptor_write;
7634 memset(&descriptor_write, 0, sizeof(descriptor_write));
7635 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7636 descriptor_write.dstSet = descriptorSet;
7637 descriptor_write.dstBinding = 0;
7638 descriptor_write.descriptorCount = 1;
7639 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7640 descriptor_write.pBufferInfo = &buffInfo;
7641
7642 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7643
7644 // Create PSO to be used for draw-time errors below
7645 char const *vsSource = "#version 450\n"
7646 "\n"
7647 "out gl_PerVertex { \n"
7648 " vec4 gl_Position;\n"
7649 "};\n"
7650 "void main(){\n"
7651 " gl_Position = vec4(1);\n"
7652 "}\n";
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007653 char const *fsSource = "#version 450\n"
7654 "\n"
7655 "layout(location=0) out vec4 x;\n"
7656 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7657 "void main(){\n"
7658 " x = vec4(bar.y);\n"
7659 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06007660 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7661 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7662 VkPipelineObj pipe(m_device);
7663 pipe.AddShader(&vs);
7664 pipe.AddShader(&fs);
7665 pipe.AddColorAttachment();
7666 pipe.CreateVKPipeline(pipeline_layout, renderPass());
7667
7668 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007669 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7670 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
7671 &descriptorSet, 0, NULL);
Tobin Ehlis31289162016-08-17 14:57:58 -06007672 Draw(1, 0, 0, 0);
7673 EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06007675 // Destroy buffer should invalidate the cmd buffer, causing error on submit
7676 vkDestroyBuffer(m_device->device(), buffer, NULL);
7677 // Attempt to submit cmd buffer
7678 VkSubmitInfo submit_info = {};
7679 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7680 submit_info.commandBufferCount = 1;
7681 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7682 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7683 m_errorMonitor->VerifyFound();
7684 // Cleanup
7685 vkFreeMemory(m_device->device(), mem, NULL);
7686
7687 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7688 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7689 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7690}
7691
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06007692TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
7693 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
7694 "due to a bound descriptor sets with a combined image "
7695 "sampler having their image, sampler, and descriptor set "
7696 "each respectively destroyed and then attempting to "
Mark Mueller917f6bc2016-08-30 10:57:19 -06007697 "submit associated cmd buffers. Attempt to destroy a "
7698 "DescriptorSet that is in use.");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06007699 ASSERT_NO_FATAL_FAILURE(InitState());
7700 ASSERT_NO_FATAL_FAILURE(InitViewport());
7701 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7702
7703 VkDescriptorPoolSize ds_type_count = {};
7704 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
7705 ds_type_count.descriptorCount = 1;
7706
7707 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7708 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7709 ds_pool_ci.pNext = NULL;
7710 ds_pool_ci.maxSets = 1;
7711 ds_pool_ci.poolSizeCount = 1;
7712 ds_pool_ci.pPoolSizes = &ds_type_count;
7713
7714 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007715 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06007716 ASSERT_VK_SUCCESS(err);
7717
7718 VkDescriptorSetLayoutBinding dsl_binding = {};
7719 dsl_binding.binding = 0;
7720 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
7721 dsl_binding.descriptorCount = 1;
7722 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7723 dsl_binding.pImmutableSamplers = NULL;
7724
7725 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7726 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7727 ds_layout_ci.pNext = NULL;
7728 ds_layout_ci.bindingCount = 1;
7729 ds_layout_ci.pBindings = &dsl_binding;
7730 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007731 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06007732 ASSERT_VK_SUCCESS(err);
7733
7734 VkDescriptorSet descriptorSet;
7735 VkDescriptorSetAllocateInfo alloc_info = {};
7736 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7737 alloc_info.descriptorSetCount = 1;
7738 alloc_info.descriptorPool = ds_pool;
7739 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007740 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06007741 ASSERT_VK_SUCCESS(err);
7742
7743 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7744 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7745 pipeline_layout_ci.pNext = NULL;
7746 pipeline_layout_ci.setLayoutCount = 1;
7747 pipeline_layout_ci.pSetLayouts = &ds_layout;
7748
7749 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007750 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06007751 ASSERT_VK_SUCCESS(err);
7752
7753 // Create images to update the descriptor with
7754 VkImage image;
7755 VkImage image2;
7756 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
7757 const int32_t tex_width = 32;
7758 const int32_t tex_height = 32;
7759 VkImageCreateInfo image_create_info = {};
7760 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7761 image_create_info.pNext = NULL;
7762 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7763 image_create_info.format = tex_format;
7764 image_create_info.extent.width = tex_width;
7765 image_create_info.extent.height = tex_height;
7766 image_create_info.extent.depth = 1;
7767 image_create_info.mipLevels = 1;
7768 image_create_info.arrayLayers = 1;
7769 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7770 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7771 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
7772 image_create_info.flags = 0;
7773 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7774 ASSERT_VK_SUCCESS(err);
7775 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
7776 ASSERT_VK_SUCCESS(err);
7777
7778 VkMemoryRequirements memory_reqs;
7779 VkDeviceMemory image_memory;
7780 bool pass;
7781 VkMemoryAllocateInfo memory_info = {};
7782 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7783 memory_info.pNext = NULL;
7784 memory_info.allocationSize = 0;
7785 memory_info.memoryTypeIndex = 0;
7786 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
7787 // Allocate enough memory for both images
7788 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007789 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06007790 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007791 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06007792 ASSERT_VK_SUCCESS(err);
7793 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
7794 ASSERT_VK_SUCCESS(err);
7795 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007796 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06007797 ASSERT_VK_SUCCESS(err);
7798
7799 VkImageViewCreateInfo image_view_create_info = {};
7800 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
7801 image_view_create_info.image = image;
7802 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7803 image_view_create_info.format = tex_format;
7804 image_view_create_info.subresourceRange.layerCount = 1;
7805 image_view_create_info.subresourceRange.baseMipLevel = 0;
7806 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007807 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06007808
7809 VkImageView view;
7810 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007811 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06007812 ASSERT_VK_SUCCESS(err);
7813 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007814 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06007815 ASSERT_VK_SUCCESS(err);
7816 // Create Samplers
7817 VkSamplerCreateInfo sampler_ci = {};
7818 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
7819 sampler_ci.pNext = NULL;
7820 sampler_ci.magFilter = VK_FILTER_NEAREST;
7821 sampler_ci.minFilter = VK_FILTER_NEAREST;
7822 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
7823 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7824 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7825 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
7826 sampler_ci.mipLodBias = 1.0;
7827 sampler_ci.anisotropyEnable = VK_FALSE;
7828 sampler_ci.maxAnisotropy = 1;
7829 sampler_ci.compareEnable = VK_FALSE;
7830 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
7831 sampler_ci.minLod = 1.0;
7832 sampler_ci.maxLod = 1.0;
7833 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
7834 sampler_ci.unnormalizedCoordinates = VK_FALSE;
7835 VkSampler sampler;
7836 VkSampler sampler2;
7837 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
7838 ASSERT_VK_SUCCESS(err);
7839 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
7840 ASSERT_VK_SUCCESS(err);
7841 // Update descriptor with image and sampler
7842 VkDescriptorImageInfo img_info = {};
7843 img_info.sampler = sampler;
7844 img_info.imageView = view;
7845 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
7846
7847 VkWriteDescriptorSet descriptor_write;
7848 memset(&descriptor_write, 0, sizeof(descriptor_write));
7849 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7850 descriptor_write.dstSet = descriptorSet;
7851 descriptor_write.dstBinding = 0;
7852 descriptor_write.descriptorCount = 1;
7853 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
7854 descriptor_write.pImageInfo = &img_info;
7855
7856 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7857
7858 // Create PSO to be used for draw-time errors below
7859 char const *vsSource = "#version 450\n"
7860 "\n"
7861 "out gl_PerVertex { \n"
7862 " vec4 gl_Position;\n"
7863 "};\n"
7864 "void main(){\n"
7865 " gl_Position = vec4(1);\n"
7866 "}\n";
7867 char const *fsSource = "#version 450\n"
7868 "\n"
7869 "layout(set=0, binding=0) uniform sampler2D s;\n"
7870 "layout(location=0) out vec4 x;\n"
7871 "void main(){\n"
7872 " x = texture(s, vec2(1));\n"
7873 "}\n";
7874 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7875 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7876 VkPipelineObj pipe(m_device);
7877 pipe.AddShader(&vs);
7878 pipe.AddShader(&fs);
7879 pipe.AddColorAttachment();
7880 pipe.CreateVKPipeline(pipeline_layout, renderPass());
7881
7882 // First error case is destroying sampler prior to cmd buffer submission
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot submit cmd buffer using deleted sampler ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06007884 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007885 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7886 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
7887 &descriptorSet, 0, NULL);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06007888 Draw(1, 0, 0, 0);
7889 EndCommandBuffer();
7890 // Destroy sampler invalidates the cmd buffer, causing error on submit
7891 vkDestroySampler(m_device->device(), sampler, NULL);
7892 // Attempt to submit cmd buffer
7893 VkSubmitInfo submit_info = {};
7894 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7895 submit_info.commandBufferCount = 1;
7896 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7897 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7898 m_errorMonitor->VerifyFound();
7899 // Now re-update descriptor with valid sampler and delete image
7900 img_info.sampler = sampler2;
7901 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007902 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06007903 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007904 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7905 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
7906 &descriptorSet, 0, NULL);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06007907 Draw(1, 0, 0, 0);
7908 EndCommandBuffer();
7909 // Destroy image invalidates the cmd buffer, causing error on submit
7910 vkDestroyImage(m_device->device(), image, NULL);
7911 // Attempt to submit cmd buffer
7912 submit_info = {};
7913 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7914 submit_info.commandBufferCount = 1;
7915 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7916 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7917 m_errorMonitor->VerifyFound();
7918 // Now update descriptor to be valid, but then free descriptor
7919 img_info.imageView = view2;
7920 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007921 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound descriptor set ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06007922 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007923 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7924 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
7925 &descriptorSet, 0, NULL);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06007926 Draw(1, 0, 0, 0);
7927 EndCommandBuffer();
7928 // Destroy descriptor set invalidates the cb, causing error on submit
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06007930 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06007931 m_errorMonitor->VerifyFound();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06007932 // Attempt to submit cmd buffer
7933 submit_info = {};
7934 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7935 submit_info.commandBufferCount = 1;
7936 submit_info.pCommandBuffers = &m_commandBuffer->handle();
7937 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7938 m_errorMonitor->VerifyFound();
7939 // Cleanup
7940 vkFreeMemory(m_device->device(), image_memory, NULL);
7941 vkDestroySampler(m_device->device(), sampler2, NULL);
7942 vkDestroyImage(m_device->device(), image2, NULL);
7943 vkDestroyImageView(m_device->device(), view, NULL);
7944 vkDestroyImageView(m_device->device(), view2, NULL);
7945 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7946 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7947 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7948}
7949
Tobin Ehlis50a095d2016-09-21 17:32:49 -06007950TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
7951 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
7952 ASSERT_NO_FATAL_FAILURE(InitState());
7953 ASSERT_NO_FATAL_FAILURE(InitViewport());
7954 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7955
7956 VkDescriptorPoolSize ds_type_count = {};
7957 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
7958 ds_type_count.descriptorCount = 1;
7959
7960 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7961 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7962 ds_pool_ci.pNext = NULL;
7963 ds_pool_ci.maxSets = 1;
7964 ds_pool_ci.poolSizeCount = 1;
7965 ds_pool_ci.pPoolSizes = &ds_type_count;
7966
7967 VkDescriptorPool ds_pool;
7968 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
7969 ASSERT_VK_SUCCESS(err);
7970
7971 VkDescriptorSetLayoutBinding dsl_binding = {};
7972 dsl_binding.binding = 0;
7973 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
7974 dsl_binding.descriptorCount = 1;
7975 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7976 dsl_binding.pImmutableSamplers = NULL;
7977
7978 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7979 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7980 ds_layout_ci.pNext = NULL;
7981 ds_layout_ci.bindingCount = 1;
7982 ds_layout_ci.pBindings = &dsl_binding;
7983 VkDescriptorSetLayout ds_layout;
7984 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
7985 ASSERT_VK_SUCCESS(err);
7986
7987 VkDescriptorSet descriptorSet;
7988 VkDescriptorSetAllocateInfo alloc_info = {};
7989 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7990 alloc_info.descriptorSetCount = 1;
7991 alloc_info.descriptorPool = ds_pool;
7992 alloc_info.pSetLayouts = &ds_layout;
7993 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
7994 ASSERT_VK_SUCCESS(err);
7995
7996 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7997 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7998 pipeline_layout_ci.pNext = NULL;
7999 pipeline_layout_ci.setLayoutCount = 1;
8000 pipeline_layout_ci.pSetLayouts = &ds_layout;
8001
8002 VkPipelineLayout pipeline_layout;
8003 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
8004 ASSERT_VK_SUCCESS(err);
8005
8006 // Create images to update the descriptor with
8007 VkImage image;
8008 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8009 const int32_t tex_width = 32;
8010 const int32_t tex_height = 32;
8011 VkImageCreateInfo image_create_info = {};
8012 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8013 image_create_info.pNext = NULL;
8014 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8015 image_create_info.format = tex_format;
8016 image_create_info.extent.width = tex_width;
8017 image_create_info.extent.height = tex_height;
8018 image_create_info.extent.depth = 1;
8019 image_create_info.mipLevels = 1;
8020 image_create_info.arrayLayers = 1;
8021 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8022 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8023 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
8024 image_create_info.flags = 0;
8025 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
8026 ASSERT_VK_SUCCESS(err);
8027 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
8028 VkMemoryRequirements memory_reqs;
8029 VkDeviceMemory image_memory;
8030 bool pass;
8031 VkMemoryAllocateInfo memory_info = {};
8032 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8033 memory_info.pNext = NULL;
8034 memory_info.allocationSize = 0;
8035 memory_info.memoryTypeIndex = 0;
8036 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
8037 // Allocate enough memory for image
8038 memory_info.allocationSize = memory_reqs.size;
8039 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
8040 ASSERT_TRUE(pass);
8041 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
8042 ASSERT_VK_SUCCESS(err);
8043 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
8044 ASSERT_VK_SUCCESS(err);
8045
8046 VkImageViewCreateInfo image_view_create_info = {};
8047 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
8048 image_view_create_info.image = image;
8049 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8050 image_view_create_info.format = tex_format;
8051 image_view_create_info.subresourceRange.layerCount = 1;
8052 image_view_create_info.subresourceRange.baseMipLevel = 0;
8053 image_view_create_info.subresourceRange.levelCount = 1;
8054 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8055
8056 VkImageView view;
8057 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
8058 ASSERT_VK_SUCCESS(err);
8059 // Create Samplers
8060 VkSamplerCreateInfo sampler_ci = {};
8061 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
8062 sampler_ci.pNext = NULL;
8063 sampler_ci.magFilter = VK_FILTER_NEAREST;
8064 sampler_ci.minFilter = VK_FILTER_NEAREST;
8065 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
8066 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
8067 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
8068 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
8069 sampler_ci.mipLodBias = 1.0;
8070 sampler_ci.anisotropyEnable = VK_FALSE;
8071 sampler_ci.maxAnisotropy = 1;
8072 sampler_ci.compareEnable = VK_FALSE;
8073 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
8074 sampler_ci.minLod = 1.0;
8075 sampler_ci.maxLod = 1.0;
8076 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
8077 sampler_ci.unnormalizedCoordinates = VK_FALSE;
8078 VkSampler sampler;
8079 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
8080 ASSERT_VK_SUCCESS(err);
8081 // Update descriptor with image and sampler
8082 VkDescriptorImageInfo img_info = {};
8083 img_info.sampler = sampler;
8084 img_info.imageView = view;
8085 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
8086
8087 VkWriteDescriptorSet descriptor_write;
8088 memset(&descriptor_write, 0, sizeof(descriptor_write));
8089 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8090 descriptor_write.dstSet = descriptorSet;
8091 descriptor_write.dstBinding = 0;
8092 descriptor_write.descriptorCount = 1;
8093 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
8094 descriptor_write.pImageInfo = &img_info;
8095 // Break memory binding and attempt update
8096 vkFreeMemory(m_device->device(), image_memory, nullptr);
8097 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06008098 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06008099 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8100 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
8101 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8102 m_errorMonitor->VerifyFound();
8103 // Cleanup
8104 vkDestroyImage(m_device->device(), image, NULL);
8105 vkDestroySampler(m_device->device(), sampler, NULL);
8106 vkDestroyImageView(m_device->device(), view, NULL);
8107 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8108 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8109 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
8110}
8111
Karl Schultz6addd812016-02-02 17:17:23 -07008112TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06008113 // Attempt to bind an invalid Pipeline to a valid Command Buffer
8114 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008115 // Create a valid cmd buffer
8116 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06008117 uint64_t fake_pipeline_handle = 0xbaad6001;
8118 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06008119 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12008120 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8121
8122 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid Pipeline Object 0xbaad6001");
Karl Schultzbdb75952016-04-19 11:36:49 -06008123 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008124 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06008125 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12008126
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06008127 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008128 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 -06008129 Draw(1, 0, 0, 0);
8130 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12008131
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06008132 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008133 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 +12008134 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06008135 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
8136 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008137}
8138
Karl Schultz6addd812016-02-02 17:17:23 -07008139TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06008140 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07008141 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008142
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008144
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008145 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06008146 ASSERT_NO_FATAL_FAILURE(InitViewport());
8147 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008148 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008149 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8150 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06008151
8152 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008153 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8154 ds_pool_ci.pNext = NULL;
8155 ds_pool_ci.maxSets = 1;
8156 ds_pool_ci.poolSizeCount = 1;
8157 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06008158
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008159 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008160 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008161 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008162
Tony Barboureb254902015-07-15 12:50:33 -06008163 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008164 dsl_binding.binding = 0;
8165 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8166 dsl_binding.descriptorCount = 1;
8167 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8168 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008169
Tony Barboureb254902015-07-15 12:50:33 -06008170 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008171 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8172 ds_layout_ci.pNext = NULL;
8173 ds_layout_ci.bindingCount = 1;
8174 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008175 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008176 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008177 ASSERT_VK_SUCCESS(err);
8178
8179 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008180 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008181 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008182 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008183 alloc_info.descriptorPool = ds_pool;
8184 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008185 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008186 ASSERT_VK_SUCCESS(err);
8187
Tony Barboureb254902015-07-15 12:50:33 -06008188 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008189 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8190 pipeline_layout_ci.pNext = NULL;
8191 pipeline_layout_ci.setLayoutCount = 1;
8192 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008193
8194 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008195 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008196 ASSERT_VK_SUCCESS(err);
8197
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008198 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06008199 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07008200 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008201 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008202
Tony Barbourc95e4ac2015-08-04 17:05:26 -06008203 VkPipelineObj pipe(m_device);
8204 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06008205 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06008206 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06008207 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06008208
8209 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008210 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
8211 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
8212 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008213
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008214 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008215
Chia-I Wuf7458c52015-10-26 21:10:41 +08008216 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8217 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8218 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008219}
8220
Karl Schultz6addd812016-02-02 17:17:23 -07008221TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07008222 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07008223 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07008224
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
8226 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07008227
8228 ASSERT_NO_FATAL_FAILURE(InitState());
8229 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008230 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
8231 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07008232
8233 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008234 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8235 ds_pool_ci.pNext = NULL;
8236 ds_pool_ci.maxSets = 1;
8237 ds_pool_ci.poolSizeCount = 1;
8238 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07008239
8240 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008241 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07008242 ASSERT_VK_SUCCESS(err);
8243
8244 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008245 dsl_binding.binding = 0;
8246 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
8247 dsl_binding.descriptorCount = 1;
8248 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8249 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07008250
8251 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008252 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8253 ds_layout_ci.pNext = NULL;
8254 ds_layout_ci.bindingCount = 1;
8255 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07008256 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008257 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07008258 ASSERT_VK_SUCCESS(err);
8259
8260 VkDescriptorSet descriptorSet;
8261 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008262 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008263 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07008264 alloc_info.descriptorPool = ds_pool;
8265 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008266 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07008267 ASSERT_VK_SUCCESS(err);
8268
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008269 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07008270 VkWriteDescriptorSet descriptor_write;
8271 memset(&descriptor_write, 0, sizeof(descriptor_write));
8272 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8273 descriptor_write.dstSet = descriptorSet;
8274 descriptor_write.dstBinding = 0;
8275 descriptor_write.descriptorCount = 1;
8276 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
8277 descriptor_write.pTexelBufferView = &view;
8278
8279 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8280
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008281 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07008282
8283 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8284 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
8285}
8286
Mark Youngd339ba32016-05-30 13:28:35 -06008287TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06008288 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 -06008289
8290 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06008291 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06008292 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06008293
8294 ASSERT_NO_FATAL_FAILURE(InitState());
8295
8296 // Create a buffer with no bound memory and then attempt to create
8297 // a buffer view.
8298 VkBufferCreateInfo buff_ci = {};
8299 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12008300 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06008301 buff_ci.size = 256;
8302 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
8303 VkBuffer buffer;
8304 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
8305 ASSERT_VK_SUCCESS(err);
8306
8307 VkBufferViewCreateInfo buff_view_ci = {};
8308 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
8309 buff_view_ci.buffer = buffer;
8310 buff_view_ci.format = VK_FORMAT_R8_UNORM;
8311 buff_view_ci.range = VK_WHOLE_SIZE;
8312 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008313 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06008314
8315 m_errorMonitor->VerifyFound();
8316 vkDestroyBuffer(m_device->device(), buffer, NULL);
8317 // If last error is success, it still created the view, so delete it.
8318 if (err == VK_SUCCESS) {
8319 vkDestroyBufferView(m_device->device(), buff_view, NULL);
8320 }
8321}
8322
Karl Schultz6addd812016-02-02 17:17:23 -07008323TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
8324 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
8325 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07008326 // 1. No dynamicOffset supplied
8327 // 2. Too many dynamicOffsets supplied
8328 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07008329 VkResult err;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " requires 1 dynamicOffsets, but only "
8331 "0 dynamicOffsets are left in "
8332 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008333
8334 ASSERT_NO_FATAL_FAILURE(InitState());
8335 ASSERT_NO_FATAL_FAILURE(InitViewport());
8336 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8337
8338 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008339 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
8340 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008341
8342 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008343 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8344 ds_pool_ci.pNext = NULL;
8345 ds_pool_ci.maxSets = 1;
8346 ds_pool_ci.poolSizeCount = 1;
8347 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008348
8349 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008350 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008351 ASSERT_VK_SUCCESS(err);
8352
8353 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008354 dsl_binding.binding = 0;
8355 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
8356 dsl_binding.descriptorCount = 1;
8357 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8358 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008359
8360 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008361 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8362 ds_layout_ci.pNext = NULL;
8363 ds_layout_ci.bindingCount = 1;
8364 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008365 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008366 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008367 ASSERT_VK_SUCCESS(err);
8368
8369 VkDescriptorSet descriptorSet;
8370 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008371 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008372 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008373 alloc_info.descriptorPool = ds_pool;
8374 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008375 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008376 ASSERT_VK_SUCCESS(err);
8377
8378 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008379 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8380 pipeline_layout_ci.pNext = NULL;
8381 pipeline_layout_ci.setLayoutCount = 1;
8382 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008383
8384 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008385 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008386 ASSERT_VK_SUCCESS(err);
8387
8388 // Create a buffer to update the descriptor with
8389 uint32_t qfi = 0;
8390 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008391 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8392 buffCI.size = 1024;
8393 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
8394 buffCI.queueFamilyIndexCount = 1;
8395 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008396
8397 VkBuffer dyub;
8398 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
8399 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06008400 // Allocate memory and bind to buffer so we can make it to the appropriate
8401 // error
8402 VkMemoryAllocateInfo mem_alloc = {};
8403 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
8404 mem_alloc.pNext = NULL;
8405 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12008406 mem_alloc.memoryTypeIndex = 0;
8407
8408 VkMemoryRequirements memReqs;
8409 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008410 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12008411 if (!pass) {
8412 vkDestroyBuffer(m_device->device(), dyub, NULL);
8413 return;
8414 }
8415
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06008416 VkDeviceMemory mem;
8417 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
8418 ASSERT_VK_SUCCESS(err);
8419 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
8420 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008421 // Correctly update descriptor to avoid "NOT_UPDATED" error
8422 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008423 buffInfo.buffer = dyub;
8424 buffInfo.offset = 0;
8425 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008426
8427 VkWriteDescriptorSet descriptor_write;
8428 memset(&descriptor_write, 0, sizeof(descriptor_write));
8429 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8430 descriptor_write.dstSet = descriptorSet;
8431 descriptor_write.dstBinding = 0;
8432 descriptor_write.descriptorCount = 1;
8433 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
8434 descriptor_write.pBufferInfo = &buffInfo;
8435
8436 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8437
8438 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008439 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
8440 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008441 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07008442 uint32_t pDynOff[2] = {512, 756};
8443 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008444 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8445 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
8446 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
8447 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12008448 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07008449 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008450 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " dynamic offset 512 combined with "
8451 "offset 0 and range 1024 that "
8452 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07008453 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008454 char const *vsSource = "#version 450\n"
8455 "\n"
8456 "out gl_PerVertex { \n"
8457 " vec4 gl_Position;\n"
8458 "};\n"
8459 "void main(){\n"
8460 " gl_Position = vec4(1);\n"
8461 "}\n";
8462 char const *fsSource = "#version 450\n"
8463 "\n"
8464 "layout(location=0) out vec4 x;\n"
8465 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
8466 "void main(){\n"
8467 " x = vec4(bar.y);\n"
8468 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07008469 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8470 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8471 VkPipelineObj pipe(m_device);
8472 pipe.AddShader(&vs);
8473 pipe.AddShader(&fs);
8474 pipe.AddColorAttachment();
8475 pipe.CreateVKPipeline(pipeline_layout, renderPass());
8476
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008477 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07008478 // This update should succeed, but offset size of 512 will overstep buffer
8479 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008480 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
8481 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07008482 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008483 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008484
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06008485 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06008486 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06008487
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008488 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008489 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07008490 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
8491}
8492
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06008493TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
8494 TEST_DESCRIPTION("Attempt to update a descriptor with a non-sparse buffer "
8495 "that doesn't have memory bound");
8496 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06008497 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06008498 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06008499 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8500 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06008501
8502 ASSERT_NO_FATAL_FAILURE(InitState());
8503 ASSERT_NO_FATAL_FAILURE(InitViewport());
8504 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8505
8506 VkDescriptorPoolSize ds_type_count = {};
8507 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
8508 ds_type_count.descriptorCount = 1;
8509
8510 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8511 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8512 ds_pool_ci.pNext = NULL;
8513 ds_pool_ci.maxSets = 1;
8514 ds_pool_ci.poolSizeCount = 1;
8515 ds_pool_ci.pPoolSizes = &ds_type_count;
8516
8517 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008518 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06008519 ASSERT_VK_SUCCESS(err);
8520
8521 VkDescriptorSetLayoutBinding dsl_binding = {};
8522 dsl_binding.binding = 0;
8523 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
8524 dsl_binding.descriptorCount = 1;
8525 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8526 dsl_binding.pImmutableSamplers = NULL;
8527
8528 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8529 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8530 ds_layout_ci.pNext = NULL;
8531 ds_layout_ci.bindingCount = 1;
8532 ds_layout_ci.pBindings = &dsl_binding;
8533 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008534 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06008535 ASSERT_VK_SUCCESS(err);
8536
8537 VkDescriptorSet descriptorSet;
8538 VkDescriptorSetAllocateInfo alloc_info = {};
8539 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8540 alloc_info.descriptorSetCount = 1;
8541 alloc_info.descriptorPool = ds_pool;
8542 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008543 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06008544 ASSERT_VK_SUCCESS(err);
8545
8546 // Create a buffer to update the descriptor with
8547 uint32_t qfi = 0;
8548 VkBufferCreateInfo buffCI = {};
8549 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
8550 buffCI.size = 1024;
8551 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
8552 buffCI.queueFamilyIndexCount = 1;
8553 buffCI.pQueueFamilyIndices = &qfi;
8554
8555 VkBuffer dyub;
8556 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
8557 ASSERT_VK_SUCCESS(err);
8558
8559 // Attempt to update descriptor without binding memory to it
8560 VkDescriptorBufferInfo buffInfo = {};
8561 buffInfo.buffer = dyub;
8562 buffInfo.offset = 0;
8563 buffInfo.range = 1024;
8564
8565 VkWriteDescriptorSet descriptor_write;
8566 memset(&descriptor_write, 0, sizeof(descriptor_write));
8567 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8568 descriptor_write.dstSet = descriptorSet;
8569 descriptor_write.dstBinding = 0;
8570 descriptor_write.descriptorCount = 1;
8571 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
8572 descriptor_write.pBufferInfo = &buffInfo;
8573
8574 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
8575 m_errorMonitor->VerifyFound();
8576
8577 vkDestroyBuffer(m_device->device(), dyub, NULL);
8578 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8579 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
8580}
8581
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008582TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008583 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008584 ASSERT_NO_FATAL_FAILURE(InitState());
8585 ASSERT_NO_FATAL_FAILURE(InitViewport());
8586 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8587
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008588 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008589 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008590 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8591 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8592 pipeline_layout_ci.pushConstantRangeCount = 1;
8593 pipeline_layout_ci.pPushConstantRanges = &pc_range;
8594
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008595 //
8596 // Check for invalid push constant ranges in pipeline layouts.
8597 //
8598 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06008599 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008600 char const *msg;
8601 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008602
Karl Schultzc81037d2016-05-12 08:11:23 -06008603 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
8604 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
8605 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
8606 "vkCreatePipelineLayout() call has push constants index 0 with "
8607 "size 0."},
8608 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
8609 "vkCreatePipelineLayout() call has push constants index 0 with "
8610 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06008611 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06008612 "vkCreatePipelineLayout() call has push constants index 0 with "
8613 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06008614 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06008615 "vkCreatePipelineLayout() call has push constants index 0 with "
8616 "size 0."},
8617 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
8618 "vkCreatePipelineLayout() call has push constants index 0 with "
8619 "offset 1. Offset must"},
8620 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
8621 "vkCreatePipelineLayout() call has push constants index 0 "
8622 "with offset "},
8623 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
8624 "vkCreatePipelineLayout() call has push constants "
8625 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06008626 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06008627 "vkCreatePipelineLayout() call has push constants index 0 "
8628 "with offset "},
8629 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
8630 "vkCreatePipelineLayout() call has push "
8631 "constants index 0 with offset "},
8632 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
8633 "vkCreatePipelineLayout() call has push "
8634 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008635 }};
8636
8637 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06008638 for (const auto &iter : range_tests) {
8639 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008640 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
8641 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008642 m_errorMonitor->VerifyFound();
8643 if (VK_SUCCESS == err) {
8644 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8645 }
8646 }
8647
8648 // Check for invalid stage flag
8649 pc_range.offset = 0;
8650 pc_range.size = 16;
8651 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06008652 m_errorMonitor->SetDesiredFailureMsg(
8653 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8654 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008655 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008656 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008657 if (VK_SUCCESS == err) {
8658 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8659 }
8660
8661 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06008662 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008663 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06008664 VkPushConstantRange const ranges[ranges_per_test];
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008665 char const *msg;
8666 };
8667
Karl Schultzc81037d2016-05-12 08:11:23 -06008668 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008669 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8670 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8671 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8672 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8673 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06008674 "vkCreatePipelineLayout() call has push constants with overlapping ranges:"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008675 {
8676 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8677 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
8678 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
8679 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
8680 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06008681 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 3:[12, 20), 4:[16, 20)",
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008682 },
8683 {
8684 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
8685 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
8686 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
8687 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
8688 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06008689 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[16, 20), 1:[12, 20)",
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008690 },
8691 {
8692 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
8693 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
8694 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
8695 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
8696 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06008697 "vkCreatePipelineLayout() call has push constants with overlapping ranges: 0:[16, 20), 3:[12, 20)",
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008698 },
8699 {
8700 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
8701 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
8702 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
8703 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
8704 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06008705 "vkCreatePipelineLayout() call has push constants with overlapping ranges:",
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008706 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008707
Karl Schultzc81037d2016-05-12 08:11:23 -06008708 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008709 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06008710 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008711 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, iter.msg);
8712 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008713 m_errorMonitor->VerifyFound();
8714 if (VK_SUCCESS == err) {
8715 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8716 }
8717 }
8718
8719 // Run some positive tests to make sure overlap checking in the layer is OK
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008720 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos = {{{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
8721 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
8722 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
8723 {VK_SHADER_STAGE_VERTEX_BIT, 12, 4},
8724 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
8725 ""},
8726 {{{VK_SHADER_STAGE_VERTEX_BIT, 92, 24},
8727 {VK_SHADER_STAGE_VERTEX_BIT, 80, 4},
8728 {VK_SHADER_STAGE_VERTEX_BIT, 64, 8},
8729 {VK_SHADER_STAGE_VERTEX_BIT, 4, 16},
8730 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
8731 ""}}};
Karl Schultzc81037d2016-05-12 08:11:23 -06008732 for (const auto &iter : overlapping_range_tests_pos) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008733 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
8734 m_errorMonitor->ExpectSuccess();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008735 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008736 m_errorMonitor->VerifyNotFound();
8737 if (VK_SUCCESS == err) {
8738 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8739 }
8740 }
8741
8742 //
8743 // CmdPushConstants tests
8744 //
Karl Schultzc81037d2016-05-12 08:11:23 -06008745 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008746
8747 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06008748 const std::array<PipelineLayoutTestCase, 11> cmd_range_tests = {{
8749 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0}, "vkCmdPushConstants: parameter size must be greater than 0"},
Karl Schultzc81037d2016-05-12 08:11:23 -06008750 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
8751 "vkCmdPushConstants() call has push constants with size 1. Size "
8752 "must be greater than zero and a multiple of 4."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06008753 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06008754 "vkCmdPushConstants() call has push constants with size 1. Size "
8755 "must be greater than zero and a multiple of 4."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06008756 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06008757 "vkCmdPushConstants() call has push constants with offset 1. "
8758 "Offset must be a multiple of 4."},
8759 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
8760 "vkCmdPushConstants() call has push constants with offset 1. "
8761 "Offset must be a multiple of 4."},
8762 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
8763 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
8764 "0x1 not within flag-matching ranges in pipeline layout"},
8765 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
8766 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
8767 "0x1 not within flag-matching ranges in pipeline layout"},
8768 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
8769 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
8770 "0x1 not within flag-matching ranges in pipeline layout"},
8771 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
8772 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
8773 "0x1 not within flag-matching ranges in pipeline layout"},
8774 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
8775 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
8776 "any of the ranges in pipeline layout"},
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008777 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06008778 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
8779 "any of the ranges in pipeline layout"},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008780 }};
8781
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06008782 BeginCommandBuffer();
8783
8784 // Setup ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06008785 const VkPushConstantRange pc_range2[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008786 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008787 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008788 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008789 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008790 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008791 ASSERT_VK_SUCCESS(err);
Karl Schultzc81037d2016-05-12 08:11:23 -06008792 for (const auto &iter : cmd_range_tests) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008793 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
8794 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
Karl Schultzc81037d2016-05-12 08:11:23 -06008795 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008796 m_errorMonitor->VerifyFound();
8797 }
8798
8799 // Check for invalid stage flag
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06008800 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008801 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008802 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06008803 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06008804
Karl Schultzc81037d2016-05-12 08:11:23 -06008805 // overlapping range tests with cmd
8806 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
8807 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
8808 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
8809 "0x1 not within flag-matching ranges in pipeline layout"},
8810 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
8811 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
8812 "0x1 not within flag-matching ranges in pipeline layout"},
8813 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
8814 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
8815 "0x1 not within flag-matching ranges in pipeline layout"},
8816 }};
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06008817 // Setup ranges: [0,16), [20,36), [36,44), [44,52), [80,92)
Karl Schultzc81037d2016-05-12 08:11:23 -06008818 const VkPushConstantRange pc_range3[] = {
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06008819 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
8820 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12}, {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
Karl Schultzc81037d2016-05-12 08:11:23 -06008821 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008822 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range3) / sizeof(VkPushConstantRange);
Karl Schultzc81037d2016-05-12 08:11:23 -06008823 pipeline_layout_ci.pPushConstantRanges = pc_range3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008824 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzc81037d2016-05-12 08:11:23 -06008825 ASSERT_VK_SUCCESS(err);
Karl Schultzc81037d2016-05-12 08:11:23 -06008826 for (const auto &iter : cmd_overlap_tests) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008827 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
8828 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
Karl Schultzc81037d2016-05-12 08:11:23 -06008829 iter.range.size, dummy_values);
8830 m_errorMonitor->VerifyFound();
8831 }
Karl Schultzc81037d2016-05-12 08:11:23 -06008832 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8833
8834 // positive overlapping range tests with cmd
8835 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = {{
8836 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, ""},
8837 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4}, ""},
8838 {{VK_SHADER_STAGE_VERTEX_BIT, 20, 12}, ""},
8839 {{VK_SHADER_STAGE_VERTEX_BIT, 56, 36}, ""},
8840 }};
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06008841 // Setup ranges: [0,16) [20,36) [36,44) [44,52) [56,80) [80,92)
Karl Schultzc81037d2016-05-12 08:11:23 -06008842 const VkPushConstantRange pc_range4[] = {
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06008843 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
8844 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12}, {VK_SHADER_STAGE_VERTEX_BIT, 36, 8}, {VK_SHADER_STAGE_VERTEX_BIT, 56, 24},
Karl Schultzc81037d2016-05-12 08:11:23 -06008845 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008846 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range4) / sizeof(VkPushConstantRange);
Karl Schultzc81037d2016-05-12 08:11:23 -06008847 pipeline_layout_ci.pPushConstantRanges = pc_range4;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008848 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzc81037d2016-05-12 08:11:23 -06008849 ASSERT_VK_SUCCESS(err);
Karl Schultzc81037d2016-05-12 08:11:23 -06008850 for (const auto &iter : cmd_overlap_tests_pos) {
8851 m_errorMonitor->ExpectSuccess();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008852 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.range.stageFlags, iter.range.offset,
Karl Schultzc81037d2016-05-12 08:11:23 -06008853 iter.range.size, dummy_values);
8854 m_errorMonitor->VerifyNotFound();
8855 }
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008856 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06008857
8858 EndCommandBuffer();
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07008859}
8860
Karl Schultz6addd812016-02-02 17:17:23 -07008861TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07008862 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07008863 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008864
8865 ASSERT_NO_FATAL_FAILURE(InitState());
8866 ASSERT_NO_FATAL_FAILURE(InitViewport());
8867 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8868
Mike Stroyanb8a61002016-06-20 16:00:28 -06008869 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
8870 VkImageTiling tiling;
8871 VkFormatProperties format_properties;
8872 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008873 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Mike Stroyanb8a61002016-06-20 16:00:28 -06008874 tiling = VK_IMAGE_TILING_LINEAR;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008875 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
Mike Stroyanb8a61002016-06-20 16:00:28 -06008876 tiling = VK_IMAGE_TILING_OPTIMAL;
8877 } else {
8878 printf("Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
8879 "skipped.\n");
8880 return;
8881 }
8882
Tobin Ehlis559c6382015-11-05 09:52:49 -07008883 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
8884 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008885 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8886 ds_type_count[0].descriptorCount = 10;
8887 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8888 ds_type_count[1].descriptorCount = 2;
8889 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
8890 ds_type_count[2].descriptorCount = 2;
8891 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
8892 ds_type_count[3].descriptorCount = 5;
8893 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
8894 // type
8895 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
8896 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
8897 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008898
8899 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008900 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8901 ds_pool_ci.pNext = NULL;
8902 ds_pool_ci.maxSets = 5;
8903 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
8904 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008905
8906 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008907 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008908 ASSERT_VK_SUCCESS(err);
8909
8910 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
8911 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008912 dsl_binding[0].binding = 0;
8913 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8914 dsl_binding[0].descriptorCount = 5;
8915 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
8916 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008917
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008918 // Create layout identical to set0 layout but w/ different stageFlags
8919 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008920 dsl_fs_stage_only.binding = 0;
8921 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8922 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008923 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
8924 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07008925 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008926 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008927 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8928 ds_layout_ci.pNext = NULL;
8929 ds_layout_ci.bindingCount = 1;
8930 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008931 static const uint32_t NUM_LAYOUTS = 4;
8932 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008933 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008934 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
8935 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008936 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008937 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07008938 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008939 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008940 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008941 dsl_binding[0].binding = 0;
8942 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008943 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07008944 dsl_binding[1].binding = 1;
8945 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
8946 dsl_binding[1].descriptorCount = 2;
8947 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
8948 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07008949 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008950 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008951 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008952 ASSERT_VK_SUCCESS(err);
8953 dsl_binding[0].binding = 0;
8954 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008955 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008956 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008957 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008958 ASSERT_VK_SUCCESS(err);
8959 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008960 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008961 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008962 ASSERT_VK_SUCCESS(err);
8963
8964 static const uint32_t NUM_SETS = 4;
8965 VkDescriptorSet descriptorSet[NUM_SETS] = {};
8966 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008967 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008968 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008969 alloc_info.descriptorPool = ds_pool;
8970 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008971 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008972 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008973 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07008974 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008975 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008976 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008977 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008978
8979 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008980 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8981 pipeline_layout_ci.pNext = NULL;
8982 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
8983 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008984
8985 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008986 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008987 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008988 // Create pipelineLayout with only one setLayout
8989 pipeline_layout_ci.setLayoutCount = 1;
8990 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008991 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008992 ASSERT_VK_SUCCESS(err);
8993 // Create pipelineLayout with 2 descriptor setLayout at index 0
8994 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
8995 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008996 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008997 ASSERT_VK_SUCCESS(err);
8998 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
8999 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
9000 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009001 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009002 ASSERT_VK_SUCCESS(err);
9003 // Create pipelineLayout with UB type, but stageFlags for FS only
9004 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
9005 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009006 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009007 ASSERT_VK_SUCCESS(err);
9008 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
9009 VkDescriptorSetLayout pl_bad_s0[2] = {};
9010 pl_bad_s0[0] = ds_layout_fs_only;
9011 pl_bad_s0[1] = ds_layout[1];
9012 pipeline_layout_ci.setLayoutCount = 2;
9013 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
9014 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009015 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009016 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07009017
9018 // Create a buffer to update the descriptor with
9019 uint32_t qfi = 0;
9020 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009021 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9022 buffCI.size = 1024;
9023 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9024 buffCI.queueFamilyIndexCount = 1;
9025 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07009026
9027 VkBuffer dyub;
9028 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
9029 ASSERT_VK_SUCCESS(err);
9030 // Correctly update descriptor to avoid "NOT_UPDATED" error
9031 static const uint32_t NUM_BUFFS = 5;
9032 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009033 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07009034 buffInfo[i].buffer = dyub;
9035 buffInfo[i].offset = 0;
9036 buffInfo[i].range = 1024;
9037 }
Karl Schultz6addd812016-02-02 17:17:23 -07009038 VkImage image;
Karl Schultz6addd812016-02-02 17:17:23 -07009039 const int32_t tex_width = 32;
9040 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009041 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009042 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9043 image_create_info.pNext = NULL;
9044 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9045 image_create_info.format = tex_format;
9046 image_create_info.extent.width = tex_width;
9047 image_create_info.extent.height = tex_height;
9048 image_create_info.extent.depth = 1;
9049 image_create_info.mipLevels = 1;
9050 image_create_info.arrayLayers = 1;
9051 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyanb8a61002016-06-20 16:00:28 -06009052 image_create_info.tiling = tiling;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009053 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07009054 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009055 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
9056 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07009057
Karl Schultz6addd812016-02-02 17:17:23 -07009058 VkMemoryRequirements memReqs;
9059 VkDeviceMemory imageMem;
9060 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07009061 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009062 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9063 memAlloc.pNext = NULL;
9064 memAlloc.allocationSize = 0;
9065 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07009066 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
9067 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009068 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07009069 ASSERT_TRUE(pass);
9070 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
9071 ASSERT_VK_SUCCESS(err);
9072 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
9073 ASSERT_VK_SUCCESS(err);
9074
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009075 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009076 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9077 image_view_create_info.image = image;
9078 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
9079 image_view_create_info.format = tex_format;
9080 image_view_create_info.subresourceRange.layerCount = 1;
9081 image_view_create_info.subresourceRange.baseMipLevel = 0;
9082 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009083 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07009084
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009085 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009086 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009087 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07009088 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009089 imageInfo[0].imageView = view;
9090 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
9091 imageInfo[1].imageView = view;
9092 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07009093 imageInfo[2].imageView = view;
9094 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
9095 imageInfo[3].imageView = view;
9096 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009097
9098 static const uint32_t NUM_SET_UPDATES = 3;
9099 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
9100 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9101 descriptor_write[0].dstSet = descriptorSet[0];
9102 descriptor_write[0].dstBinding = 0;
9103 descriptor_write[0].descriptorCount = 5;
9104 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9105 descriptor_write[0].pBufferInfo = buffInfo;
9106 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9107 descriptor_write[1].dstSet = descriptorSet[1];
9108 descriptor_write[1].dstBinding = 0;
9109 descriptor_write[1].descriptorCount = 2;
9110 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
9111 descriptor_write[1].pImageInfo = imageInfo;
9112 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9113 descriptor_write[2].dstSet = descriptorSet[1];
9114 descriptor_write[2].dstBinding = 1;
9115 descriptor_write[2].descriptorCount = 2;
9116 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07009117 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009118
9119 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07009120
Tobin Ehlis88452832015-12-03 09:40:56 -07009121 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009122 char const *vsSource = "#version 450\n"
9123 "\n"
9124 "out gl_PerVertex {\n"
9125 " vec4 gl_Position;\n"
9126 "};\n"
9127 "void main(){\n"
9128 " gl_Position = vec4(1);\n"
9129 "}\n";
9130 char const *fsSource = "#version 450\n"
9131 "\n"
9132 "layout(location=0) out vec4 x;\n"
9133 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
9134 "void main(){\n"
9135 " x = vec4(bar.y);\n"
9136 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07009137 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
9138 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07009139 VkPipelineObj pipe(m_device);
9140 pipe.AddShader(&vs);
9141 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07009142 pipe.AddColorAttachment();
9143 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07009144
9145 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07009146
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009147 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07009148 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
9149 // of PSO
9150 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
9151 // cmd_pipeline.c
9152 // due to the fact that cmd_alloc_dset_data() has not been called in
9153 // cmd_bind_graphics_pipeline()
9154 // TODO : Want to cause various binding incompatibility issues here to test
9155 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07009156 // First cause various verify_layout_compatibility() fails
9157 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009158 // verify_set_layout_compatibility fail cases:
9159 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009160 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid Pipeline Layout Object ");
9161 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
9162 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009163 m_errorMonitor->VerifyFound();
9164
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009165 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009166 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
9167 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
9168 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009169 m_errorMonitor->VerifyFound();
9170
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009171 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07009172 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
9173 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009174 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
9175 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
9176 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009177 m_errorMonitor->VerifyFound();
9178
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009179 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
9180 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009181 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
9182 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
9183 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009184 m_errorMonitor->VerifyFound();
9185
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009186 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
9187 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9189 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
9190 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
9191 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009192 m_errorMonitor->VerifyFound();
9193
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009194 // Cause INFO messages due to disturbing previously bound Sets
9195 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009196 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
9197 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009198 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009199 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
9200 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
9201 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009202 m_errorMonitor->VerifyFound();
9203
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009204 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
9205 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009206 // 2. Disturb set after last bound set
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009207 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " newly bound as set #0 so set #1 and "
9208 "any subsequent sets were disturbed ");
9209 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
9210 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009211 m_errorMonitor->VerifyFound();
9212
Tobin Ehlis10fad692016-07-07 12:00:36 -06009213 // Now that we're done actively using the pipelineLayout that gfx pipeline
9214 // was created with, we should be able to delete it. Do that now to verify
9215 // that validation obeys pipelineLayout lifetime
9216 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
9217
Tobin Ehlis88452832015-12-03 09:40:56 -07009218 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07009219 // 1. Error due to not binding required set (we actually use same code as
9220 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009221 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
9222 &descriptorSet[0], 0, NULL);
9223 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
9224 &descriptorSet[1], 0, NULL);
9225 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 -07009226 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009227 m_errorMonitor->VerifyFound();
9228
Tobin Ehlis991d45a2016-01-06 08:48:41 -07009229 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07009230 // 2. Error due to bound set not being compatible with PSO's
9231 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009232 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
9233 &descriptorSet[0], 0, NULL);
9234 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07009235 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009236 m_errorMonitor->VerifyFound();
9237
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009238 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07009239 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009240 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
9241 }
9242 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06009243 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
9244 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07009245 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07009246 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9247 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009248 vkFreeMemory(m_device->device(), imageMem, NULL);
9249 vkDestroyImage(m_device->device(), image, NULL);
9250 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07009251}
Tobin Ehlis559c6382015-11-05 09:52:49 -07009252
Karl Schultz6addd812016-02-02 17:17:23 -07009253TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009254
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009255 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9256 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009257
9258 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009259 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009260 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009261 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009262
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009263 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009264}
9265
Karl Schultz6addd812016-02-02 17:17:23 -07009266TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
9267 VkResult err;
9268 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009269
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009271
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06009272 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06009273
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009274 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009275 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06009276 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009277 cmd.commandPool = m_commandPool;
9278 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009279 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06009280
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009281 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06009282 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06009283
9284 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009285 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07009286 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009287 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06009288 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009289 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 -07009290 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06009291
9292 // The error should be caught by validation of the BeginCommandBuffer call
9293 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
9294
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009295 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009296 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06009297}
9298
Karl Schultz6addd812016-02-02 17:17:23 -07009299TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07009300 // Cause error due to Begin while recording CB
9301 // Then cause 2 errors for attempting to reset CB w/o having
9302 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
9303 // which CBs were allocated. Note that this bit is off by default.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009304 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07009305
9306 ASSERT_NO_FATAL_FAILURE(InitState());
9307
9308 // Calls AllocateCommandBuffers
9309 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
9310
Karl Schultz6addd812016-02-02 17:17:23 -07009311 // Force the failure by setting the Renderpass and Framebuffer fields with
9312 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07009313 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07009314 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07009315 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9316 cmd_buf_info.pNext = NULL;
9317 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009318 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07009319
9320 // Begin CB to transition to recording state
9321 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
9322 // Can't re-begin. This should trigger error
9323 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009324 m_errorMonitor->VerifyFound();
9325
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009326 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07009327 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
9328 // Reset attempt will trigger error due to incorrect CommandPool state
9329 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009330 m_errorMonitor->VerifyFound();
9331
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009332 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07009333 // Transition CB to RECORDED state
9334 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
9335 // Now attempting to Begin will implicitly reset, which triggers error
9336 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009337 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07009338}
9339
Karl Schultz6addd812016-02-02 17:17:23 -07009340TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009341 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07009342 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009343
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid Pipeline CreateInfo State: Vtx Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009345
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009346 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06009347 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06009348
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009349 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009350 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9351 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06009352
9353 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009354 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9355 ds_pool_ci.pNext = NULL;
9356 ds_pool_ci.maxSets = 1;
9357 ds_pool_ci.poolSizeCount = 1;
9358 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06009359
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009360 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009361 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009362 ASSERT_VK_SUCCESS(err);
9363
Tony Barboureb254902015-07-15 12:50:33 -06009364 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009365 dsl_binding.binding = 0;
9366 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9367 dsl_binding.descriptorCount = 1;
9368 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9369 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009370
Tony Barboureb254902015-07-15 12:50:33 -06009371 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009372 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9373 ds_layout_ci.pNext = NULL;
9374 ds_layout_ci.bindingCount = 1;
9375 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06009376
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009377 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009378 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009379 ASSERT_VK_SUCCESS(err);
9380
9381 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009382 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009383 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009384 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009385 alloc_info.descriptorPool = ds_pool;
9386 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009387 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009388 ASSERT_VK_SUCCESS(err);
9389
Tony Barboureb254902015-07-15 12:50:33 -06009390 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009391 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9392 pipeline_layout_ci.setLayoutCount = 1;
9393 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009394
9395 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009396 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009397 ASSERT_VK_SUCCESS(err);
9398
Tobin Ehlise68360f2015-10-01 11:15:13 -06009399 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07009400 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06009401
9402 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009403 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9404 vp_state_ci.scissorCount = 1;
9405 vp_state_ci.pScissors = &sc;
9406 vp_state_ci.viewportCount = 1;
9407 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009408
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009409 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
9410 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9411 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
9412 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
9413 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9414 rs_state_ci.depthClampEnable = VK_FALSE;
9415 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
9416 rs_state_ci.depthBiasEnable = VK_FALSE;
9417
Tony Barboureb254902015-07-15 12:50:33 -06009418 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009419 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9420 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009421 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07009422 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9423 gp_ci.layout = pipeline_layout;
9424 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06009425
9426 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009427 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9428 pc_ci.initialDataSize = 0;
9429 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009430
9431 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06009432 VkPipelineCache pipelineCache;
9433
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009434 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06009435 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009436 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06009437
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009438 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009439
Chia-I Wuf7458c52015-10-26 21:10:41 +08009440 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9441 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9442 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9443 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009444}
Tobin Ehlis912df022015-09-17 08:46:18 -06009445/*// TODO : This test should be good, but needs Tess support in compiler to run
9446TEST_F(VkLayerTest, InvalidPatchControlPoints)
9447{
9448 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06009449 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009450
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009451 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009452 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
9453primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009454
Tobin Ehlis912df022015-09-17 08:46:18 -06009455 ASSERT_NO_FATAL_FAILURE(InitState());
9456 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06009457
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009458 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06009459 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009460 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06009461
9462 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9463 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9464 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009465 ds_pool_ci.poolSizeCount = 1;
9466 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06009467
9468 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07009469 err = vkCreateDescriptorPool(m_device->device(),
9470VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06009471 ASSERT_VK_SUCCESS(err);
9472
9473 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08009474 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06009475 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08009476 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06009477 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9478 dsl_binding.pImmutableSamplers = NULL;
9479
9480 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009481 ds_layout_ci.sType =
9482VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06009483 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009484 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07009485 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06009486
9487 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009488 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9489&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06009490 ASSERT_VK_SUCCESS(err);
9491
9492 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07009493 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
9494VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06009495 ASSERT_VK_SUCCESS(err);
9496
9497 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009498 pipeline_layout_ci.sType =
9499VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06009500 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009501 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06009502 pipeline_layout_ci.pSetLayouts = &ds_layout;
9503
9504 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07009505 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9506&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06009507 ASSERT_VK_SUCCESS(err);
9508
9509 VkPipelineShaderStageCreateInfo shaderStages[3];
9510 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
9511
Karl Schultz6addd812016-02-02 17:17:23 -07009512 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
9513this);
Tobin Ehlis912df022015-09-17 08:46:18 -06009514 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07009515 VkShaderObj
9516tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
9517this);
9518 VkShaderObj
9519te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
9520this);
Tobin Ehlis912df022015-09-17 08:46:18 -06009521
Karl Schultz6addd812016-02-02 17:17:23 -07009522 shaderStages[0].sType =
9523VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009524 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06009525 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07009526 shaderStages[1].sType =
9527VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009528 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06009529 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07009530 shaderStages[2].sType =
9531VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06009532 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06009533 shaderStages[2].shader = te.handle();
9534
9535 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009536 iaCI.sType =
9537VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08009538 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06009539
9540 VkPipelineTessellationStateCreateInfo tsCI = {};
9541 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
9542 tsCI.patchControlPoints = 0; // This will cause an error
9543
9544 VkGraphicsPipelineCreateInfo gp_ci = {};
9545 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9546 gp_ci.pNext = NULL;
9547 gp_ci.stageCount = 3;
9548 gp_ci.pStages = shaderStages;
9549 gp_ci.pVertexInputState = NULL;
9550 gp_ci.pInputAssemblyState = &iaCI;
9551 gp_ci.pTessellationState = &tsCI;
9552 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009553 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06009554 gp_ci.pMultisampleState = NULL;
9555 gp_ci.pDepthStencilState = NULL;
9556 gp_ci.pColorBlendState = NULL;
9557 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9558 gp_ci.layout = pipeline_layout;
9559 gp_ci.renderPass = renderPass();
9560
9561 VkPipelineCacheCreateInfo pc_ci = {};
9562 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9563 pc_ci.pNext = NULL;
9564 pc_ci.initialSize = 0;
9565 pc_ci.initialData = 0;
9566 pc_ci.maxSize = 0;
9567
9568 VkPipeline pipeline;
9569 VkPipelineCache pipelineCache;
9570
Karl Schultz6addd812016-02-02 17:17:23 -07009571 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
9572&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06009573 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009574 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9575&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06009576
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009577 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009578
Chia-I Wuf7458c52015-10-26 21:10:41 +08009579 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9580 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9581 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9582 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06009583}
9584*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06009585// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07009586TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07009587 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009588
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009589 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9590 "Gfx Pipeline viewport count (1) must match scissor count (0).");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009591
Tobin Ehlise68360f2015-10-01 11:15:13 -06009592 ASSERT_NO_FATAL_FAILURE(InitState());
9593 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06009594
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009595 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009596 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9597 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009598
9599 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009600 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9601 ds_pool_ci.maxSets = 1;
9602 ds_pool_ci.poolSizeCount = 1;
9603 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009604
9605 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009606 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009607 ASSERT_VK_SUCCESS(err);
9608
9609 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009610 dsl_binding.binding = 0;
9611 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9612 dsl_binding.descriptorCount = 1;
9613 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009614
9615 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009616 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9617 ds_layout_ci.bindingCount = 1;
9618 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009619
9620 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009621 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009622 ASSERT_VK_SUCCESS(err);
9623
9624 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009625 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009626 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009627 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009628 alloc_info.descriptorPool = ds_pool;
9629 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009630 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009631 ASSERT_VK_SUCCESS(err);
9632
9633 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009634 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9635 pipeline_layout_ci.setLayoutCount = 1;
9636 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009637
9638 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009639 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009640 ASSERT_VK_SUCCESS(err);
9641
9642 VkViewport vp = {}; // Just need dummy vp to point to
9643
9644 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009645 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9646 vp_state_ci.scissorCount = 0;
9647 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
9648 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009649
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009650 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
9651 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9652 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
9653 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
9654 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9655 rs_state_ci.depthClampEnable = VK_FALSE;
9656 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
9657 rs_state_ci.depthBiasEnable = VK_FALSE;
9658
Cody Northropeb3a6c12015-10-05 14:44:45 -06009659 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07009660 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06009661
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009662 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
9663 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
9664 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08009665 shaderStages[0] = vs.GetStageCreateInfo();
9666 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009667
9668 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009669 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9670 gp_ci.stageCount = 2;
9671 gp_ci.pStages = shaderStages;
9672 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009673 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07009674 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9675 gp_ci.layout = pipeline_layout;
9676 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009677
9678 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009679 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009680
9681 VkPipeline pipeline;
9682 VkPipelineCache pipelineCache;
9683
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009684 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009685 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009686 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009687
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009688 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009689
Chia-I Wuf7458c52015-10-26 21:10:41 +08009690 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9691 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9692 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9693 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009694}
Karl Schultz6addd812016-02-02 17:17:23 -07009695// Don't set viewport state in PSO. This is an error b/c we always need this
9696// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06009697// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07009698TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06009699 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07009700 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009701
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009702 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Gfx Pipeline pViewportState is null. Even if ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009703
Tobin Ehlise68360f2015-10-01 11:15:13 -06009704 ASSERT_NO_FATAL_FAILURE(InitState());
9705 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06009706
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009707 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009708 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9709 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009710
9711 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009712 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9713 ds_pool_ci.maxSets = 1;
9714 ds_pool_ci.poolSizeCount = 1;
9715 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009716
9717 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009718 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009719 ASSERT_VK_SUCCESS(err);
9720
9721 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009722 dsl_binding.binding = 0;
9723 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9724 dsl_binding.descriptorCount = 1;
9725 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009726
9727 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009728 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9729 ds_layout_ci.bindingCount = 1;
9730 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009731
9732 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009733 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009734 ASSERT_VK_SUCCESS(err);
9735
9736 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009737 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009738 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009739 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009740 alloc_info.descriptorPool = ds_pool;
9741 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009742 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009743 ASSERT_VK_SUCCESS(err);
9744
9745 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009746 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9747 pipeline_layout_ci.setLayoutCount = 1;
9748 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009749
9750 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009751 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009752 ASSERT_VK_SUCCESS(err);
9753
9754 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
9755 // Set scissor as dynamic to avoid second error
9756 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009757 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9758 dyn_state_ci.dynamicStateCount = 1;
9759 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009760
Cody Northropeb3a6c12015-10-05 14:44:45 -06009761 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07009762 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06009763
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009764 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
9765 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
9766 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08009767 shaderStages[0] = vs.GetStageCreateInfo();
9768 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009769
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009770 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
9771 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9772 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
9773 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
9774 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9775 rs_state_ci.depthClampEnable = VK_FALSE;
9776 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
9777 rs_state_ci.depthBiasEnable = VK_FALSE;
9778
Tobin Ehlise68360f2015-10-01 11:15:13 -06009779 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009780 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9781 gp_ci.stageCount = 2;
9782 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07009783 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07009784 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
9785 // should cause validation error
9786 gp_ci.pDynamicState = &dyn_state_ci;
9787 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9788 gp_ci.layout = pipeline_layout;
9789 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009790
9791 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009792 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009793
9794 VkPipeline pipeline;
9795 VkPipelineCache pipelineCache;
9796
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009797 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009798 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009799 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009800
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009801 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009802
Chia-I Wuf7458c52015-10-26 21:10:41 +08009803 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9804 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9805 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9806 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009807}
9808// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07009809// Then run second test where dynamic scissor count doesn't match PSO scissor
9810// count
9811TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
9812 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009813
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009814 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9815 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009816
Tobin Ehlise68360f2015-10-01 11:15:13 -06009817 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009818
9819 if (!m_device->phy().features().multiViewport) {
9820 printf("Device does not support multiple viewports/scissors; skipped.\n");
9821 return;
9822 }
9823
Tobin Ehlise68360f2015-10-01 11:15:13 -06009824 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06009825
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009826 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009827 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9828 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009829
9830 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009831 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9832 ds_pool_ci.maxSets = 1;
9833 ds_pool_ci.poolSizeCount = 1;
9834 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009835
9836 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009837 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009838 ASSERT_VK_SUCCESS(err);
9839
9840 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009841 dsl_binding.binding = 0;
9842 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9843 dsl_binding.descriptorCount = 1;
9844 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009845
9846 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009847 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9848 ds_layout_ci.bindingCount = 1;
9849 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009850
9851 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009852 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009853 ASSERT_VK_SUCCESS(err);
9854
9855 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009856 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08009857 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07009858 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06009859 alloc_info.descriptorPool = ds_pool;
9860 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009861 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009862 ASSERT_VK_SUCCESS(err);
9863
9864 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009865 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9866 pipeline_layout_ci.setLayoutCount = 1;
9867 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009868
9869 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009870 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009871 ASSERT_VK_SUCCESS(err);
9872
9873 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009874 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9875 vp_state_ci.viewportCount = 1;
9876 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
9877 vp_state_ci.scissorCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009878 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06009879
9880 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
9881 // Set scissor as dynamic to avoid that error
9882 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009883 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9884 dyn_state_ci.dynamicStateCount = 1;
9885 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009886
Cody Northropeb3a6c12015-10-05 14:44:45 -06009887 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07009888 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06009889
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009890 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
9891 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
9892 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08009893 shaderStages[0] = vs.GetStageCreateInfo();
9894 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009895
Cody Northropf6622dc2015-10-06 10:33:21 -06009896 VkPipelineVertexInputStateCreateInfo vi_ci = {};
9897 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9898 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009899 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06009900 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08009901 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06009902 vi_ci.pVertexAttributeDescriptions = nullptr;
9903
9904 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
9905 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9906 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9907
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009908 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08009909 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06009910 rs_ci.pNext = nullptr;
9911
Mark Youngc89c6312016-03-31 16:03:20 -06009912 VkPipelineColorBlendAttachmentState att = {};
9913 att.blendEnable = VK_FALSE;
9914 att.colorWriteMask = 0xf;
9915
Cody Northropf6622dc2015-10-06 10:33:21 -06009916 VkPipelineColorBlendStateCreateInfo cb_ci = {};
9917 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
9918 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06009919 cb_ci.attachmentCount = 1;
9920 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06009921
Tobin Ehlise68360f2015-10-01 11:15:13 -06009922 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009923 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9924 gp_ci.stageCount = 2;
9925 gp_ci.pStages = shaderStages;
9926 gp_ci.pVertexInputState = &vi_ci;
9927 gp_ci.pInputAssemblyState = &ia_ci;
9928 gp_ci.pViewportState = &vp_state_ci;
9929 gp_ci.pRasterizationState = &rs_ci;
9930 gp_ci.pColorBlendState = &cb_ci;
9931 gp_ci.pDynamicState = &dyn_state_ci;
9932 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9933 gp_ci.layout = pipeline_layout;
9934 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009935
9936 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009937 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06009938
9939 VkPipeline pipeline;
9940 VkPipelineCache pipelineCache;
9941
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009942 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009943 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009944 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009945
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009946 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009947
Tobin Ehlisd332f282015-10-02 11:00:56 -06009948 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07009949 // First need to successfully create the PSO from above by setting
9950 // pViewports
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009951 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic scissor(s) 0 are used by PSO, ");
Karl Schultz6addd812016-02-02 17:17:23 -07009952
9953 VkViewport vp = {}; // Just need dummy vp to point to
9954 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009955 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07009956 ASSERT_VK_SUCCESS(err);
9957 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009958 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009959 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07009960 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009961 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07009962 Draw(1, 0, 0, 0);
9963
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009964 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07009965
9966 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9967 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9968 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9969 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009970 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07009971}
9972// Create PSO w/o non-zero scissorCount but no scissor data
9973// Then run second test where dynamic viewportCount doesn't match PSO
9974// viewportCount
9975TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
9976 VkResult err;
9977
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009978 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 -07009979
9980 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12009981
9982 if (!m_device->phy().features().multiViewport) {
9983 printf("Device does not support multiple viewports/scissors; skipped.\n");
9984 return;
9985 }
9986
Karl Schultz6addd812016-02-02 17:17:23 -07009987 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9988
9989 VkDescriptorPoolSize ds_type_count = {};
9990 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9991 ds_type_count.descriptorCount = 1;
9992
9993 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9994 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9995 ds_pool_ci.maxSets = 1;
9996 ds_pool_ci.poolSizeCount = 1;
9997 ds_pool_ci.pPoolSizes = &ds_type_count;
9998
9999 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010000 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -070010001 ASSERT_VK_SUCCESS(err);
10002
10003 VkDescriptorSetLayoutBinding dsl_binding = {};
10004 dsl_binding.binding = 0;
10005 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10006 dsl_binding.descriptorCount = 1;
10007 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10008
10009 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10010 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10011 ds_layout_ci.bindingCount = 1;
10012 ds_layout_ci.pBindings = &dsl_binding;
10013
10014 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010015 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -070010016 ASSERT_VK_SUCCESS(err);
10017
10018 VkDescriptorSet descriptorSet;
10019 VkDescriptorSetAllocateInfo alloc_info = {};
10020 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10021 alloc_info.descriptorSetCount = 1;
10022 alloc_info.descriptorPool = ds_pool;
10023 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010024 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -070010025 ASSERT_VK_SUCCESS(err);
10026
10027 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10028 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10029 pipeline_layout_ci.setLayoutCount = 1;
10030 pipeline_layout_ci.pSetLayouts = &ds_layout;
10031
10032 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010033 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -070010034 ASSERT_VK_SUCCESS(err);
10035
10036 VkPipelineViewportStateCreateInfo vp_state_ci = {};
10037 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
10038 vp_state_ci.scissorCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010039 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -070010040 vp_state_ci.viewportCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010041 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -070010042
10043 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
10044 // Set scissor as dynamic to avoid that error
10045 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
10046 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
10047 dyn_state_ci.dynamicStateCount = 1;
10048 dyn_state_ci.pDynamicStates = &vp_state;
10049
10050 VkPipelineShaderStageCreateInfo shaderStages[2];
10051 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
10052
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010053 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
10054 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
10055 // but add it to be able to run on more devices
Karl Schultz6addd812016-02-02 17:17:23 -070010056 shaderStages[0] = vs.GetStageCreateInfo();
10057 shaderStages[1] = fs.GetStageCreateInfo();
10058
10059 VkPipelineVertexInputStateCreateInfo vi_ci = {};
10060 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
10061 vi_ci.pNext = nullptr;
10062 vi_ci.vertexBindingDescriptionCount = 0;
10063 vi_ci.pVertexBindingDescriptions = nullptr;
10064 vi_ci.vertexAttributeDescriptionCount = 0;
10065 vi_ci.pVertexAttributeDescriptions = nullptr;
10066
10067 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
10068 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
10069 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
10070
10071 VkPipelineRasterizationStateCreateInfo rs_ci = {};
10072 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
10073 rs_ci.pNext = nullptr;
10074
Mark Youngc89c6312016-03-31 16:03:20 -060010075 VkPipelineColorBlendAttachmentState att = {};
10076 att.blendEnable = VK_FALSE;
10077 att.colorWriteMask = 0xf;
10078
Karl Schultz6addd812016-02-02 17:17:23 -070010079 VkPipelineColorBlendStateCreateInfo cb_ci = {};
10080 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
10081 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -060010082 cb_ci.attachmentCount = 1;
10083 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -070010084
10085 VkGraphicsPipelineCreateInfo gp_ci = {};
10086 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
10087 gp_ci.stageCount = 2;
10088 gp_ci.pStages = shaderStages;
10089 gp_ci.pVertexInputState = &vi_ci;
10090 gp_ci.pInputAssemblyState = &ia_ci;
10091 gp_ci.pViewportState = &vp_state_ci;
10092 gp_ci.pRasterizationState = &rs_ci;
10093 gp_ci.pColorBlendState = &cb_ci;
10094 gp_ci.pDynamicState = &dyn_state_ci;
10095 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
10096 gp_ci.layout = pipeline_layout;
10097 gp_ci.renderPass = renderPass();
10098
10099 VkPipelineCacheCreateInfo pc_ci = {};
10100 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
10101
10102 VkPipeline pipeline;
10103 VkPipelineCache pipelineCache;
10104
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010105 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -070010106 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010107 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -070010108
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010109 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -070010110
10111 // Now hit second fail case where we set scissor w/ different count than PSO
10112 // First need to successfully create the PSO from above by setting
10113 // pViewports
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010114 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic viewport(s) 0 are used by PSO, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010115
Tobin Ehlisd332f282015-10-02 11:00:56 -060010116 VkRect2D sc = {}; // Just need dummy vp to point to
10117 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010118 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -060010119 ASSERT_VK_SUCCESS(err);
10120 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010121 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Chris Forbesc08a6ca2016-07-28 14:14:07 +120010122 VkViewport viewports[1] = {}; // don't care about data
Tobin Ehlisd332f282015-10-02 11:00:56 -060010123 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +120010124 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -060010125 Draw(1, 0, 0, 0);
10126
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010127 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -060010128
Chia-I Wuf7458c52015-10-26 21:10:41 +080010129 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
10130 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10131 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10132 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060010133 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -060010134}
10135
Mark Young7394fdd2016-03-31 14:56:43 -060010136TEST_F(VkLayerTest, PSOLineWidthInvalid) {
10137 VkResult err;
10138
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010139 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -060010140
10141 ASSERT_NO_FATAL_FAILURE(InitState());
10142 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10143
10144 VkDescriptorPoolSize ds_type_count = {};
10145 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10146 ds_type_count.descriptorCount = 1;
10147
10148 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10149 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10150 ds_pool_ci.maxSets = 1;
10151 ds_pool_ci.poolSizeCount = 1;
10152 ds_pool_ci.pPoolSizes = &ds_type_count;
10153
10154 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010155 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -060010156 ASSERT_VK_SUCCESS(err);
10157
10158 VkDescriptorSetLayoutBinding dsl_binding = {};
10159 dsl_binding.binding = 0;
10160 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10161 dsl_binding.descriptorCount = 1;
10162 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10163
10164 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10165 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10166 ds_layout_ci.bindingCount = 1;
10167 ds_layout_ci.pBindings = &dsl_binding;
10168
10169 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010170 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -060010171 ASSERT_VK_SUCCESS(err);
10172
10173 VkDescriptorSet descriptorSet;
10174 VkDescriptorSetAllocateInfo alloc_info = {};
10175 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10176 alloc_info.descriptorSetCount = 1;
10177 alloc_info.descriptorPool = ds_pool;
10178 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010179 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -060010180 ASSERT_VK_SUCCESS(err);
10181
10182 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10183 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10184 pipeline_layout_ci.setLayoutCount = 1;
10185 pipeline_layout_ci.pSetLayouts = &ds_layout;
10186
10187 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010188 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -060010189 ASSERT_VK_SUCCESS(err);
10190
10191 VkPipelineViewportStateCreateInfo vp_state_ci = {};
10192 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
10193 vp_state_ci.scissorCount = 1;
10194 vp_state_ci.pScissors = NULL;
10195 vp_state_ci.viewportCount = 1;
10196 vp_state_ci.pViewports = NULL;
10197
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010198 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -060010199 // Set scissor as dynamic to avoid that error
10200 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
10201 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
10202 dyn_state_ci.dynamicStateCount = 2;
10203 dyn_state_ci.pDynamicStates = dynamic_states;
10204
10205 VkPipelineShaderStageCreateInfo shaderStages[2];
10206 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
10207
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010208 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
10209 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Young7394fdd2016-03-31 14:56:43 -060010210 this); // TODO - We shouldn't need a fragment shader
10211 // but add it to be able to run on more devices
10212 shaderStages[0] = vs.GetStageCreateInfo();
10213 shaderStages[1] = fs.GetStageCreateInfo();
10214
10215 VkPipelineVertexInputStateCreateInfo vi_ci = {};
10216 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
10217 vi_ci.pNext = nullptr;
10218 vi_ci.vertexBindingDescriptionCount = 0;
10219 vi_ci.pVertexBindingDescriptions = nullptr;
10220 vi_ci.vertexAttributeDescriptionCount = 0;
10221 vi_ci.pVertexAttributeDescriptions = nullptr;
10222
10223 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
10224 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
10225 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
10226
10227 VkPipelineRasterizationStateCreateInfo rs_ci = {};
10228 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
10229 rs_ci.pNext = nullptr;
10230
Mark Young47107952016-05-02 15:59:55 -060010231 // Check too low (line width of -1.0f).
10232 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -060010233
10234 VkPipelineColorBlendAttachmentState att = {};
10235 att.blendEnable = VK_FALSE;
10236 att.colorWriteMask = 0xf;
10237
10238 VkPipelineColorBlendStateCreateInfo cb_ci = {};
10239 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
10240 cb_ci.pNext = nullptr;
10241 cb_ci.attachmentCount = 1;
10242 cb_ci.pAttachments = &att;
10243
10244 VkGraphicsPipelineCreateInfo gp_ci = {};
10245 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
10246 gp_ci.stageCount = 2;
10247 gp_ci.pStages = shaderStages;
10248 gp_ci.pVertexInputState = &vi_ci;
10249 gp_ci.pInputAssemblyState = &ia_ci;
10250 gp_ci.pViewportState = &vp_state_ci;
10251 gp_ci.pRasterizationState = &rs_ci;
10252 gp_ci.pColorBlendState = &cb_ci;
10253 gp_ci.pDynamicState = &dyn_state_ci;
10254 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
10255 gp_ci.layout = pipeline_layout;
10256 gp_ci.renderPass = renderPass();
10257
10258 VkPipelineCacheCreateInfo pc_ci = {};
10259 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
10260
10261 VkPipeline pipeline;
10262 VkPipelineCache pipelineCache;
10263
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010264 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -060010265 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010266 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -060010267
10268 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060010269 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -060010270
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010271 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -060010272
10273 // Check too high (line width of 65536.0f).
10274 rs_ci.lineWidth = 65536.0f;
10275
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010276 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -060010277 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010278 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -060010279
10280 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060010281 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -060010282
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010283 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -060010284
10285 dyn_state_ci.dynamicStateCount = 3;
10286
10287 rs_ci.lineWidth = 1.0f;
10288
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010289 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -060010290 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010291 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -060010292 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010293 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -060010294
10295 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -060010296 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -060010297 m_errorMonitor->VerifyFound();
10298
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010299 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -060010300
10301 // Check too high with dynamic setting.
10302 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
10303 m_errorMonitor->VerifyFound();
10304 EndCommandBuffer();
10305
10306 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
10307 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10308 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10309 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060010310 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -060010311}
10312
Karl Schultz6addd812016-02-02 17:17:23 -070010313TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -060010314 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010315 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10316 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -060010317
10318 ASSERT_NO_FATAL_FAILURE(InitState());
10319 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -060010320
Tony Barbourfe3351b2015-07-28 10:17:20 -060010321 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070010322 // Don't care about RenderPass handle b/c error should be flagged before
10323 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010324 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -060010325
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010326 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -060010327}
10328
Karl Schultz6addd812016-02-02 17:17:23 -070010329TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -060010330 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010331 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10332 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -060010333
10334 ASSERT_NO_FATAL_FAILURE(InitState());
10335 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -060010336
Tony Barbourfe3351b2015-07-28 10:17:20 -060010337 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070010338 // Just create a dummy Renderpass that's non-NULL so we can get to the
10339 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010340 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -060010341
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010342 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010343}
10344
Chris Forbes2eeabe32016-06-21 20:52:34 +120010345TEST_F(VkLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
10346 m_errorMonitor->ExpectSuccess();
10347
10348 ASSERT_NO_FATAL_FAILURE(InitState());
10349 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10350
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010351 BeginCommandBuffer(); // framework implicitly begins the renderpass.
Chris Forbes2eeabe32016-06-21 20:52:34 +120010352 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // end implicit.
10353
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010354 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Chris Forbes2eeabe32016-06-21 20:52:34 +120010355 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
10356 m_errorMonitor->VerifyNotFound();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010357 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Chris Forbes2eeabe32016-06-21 20:52:34 +120010358 m_errorMonitor->VerifyNotFound();
10359 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
10360 m_errorMonitor->VerifyNotFound();
10361
10362 m_commandBuffer->EndCommandBuffer();
10363 m_errorMonitor->VerifyNotFound();
10364}
10365
Tobin Ehlis5a1c0332016-05-31 13:59:26 -060010366TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
10367 TEST_DESCRIPTION("Begin a renderPass where clearValueCount is less than"
10368 "the number of renderPass attachments that use loadOp"
10369 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
10370
10371 ASSERT_NO_FATAL_FAILURE(InitState());
10372 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10373
10374 // Create a renderPass with a single attachment that uses loadOp CLEAR
10375 VkAttachmentReference attach = {};
10376 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
10377 VkSubpassDescription subpass = {};
10378 subpass.inputAttachmentCount = 1;
10379 subpass.pInputAttachments = &attach;
10380 VkRenderPassCreateInfo rpci = {};
10381 rpci.subpassCount = 1;
10382 rpci.pSubpasses = &subpass;
10383 rpci.attachmentCount = 1;
10384 VkAttachmentDescription attach_desc = {};
10385 attach_desc.format = VK_FORMAT_UNDEFINED;
10386 // Set loadOp to CLEAR
10387 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
10388 rpci.pAttachments = &attach_desc;
10389 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
10390 VkRenderPass rp;
10391 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10392
10393 VkCommandBufferInheritanceInfo hinfo = {};
10394 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
10395 hinfo.renderPass = VK_NULL_HANDLE;
10396 hinfo.subpass = 0;
10397 hinfo.framebuffer = VK_NULL_HANDLE;
10398 hinfo.occlusionQueryEnable = VK_FALSE;
10399 hinfo.queryFlags = 0;
10400 hinfo.pipelineStatistics = 0;
10401 VkCommandBufferBeginInfo info = {};
10402 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
10403 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
10404 info.pInheritanceInfo = &hinfo;
10405
10406 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
10407 VkRenderPassBeginInfo rp_begin = {};
10408 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
10409 rp_begin.pNext = NULL;
10410 rp_begin.renderPass = renderPass();
10411 rp_begin.framebuffer = framebuffer();
10412 rp_begin.clearValueCount = 0; // Should be 1
10413
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010414 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has a clearValueCount of 0 but "
10415 "there must be at least 1 entries in "
10416 "pClearValues array to account for ");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -060010417
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010418 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -060010419
10420 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -060010421
10422 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -060010423}
10424
Cody Northrop3bb4d962016-05-09 16:15:57 -060010425TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
10426
10427 TEST_DESCRIPTION("End a command buffer with an active render pass");
10428
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010429 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10430 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -060010431
10432 ASSERT_NO_FATAL_FAILURE(InitState());
10433 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10434
10435 // The framework's BeginCommandBuffer calls CreateRenderPass
10436 BeginCommandBuffer();
10437
10438 // Call directly into vkEndCommandBuffer instead of the
10439 // the framework's EndCommandBuffer, which inserts a
10440 // vkEndRenderPass
10441 vkEndCommandBuffer(m_commandBuffer->GetBufferHandle());
10442
10443 m_errorMonitor->VerifyFound();
10444
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010445 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
10446 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -060010447}
10448
Karl Schultz6addd812016-02-02 17:17:23 -070010449TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010450 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010451 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10452 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010453
10454 ASSERT_NO_FATAL_FAILURE(InitState());
10455 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010456
10457 // Renderpass is started here
10458 BeginCommandBuffer();
10459
10460 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010461 vk_testing::Buffer dstBuffer;
10462 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010463
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010464 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010465
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010466 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010467}
10468
Karl Schultz6addd812016-02-02 17:17:23 -070010469TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010470 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010471 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10472 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010473
10474 ASSERT_NO_FATAL_FAILURE(InitState());
10475 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010476
10477 // Renderpass is started here
10478 BeginCommandBuffer();
10479
10480 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010481 vk_testing::Buffer dstBuffer;
10482 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010483
Karl Schultz6addd812016-02-02 17:17:23 -070010484 VkDeviceSize dstOffset = 0;
10485 VkDeviceSize dataSize = 1024;
Karl Schultzee344492016-07-11 15:09:57 -060010486 const void *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010487
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010488 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010489
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010490 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010491}
10492
Karl Schultz6addd812016-02-02 17:17:23 -070010493TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010494 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010495 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10496 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010497
10498 ASSERT_NO_FATAL_FAILURE(InitState());
10499 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010500
10501 // Renderpass is started here
10502 BeginCommandBuffer();
10503
Michael Lentine0a369f62016-02-03 16:51:46 -060010504 VkClearColorValue clear_color;
10505 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -070010506 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
10507 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
10508 const int32_t tex_width = 32;
10509 const int32_t tex_height = 32;
10510 VkImageCreateInfo image_create_info = {};
10511 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10512 image_create_info.pNext = NULL;
10513 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10514 image_create_info.format = tex_format;
10515 image_create_info.extent.width = tex_width;
10516 image_create_info.extent.height = tex_height;
10517 image_create_info.extent.depth = 1;
10518 image_create_info.mipLevels = 1;
10519 image_create_info.arrayLayers = 1;
10520 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
10521 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
10522 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010523
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010524 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010525 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010526
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010527 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010528
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010529 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010530
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010531 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010532}
10533
Karl Schultz6addd812016-02-02 17:17:23 -070010534TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010535 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010536 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10537 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010538
10539 ASSERT_NO_FATAL_FAILURE(InitState());
10540 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010541
10542 // Renderpass is started here
10543 BeginCommandBuffer();
10544
10545 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -070010546 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070010547 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
10548 image_create_info.imageType = VK_IMAGE_TYPE_2D;
10549 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
10550 image_create_info.extent.width = 64;
10551 image_create_info.extent.height = 64;
10552 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
10553 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010554
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010555 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010556 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010557
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010558 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010559
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010560 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
10561 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010562
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010563 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010564}
10565
Karl Schultz6addd812016-02-02 17:17:23 -070010566TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060010567 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -070010568 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010569
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010570 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearAttachments(): This call "
10571 "must be issued inside an active "
10572 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010573
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010574 ASSERT_NO_FATAL_FAILURE(InitState());
10575 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010576
10577 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010578 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010579 ASSERT_VK_SUCCESS(err);
10580
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060010581 VkClearAttachment color_attachment;
10582 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10583 color_attachment.clearValue.color.float32[0] = 0;
10584 color_attachment.clearValue.color.float32[1] = 0;
10585 color_attachment.clearValue.color.float32[2] = 0;
10586 color_attachment.clearValue.color.float32[3] = 0;
10587 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070010588 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010589 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010590
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010591 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -060010592}
10593
Chris Forbes3b97e932016-09-07 11:29:24 +120010594TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
10595 TEST_DESCRIPTION("Test that an error is produced when CmdNextSubpass is "
10596 "called too many times in a renderpass instance");
10597
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010598 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdNextSubpass(): Attempted to advance "
10599 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +120010600
10601 ASSERT_NO_FATAL_FAILURE(InitState());
10602 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10603
10604 BeginCommandBuffer();
10605
10606 // error here.
10607 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
10608 m_errorMonitor->VerifyFound();
10609
10610 EndCommandBuffer();
10611}
10612
Chris Forbes6d624702016-09-07 13:57:05 +120010613TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
10614 TEST_DESCRIPTION("Test that an error is produced when CmdEndRenderPass is "
10615 "called before the final subpass has been reached");
10616
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010617 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdEndRenderPass(): Called before reaching "
10618 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +120010619
10620 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010621 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
10622 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +120010623
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010624 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +120010625
10626 VkRenderPass rp;
10627 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
10628 ASSERT_VK_SUCCESS(err);
10629
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010630 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +120010631
10632 VkFramebuffer fb;
10633 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
10634 ASSERT_VK_SUCCESS(err);
10635
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010636 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +120010637
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010638 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 +120010639
10640 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
10641
10642 // Error here.
10643 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
10644 m_errorMonitor->VerifyFound();
10645
10646 // Clean up.
10647 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
10648 vkDestroyRenderPass(m_device->device(), rp, nullptr);
10649}
10650
Karl Schultz9e66a292016-04-21 15:57:51 -060010651TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
10652 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10654 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -060010655
10656 ASSERT_NO_FATAL_FAILURE(InitState());
10657 BeginCommandBuffer();
10658
10659 VkBufferMemoryBarrier buf_barrier = {};
10660 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
10661 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10662 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10663 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10664 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10665 buf_barrier.buffer = VK_NULL_HANDLE;
10666 buf_barrier.offset = 0;
10667 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010668 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
10669 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -060010670
10671 m_errorMonitor->VerifyFound();
10672}
10673
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010674TEST_F(VkLayerTest, InvalidBarriers) {
10675 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
10676
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010677 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010678
10679 ASSERT_NO_FATAL_FAILURE(InitState());
10680 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10681
10682 VkMemoryBarrier mem_barrier = {};
10683 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
10684 mem_barrier.pNext = NULL;
10685 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10686 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10687 BeginCommandBuffer();
10688 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010689 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010690 &mem_barrier, 0, nullptr, 0, nullptr);
10691 m_errorMonitor->VerifyFound();
10692
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010693 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010694 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010695 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 -060010696 ASSERT_TRUE(image.initialized());
10697 VkImageMemoryBarrier img_barrier = {};
10698 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
10699 img_barrier.pNext = NULL;
10700 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10701 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10702 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10703 // New layout can't be UNDEFINED
10704 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
10705 img_barrier.image = image.handle();
10706 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10707 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10708 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10709 img_barrier.subresourceRange.baseArrayLayer = 0;
10710 img_barrier.subresourceRange.baseMipLevel = 0;
10711 img_barrier.subresourceRange.layerCount = 1;
10712 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010713 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
10714 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010715 m_errorMonitor->VerifyFound();
10716 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10717
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the "
10719 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010720 // baseArrayLayer + layerCount must be <= image's arrayLayers
10721 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010722 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
10723 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010724 m_errorMonitor->VerifyFound();
10725 img_barrier.subresourceRange.baseArrayLayer = 0;
10726
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010727 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010728 // baseMipLevel + levelCount must be <= image's mipLevels
10729 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010730 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
10731 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010732 m_errorMonitor->VerifyFound();
10733 img_barrier.subresourceRange.baseMipLevel = 0;
10734
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010735 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 -060010736 vk_testing::Buffer buffer;
10737 buffer.init(*m_device, 256);
10738 VkBufferMemoryBarrier buf_barrier = {};
10739 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
10740 buf_barrier.pNext = NULL;
10741 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
10742 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
10743 buf_barrier.buffer = buffer.handle();
10744 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10745 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
10746 buf_barrier.offset = 0;
10747 buf_barrier.size = VK_WHOLE_SIZE;
10748 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010749 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
10750 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010751 m_errorMonitor->VerifyFound();
10752 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
10753
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010754 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010755 buf_barrier.offset = 257;
10756 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010757 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
10758 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010759 m_errorMonitor->VerifyFound();
10760 buf_barrier.offset = 0;
10761
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010762 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010763 buf_barrier.size = 257;
10764 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010765 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
10766 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010767 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010768
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010769 // Now exercise barrier aspect bit errors, first DS
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010770 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image is a depth and stencil format and thus must "
10771 "have either one or both of VK_IMAGE_ASPECT_DEPTH_BIT and "
10772 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010773 VkDepthStencilObj ds_image(m_device);
10774 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
10775 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -060010776 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
10777 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010778 img_barrier.image = ds_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -060010779 // Use of COLOR aspect on DS image is error
10780 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010781 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
10782 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010783 m_errorMonitor->VerifyFound();
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010784 // Now test depth-only
10785 VkFormatProperties format_props;
10786
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010787 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
10788 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
10789 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image is a depth-only format and thus must "
10790 "have VK_IMAGE_ASPECT_DEPTH_BIT set.");
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010791 VkDepthStencilObj d_image(m_device);
10792 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
10793 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010794 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -060010795 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010796 img_barrier.image = d_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -060010797 // Use of COLOR aspect on depth image is error
10798 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010799 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
10800 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010801 m_errorMonitor->VerifyFound();
10802 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010803 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
10804 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010805 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image is a stencil-only format and thus must "
10807 "have VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010808 VkDepthStencilObj s_image(m_device);
10809 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
10810 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010811 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -060010812 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010813 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -060010814 // Use of COLOR aspect on depth image is error
10815 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010816 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
10817 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010818 m_errorMonitor->VerifyFound();
10819 }
10820 // Finally test color
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010821 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image is a color format and thus must "
10822 "have VK_IMAGE_ASPECT_COLOR_BIT set.");
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010823 VkImageObj c_image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010824 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 -060010825 ASSERT_TRUE(c_image.initialized());
10826 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10827 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
10828 img_barrier.image = c_image.handle();
10829 // Set aspect to depth (non-color)
10830 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010831 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
10832 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -060010833 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -060010834}
10835
Tony Barbour18ba25c2016-09-29 13:42:40 -060010836TEST_F(VkLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
10837 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ in srcAccessMask
10838
10839 m_errorMonitor->SetDesiredFailureMsg(
10840 VK_DEBUG_REPORT_WARNING_BIT_EXT,
10841 "must have required access bit");
10842 ASSERT_NO_FATAL_FAILURE(InitState());
10843 VkImageObj image(m_device);
Tony Barbour256c80a2016-10-05 13:23:46 -060010844 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 -060010845 ASSERT_TRUE(image.initialized());
10846
10847 VkImageMemoryBarrier barrier = {};
10848 VkImageSubresourceRange range;
10849 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
10850 barrier.srcAccessMask = 0;
10851 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
10852 barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
10853 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10854 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
10855 barrier.image = image.handle();
10856 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10857 range.baseMipLevel = 0;
10858 range.levelCount = 1;
10859 range.baseArrayLayer = 0;
10860 range.layerCount = 1;
10861 barrier.subresourceRange = range;
10862 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
10863 cmdbuf.BeginCommandBuffer();
10864 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
10865 &barrier);
10866 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
10867 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
10868 barrier.srcAccessMask = 0;
10869 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
10870 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
10871 &barrier);
10872
10873 m_errorMonitor->VerifyFound();
10874}
10875
Karl Schultz6addd812016-02-02 17:17:23 -070010876TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010877 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -070010878 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010879
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010881
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010882 ASSERT_NO_FATAL_FAILURE(InitState());
10883 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010884 uint32_t qfi = 0;
10885 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010886 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10887 buffCI.size = 1024;
10888 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
10889 buffCI.queueFamilyIndexCount = 1;
10890 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010891
10892 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010893 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010894 ASSERT_VK_SUCCESS(err);
10895
10896 BeginCommandBuffer();
10897 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -070010898 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
10899 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010900 // Should error before calling to driver so don't care about actual data
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010901 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7, VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010902
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010903 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010904
Chia-I Wuf7458c52015-10-26 21:10:41 +080010905 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010906}
10907
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010908TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
10909 // Create an out-of-range queueFamilyIndex
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010910 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10911 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
10912 "of the indices specified when the device was created, via the "
10913 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010914
10915 ASSERT_NO_FATAL_FAILURE(InitState());
10916 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10917 VkBufferCreateInfo buffCI = {};
10918 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10919 buffCI.size = 1024;
10920 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
10921 buffCI.queueFamilyIndexCount = 1;
10922 // Introduce failure by specifying invalid queue_family_index
10923 uint32_t qfi = 777;
10924 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -060010925 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010926
10927 VkBuffer ib;
10928 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
10929
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010930 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060010931 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010932}
10933
Karl Schultz6addd812016-02-02 17:17:23 -070010934TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Tobin Ehlis0c94db02016-07-19 10:49:32 -060010935 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands w/ a primary cmd buffer"
10936 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010937
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010939
10940 ASSERT_NO_FATAL_FAILURE(InitState());
10941 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010942
10943 BeginCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -060010944
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010945 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
10946 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010947
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010948 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010949}
10950
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010951TEST_F(VkLayerTest, DSUsageBitsErrors) {
10952 TEST_DESCRIPTION("Attempt to update descriptor sets for images and buffers "
10953 "that do not have correct usage bits sets.");
10954 VkResult err;
10955
10956 ASSERT_NO_FATAL_FAILURE(InitState());
10957 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
10958 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10959 ds_type_count[i].type = VkDescriptorType(i);
10960 ds_type_count[i].descriptorCount = 1;
10961 }
10962 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10963 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10964 ds_pool_ci.pNext = NULL;
10965 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10966 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10967 ds_pool_ci.pPoolSizes = ds_type_count;
10968
10969 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010970 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010971 ASSERT_VK_SUCCESS(err);
10972
10973 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010974 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010975 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10976 dsl_binding[i].binding = 0;
10977 dsl_binding[i].descriptorType = VkDescriptorType(i);
10978 dsl_binding[i].descriptorCount = 1;
10979 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
10980 dsl_binding[i].pImmutableSamplers = NULL;
10981 }
10982
10983 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10984 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10985 ds_layout_ci.pNext = NULL;
10986 ds_layout_ci.bindingCount = 1;
10987 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
10988 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10989 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010990 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010991 ASSERT_VK_SUCCESS(err);
10992 }
10993 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
10994 VkDescriptorSetAllocateInfo alloc_info = {};
10995 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10996 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10997 alloc_info.descriptorPool = ds_pool;
10998 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010999 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060011000 ASSERT_VK_SUCCESS(err);
11001
11002 // Create a buffer & bufferView to be used for invalid updates
11003 VkBufferCreateInfo buff_ci = {};
11004 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
11005 // This usage is not valid for any descriptor type
11006 buff_ci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
11007 buff_ci.size = 256;
11008 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
11009 VkBuffer buffer;
11010 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
11011 ASSERT_VK_SUCCESS(err);
11012
11013 VkBufferViewCreateInfo buff_view_ci = {};
11014 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
11015 buff_view_ci.buffer = buffer;
11016 buff_view_ci.format = VK_FORMAT_R8_UNORM;
11017 buff_view_ci.range = VK_WHOLE_SIZE;
11018 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011019 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060011020 ASSERT_VK_SUCCESS(err);
11021
11022 // Create an image to be used for invalid updates
11023 VkImageCreateInfo image_ci = {};
11024 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11025 image_ci.imageType = VK_IMAGE_TYPE_2D;
11026 image_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
11027 image_ci.extent.width = 64;
11028 image_ci.extent.height = 64;
11029 image_ci.extent.depth = 1;
11030 image_ci.mipLevels = 1;
11031 image_ci.arrayLayers = 1;
11032 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
11033 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
11034 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
11035 // This usage is not valid for any descriptor type
11036 image_ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
11037 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
11038 VkImage image;
11039 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
11040 ASSERT_VK_SUCCESS(err);
11041 // Bind memory to image
11042 VkMemoryRequirements mem_reqs;
11043 VkDeviceMemory image_mem;
11044 bool pass;
11045 VkMemoryAllocateInfo mem_alloc = {};
11046 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11047 mem_alloc.pNext = NULL;
11048 mem_alloc.allocationSize = 0;
11049 mem_alloc.memoryTypeIndex = 0;
11050 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
11051 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011052 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060011053 ASSERT_TRUE(pass);
11054 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
11055 ASSERT_VK_SUCCESS(err);
11056 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
11057 ASSERT_VK_SUCCESS(err);
11058 // Now create view for image
11059 VkImageViewCreateInfo image_view_ci = {};
11060 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
11061 image_view_ci.image = image;
11062 image_view_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
11063 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
11064 image_view_ci.subresourceRange.layerCount = 1;
11065 image_view_ci.subresourceRange.baseArrayLayer = 0;
11066 image_view_ci.subresourceRange.levelCount = 1;
11067 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11068 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011069 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060011070 ASSERT_VK_SUCCESS(err);
11071
11072 VkDescriptorBufferInfo buff_info = {};
11073 buff_info.buffer = buffer;
11074 VkDescriptorImageInfo img_info = {};
11075 img_info.imageView = image_view;
11076 VkWriteDescriptorSet descriptor_write = {};
11077 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11078 descriptor_write.dstBinding = 0;
11079 descriptor_write.descriptorCount = 1;
11080 descriptor_write.pTexelBufferView = &buff_view;
11081 descriptor_write.pBufferInfo = &buff_info;
11082 descriptor_write.pImageInfo = &img_info;
11083
11084 // These error messages align with VkDescriptorType struct
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011085 const char *error_msgs[] = {"", // placeholder, no error for SAMPLER descriptor
11086 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
11087 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
11088 " does not have VK_IMAGE_USAGE_STORAGE_BIT set.",
11089 " does not have VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT set.",
11090 " does not have VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set.",
11091 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
11092 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
11093 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
11094 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
11095 " does not have VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set."};
Tobin Ehlis17826bd2016-05-25 11:12:50 -060011096 // Start loop at 1 as SAMPLER desc type has no usage bit error
11097 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
11098 descriptor_write.descriptorType = VkDescriptorType(i);
11099 descriptor_write.dstSet = descriptor_sets[i];
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011100 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msgs[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060011101
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011102 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060011103
11104 m_errorMonitor->VerifyFound();
11105 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
11106 }
11107 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
11108 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060011109 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060011110 vkDestroyImageView(m_device->device(), image_view, NULL);
11111 vkDestroyBuffer(m_device->device(), buffer, NULL);
11112 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011113 vkFreeDescriptorSets(m_device->device(), ds_pool, VK_DESCRIPTOR_TYPE_RANGE_SIZE, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060011114 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11115}
11116
Tobin Ehlis585f66d2016-07-01 18:23:58 -060011117TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011118 TEST_DESCRIPTION("Attempt to update buffer descriptor set that has incorrect "
11119 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
11120 "1. offset value greater than buffer size\n"
11121 "2. range value of 0\n"
11122 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -060011123 VkResult err;
11124
11125 ASSERT_NO_FATAL_FAILURE(InitState());
11126 VkDescriptorPoolSize ds_type_count = {};
11127 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11128 ds_type_count.descriptorCount = 1;
11129
11130 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11131 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11132 ds_pool_ci.pNext = NULL;
11133 ds_pool_ci.maxSets = 1;
11134 ds_pool_ci.poolSizeCount = 1;
11135 ds_pool_ci.pPoolSizes = &ds_type_count;
11136
11137 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011138 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060011139 ASSERT_VK_SUCCESS(err);
11140
11141 // Create layout with single uniform buffer descriptor
11142 VkDescriptorSetLayoutBinding dsl_binding = {};
11143 dsl_binding.binding = 0;
11144 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11145 dsl_binding.descriptorCount = 1;
11146 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11147 dsl_binding.pImmutableSamplers = NULL;
11148
11149 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11150 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11151 ds_layout_ci.pNext = NULL;
11152 ds_layout_ci.bindingCount = 1;
11153 ds_layout_ci.pBindings = &dsl_binding;
11154 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011155 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060011156 ASSERT_VK_SUCCESS(err);
11157
11158 VkDescriptorSet descriptor_set = {};
11159 VkDescriptorSetAllocateInfo alloc_info = {};
11160 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11161 alloc_info.descriptorSetCount = 1;
11162 alloc_info.descriptorPool = ds_pool;
11163 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011164 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060011165 ASSERT_VK_SUCCESS(err);
11166
11167 // Create a buffer to be used for invalid updates
11168 VkBufferCreateInfo buff_ci = {};
11169 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
11170 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
11171 buff_ci.size = 256;
11172 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
11173 VkBuffer buffer;
11174 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
11175 ASSERT_VK_SUCCESS(err);
11176 // Have to bind memory to buffer before descriptor update
11177 VkMemoryAllocateInfo mem_alloc = {};
11178 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11179 mem_alloc.pNext = NULL;
11180 mem_alloc.allocationSize = 256;
11181 mem_alloc.memoryTypeIndex = 0;
11182
11183 VkMemoryRequirements mem_reqs;
11184 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011185 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060011186 if (!pass) {
11187 vkDestroyBuffer(m_device->device(), buffer, NULL);
11188 return;
11189 }
11190
11191 VkDeviceMemory mem;
11192 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
11193 ASSERT_VK_SUCCESS(err);
11194 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
11195 ASSERT_VK_SUCCESS(err);
11196
11197 VkDescriptorBufferInfo buff_info = {};
11198 buff_info.buffer = buffer;
11199 // First make offset 1 larger than buffer size
11200 buff_info.offset = 257;
11201 buff_info.range = VK_WHOLE_SIZE;
11202 VkWriteDescriptorSet descriptor_write = {};
11203 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11204 descriptor_write.dstBinding = 0;
11205 descriptor_write.descriptorCount = 1;
11206 descriptor_write.pTexelBufferView = nullptr;
11207 descriptor_write.pBufferInfo = &buff_info;
11208 descriptor_write.pImageInfo = nullptr;
11209
11210 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11211 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011212 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " offset of 257 is greater than buffer ");
Tobin Ehlis585f66d2016-07-01 18:23:58 -060011213
11214 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11215
11216 m_errorMonitor->VerifyFound();
11217 // Now cause error due to range of 0
11218 buff_info.offset = 0;
11219 buff_info.range = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011220 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11221 " range is not VK_WHOLE_SIZE and is zero, which is not allowed.");
Tobin Ehlis585f66d2016-07-01 18:23:58 -060011222
11223 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11224
11225 m_errorMonitor->VerifyFound();
11226 // Now cause error due to range exceeding buffer size - offset
11227 buff_info.offset = 128;
11228 buff_info.range = 200;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011229 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 -060011230
11231 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11232
11233 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -060011234 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060011235 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11236 vkDestroyBuffer(m_device->device(), buffer, NULL);
11237 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
11238 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11239}
11240
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060011241TEST_F(VkLayerTest, DSAspectBitsErrors) {
11242 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
11243 // are set, but could expand this test to hit more cases.
11244 TEST_DESCRIPTION("Attempt to update descriptor sets for images "
11245 "that do not have correct aspect bits sets.");
11246 VkResult err;
11247
11248 ASSERT_NO_FATAL_FAILURE(InitState());
11249 VkDescriptorPoolSize ds_type_count = {};
11250 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
11251 ds_type_count.descriptorCount = 1;
11252
11253 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11254 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11255 ds_pool_ci.pNext = NULL;
11256 ds_pool_ci.maxSets = 5;
11257 ds_pool_ci.poolSizeCount = 1;
11258 ds_pool_ci.pPoolSizes = &ds_type_count;
11259
11260 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011261 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060011262 ASSERT_VK_SUCCESS(err);
11263
11264 VkDescriptorSetLayoutBinding dsl_binding = {};
11265 dsl_binding.binding = 0;
11266 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
11267 dsl_binding.descriptorCount = 1;
11268 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11269 dsl_binding.pImmutableSamplers = NULL;
11270
11271 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11272 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11273 ds_layout_ci.pNext = NULL;
11274 ds_layout_ci.bindingCount = 1;
11275 ds_layout_ci.pBindings = &dsl_binding;
11276 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011277 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060011278 ASSERT_VK_SUCCESS(err);
11279
11280 VkDescriptorSet descriptor_set = {};
11281 VkDescriptorSetAllocateInfo alloc_info = {};
11282 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11283 alloc_info.descriptorSetCount = 1;
11284 alloc_info.descriptorPool = ds_pool;
11285 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011286 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060011287 ASSERT_VK_SUCCESS(err);
11288
11289 // Create an image to be used for invalid updates
11290 VkImageCreateInfo image_ci = {};
11291 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11292 image_ci.imageType = VK_IMAGE_TYPE_2D;
11293 image_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
11294 image_ci.extent.width = 64;
11295 image_ci.extent.height = 64;
11296 image_ci.extent.depth = 1;
11297 image_ci.mipLevels = 1;
11298 image_ci.arrayLayers = 1;
11299 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
11300 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
11301 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
11302 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
11303 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
11304 VkImage image;
11305 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
11306 ASSERT_VK_SUCCESS(err);
11307 // Bind memory to image
11308 VkMemoryRequirements mem_reqs;
11309 VkDeviceMemory image_mem;
11310 bool pass;
11311 VkMemoryAllocateInfo mem_alloc = {};
11312 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11313 mem_alloc.pNext = NULL;
11314 mem_alloc.allocationSize = 0;
11315 mem_alloc.memoryTypeIndex = 0;
11316 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
11317 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011318 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060011319 ASSERT_TRUE(pass);
11320 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
11321 ASSERT_VK_SUCCESS(err);
11322 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
11323 ASSERT_VK_SUCCESS(err);
11324 // Now create view for image
11325 VkImageViewCreateInfo image_view_ci = {};
11326 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
11327 image_view_ci.image = image;
11328 image_view_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
11329 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
11330 image_view_ci.subresourceRange.layerCount = 1;
11331 image_view_ci.subresourceRange.baseArrayLayer = 0;
11332 image_view_ci.subresourceRange.levelCount = 1;
11333 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011334 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060011335
11336 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011337 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060011338 ASSERT_VK_SUCCESS(err);
11339
11340 VkDescriptorImageInfo img_info = {};
11341 img_info.imageView = image_view;
11342 VkWriteDescriptorSet descriptor_write = {};
11343 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11344 descriptor_write.dstBinding = 0;
11345 descriptor_write.descriptorCount = 1;
11346 descriptor_write.pTexelBufferView = NULL;
11347 descriptor_write.pBufferInfo = NULL;
11348 descriptor_write.pImageInfo = &img_info;
11349 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
11350 descriptor_write.dstSet = descriptor_set;
11351 const char *error_msg = " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
11352 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060011354
11355 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11356
11357 m_errorMonitor->VerifyFound();
11358 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11359 vkDestroyImage(m_device->device(), image, NULL);
11360 vkFreeMemory(m_device->device(), image_mem, NULL);
11361 vkDestroyImageView(m_device->device(), image_view, NULL);
11362 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
11363 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11364}
11365
Karl Schultz6addd812016-02-02 17:17:23 -070011366TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011367 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070011368 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011369
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011370 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11371 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
11372 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011373
Tobin Ehlis3b780662015-05-28 12:11:26 -060011374 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011375 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011376 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011377 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11378 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011379
11380 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011381 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11382 ds_pool_ci.pNext = NULL;
11383 ds_pool_ci.maxSets = 1;
11384 ds_pool_ci.poolSizeCount = 1;
11385 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011386
Tobin Ehlis3b780662015-05-28 12:11:26 -060011387 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011388 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011389 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060011390 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011391 dsl_binding.binding = 0;
11392 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11393 dsl_binding.descriptorCount = 1;
11394 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11395 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011396
Tony Barboureb254902015-07-15 12:50:33 -060011397 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011398 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11399 ds_layout_ci.pNext = NULL;
11400 ds_layout_ci.bindingCount = 1;
11401 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011402
Tobin Ehlis3b780662015-05-28 12:11:26 -060011403 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011404 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011405 ASSERT_VK_SUCCESS(err);
11406
11407 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011408 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011409 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011410 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011411 alloc_info.descriptorPool = ds_pool;
11412 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011413 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011414 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011415
Tobin Ehlis30db8f82016-05-05 08:19:48 -060011416 VkSamplerCreateInfo sampler_ci = {};
11417 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11418 sampler_ci.pNext = NULL;
11419 sampler_ci.magFilter = VK_FILTER_NEAREST;
11420 sampler_ci.minFilter = VK_FILTER_NEAREST;
11421 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11422 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11423 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11424 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11425 sampler_ci.mipLodBias = 1.0;
11426 sampler_ci.anisotropyEnable = VK_FALSE;
11427 sampler_ci.maxAnisotropy = 1;
11428 sampler_ci.compareEnable = VK_FALSE;
11429 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11430 sampler_ci.minLod = 1.0;
11431 sampler_ci.maxLod = 1.0;
11432 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11433 sampler_ci.unnormalizedCoordinates = VK_FALSE;
11434 VkSampler sampler;
11435 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
11436 ASSERT_VK_SUCCESS(err);
11437
11438 VkDescriptorImageInfo info = {};
11439 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011440
11441 VkWriteDescriptorSet descriptor_write;
11442 memset(&descriptor_write, 0, sizeof(descriptor_write));
11443 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011444 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011445 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011446 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011447 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011448 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011449
11450 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11451
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011452 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011453
Chia-I Wuf7458c52015-10-26 21:10:41 +080011454 vkDestroySampler(m_device->device(), sampler, NULL);
11455 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11456 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011457}
11458
Karl Schultz6addd812016-02-02 17:17:23 -070011459TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011460 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070011461 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011462
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011463 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11464 " binding #0 with 1 total descriptors but update of 1 descriptors "
11465 "starting at binding offset of 0 combined with update array element "
11466 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011467
Tobin Ehlis3b780662015-05-28 12:11:26 -060011468 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011469 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011470 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011471 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11472 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011473
11474 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011475 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11476 ds_pool_ci.pNext = NULL;
11477 ds_pool_ci.maxSets = 1;
11478 ds_pool_ci.poolSizeCount = 1;
11479 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011480
Tobin Ehlis3b780662015-05-28 12:11:26 -060011481 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011482 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011483 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011484
Tony Barboureb254902015-07-15 12:50:33 -060011485 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011486 dsl_binding.binding = 0;
11487 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11488 dsl_binding.descriptorCount = 1;
11489 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11490 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060011491
11492 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011493 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11494 ds_layout_ci.pNext = NULL;
11495 ds_layout_ci.bindingCount = 1;
11496 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011497
Tobin Ehlis3b780662015-05-28 12:11:26 -060011498 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011499 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011500 ASSERT_VK_SUCCESS(err);
11501
11502 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011503 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011504 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011505 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011506 alloc_info.descriptorPool = ds_pool;
11507 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011508 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011509 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011510
Tobin Ehlis30db8f82016-05-05 08:19:48 -060011511 // Correctly update descriptor to avoid "NOT_UPDATED" error
11512 VkDescriptorBufferInfo buff_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011513 buff_info.buffer = VkBuffer(0); // Don't care about buffer handle for this test
Tobin Ehlis30db8f82016-05-05 08:19:48 -060011514 buff_info.offset = 0;
11515 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011516
11517 VkWriteDescriptorSet descriptor_write;
11518 memset(&descriptor_write, 0, sizeof(descriptor_write));
11519 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011520 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011521 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080011522 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011523 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11524 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011525
11526 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11527
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011528 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011529
Chia-I Wuf7458c52015-10-26 21:10:41 +080011530 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11531 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011532}
11533
Karl Schultz6addd812016-02-02 17:17:23 -070011534TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
11535 // Create layout w/ count of 1 and attempt update to that layout w/ binding
11536 // index 2
11537 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011538
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011539 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011540
Tobin Ehlis3b780662015-05-28 12:11:26 -060011541 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011542 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011543 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011544 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11545 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011546
11547 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011548 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11549 ds_pool_ci.pNext = NULL;
11550 ds_pool_ci.maxSets = 1;
11551 ds_pool_ci.poolSizeCount = 1;
11552 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011553
Tobin Ehlis3b780662015-05-28 12:11:26 -060011554 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011555 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011556 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011557
Tony Barboureb254902015-07-15 12:50:33 -060011558 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011559 dsl_binding.binding = 0;
11560 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11561 dsl_binding.descriptorCount = 1;
11562 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11563 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060011564
11565 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011566 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11567 ds_layout_ci.pNext = NULL;
11568 ds_layout_ci.bindingCount = 1;
11569 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011570 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011571 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011572 ASSERT_VK_SUCCESS(err);
11573
11574 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011575 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011576 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011577 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011578 alloc_info.descriptorPool = ds_pool;
11579 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011580 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011581 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011582
Tony Barboureb254902015-07-15 12:50:33 -060011583 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011584 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11585 sampler_ci.pNext = NULL;
11586 sampler_ci.magFilter = VK_FILTER_NEAREST;
11587 sampler_ci.minFilter = VK_FILTER_NEAREST;
11588 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11589 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11590 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11591 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11592 sampler_ci.mipLodBias = 1.0;
11593 sampler_ci.anisotropyEnable = VK_FALSE;
11594 sampler_ci.maxAnisotropy = 1;
11595 sampler_ci.compareEnable = VK_FALSE;
11596 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11597 sampler_ci.minLod = 1.0;
11598 sampler_ci.maxLod = 1.0;
11599 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11600 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060011601
Tobin Ehlis3b780662015-05-28 12:11:26 -060011602 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011603 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011604 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011605
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011606 VkDescriptorImageInfo info = {};
11607 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011608
11609 VkWriteDescriptorSet descriptor_write;
11610 memset(&descriptor_write, 0, sizeof(descriptor_write));
11611 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011612 descriptor_write.dstSet = descriptorSet;
11613 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011614 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011615 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011616 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011617 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011618
11619 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11620
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011621 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011622
Chia-I Wuf7458c52015-10-26 21:10:41 +080011623 vkDestroySampler(m_device->device(), sampler, NULL);
11624 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11625 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011626}
11627
Karl Schultz6addd812016-02-02 17:17:23 -070011628TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
11629 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
11630 // types
11631 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011632
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011633 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 -060011634
Tobin Ehlis3b780662015-05-28 12:11:26 -060011635 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011636
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011637 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011638 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11639 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011640
11641 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011642 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11643 ds_pool_ci.pNext = NULL;
11644 ds_pool_ci.maxSets = 1;
11645 ds_pool_ci.poolSizeCount = 1;
11646 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011647
Tobin Ehlis3b780662015-05-28 12:11:26 -060011648 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011649 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011650 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060011651 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011652 dsl_binding.binding = 0;
11653 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11654 dsl_binding.descriptorCount = 1;
11655 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11656 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011657
Tony Barboureb254902015-07-15 12:50:33 -060011658 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011659 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11660 ds_layout_ci.pNext = NULL;
11661 ds_layout_ci.bindingCount = 1;
11662 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011663
Tobin Ehlis3b780662015-05-28 12:11:26 -060011664 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011665 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011666 ASSERT_VK_SUCCESS(err);
11667
11668 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011669 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011670 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011671 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011672 alloc_info.descriptorPool = ds_pool;
11673 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011674 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011675 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011676
Tony Barboureb254902015-07-15 12:50:33 -060011677 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011678 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11679 sampler_ci.pNext = NULL;
11680 sampler_ci.magFilter = VK_FILTER_NEAREST;
11681 sampler_ci.minFilter = VK_FILTER_NEAREST;
11682 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11683 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11684 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11685 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11686 sampler_ci.mipLodBias = 1.0;
11687 sampler_ci.anisotropyEnable = VK_FALSE;
11688 sampler_ci.maxAnisotropy = 1;
11689 sampler_ci.compareEnable = VK_FALSE;
11690 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11691 sampler_ci.minLod = 1.0;
11692 sampler_ci.maxLod = 1.0;
11693 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11694 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011695 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011696 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011697 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011698
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011699 VkDescriptorImageInfo info = {};
11700 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011701
11702 VkWriteDescriptorSet descriptor_write;
11703 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011704 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011705 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011706 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011707 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011708 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011709 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011710
11711 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11712
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011713 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011714
Chia-I Wuf7458c52015-10-26 21:10:41 +080011715 vkDestroySampler(m_device->device(), sampler, NULL);
11716 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11717 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011718}
11719
Karl Schultz6addd812016-02-02 17:17:23 -070011720TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011721 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070011722 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011723
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011724 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11725 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011726
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011727 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011728 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
11729 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011730 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011731 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
11732 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011733
11734 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011735 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11736 ds_pool_ci.pNext = NULL;
11737 ds_pool_ci.maxSets = 1;
11738 ds_pool_ci.poolSizeCount = 1;
11739 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011740
11741 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011742 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011743 ASSERT_VK_SUCCESS(err);
11744
11745 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011746 dsl_binding.binding = 0;
11747 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11748 dsl_binding.descriptorCount = 1;
11749 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11750 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011751
11752 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011753 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11754 ds_layout_ci.pNext = NULL;
11755 ds_layout_ci.bindingCount = 1;
11756 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011757 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011758 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011759 ASSERT_VK_SUCCESS(err);
11760
11761 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011762 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011763 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011764 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011765 alloc_info.descriptorPool = ds_pool;
11766 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011767 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011768 ASSERT_VK_SUCCESS(err);
11769
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011770 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011771
11772 VkDescriptorImageInfo descriptor_info;
11773 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
11774 descriptor_info.sampler = sampler;
11775
11776 VkWriteDescriptorSet descriptor_write;
11777 memset(&descriptor_write, 0, sizeof(descriptor_write));
11778 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011779 descriptor_write.dstSet = descriptorSet;
11780 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011781 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011782 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11783 descriptor_write.pImageInfo = &descriptor_info;
11784
11785 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11786
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011787 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011788
Chia-I Wuf7458c52015-10-26 21:10:41 +080011789 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11790 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011791}
11792
Karl Schultz6addd812016-02-02 17:17:23 -070011793TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
11794 // Create a single combined Image/Sampler descriptor and send it an invalid
11795 // imageView
11796 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011797
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011798 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to combined "
11799 "image sampler descriptor failed due "
11800 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011801
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011802 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011803 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011804 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11805 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011806
11807 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011808 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11809 ds_pool_ci.pNext = NULL;
11810 ds_pool_ci.maxSets = 1;
11811 ds_pool_ci.poolSizeCount = 1;
11812 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011813
11814 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011815 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011816 ASSERT_VK_SUCCESS(err);
11817
11818 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011819 dsl_binding.binding = 0;
11820 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11821 dsl_binding.descriptorCount = 1;
11822 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11823 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011824
11825 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011826 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11827 ds_layout_ci.pNext = NULL;
11828 ds_layout_ci.bindingCount = 1;
11829 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011830 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011831 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011832 ASSERT_VK_SUCCESS(err);
11833
11834 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011835 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011836 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011837 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011838 alloc_info.descriptorPool = ds_pool;
11839 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011840 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011841 ASSERT_VK_SUCCESS(err);
11842
11843 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011844 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11845 sampler_ci.pNext = NULL;
11846 sampler_ci.magFilter = VK_FILTER_NEAREST;
11847 sampler_ci.minFilter = VK_FILTER_NEAREST;
11848 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11849 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11850 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11851 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11852 sampler_ci.mipLodBias = 1.0;
11853 sampler_ci.anisotropyEnable = VK_FALSE;
11854 sampler_ci.maxAnisotropy = 1;
11855 sampler_ci.compareEnable = VK_FALSE;
11856 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11857 sampler_ci.minLod = 1.0;
11858 sampler_ci.maxLod = 1.0;
11859 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11860 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011861
11862 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011863 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011864 ASSERT_VK_SUCCESS(err);
11865
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011866 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011867
11868 VkDescriptorImageInfo descriptor_info;
11869 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
11870 descriptor_info.sampler = sampler;
11871 descriptor_info.imageView = view;
11872
11873 VkWriteDescriptorSet descriptor_write;
11874 memset(&descriptor_write, 0, sizeof(descriptor_write));
11875 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011876 descriptor_write.dstSet = descriptorSet;
11877 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011878 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011879 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11880 descriptor_write.pImageInfo = &descriptor_info;
11881
11882 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11883
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011884 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011885
Chia-I Wuf7458c52015-10-26 21:10:41 +080011886 vkDestroySampler(m_device->device(), sampler, NULL);
11887 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11888 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011889}
11890
Karl Schultz6addd812016-02-02 17:17:23 -070011891TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
11892 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
11893 // into the other
11894 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011895
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011896 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding #1 with type "
11897 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
11898 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011899
Tobin Ehlis04356f92015-10-27 16:35:27 -060011900 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070011901 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011902 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011903 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11904 ds_type_count[0].descriptorCount = 1;
11905 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
11906 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011907
11908 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011909 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11910 ds_pool_ci.pNext = NULL;
11911 ds_pool_ci.maxSets = 1;
11912 ds_pool_ci.poolSizeCount = 2;
11913 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011914
11915 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011916 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011917 ASSERT_VK_SUCCESS(err);
11918 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011919 dsl_binding[0].binding = 0;
11920 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11921 dsl_binding[0].descriptorCount = 1;
11922 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
11923 dsl_binding[0].pImmutableSamplers = NULL;
11924 dsl_binding[1].binding = 1;
11925 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11926 dsl_binding[1].descriptorCount = 1;
11927 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
11928 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011929
11930 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011931 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11932 ds_layout_ci.pNext = NULL;
11933 ds_layout_ci.bindingCount = 2;
11934 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011935
11936 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011937 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011938 ASSERT_VK_SUCCESS(err);
11939
11940 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011941 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011942 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011943 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011944 alloc_info.descriptorPool = ds_pool;
11945 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011946 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011947 ASSERT_VK_SUCCESS(err);
11948
11949 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011950 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11951 sampler_ci.pNext = NULL;
11952 sampler_ci.magFilter = VK_FILTER_NEAREST;
11953 sampler_ci.minFilter = VK_FILTER_NEAREST;
11954 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11955 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11956 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11957 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11958 sampler_ci.mipLodBias = 1.0;
11959 sampler_ci.anisotropyEnable = VK_FALSE;
11960 sampler_ci.maxAnisotropy = 1;
11961 sampler_ci.compareEnable = VK_FALSE;
11962 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11963 sampler_ci.minLod = 1.0;
11964 sampler_ci.maxLod = 1.0;
11965 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11966 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011967
11968 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011969 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011970 ASSERT_VK_SUCCESS(err);
11971
11972 VkDescriptorImageInfo info = {};
11973 info.sampler = sampler;
11974
11975 VkWriteDescriptorSet descriptor_write;
11976 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
11977 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011978 descriptor_write.dstSet = descriptorSet;
11979 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080011980 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011981 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11982 descriptor_write.pImageInfo = &info;
11983 // This write update should succeed
11984 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11985 // Now perform a copy update that fails due to type mismatch
11986 VkCopyDescriptorSet copy_ds_update;
11987 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11988 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11989 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -060011990 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011991 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070011992 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +080011993 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011994 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11995
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011996 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011997 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011998 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 -060011999 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
12000 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
12001 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012002 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012003 copy_ds_update.dstSet = descriptorSet;
12004 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -060012005 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060012006 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
12007
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012008 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012009
Tobin Ehlis04356f92015-10-27 16:35:27 -060012010 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
12012 "update array offset of 0 and update of "
12013 "5 descriptors oversteps total number "
12014 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012015
Tobin Ehlis04356f92015-10-27 16:35:27 -060012016 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
12017 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
12018 copy_ds_update.srcSet = descriptorSet;
12019 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012020 copy_ds_update.dstSet = descriptorSet;
12021 copy_ds_update.dstBinding = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012022 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060012023 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
12024
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012025 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060012026
Chia-I Wuf7458c52015-10-26 21:10:41 +080012027 vkDestroySampler(m_device->device(), sampler, NULL);
12028 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12029 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060012030}
12031
Karl Schultz6addd812016-02-02 17:17:23 -070012032TEST_F(VkLayerTest, NumSamplesMismatch) {
12033 // Create CommandBuffer where MSAA samples doesn't match RenderPass
12034 // sampleCount
12035 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060012036
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012037 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012038
Tobin Ehlis3b780662015-05-28 12:11:26 -060012039 ASSERT_NO_FATAL_FAILURE(InitState());
12040 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080012041 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060012042 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080012043 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060012044
12045 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012046 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12047 ds_pool_ci.pNext = NULL;
12048 ds_pool_ci.maxSets = 1;
12049 ds_pool_ci.poolSizeCount = 1;
12050 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060012051
Tobin Ehlis3b780662015-05-28 12:11:26 -060012052 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012053 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060012054 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060012055
Tony Barboureb254902015-07-15 12:50:33 -060012056 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080012057 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060012058 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080012059 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060012060 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
12061 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060012062
Tony Barboureb254902015-07-15 12:50:33 -060012063 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12064 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12065 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080012066 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070012067 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060012068
Tobin Ehlis3b780662015-05-28 12:11:26 -060012069 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012070 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060012071 ASSERT_VK_SUCCESS(err);
12072
12073 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012074 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080012075 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070012076 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060012077 alloc_info.descriptorPool = ds_pool;
12078 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012079 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060012080 ASSERT_VK_SUCCESS(err);
12081
Tony Barboureb254902015-07-15 12:50:33 -060012082 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012083 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070012084 pipe_ms_state_ci.pNext = NULL;
12085 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
12086 pipe_ms_state_ci.sampleShadingEnable = 0;
12087 pipe_ms_state_ci.minSampleShading = 1.0;
12088 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060012089
Tony Barboureb254902015-07-15 12:50:33 -060012090 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012091 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12092 pipeline_layout_ci.pNext = NULL;
12093 pipeline_layout_ci.setLayoutCount = 1;
12094 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060012095
12096 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012097 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060012098 ASSERT_VK_SUCCESS(err);
12099
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012100 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12101 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
12102 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012103 VkPipelineObj pipe(m_device);
12104 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060012105 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060012106 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012107 pipe.SetMSAA(&pipe_ms_state_ci);
12108 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060012109
Tony Barbourfe3351b2015-07-28 10:17:20 -060012110 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012111 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060012112
Mark Young29927482016-05-04 14:38:51 -060012113 // Render triangle (the error should trigger on the attempt to draw).
12114 Draw(3, 1, 0, 0);
12115
12116 // Finalize recording of the command buffer
12117 EndCommandBuffer();
12118
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012119 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060012120
Chia-I Wuf7458c52015-10-26 21:10:41 +080012121 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12122 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12123 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060012124}
Mark Young29927482016-05-04 14:38:51 -060012125
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060012126TEST_F(VkLayerTest, RenderPassIncompatible) {
12127 TEST_DESCRIPTION("Hit RenderPass incompatible cases. "
12128 "Initial case is drawing with an active renderpass that's "
12129 "not compatible with the bound PSO's creation renderpass");
12130 VkResult err;
12131
12132 ASSERT_NO_FATAL_FAILURE(InitState());
12133 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12134
12135 VkDescriptorSetLayoutBinding dsl_binding = {};
12136 dsl_binding.binding = 0;
12137 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12138 dsl_binding.descriptorCount = 1;
12139 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
12140 dsl_binding.pImmutableSamplers = NULL;
12141
12142 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12143 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12144 ds_layout_ci.pNext = NULL;
12145 ds_layout_ci.bindingCount = 1;
12146 ds_layout_ci.pBindings = &dsl_binding;
12147
12148 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012149 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060012150 ASSERT_VK_SUCCESS(err);
12151
12152 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12153 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12154 pipeline_layout_ci.pNext = NULL;
12155 pipeline_layout_ci.setLayoutCount = 1;
12156 pipeline_layout_ci.pSetLayouts = &ds_layout;
12157
12158 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012159 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060012160 ASSERT_VK_SUCCESS(err);
12161
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012162 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12163 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
12164 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060012165 // Create a renderpass that will be incompatible with default renderpass
12166 VkAttachmentReference attach = {};
12167 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12168 VkAttachmentReference color_att = {};
12169 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12170 VkSubpassDescription subpass = {};
12171 subpass.inputAttachmentCount = 1;
12172 subpass.pInputAttachments = &attach;
12173 subpass.colorAttachmentCount = 1;
12174 subpass.pColorAttachments = &color_att;
12175 VkRenderPassCreateInfo rpci = {};
12176 rpci.subpassCount = 1;
12177 rpci.pSubpasses = &subpass;
12178 rpci.attachmentCount = 1;
12179 VkAttachmentDescription attach_desc = {};
12180 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060012181 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
12182 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060012183 rpci.pAttachments = &attach_desc;
12184 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
12185 VkRenderPass rp;
12186 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12187 VkPipelineObj pipe(m_device);
12188 pipe.AddShader(&vs);
12189 pipe.AddShader(&fs);
12190 pipe.AddColorAttachment();
12191 VkViewport view_port = {};
12192 m_viewports.push_back(view_port);
12193 pipe.SetViewport(m_viewports);
12194 VkRect2D rect = {};
12195 m_scissors.push_back(rect);
12196 pipe.SetScissor(m_scissors);
12197 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12198
12199 VkCommandBufferInheritanceInfo cbii = {};
12200 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
12201 cbii.renderPass = rp;
12202 cbii.subpass = 0;
12203 VkCommandBufferBeginInfo cbbi = {};
12204 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12205 cbbi.pInheritanceInfo = &cbii;
12206 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
12207 VkRenderPassBeginInfo rpbi = {};
12208 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
12209 rpbi.framebuffer = m_framebuffer;
12210 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012211 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
12212 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060012213
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012214 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060012215 // Render triangle (the error should trigger on the attempt to draw).
12216 Draw(3, 1, 0, 0);
12217
12218 // Finalize recording of the command buffer
12219 EndCommandBuffer();
12220
12221 m_errorMonitor->VerifyFound();
12222
12223 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12224 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12225 vkDestroyRenderPass(m_device->device(), rp, NULL);
12226}
12227
Mark Youngc89c6312016-03-31 16:03:20 -060012228TEST_F(VkLayerTest, NumBlendAttachMismatch) {
12229 // Create Pipeline where the number of blend attachments doesn't match the
12230 // number of color attachments. In this case, we don't add any color
12231 // blend attachments even though we have a color attachment.
12232 VkResult err;
12233
12234 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012235 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -060012236
12237 ASSERT_NO_FATAL_FAILURE(InitState());
12238 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12239 VkDescriptorPoolSize ds_type_count = {};
12240 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12241 ds_type_count.descriptorCount = 1;
12242
12243 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12244 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12245 ds_pool_ci.pNext = NULL;
12246 ds_pool_ci.maxSets = 1;
12247 ds_pool_ci.poolSizeCount = 1;
12248 ds_pool_ci.pPoolSizes = &ds_type_count;
12249
12250 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012251 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060012252 ASSERT_VK_SUCCESS(err);
12253
12254 VkDescriptorSetLayoutBinding dsl_binding = {};
12255 dsl_binding.binding = 0;
12256 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12257 dsl_binding.descriptorCount = 1;
12258 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
12259 dsl_binding.pImmutableSamplers = NULL;
12260
12261 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12262 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12263 ds_layout_ci.pNext = NULL;
12264 ds_layout_ci.bindingCount = 1;
12265 ds_layout_ci.pBindings = &dsl_binding;
12266
12267 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012268 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060012269 ASSERT_VK_SUCCESS(err);
12270
12271 VkDescriptorSet descriptorSet;
12272 VkDescriptorSetAllocateInfo alloc_info = {};
12273 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12274 alloc_info.descriptorSetCount = 1;
12275 alloc_info.descriptorPool = ds_pool;
12276 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012277 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060012278 ASSERT_VK_SUCCESS(err);
12279
12280 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012281 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060012282 pipe_ms_state_ci.pNext = NULL;
12283 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12284 pipe_ms_state_ci.sampleShadingEnable = 0;
12285 pipe_ms_state_ci.minSampleShading = 1.0;
12286 pipe_ms_state_ci.pSampleMask = NULL;
12287
12288 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12289 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12290 pipeline_layout_ci.pNext = NULL;
12291 pipeline_layout_ci.setLayoutCount = 1;
12292 pipeline_layout_ci.pSetLayouts = &ds_layout;
12293
12294 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012295 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060012296 ASSERT_VK_SUCCESS(err);
12297
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012298 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12299 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
12300 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060012301 VkPipelineObj pipe(m_device);
12302 pipe.AddShader(&vs);
12303 pipe.AddShader(&fs);
12304 pipe.SetMSAA(&pipe_ms_state_ci);
12305 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12306
12307 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012308 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Youngc89c6312016-03-31 16:03:20 -060012309
Mark Young29927482016-05-04 14:38:51 -060012310 // Render triangle (the error should trigger on the attempt to draw).
12311 Draw(3, 1, 0, 0);
12312
12313 // Finalize recording of the command buffer
12314 EndCommandBuffer();
12315
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012316 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060012317
12318 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12319 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12320 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12321}
Mark Young29927482016-05-04 14:38:51 -060012322
Mark Muellerd4914412016-06-13 17:52:06 -060012323TEST_F(VkLayerTest, MissingClearAttachment) {
12324 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment "
12325 "structure passed to vkCmdClearAttachments");
Cody Northropc31a84f2016-08-22 10:41:47 -060012326 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesda6ae6f2016-09-09 14:36:33 +120012327 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesef5e2842016-09-08 15:25:24 +120012328 "vkCmdClearAttachments() color attachment index 1 out of range for active subpass 0; ignored");
Mark Muellerd4914412016-06-13 17:52:06 -060012329
12330 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
12331 m_errorMonitor->VerifyFound();
12332}
12333
Karl Schultz6addd812016-02-02 17:17:23 -070012334TEST_F(VkLayerTest, ClearCmdNoDraw) {
12335 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
12336 // to issuing a Draw
12337 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012338
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012339 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12340 "vkCmdClearAttachments() issued on CB object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012341
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012342 ASSERT_NO_FATAL_FAILURE(InitState());
12343 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060012344
Chia-I Wu1b99bb22015-10-27 19:25:11 +080012345 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012346 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12347 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060012348
12349 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012350 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12351 ds_pool_ci.pNext = NULL;
12352 ds_pool_ci.maxSets = 1;
12353 ds_pool_ci.poolSizeCount = 1;
12354 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060012355
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012356 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012357 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012358 ASSERT_VK_SUCCESS(err);
12359
Tony Barboureb254902015-07-15 12:50:33 -060012360 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012361 dsl_binding.binding = 0;
12362 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12363 dsl_binding.descriptorCount = 1;
12364 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
12365 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012366
Tony Barboureb254902015-07-15 12:50:33 -060012367 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012368 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12369 ds_layout_ci.pNext = NULL;
12370 ds_layout_ci.bindingCount = 1;
12371 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012372
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012373 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012374 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012375 ASSERT_VK_SUCCESS(err);
12376
12377 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012378 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080012379 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070012380 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060012381 alloc_info.descriptorPool = ds_pool;
12382 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012383 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012384 ASSERT_VK_SUCCESS(err);
12385
Tony Barboureb254902015-07-15 12:50:33 -060012386 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012387 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070012388 pipe_ms_state_ci.pNext = NULL;
12389 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
12390 pipe_ms_state_ci.sampleShadingEnable = 0;
12391 pipe_ms_state_ci.minSampleShading = 1.0;
12392 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012393
Tony Barboureb254902015-07-15 12:50:33 -060012394 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012395 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12396 pipeline_layout_ci.pNext = NULL;
12397 pipeline_layout_ci.setLayoutCount = 1;
12398 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012399
12400 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012401 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012402 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012403
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012404 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060012405 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070012406 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012407 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012408
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012409 VkPipelineObj pipe(m_device);
12410 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060012411 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012412 pipe.SetMSAA(&pipe_ms_state_ci);
12413 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060012414
12415 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012416
Karl Schultz6addd812016-02-02 17:17:23 -070012417 // Main thing we care about for this test is that the VkImage obj we're
12418 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012419 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060012420 VkClearAttachment color_attachment;
12421 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12422 color_attachment.clearValue.color.float32[0] = 1.0;
12423 color_attachment.clearValue.color.float32[1] = 1.0;
12424 color_attachment.clearValue.color.float32[2] = 1.0;
12425 color_attachment.clearValue.color.float32[3] = 1.0;
12426 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012427 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012428
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012429 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012430
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012431 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060012432
Chia-I Wuf7458c52015-10-26 21:10:41 +080012433 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12434 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12435 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060012436}
12437
Karl Schultz6addd812016-02-02 17:17:23 -070012438TEST_F(VkLayerTest, VtxBufferBadIndex) {
12439 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012440
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012441 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12442 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012443
Tobin Ehlis502480b2015-06-24 15:53:07 -060012444 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -060012445 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060012446 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060012447
Chia-I Wu1b99bb22015-10-27 19:25:11 +080012448 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012449 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12450 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060012451
12452 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012453 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12454 ds_pool_ci.pNext = NULL;
12455 ds_pool_ci.maxSets = 1;
12456 ds_pool_ci.poolSizeCount = 1;
12457 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060012458
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060012459 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012460 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012461 ASSERT_VK_SUCCESS(err);
12462
Tony Barboureb254902015-07-15 12:50:33 -060012463 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012464 dsl_binding.binding = 0;
12465 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12466 dsl_binding.descriptorCount = 1;
12467 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
12468 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012469
Tony Barboureb254902015-07-15 12:50:33 -060012470 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012471 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12472 ds_layout_ci.pNext = NULL;
12473 ds_layout_ci.bindingCount = 1;
12474 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060012475
Tobin Ehlis502480b2015-06-24 15:53:07 -060012476 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012477 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012478 ASSERT_VK_SUCCESS(err);
12479
12480 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012481 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080012482 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070012483 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060012484 alloc_info.descriptorPool = ds_pool;
12485 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012486 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012487 ASSERT_VK_SUCCESS(err);
12488
Tony Barboureb254902015-07-15 12:50:33 -060012489 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012490 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070012491 pipe_ms_state_ci.pNext = NULL;
12492 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12493 pipe_ms_state_ci.sampleShadingEnable = 0;
12494 pipe_ms_state_ci.minSampleShading = 1.0;
12495 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012496
Tony Barboureb254902015-07-15 12:50:33 -060012497 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012498 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12499 pipeline_layout_ci.pNext = NULL;
12500 pipeline_layout_ci.setLayoutCount = 1;
12501 pipeline_layout_ci.pSetLayouts = &ds_layout;
12502 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012503
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012504 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012505 ASSERT_VK_SUCCESS(err);
12506
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012507 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12508 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
12509 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012510 VkPipelineObj pipe(m_device);
12511 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060012512 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060012513 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012514 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060012515 pipe.SetViewport(m_viewports);
12516 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012517 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060012518
12519 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012520 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060012521 // Don't care about actual data, just need to get to draw to flag error
12522 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012523 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060012524 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060012525 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012526
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012527 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060012528
Chia-I Wuf7458c52015-10-26 21:10:41 +080012529 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12530 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12531 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012532}
Mark Muellerdfe37552016-07-07 14:47:42 -060012533
Mark Mueller2ee294f2016-08-04 12:59:48 -060012534TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
12535 TEST_DESCRIPTION("Use an invalid count in a vkEnumeratePhysicalDevices call."
12536 "Use invalid Queue Family Index in vkCreateDevice");
Cody Northropc31a84f2016-08-22 10:41:47 -060012537 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Mueller2ee294f2016-08-04 12:59:48 -060012538
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012539 const char *mismatch_count_message = "Call to vkEnumeratePhysicalDevices() "
12540 "w/ pPhysicalDeviceCount value ";
Mark Mueller2ee294f2016-08-04 12:59:48 -060012541
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012542 const char *invalid_queueFamilyIndex_message = "Invalid queue create request in vkCreateDevice(). Invalid "
12543 "queueFamilyIndex ";
Mark Mueller2ee294f2016-08-04 12:59:48 -060012544
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012545 const char *unavailable_feature_message = "While calling vkCreateDevice(), requesting feature #";
Mark Mueller2ee294f2016-08-04 12:59:48 -060012546
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012547 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, mismatch_count_message);
Mark Mueller880fce52016-08-17 15:23:23 -060012548 // The following test fails with recent NVidia drivers.
12549 // By the time core_validation is reached, the NVidia
12550 // driver has sanitized the invalid condition and core_validation
12551 // is not introduced to the failure condition. This is not the case
12552 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012553 // uint32_t count = static_cast<uint32_t>(~0);
12554 // VkPhysicalDevice physical_device;
12555 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
12556 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060012557
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012558 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queueFamilyIndex_message);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012559 float queue_priority = 0.0;
12560
12561 VkDeviceQueueCreateInfo queue_create_info = {};
12562 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
12563 queue_create_info.queueCount = 1;
12564 queue_create_info.pQueuePriorities = &queue_priority;
12565 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
12566
12567 VkPhysicalDeviceFeatures features = m_device->phy().features();
12568 VkDevice testDevice;
12569 VkDeviceCreateInfo device_create_info = {};
12570 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
12571 device_create_info.queueCreateInfoCount = 1;
12572 device_create_info.pQueueCreateInfos = &queue_create_info;
12573 device_create_info.pEnabledFeatures = &features;
12574 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
12575 m_errorMonitor->VerifyFound();
12576
12577 queue_create_info.queueFamilyIndex = 1;
12578
12579 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
12580 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
12581 for (unsigned i = 0; i < feature_count; i++) {
12582 if (VK_FALSE == feature_array[i]) {
12583 feature_array[i] = VK_TRUE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012584 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, unavailable_feature_message);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012585 device_create_info.pEnabledFeatures = &features;
12586 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
12587 m_errorMonitor->VerifyFound();
12588 break;
12589 }
12590 }
12591}
12592
12593TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
12594 TEST_DESCRIPTION("Use an invalid queue index in a vkCmdWaitEvents call."
12595 "End a command buffer with a query still in progress.");
12596
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012597 const char *invalid_queue_index = "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
12598 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
12599 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060012600
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012601 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060012602
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012603 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012604
12605 ASSERT_NO_FATAL_FAILURE(InitState());
12606
12607 VkEvent event;
12608 VkEventCreateInfo event_create_info{};
12609 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12610 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12611
Mark Mueller2ee294f2016-08-04 12:59:48 -060012612 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012613 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012614
12615 BeginCommandBuffer();
12616
12617 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012618 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 -060012619 ASSERT_TRUE(image.initialized());
12620 VkImageMemoryBarrier img_barrier = {};
12621 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
12622 img_barrier.pNext = NULL;
12623 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
12624 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
12625 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12626 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12627 img_barrier.image = image.handle();
12628 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060012629
12630 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
12631 // that layer validation catches the case when it is not.
12632 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060012633 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12634 img_barrier.subresourceRange.baseArrayLayer = 0;
12635 img_barrier.subresourceRange.baseMipLevel = 0;
12636 img_barrier.subresourceRange.layerCount = 1;
12637 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012638 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
12639 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012640 m_errorMonitor->VerifyFound();
12641
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012642 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012643
12644 VkQueryPool query_pool;
12645 VkQueryPoolCreateInfo query_pool_create_info = {};
12646 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12647 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
12648 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012649 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012650
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012651 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012652 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
12653
12654 vkEndCommandBuffer(m_commandBuffer->handle());
12655 m_errorMonitor->VerifyFound();
12656
12657 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
12658 vkDestroyEvent(m_device->device(), event, nullptr);
12659}
12660
Mark Muellerdfe37552016-07-07 14:47:42 -060012661TEST_F(VkLayerTest, VertexBufferInvalid) {
12662 TEST_DESCRIPTION("Submit a command buffer using deleted vertex buffer, "
12663 "delete a buffer twice, use an invalid offset for each "
12664 "buffer type, and attempt to bind a null buffer");
12665
12666 const char *deleted_buffer_in_command_buffer = "Cannot submit cmd buffer "
12667 "using deleted buffer ";
12668 const char *double_destroy_message = "Cannot free buffer 0x";
12669 const char *invalid_offset_message = "vkBindBufferMemory(): "
12670 "memoryOffset is 0x";
12671 const char *invalid_storage_buffer_offset_message = "vkBindBufferMemory(): "
12672 "storage memoryOffset "
12673 "is 0x";
12674 const char *invalid_texel_buffer_offset_message = "vkBindBufferMemory(): "
12675 "texel memoryOffset "
12676 "is 0x";
12677 const char *invalid_uniform_buffer_offset_message = "vkBindBufferMemory(): "
12678 "uniform memoryOffset "
12679 "is 0x";
12680 const char *bind_null_buffer_message = "In vkBindBufferMemory, attempting"
12681 " to Bind Obj(0x";
12682 const char *free_invalid_buffer_message = "Request to delete memory "
12683 "object 0x";
12684
12685 ASSERT_NO_FATAL_FAILURE(InitState());
12686 ASSERT_NO_FATAL_FAILURE(InitViewport());
12687 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12688
12689 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012690 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060012691 pipe_ms_state_ci.pNext = NULL;
12692 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12693 pipe_ms_state_ci.sampleShadingEnable = 0;
12694 pipe_ms_state_ci.minSampleShading = 1.0;
12695 pipe_ms_state_ci.pSampleMask = nullptr;
12696
12697 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12698 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12699 VkPipelineLayout pipeline_layout;
12700
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012701 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060012702 ASSERT_VK_SUCCESS(err);
12703
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012704 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12705 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060012706 VkPipelineObj pipe(m_device);
12707 pipe.AddShader(&vs);
12708 pipe.AddShader(&fs);
12709 pipe.AddColorAttachment();
12710 pipe.SetMSAA(&pipe_ms_state_ci);
12711 pipe.SetViewport(m_viewports);
12712 pipe.SetScissor(m_scissors);
12713 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12714
12715 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012716 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060012717
12718 {
12719 // Create and bind a vertex buffer in a reduced scope, which will cause
12720 // it to be deleted upon leaving this scope
12721 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012722 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060012723 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
12724 draw_verticies.AddVertexInputToPipe(pipe);
12725 }
12726
12727 Draw(1, 0, 0, 0);
12728
12729 EndCommandBuffer();
12730
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060012732 QueueCommandBuffer(false);
12733 m_errorMonitor->VerifyFound();
12734
12735 {
12736 // Create and bind a vertex buffer in a reduced scope, and delete it
12737 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012738 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
12739 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, double_destroy_message);
Mark Muellerdfe37552016-07-07 14:47:42 -060012740 buffer_test.TestDoubleDestroy();
12741 }
12742 m_errorMonitor->VerifyFound();
12743
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012744 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012745 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012746 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
12747 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
12748 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012749 m_errorMonitor->VerifyFound();
12750 }
12751
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012752 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
12753 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012754 // Create and bind a memory buffer with an invalid offset again,
12755 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012756 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
12757 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
12758 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012759 m_errorMonitor->VerifyFound();
12760 }
12761
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012762 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012763 // Create and bind a memory buffer with an invalid offset again, but
12764 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012765 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
12766 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
12767 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012768 m_errorMonitor->VerifyFound();
12769 }
12770
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012771 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012772 // Create and bind a memory buffer with an invalid offset again, but
12773 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012774 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
12775 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
12776 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012777 m_errorMonitor->VerifyFound();
12778 }
12779
12780 {
12781 // Attempt to bind a null buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012782 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bind_null_buffer_message);
12783 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
12784 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012785 m_errorMonitor->VerifyFound();
12786 }
12787
12788 {
12789 // Attempt to use an invalid handle to delete a buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012790 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, free_invalid_buffer_message);
12791 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
12792 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012793 }
12794 m_errorMonitor->VerifyFound();
12795
12796 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12797}
12798
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012799// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
12800TEST_F(VkLayerTest, InvalidImageLayout) {
12801 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012802 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
12803 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012804 // 3 in ValidateCmdBufImageLayouts
12805 // * -1 Attempt to submit cmd buf w/ deleted image
12806 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
12807 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012808 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12809 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012810
12811 ASSERT_NO_FATAL_FAILURE(InitState());
12812 // Create src & dst images to use for copy operations
12813 VkImage src_image;
12814 VkImage dst_image;
12815
12816 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
12817 const int32_t tex_width = 32;
12818 const int32_t tex_height = 32;
12819
12820 VkImageCreateInfo image_create_info = {};
12821 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
12822 image_create_info.pNext = NULL;
12823 image_create_info.imageType = VK_IMAGE_TYPE_2D;
12824 image_create_info.format = tex_format;
12825 image_create_info.extent.width = tex_width;
12826 image_create_info.extent.height = tex_height;
12827 image_create_info.extent.depth = 1;
12828 image_create_info.mipLevels = 1;
12829 image_create_info.arrayLayers = 4;
12830 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
12831 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
12832 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
12833 image_create_info.flags = 0;
12834
12835 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
12836 ASSERT_VK_SUCCESS(err);
12837 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
12838 ASSERT_VK_SUCCESS(err);
12839
12840 BeginCommandBuffer();
12841 VkImageCopy copyRegion;
12842 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12843 copyRegion.srcSubresource.mipLevel = 0;
12844 copyRegion.srcSubresource.baseArrayLayer = 0;
12845 copyRegion.srcSubresource.layerCount = 1;
12846 copyRegion.srcOffset.x = 0;
12847 copyRegion.srcOffset.y = 0;
12848 copyRegion.srcOffset.z = 0;
12849 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12850 copyRegion.dstSubresource.mipLevel = 0;
12851 copyRegion.dstSubresource.baseArrayLayer = 0;
12852 copyRegion.dstSubresource.layerCount = 1;
12853 copyRegion.dstOffset.x = 0;
12854 copyRegion.dstOffset.y = 0;
12855 copyRegion.dstOffset.z = 0;
12856 copyRegion.extent.width = 1;
12857 copyRegion.extent.height = 1;
12858 copyRegion.extent.depth = 1;
12859 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12860 m_errorMonitor->VerifyFound();
12861 // Now cause error due to src image layout changing
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012862 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot copy from an image whose source layout is "
12863 "VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current "
12864 "layout VK_IMAGE_LAYOUT_GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012865 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12866 m_errorMonitor->VerifyFound();
12867 // Final src error is due to bad layout type
12868 m_errorMonitor->SetDesiredFailureMsg(
12869 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12870 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
12871 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12872 m_errorMonitor->VerifyFound();
12873 // Now verify same checks for dst
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12875 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012876 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
12877 m_errorMonitor->VerifyFound();
12878 // Now cause error due to src image layout changing
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012879 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot copy from an image whose dest layout is "
12880 "VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current "
12881 "layout VK_IMAGE_LAYOUT_GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012882 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
12883 m_errorMonitor->VerifyFound();
12884 m_errorMonitor->SetDesiredFailureMsg(
12885 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12886 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
12887 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
12888 m_errorMonitor->VerifyFound();
12889 // Now cause error due to bad image layout transition in PipelineBarrier
12890 VkImageMemoryBarrier image_barrier[1] = {};
12891 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12892 image_barrier[0].image = src_image;
12893 image_barrier[0].subresourceRange.layerCount = 2;
12894 image_barrier[0].subresourceRange.levelCount = 2;
12895 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012896 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "You cannot transition the layout from "
12897 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when "
12898 "current layout is VK_IMAGE_LAYOUT_GENERAL.");
12899 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12900 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012901 m_errorMonitor->VerifyFound();
12902
12903 // Finally some layout errors at RenderPass create time
12904 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
12905 VkAttachmentReference attach = {};
12906 // perf warning for GENERAL layout w/ non-DS input attachment
12907 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12908 VkSubpassDescription subpass = {};
12909 subpass.inputAttachmentCount = 1;
12910 subpass.pInputAttachments = &attach;
12911 VkRenderPassCreateInfo rpci = {};
12912 rpci.subpassCount = 1;
12913 rpci.pSubpasses = &subpass;
12914 rpci.attachmentCount = 1;
12915 VkAttachmentDescription attach_desc = {};
12916 attach_desc.format = VK_FORMAT_UNDEFINED;
12917 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012918 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012919 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012920 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12921 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012922 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12923 m_errorMonitor->VerifyFound();
12924 // error w/ non-general layout
12925 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12926
12927 m_errorMonitor->SetDesiredFailureMsg(
12928 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12929 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
12930 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12931 m_errorMonitor->VerifyFound();
12932 subpass.inputAttachmentCount = 0;
12933 subpass.colorAttachmentCount = 1;
12934 subpass.pColorAttachments = &attach;
12935 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12936 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012937 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12938 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012939 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12940 m_errorMonitor->VerifyFound();
12941 // error w/ non-color opt or GENERAL layout for color attachment
12942 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12943 m_errorMonitor->SetDesiredFailureMsg(
12944 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12945 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
12946 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12947 m_errorMonitor->VerifyFound();
12948 subpass.colorAttachmentCount = 0;
12949 subpass.pDepthStencilAttachment = &attach;
12950 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12951 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12953 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012954 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12955 m_errorMonitor->VerifyFound();
12956 // error w/ non-ds opt or GENERAL layout for color attachment
12957 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012958 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12959 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
12960 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012961 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12962 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012963 // For this error we need a valid renderpass so create default one
12964 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12965 attach.attachment = 0;
12966 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
12967 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12968 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12969 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12970 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12971 // Can't do a CLEAR load on READ_ONLY initialLayout
12972 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12973 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12974 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " with invalid first layout "
12976 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
12977 "ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060012978 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12979 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012980
12981 vkDestroyImage(m_device->device(), src_image, NULL);
12982 vkDestroyImage(m_device->device(), dst_image, NULL);
12983}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012984
12985TEST_F(VkLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
12986 TEST_DESCRIPTION("Positive test where we create a renderpass with an "
12987 "attachment that uses LOAD_OP_CLEAR, the first subpass "
12988 "has a valid layout, and a second subpass then uses a "
12989 "valid *READ_ONLY* layout.");
12990 m_errorMonitor->ExpectSuccess();
12991 ASSERT_NO_FATAL_FAILURE(InitState());
12992
12993 VkAttachmentReference attach[2] = {};
12994 attach[0].attachment = 0;
12995 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
12996 attach[1].attachment = 0;
12997 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12998 VkSubpassDescription subpasses[2] = {};
12999 // First subpass clears DS attach on load
13000 subpasses[0].pDepthStencilAttachment = &attach[0];
13001 // 2nd subpass reads in DS as input attachment
13002 subpasses[1].inputAttachmentCount = 1;
13003 subpasses[1].pInputAttachments = &attach[1];
13004 VkAttachmentDescription attach_desc = {};
13005 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
13006 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
13007 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
13008 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
13009 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
13010 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013011 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlisd8d89182016-07-18 20:13:11 -060013012 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
13013 VkRenderPassCreateInfo rpci = {};
13014 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
13015 rpci.attachmentCount = 1;
13016 rpci.pAttachments = &attach_desc;
13017 rpci.subpassCount = 2;
13018 rpci.pSubpasses = subpasses;
13019
13020 // Now create RenderPass and verify no errors
13021 VkRenderPass rp;
13022 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
13023 m_errorMonitor->VerifyNotFound();
13024
13025 vkDestroyRenderPass(m_device->device(), rp, NULL);
13026}
Tobin Ehlis4af23302016-07-19 10:50:30 -060013027
Mark Mueller93b938f2016-08-18 10:27:40 -060013028TEST_F(VkLayerTest, SimultaneousUse) {
13029 TEST_DESCRIPTION("Use vkCmdExecuteCommands with invalid state "
13030 "in primary and secondary command buffers.");
13031
13032 ASSERT_NO_FATAL_FAILURE(InitState());
13033 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13034
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013035 const char *simultaneous_use_message1 = "w/o VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
13036 const char *simultaneous_use_message2 = "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
13037 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060013038
13039 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013040 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060013041 command_buffer_allocate_info.commandPool = m_commandPool;
13042 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13043 command_buffer_allocate_info.commandBufferCount = 1;
13044
13045 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013046 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060013047 VkCommandBufferBeginInfo command_buffer_begin_info = {};
13048 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013049 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060013050 command_buffer_inheritance_info.renderPass = m_renderPass;
13051 command_buffer_inheritance_info.framebuffer = m_framebuffer;
13052 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013053 command_buffer_begin_info.flags =
13054 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060013055 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
13056
13057 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013058 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
13059 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller4042b652016-09-05 22:52:21 -060013060 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
Mark Mueller93b938f2016-08-18 10:27:40 -060013061 vkEndCommandBuffer(secondary_command_buffer);
13062
Mark Mueller93b938f2016-08-18 10:27:40 -060013063 VkSubmitInfo submit_info = {};
13064 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13065 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013066 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller4042b652016-09-05 22:52:21 -060013067 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Mueller93b938f2016-08-18 10:27:40 -060013068
Mark Mueller4042b652016-09-05 22:52:21 -060013069 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013070 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
13071 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
13072 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060013073 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060013074 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
13075 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060013076
13077 m_errorMonitor->SetDesiredFailureMsg(0, "");
Mark Mueller93b938f2016-08-18 10:27:40 -060013078 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13079
Mark Mueller4042b652016-09-05 22:52:21 -060013080 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060013081 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013082 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060013083
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013084 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
13085 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060013086 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060013087 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
13088 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060013089}
13090
Mark Mueller917f6bc2016-08-30 10:57:19 -060013091TEST_F(VkLayerTest, InUseDestroyedSignaled) {
13092 TEST_DESCRIPTION("Use vkCmdExecuteCommands with invalid state "
13093 "in primary and secondary command buffers. "
Mark Muellerc8d441e2016-08-23 17:36:00 -060013094 "Delete objects that are inuse. Call VkQueueSubmit "
13095 "with an event that has been deleted.");
Mark Mueller917f6bc2016-08-30 10:57:19 -060013096
13097 ASSERT_NO_FATAL_FAILURE(InitState());
13098 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13099
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013100 const char *submit_with_deleted_event_message = "Cannot submit cmd buffer using deleted event 0x";
13101 const char *cannot_delete_event_message = "Cannot delete event 0x";
13102 const char *cannot_delete_semaphore_message = "Cannot delete semaphore 0x";
13103 const char *cannot_destroy_fence_message = "Fence 0x";
Mark Mueller917f6bc2016-08-30 10:57:19 -060013104
13105 BeginCommandBuffer();
13106
13107 VkEvent event;
13108 VkEventCreateInfo event_create_info = {};
13109 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13110 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013111 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013112
Mark Muellerc8d441e2016-08-23 17:36:00 -060013113 EndCommandBuffer();
13114 vkDestroyEvent(m_device->device(), event, nullptr);
13115
13116 VkSubmitInfo submit_info = {};
13117 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13118 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013119 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13120 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, submit_with_deleted_event_message);
Mark Muellerc8d441e2016-08-23 17:36:00 -060013121 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13122 m_errorMonitor->VerifyFound();
13123
13124 m_errorMonitor->SetDesiredFailureMsg(0, "");
13125 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
13126
13127 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
13128
Mark Mueller917f6bc2016-08-30 10:57:19 -060013129 VkSemaphoreCreateInfo semaphore_create_info = {};
13130 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13131 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013132 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013133 VkFenceCreateInfo fence_create_info = {};
13134 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13135 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013136 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013137
13138 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060013139 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013140 descriptor_pool_type_count.descriptorCount = 1;
13141
13142 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13143 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13144 descriptor_pool_create_info.maxSets = 1;
13145 descriptor_pool_create_info.poolSizeCount = 1;
13146 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013147 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013148
13149 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013150 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013151
13152 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060013153 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013154 descriptorset_layout_binding.descriptorCount = 1;
13155 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
13156
13157 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013158 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013159 descriptorset_layout_create_info.bindingCount = 1;
13160 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13161
13162 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013163 ASSERT_VK_SUCCESS(
13164 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013165
13166 VkDescriptorSet descriptorset;
13167 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013168 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013169 descriptorset_allocate_info.descriptorSetCount = 1;
13170 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13171 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013172 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013173
Mark Mueller4042b652016-09-05 22:52:21 -060013174 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13175
13176 VkDescriptorBufferInfo buffer_info = {};
13177 buffer_info.buffer = buffer_test.GetBuffer();
13178 buffer_info.offset = 0;
13179 buffer_info.range = 1024;
13180
13181 VkWriteDescriptorSet write_descriptor_set = {};
13182 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13183 write_descriptor_set.dstSet = descriptorset;
13184 write_descriptor_set.descriptorCount = 1;
13185 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13186 write_descriptor_set.pBufferInfo = &buffer_info;
13187
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013188 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060013189
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013190 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13191 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013192
13193 VkPipelineObj pipe(m_device);
13194 pipe.AddColorAttachment();
13195 pipe.AddShader(&vs);
13196 pipe.AddShader(&fs);
13197
13198 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013199 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013200 pipeline_layout_create_info.setLayoutCount = 1;
13201 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13202
13203 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013204 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013205
13206 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
13207
Mark Muellerc8d441e2016-08-23 17:36:00 -060013208 BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013209 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060013210
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013211 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13212 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13213 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013214
Mark Muellerc8d441e2016-08-23 17:36:00 -060013215 EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060013216
Mark Mueller917f6bc2016-08-30 10:57:19 -060013217 submit_info.signalSemaphoreCount = 1;
13218 submit_info.pSignalSemaphores = &semaphore;
13219 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Muellerc8d441e2016-08-23 17:36:00 -060013220
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013221 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, cannot_delete_event_message);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013222 vkDestroyEvent(m_device->device(), event, nullptr);
13223 m_errorMonitor->VerifyFound();
13224
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, cannot_delete_semaphore_message);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013226 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13227 m_errorMonitor->VerifyFound();
13228
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013229 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, cannot_destroy_fence_message);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013230 vkDestroyFence(m_device->device(), fence, nullptr);
13231 m_errorMonitor->VerifyFound();
13232
Tobin Ehlis122207b2016-09-01 08:50:06 -070013233 vkQueueWaitIdle(m_device->m_queue);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013234 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13235 vkDestroyFence(m_device->device(), fence, nullptr);
13236 vkDestroyEvent(m_device->device(), event, nullptr);
13237 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013238 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013239 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13240}
13241
Tobin Ehlis2adda372016-09-01 08:51:06 -070013242TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
13243 TEST_DESCRIPTION("Delete in-use query pool.");
13244
13245 ASSERT_NO_FATAL_FAILURE(InitState());
13246 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13247
13248 VkQueryPool query_pool;
13249 VkQueryPoolCreateInfo query_pool_ci{};
13250 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
13251 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
13252 query_pool_ci.queryCount = 1;
13253 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
13254 BeginCommandBuffer();
13255 // Reset query pool to create binding with cmd buffer
13256 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
13257
13258 EndCommandBuffer();
13259
13260 VkSubmitInfo submit_info = {};
13261 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13262 submit_info.commandBufferCount = 1;
13263 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13264 // Submit cmd buffer and then destroy query pool while in-flight
13265 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13266
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013267 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete query pool 0x");
Tobin Ehlis2adda372016-09-01 08:51:06 -070013268 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
13269 m_errorMonitor->VerifyFound();
13270
13271 vkQueueWaitIdle(m_device->m_queue);
13272 // Now that cmd buffer done we can safely destroy query_pool
13273 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
13274}
13275
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013276TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
13277 TEST_DESCRIPTION("Delete in-use pipeline.");
13278
13279 ASSERT_NO_FATAL_FAILURE(InitState());
13280 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13281
13282 // Empty pipeline layout used for binding PSO
13283 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13284 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13285 pipeline_layout_ci.setLayoutCount = 0;
13286 pipeline_layout_ci.pSetLayouts = NULL;
13287
13288 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013289 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013290 ASSERT_VK_SUCCESS(err);
13291
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013292 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete pipeline 0x");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013293 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013294 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13295 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013296 // Store pipeline handle so we can actually delete it before test finishes
13297 VkPipeline delete_this_pipeline;
13298 { // Scope pipeline so it will be auto-deleted
13299 VkPipelineObj pipe(m_device);
13300 pipe.AddShader(&vs);
13301 pipe.AddShader(&fs);
13302 pipe.AddColorAttachment();
13303 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13304 delete_this_pipeline = pipe.handle();
13305
13306 BeginCommandBuffer();
13307 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013308 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013309
13310 EndCommandBuffer();
13311
13312 VkSubmitInfo submit_info = {};
13313 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13314 submit_info.commandBufferCount = 1;
13315 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13316 // Submit cmd buffer and then pipeline destroyed while in-flight
13317 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13318 } // Pipeline deletion triggered here
13319 m_errorMonitor->VerifyFound();
13320 // Make sure queue finished and then actually delete pipeline
13321 vkQueueWaitIdle(m_device->m_queue);
13322 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
13323 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
13324}
13325
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013326TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
13327 TEST_DESCRIPTION("Delete in-use imageView.");
13328
13329 ASSERT_NO_FATAL_FAILURE(InitState());
13330 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13331
13332 VkDescriptorPoolSize ds_type_count;
13333 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13334 ds_type_count.descriptorCount = 1;
13335
13336 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13337 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13338 ds_pool_ci.maxSets = 1;
13339 ds_pool_ci.poolSizeCount = 1;
13340 ds_pool_ci.pPoolSizes = &ds_type_count;
13341
13342 VkDescriptorPool ds_pool;
13343 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
13344 ASSERT_VK_SUCCESS(err);
13345
13346 VkSamplerCreateInfo sampler_ci = {};
13347 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
13348 sampler_ci.pNext = NULL;
13349 sampler_ci.magFilter = VK_FILTER_NEAREST;
13350 sampler_ci.minFilter = VK_FILTER_NEAREST;
13351 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
13352 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13353 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13354 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13355 sampler_ci.mipLodBias = 1.0;
13356 sampler_ci.anisotropyEnable = VK_FALSE;
13357 sampler_ci.maxAnisotropy = 1;
13358 sampler_ci.compareEnable = VK_FALSE;
13359 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
13360 sampler_ci.minLod = 1.0;
13361 sampler_ci.maxLod = 1.0;
13362 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
13363 sampler_ci.unnormalizedCoordinates = VK_FALSE;
13364 VkSampler sampler;
13365
13366 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
13367 ASSERT_VK_SUCCESS(err);
13368
13369 VkDescriptorSetLayoutBinding layout_binding;
13370 layout_binding.binding = 0;
13371 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13372 layout_binding.descriptorCount = 1;
13373 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13374 layout_binding.pImmutableSamplers = NULL;
13375
13376 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13377 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13378 ds_layout_ci.bindingCount = 1;
13379 ds_layout_ci.pBindings = &layout_binding;
13380 VkDescriptorSetLayout ds_layout;
13381 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
13382 ASSERT_VK_SUCCESS(err);
13383
13384 VkDescriptorSetAllocateInfo alloc_info = {};
13385 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13386 alloc_info.descriptorSetCount = 1;
13387 alloc_info.descriptorPool = ds_pool;
13388 alloc_info.pSetLayouts = &ds_layout;
13389 VkDescriptorSet descriptor_set;
13390 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
13391 ASSERT_VK_SUCCESS(err);
13392
13393 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13394 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13395 pipeline_layout_ci.pNext = NULL;
13396 pipeline_layout_ci.setLayoutCount = 1;
13397 pipeline_layout_ci.pSetLayouts = &ds_layout;
13398
13399 VkPipelineLayout pipeline_layout;
13400 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
13401 ASSERT_VK_SUCCESS(err);
13402
13403 VkImageObj image(m_device);
13404 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
13405 ASSERT_TRUE(image.initialized());
13406
13407 VkImageView view;
13408 VkImageViewCreateInfo ivci = {};
13409 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13410 ivci.image = image.handle();
13411 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
13412 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
13413 ivci.subresourceRange.layerCount = 1;
13414 ivci.subresourceRange.baseMipLevel = 0;
13415 ivci.subresourceRange.levelCount = 1;
13416 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13417
13418 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
13419 ASSERT_VK_SUCCESS(err);
13420
13421 VkDescriptorImageInfo image_info{};
13422 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
13423 image_info.imageView = view;
13424 image_info.sampler = sampler;
13425
13426 VkWriteDescriptorSet descriptor_write = {};
13427 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13428 descriptor_write.dstSet = descriptor_set;
13429 descriptor_write.dstBinding = 0;
13430 descriptor_write.descriptorCount = 1;
13431 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13432 descriptor_write.pImageInfo = &image_info;
13433
13434 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13435
13436 // Create PSO to use the sampler
13437 char const *vsSource = "#version 450\n"
13438 "\n"
13439 "out gl_PerVertex { \n"
13440 " vec4 gl_Position;\n"
13441 "};\n"
13442 "void main(){\n"
13443 " gl_Position = vec4(1);\n"
13444 "}\n";
13445 char const *fsSource = "#version 450\n"
13446 "\n"
13447 "layout(set=0, binding=0) uniform sampler2D s;\n"
13448 "layout(location=0) out vec4 x;\n"
13449 "void main(){\n"
13450 " x = texture(s, vec2(1));\n"
13451 "}\n";
13452 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13453 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13454 VkPipelineObj pipe(m_device);
13455 pipe.AddShader(&vs);
13456 pipe.AddShader(&fs);
13457 pipe.AddColorAttachment();
13458 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13459
13460 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete image view 0x");
13461
13462 BeginCommandBuffer();
13463 // Bind pipeline to cmd buffer
13464 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13465 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13466 &descriptor_set, 0, nullptr);
13467 Draw(1, 0, 0, 0);
13468 EndCommandBuffer();
13469 // Submit cmd buffer then destroy sampler
13470 VkSubmitInfo submit_info = {};
13471 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13472 submit_info.commandBufferCount = 1;
13473 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13474 // Submit cmd buffer and then destroy imageView while in-flight
13475 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13476
13477 vkDestroyImageView(m_device->device(), view, nullptr);
13478 m_errorMonitor->VerifyFound();
13479 vkQueueWaitIdle(m_device->m_queue);
13480 // Now we can actually destroy imageView
13481 vkDestroyImageView(m_device->device(), view, NULL);
13482 vkDestroySampler(m_device->device(), sampler, nullptr);
13483 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13484 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13485 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13486}
13487
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013488TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
13489 TEST_DESCRIPTION("Delete in-use bufferView.");
13490
13491 ASSERT_NO_FATAL_FAILURE(InitState());
13492 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13493
13494 VkDescriptorPoolSize ds_type_count;
13495 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13496 ds_type_count.descriptorCount = 1;
13497
13498 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13499 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13500 ds_pool_ci.maxSets = 1;
13501 ds_pool_ci.poolSizeCount = 1;
13502 ds_pool_ci.pPoolSizes = &ds_type_count;
13503
13504 VkDescriptorPool ds_pool;
13505 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
13506 ASSERT_VK_SUCCESS(err);
13507
13508 VkDescriptorSetLayoutBinding layout_binding;
13509 layout_binding.binding = 0;
13510 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13511 layout_binding.descriptorCount = 1;
13512 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13513 layout_binding.pImmutableSamplers = NULL;
13514
13515 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13516 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13517 ds_layout_ci.bindingCount = 1;
13518 ds_layout_ci.pBindings = &layout_binding;
13519 VkDescriptorSetLayout ds_layout;
13520 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
13521 ASSERT_VK_SUCCESS(err);
13522
13523 VkDescriptorSetAllocateInfo alloc_info = {};
13524 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13525 alloc_info.descriptorSetCount = 1;
13526 alloc_info.descriptorPool = ds_pool;
13527 alloc_info.pSetLayouts = &ds_layout;
13528 VkDescriptorSet descriptor_set;
13529 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
13530 ASSERT_VK_SUCCESS(err);
13531
13532 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13533 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13534 pipeline_layout_ci.pNext = NULL;
13535 pipeline_layout_ci.setLayoutCount = 1;
13536 pipeline_layout_ci.pSetLayouts = &ds_layout;
13537
13538 VkPipelineLayout pipeline_layout;
13539 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
13540 ASSERT_VK_SUCCESS(err);
13541
13542 VkBuffer buffer;
13543 uint32_t queue_family_index = 0;
13544 VkBufferCreateInfo buffer_create_info = {};
13545 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
13546 buffer_create_info.size = 1024;
13547 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
13548 buffer_create_info.queueFamilyIndexCount = 1;
13549 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
13550
13551 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
13552 ASSERT_VK_SUCCESS(err);
13553
13554 VkMemoryRequirements memory_reqs;
13555 VkDeviceMemory buffer_memory;
13556
13557 VkMemoryAllocateInfo memory_info = {};
13558 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
13559 memory_info.allocationSize = 0;
13560 memory_info.memoryTypeIndex = 0;
13561
13562 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
13563 memory_info.allocationSize = memory_reqs.size;
13564 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
13565 ASSERT_TRUE(pass);
13566
13567 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
13568 ASSERT_VK_SUCCESS(err);
13569 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
13570 ASSERT_VK_SUCCESS(err);
13571
13572 VkBufferView view;
13573 VkBufferViewCreateInfo bvci = {};
13574 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
13575 bvci.buffer = buffer;
13576 bvci.format = VK_FORMAT_R8_UNORM;
13577 bvci.range = VK_WHOLE_SIZE;
13578
13579 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
13580 ASSERT_VK_SUCCESS(err);
13581
13582 VkWriteDescriptorSet descriptor_write = {};
13583 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13584 descriptor_write.dstSet = descriptor_set;
13585 descriptor_write.dstBinding = 0;
13586 descriptor_write.descriptorCount = 1;
13587 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13588 descriptor_write.pTexelBufferView = &view;
13589
13590 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13591
13592 char const *vsSource = "#version 450\n"
13593 "\n"
13594 "out gl_PerVertex { \n"
13595 " vec4 gl_Position;\n"
13596 "};\n"
13597 "void main(){\n"
13598 " gl_Position = vec4(1);\n"
13599 "}\n";
13600 char const *fsSource = "#version 450\n"
13601 "\n"
13602 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
13603 "layout(location=0) out vec4 x;\n"
13604 "void main(){\n"
13605 " x = imageLoad(s, 0);\n"
13606 "}\n";
13607 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13608 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13609 VkPipelineObj pipe(m_device);
13610 pipe.AddShader(&vs);
13611 pipe.AddShader(&fs);
13612 pipe.AddColorAttachment();
13613 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13614
13615 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete buffer view 0x");
13616
13617 BeginCommandBuffer();
13618 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13619 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13620 VkRect2D scissor = {{0, 0}, {16, 16}};
13621 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13622 // Bind pipeline to cmd buffer
13623 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13624 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13625 &descriptor_set, 0, nullptr);
13626 Draw(1, 0, 0, 0);
13627 EndCommandBuffer();
13628
13629 VkSubmitInfo submit_info = {};
13630 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13631 submit_info.commandBufferCount = 1;
13632 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13633 // Submit cmd buffer and then destroy bufferView while in-flight
13634 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13635
13636 vkDestroyBufferView(m_device->device(), view, nullptr);
13637 m_errorMonitor->VerifyFound();
13638 vkQueueWaitIdle(m_device->m_queue);
13639 // Now we can actually destroy bufferView
13640 vkDestroyBufferView(m_device->device(), view, NULL);
13641 vkDestroyBuffer(m_device->device(), buffer, NULL);
13642 vkFreeMemory(m_device->device(), buffer_memory, NULL);
13643 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13644 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13645 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13646}
13647
Tobin Ehlis209532e2016-09-07 13:52:18 -060013648TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
13649 TEST_DESCRIPTION("Delete in-use sampler.");
13650
13651 ASSERT_NO_FATAL_FAILURE(InitState());
13652 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13653
13654 VkDescriptorPoolSize ds_type_count;
13655 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13656 ds_type_count.descriptorCount = 1;
13657
13658 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13659 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13660 ds_pool_ci.maxSets = 1;
13661 ds_pool_ci.poolSizeCount = 1;
13662 ds_pool_ci.pPoolSizes = &ds_type_count;
13663
13664 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013665 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013666 ASSERT_VK_SUCCESS(err);
13667
13668 VkSamplerCreateInfo sampler_ci = {};
13669 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
13670 sampler_ci.pNext = NULL;
13671 sampler_ci.magFilter = VK_FILTER_NEAREST;
13672 sampler_ci.minFilter = VK_FILTER_NEAREST;
13673 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
13674 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13675 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13676 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13677 sampler_ci.mipLodBias = 1.0;
13678 sampler_ci.anisotropyEnable = VK_FALSE;
13679 sampler_ci.maxAnisotropy = 1;
13680 sampler_ci.compareEnable = VK_FALSE;
13681 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
13682 sampler_ci.minLod = 1.0;
13683 sampler_ci.maxLod = 1.0;
13684 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
13685 sampler_ci.unnormalizedCoordinates = VK_FALSE;
13686 VkSampler sampler;
13687
13688 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
13689 ASSERT_VK_SUCCESS(err);
13690
13691 VkDescriptorSetLayoutBinding layout_binding;
13692 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060013693 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060013694 layout_binding.descriptorCount = 1;
13695 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13696 layout_binding.pImmutableSamplers = NULL;
13697
13698 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13699 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13700 ds_layout_ci.bindingCount = 1;
13701 ds_layout_ci.pBindings = &layout_binding;
13702 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013703 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013704 ASSERT_VK_SUCCESS(err);
13705
13706 VkDescriptorSetAllocateInfo alloc_info = {};
13707 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13708 alloc_info.descriptorSetCount = 1;
13709 alloc_info.descriptorPool = ds_pool;
13710 alloc_info.pSetLayouts = &ds_layout;
13711 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013712 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013713 ASSERT_VK_SUCCESS(err);
13714
13715 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13716 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13717 pipeline_layout_ci.pNext = NULL;
13718 pipeline_layout_ci.setLayoutCount = 1;
13719 pipeline_layout_ci.pSetLayouts = &ds_layout;
13720
13721 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013722 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013723 ASSERT_VK_SUCCESS(err);
13724
13725 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013726 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 -060013727 ASSERT_TRUE(image.initialized());
13728
13729 VkImageView view;
13730 VkImageViewCreateInfo ivci = {};
13731 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13732 ivci.image = image.handle();
13733 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
13734 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
13735 ivci.subresourceRange.layerCount = 1;
13736 ivci.subresourceRange.baseMipLevel = 0;
13737 ivci.subresourceRange.levelCount = 1;
13738 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13739
13740 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
13741 ASSERT_VK_SUCCESS(err);
13742
13743 VkDescriptorImageInfo image_info{};
13744 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
13745 image_info.imageView = view;
13746 image_info.sampler = sampler;
13747
13748 VkWriteDescriptorSet descriptor_write = {};
13749 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13750 descriptor_write.dstSet = descriptor_set;
13751 descriptor_write.dstBinding = 0;
13752 descriptor_write.descriptorCount = 1;
13753 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13754 descriptor_write.pImageInfo = &image_info;
13755
13756 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13757
13758 // Create PSO to use the sampler
13759 char const *vsSource = "#version 450\n"
13760 "\n"
13761 "out gl_PerVertex { \n"
13762 " vec4 gl_Position;\n"
13763 "};\n"
13764 "void main(){\n"
13765 " gl_Position = vec4(1);\n"
13766 "}\n";
13767 char const *fsSource = "#version 450\n"
13768 "\n"
13769 "layout(set=0, binding=0) uniform sampler2D s;\n"
13770 "layout(location=0) out vec4 x;\n"
13771 "void main(){\n"
13772 " x = texture(s, vec2(1));\n"
13773 "}\n";
13774 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13775 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13776 VkPipelineObj pipe(m_device);
13777 pipe.AddShader(&vs);
13778 pipe.AddShader(&fs);
13779 pipe.AddColorAttachment();
13780 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13781
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013782 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete sampler 0x");
Tobin Ehlis209532e2016-09-07 13:52:18 -060013783
13784 BeginCommandBuffer();
13785 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013786 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13787 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13788 &descriptor_set, 0, nullptr);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013789 Draw(1, 0, 0, 0);
13790 EndCommandBuffer();
13791 // Submit cmd buffer then destroy sampler
13792 VkSubmitInfo submit_info = {};
13793 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13794 submit_info.commandBufferCount = 1;
13795 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13796 // Submit cmd buffer and then destroy sampler while in-flight
13797 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13798
13799 vkDestroySampler(m_device->device(), sampler, nullptr);
13800 m_errorMonitor->VerifyFound();
13801 vkQueueWaitIdle(m_device->m_queue);
13802 // Now we can actually destroy sampler
13803 vkDestroySampler(m_device->device(), sampler, nullptr);
13804 vkDestroyImageView(m_device->device(), view, NULL);
13805 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13806 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13807 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13808}
13809
Mark Mueller1cd9f412016-08-25 13:23:52 -060013810TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Mueller96a56d52016-08-24 10:28:05 -060013811 TEST_DESCRIPTION("Call VkQueueSubmit with a semaphore that is already "
Mark Mueller1cd9f412016-08-25 13:23:52 -060013812 "signaled but not waited on by the queue. Wait on a "
13813 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060013814
13815 ASSERT_NO_FATAL_FAILURE(InitState());
13816 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13817
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013818 const char *queue_forward_progress_message = " that has already been signaled but not waited on by queue 0x";
13819 const char *invalid_fence_wait_message = " which has not been submitted on a Queue or during "
13820 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060013821
13822 BeginCommandBuffer();
13823 EndCommandBuffer();
13824
13825 VkSemaphoreCreateInfo semaphore_create_info = {};
13826 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13827 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013828 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060013829 VkSubmitInfo submit_info = {};
13830 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13831 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013832 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060013833 submit_info.signalSemaphoreCount = 1;
13834 submit_info.pSignalSemaphores = &semaphore;
13835 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13836 m_errorMonitor->SetDesiredFailureMsg(0, "");
13837 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
13838 BeginCommandBuffer();
13839 EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013840 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060013841 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13842 m_errorMonitor->VerifyFound();
13843
Mark Mueller1cd9f412016-08-25 13:23:52 -060013844 VkFenceCreateInfo fence_create_info = {};
13845 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13846 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013847 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060013848
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013849 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060013850 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
13851 m_errorMonitor->VerifyFound();
13852
Mark Mueller4042b652016-09-05 22:52:21 -060013853 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060013854 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060013855 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13856}
13857
Tobin Ehlis4af23302016-07-19 10:50:30 -060013858TEST_F(VkLayerTest, FramebufferIncompatible) {
13859 TEST_DESCRIPTION("Bind a secondary command buffer with with a framebuffer "
13860 "that does not match the framebuffer for the active "
13861 "renderpass.");
13862 ASSERT_NO_FATAL_FAILURE(InitState());
13863 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13864
13865 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013866 VkAttachmentDescription attachment = {0,
13867 VK_FORMAT_B8G8R8A8_UNORM,
13868 VK_SAMPLE_COUNT_1_BIT,
13869 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13870 VK_ATTACHMENT_STORE_OP_STORE,
13871 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13872 VK_ATTACHMENT_STORE_OP_DONT_CARE,
13873 VK_IMAGE_LAYOUT_UNDEFINED,
13874 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013875
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013876 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013877
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013878 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013879
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013880 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013881
13882 VkRenderPass rp;
13883 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13884 ASSERT_VK_SUCCESS(err);
13885
13886 // A compatible framebuffer.
13887 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013888 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 -060013889 ASSERT_TRUE(image.initialized());
13890
13891 VkImageViewCreateInfo ivci = {
13892 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
13893 nullptr,
13894 0,
13895 image.handle(),
13896 VK_IMAGE_VIEW_TYPE_2D,
13897 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013898 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
13899 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060013900 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
13901 };
13902 VkImageView view;
13903 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
13904 ASSERT_VK_SUCCESS(err);
13905
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013906 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013907 VkFramebuffer fb;
13908 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
13909 ASSERT_VK_SUCCESS(err);
13910
13911 VkCommandBufferAllocateInfo cbai = {};
13912 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
13913 cbai.commandPool = m_commandPool;
13914 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13915 cbai.commandBufferCount = 1;
13916
13917 VkCommandBuffer sec_cb;
13918 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
13919 ASSERT_VK_SUCCESS(err);
13920 VkCommandBufferBeginInfo cbbi = {};
13921 VkCommandBufferInheritanceInfo cbii = {};
13922 cbii.renderPass = renderPass();
13923 cbii.framebuffer = fb;
13924 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13925 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013926 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 -060013927 cbbi.pInheritanceInfo = &cbii;
13928 vkBeginCommandBuffer(sec_cb, &cbbi);
13929 vkEndCommandBuffer(sec_cb);
13930
Chris Forbes3400bc52016-09-13 18:10:34 +120013931 VkCommandBufferBeginInfo cbbi2 = {
13932 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
13933 0, nullptr
13934 };
13935 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
13936 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013937
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13939 " that is not the same as the primaryCB's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060013940 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
13941 m_errorMonitor->VerifyFound();
13942 // Cleanup
13943 vkDestroyImageView(m_device->device(), view, NULL);
13944 vkDestroyRenderPass(m_device->device(), rp, NULL);
13945 vkDestroyFramebuffer(m_device->device(), fb, NULL);
13946}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013947
13948TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
13949 TEST_DESCRIPTION("If logicOp is available on the device, set it to an "
13950 "invalid value. If logicOp is not available, attempt to "
13951 "use it and verify that we see the correct error.");
13952 ASSERT_NO_FATAL_FAILURE(InitState());
13953 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13954
13955 auto features = m_device->phy().features();
13956 // Set the expected error depending on whether or not logicOp available
13957 if (VK_FALSE == features.logicOp) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013958 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "If logic operations feature not "
13959 "enabled, logicOpEnable must be "
13960 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013961 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130013962 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013963 }
13964 // Create a pipeline using logicOp
13965 VkResult err;
13966
13967 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13968 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13969
13970 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013971 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013972 ASSERT_VK_SUCCESS(err);
13973
13974 VkPipelineViewportStateCreateInfo vp_state_ci = {};
13975 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13976 vp_state_ci.viewportCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013977 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013978 vp_state_ci.pViewports = &vp;
13979 vp_state_ci.scissorCount = 1;
13980 VkRect2D scissors = {}; // Dummy scissors to point to
13981 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013982
13983 VkPipelineShaderStageCreateInfo shaderStages[2];
13984 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
13985
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013986 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13987 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013988 shaderStages[0] = vs.GetStageCreateInfo();
13989 shaderStages[1] = fs.GetStageCreateInfo();
13990
13991 VkPipelineVertexInputStateCreateInfo vi_ci = {};
13992 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13993
13994 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
13995 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13996 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13997
13998 VkPipelineRasterizationStateCreateInfo rs_ci = {};
13999 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130014000 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014001
14002 VkPipelineColorBlendAttachmentState att = {};
14003 att.blendEnable = VK_FALSE;
14004 att.colorWriteMask = 0xf;
14005
14006 VkPipelineColorBlendStateCreateInfo cb_ci = {};
14007 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
14008 // Enable logicOp & set logicOp to value 1 beyond allowed entries
14009 cb_ci.logicOpEnable = VK_TRUE;
14010 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
14011 cb_ci.attachmentCount = 1;
14012 cb_ci.pAttachments = &att;
14013
Chris Forbes8aeacbf2016-10-03 14:25:08 +130014014 VkPipelineMultisampleStateCreateInfo ms_ci = {};
14015 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
14016 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
14017
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014018 VkGraphicsPipelineCreateInfo gp_ci = {};
14019 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
14020 gp_ci.stageCount = 2;
14021 gp_ci.pStages = shaderStages;
14022 gp_ci.pVertexInputState = &vi_ci;
14023 gp_ci.pInputAssemblyState = &ia_ci;
14024 gp_ci.pViewportState = &vp_state_ci;
14025 gp_ci.pRasterizationState = &rs_ci;
14026 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130014027 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014028 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
14029 gp_ci.layout = pipeline_layout;
14030 gp_ci.renderPass = renderPass();
14031
14032 VkPipelineCacheCreateInfo pc_ci = {};
14033 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
14034
14035 VkPipeline pipeline;
14036 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014037 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014038 ASSERT_VK_SUCCESS(err);
14039
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014040 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014041 m_errorMonitor->VerifyFound();
14042 if (VK_SUCCESS == err) {
14043 vkDestroyPipeline(m_device->device(), pipeline, NULL);
14044 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014045 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
14046 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
14047}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014048#endif // DRAW_STATE_TESTS
14049
Tobin Ehlis0788f522015-05-26 16:11:58 -060014050#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -060014051#if GTEST_IS_THREADSAFE
14052struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014053 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014054 VkEvent event;
14055 bool bailout;
14056};
14057
Karl Schultz6addd812016-02-02 17:17:23 -070014058extern "C" void *AddToCommandBuffer(void *arg) {
14059 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014060
Mike Stroyana6d14942016-07-13 15:10:05 -060014061 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014062 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014063 if (data->bailout) {
14064 break;
14065 }
14066 }
14067 return NULL;
14068}
14069
Karl Schultz6addd812016-02-02 17:17:23 -070014070TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060014071 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014072
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014073 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014074
Mike Stroyanaccf7692015-05-12 16:00:45 -060014075 ASSERT_NO_FATAL_FAILURE(InitState());
14076 ASSERT_NO_FATAL_FAILURE(InitViewport());
14077 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14078
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014079 // Calls AllocateCommandBuffers
14080 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060014081
14082 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014083 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014084
14085 VkEventCreateInfo event_info;
14086 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014087 VkResult err;
14088
14089 memset(&event_info, 0, sizeof(event_info));
14090 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
14091
Chia-I Wuf7458c52015-10-26 21:10:41 +080014092 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014093 ASSERT_VK_SUCCESS(err);
14094
Mike Stroyanaccf7692015-05-12 16:00:45 -060014095 err = vkResetEvent(device(), event);
14096 ASSERT_VK_SUCCESS(err);
14097
14098 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014099 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014100 data.event = event;
14101 data.bailout = false;
14102 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060014103
14104 // First do some correct operations using multiple threads.
14105 // Add many entries to command buffer from another thread.
14106 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
14107 // Make non-conflicting calls from this thread at the same time.
14108 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060014109 uint32_t count;
14110 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060014111 }
14112 test_platform_thread_join(thread, NULL);
14113
14114 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060014115 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060014116 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014117 // Add many entries to command buffer from this thread at the same time.
14118 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060014119
Mike Stroyan4268d1f2015-07-13 14:45:35 -060014120 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014121 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014122
Mike Stroyan10b8cb72016-01-22 15:22:03 -070014123 m_errorMonitor->SetBailout(NULL);
14124
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014125 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014126
Chia-I Wuf7458c52015-10-26 21:10:41 +080014127 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014128}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014129#endif // GTEST_IS_THREADSAFE
14130#endif // THREADING_TESTS
14131
Chris Forbes9f7ff632015-05-25 11:13:08 +120014132#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070014133TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014134 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
14135 "with an impossible code size");
14136
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014137 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014138
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014139 ASSERT_NO_FATAL_FAILURE(InitState());
14140 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14141
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014142 VkShaderModule module;
14143 VkShaderModuleCreateInfo moduleCreateInfo;
14144 struct icd_spv_header spv;
14145
14146 spv.magic = ICD_SPV_MAGIC;
14147 spv.version = ICD_SPV_VERSION;
14148 spv.gen_magic = 0;
14149
14150 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14151 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070014152 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014153 moduleCreateInfo.codeSize = 4;
14154 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014155 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014156
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014157 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014158}
14159
Karl Schultz6addd812016-02-02 17:17:23 -070014160TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014161 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
14162 "with a bad magic number");
14163
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014164 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014165
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014166 ASSERT_NO_FATAL_FAILURE(InitState());
14167 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14168
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014169 VkShaderModule module;
14170 VkShaderModuleCreateInfo moduleCreateInfo;
14171 struct icd_spv_header spv;
14172
14173 spv.magic = ~ICD_SPV_MAGIC;
14174 spv.version = ICD_SPV_VERSION;
14175 spv.gen_magic = 0;
14176
14177 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14178 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070014179 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014180 moduleCreateInfo.codeSize = sizeof(spv) + 10;
14181 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014182 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014183
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014184 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014185}
14186
Chris Forbesb4afd0f2016-04-04 10:48:35 +120014187#if 0
14188// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070014189TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014190 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120014191 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014192
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014193 ASSERT_NO_FATAL_FAILURE(InitState());
14194 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14195
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014196 VkShaderModule module;
14197 VkShaderModuleCreateInfo moduleCreateInfo;
14198 struct icd_spv_header spv;
14199
14200 spv.magic = ICD_SPV_MAGIC;
14201 spv.version = ~ICD_SPV_VERSION;
14202 spv.gen_magic = 0;
14203
14204 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14205 moduleCreateInfo.pNext = NULL;
14206
Karl Schultz6addd812016-02-02 17:17:23 -070014207 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014208 moduleCreateInfo.codeSize = sizeof(spv) + 10;
14209 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014210 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014211
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014212 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014213}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120014214#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014215
Karl Schultz6addd812016-02-02 17:17:23 -070014216TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014217 TEST_DESCRIPTION("Test that a warning is produced for a vertex output that "
14218 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014220
Chris Forbes9f7ff632015-05-25 11:13:08 +120014221 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014222 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120014223
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014224 char const *vsSource = "#version 450\n"
14225 "\n"
14226 "layout(location=0) out float x;\n"
14227 "out gl_PerVertex {\n"
14228 " vec4 gl_Position;\n"
14229 "};\n"
14230 "void main(){\n"
14231 " gl_Position = vec4(1);\n"
14232 " x = 0;\n"
14233 "}\n";
14234 char const *fsSource = "#version 450\n"
14235 "\n"
14236 "layout(location=0) out vec4 color;\n"
14237 "void main(){\n"
14238 " color = vec4(1);\n"
14239 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120014240
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014241 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14242 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120014243
14244 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014245 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120014246 pipe.AddShader(&vs);
14247 pipe.AddShader(&fs);
14248
Chris Forbes9f7ff632015-05-25 11:13:08 +120014249 VkDescriptorSetObj descriptorSet(m_device);
14250 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014251 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120014252
Tony Barbour5781e8f2015-08-04 16:23:11 -060014253 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120014254
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014255 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120014256}
Chris Forbes9f7ff632015-05-25 11:13:08 +120014257
Karl Schultz6addd812016-02-02 17:17:23 -070014258TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014259 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
14260 "which is not present in the outputs of the previous stage");
14261
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014262 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014263
Chris Forbes59cb88d2015-05-25 11:13:13 +120014264 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014265 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014266
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014267 char const *vsSource = "#version 450\n"
14268 "\n"
14269 "out gl_PerVertex {\n"
14270 " vec4 gl_Position;\n"
14271 "};\n"
14272 "void main(){\n"
14273 " gl_Position = vec4(1);\n"
14274 "}\n";
14275 char const *fsSource = "#version 450\n"
14276 "\n"
14277 "layout(location=0) in float x;\n"
14278 "layout(location=0) out vec4 color;\n"
14279 "void main(){\n"
14280 " color = vec4(x);\n"
14281 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120014282
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014283 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14284 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014285
14286 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014287 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014288 pipe.AddShader(&vs);
14289 pipe.AddShader(&fs);
14290
Chris Forbes59cb88d2015-05-25 11:13:13 +120014291 VkDescriptorSetObj descriptorSet(m_device);
14292 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014293 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014294
Tony Barbour5781e8f2015-08-04 16:23:11 -060014295 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014296
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014297 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014298}
14299
Karl Schultz6addd812016-02-02 17:17:23 -070014300TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014301 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
14302 "within an interace block, which is not present in the outputs "
14303 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014304 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014305
14306 ASSERT_NO_FATAL_FAILURE(InitState());
14307 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14308
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014309 char const *vsSource = "#version 450\n"
14310 "\n"
14311 "out gl_PerVertex {\n"
14312 " vec4 gl_Position;\n"
14313 "};\n"
14314 "void main(){\n"
14315 " gl_Position = vec4(1);\n"
14316 "}\n";
14317 char const *fsSource = "#version 450\n"
14318 "\n"
14319 "in block { layout(location=0) float x; } ins;\n"
14320 "layout(location=0) out vec4 color;\n"
14321 "void main(){\n"
14322 " color = vec4(ins.x);\n"
14323 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014324
14325 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14326 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14327
14328 VkPipelineObj pipe(m_device);
14329 pipe.AddColorAttachment();
14330 pipe.AddShader(&vs);
14331 pipe.AddShader(&fs);
14332
14333 VkDescriptorSetObj descriptorSet(m_device);
14334 descriptorSet.AppendDummy();
14335 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14336
14337 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14338
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014339 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014340}
14341
Karl Schultz6addd812016-02-02 17:17:23 -070014342TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014343 TEST_DESCRIPTION("Test that an error is produced for mismatched array sizes "
14344 "across the VS->FS interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0.0: 'ptr to "
14346 "output arr[2] of float32' vs 'ptr to "
14347 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130014348
14349 ASSERT_NO_FATAL_FAILURE(InitState());
14350 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14351
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014352 char const *vsSource = "#version 450\n"
14353 "\n"
14354 "layout(location=0) out float x[2];\n"
14355 "out gl_PerVertex {\n"
14356 " vec4 gl_Position;\n"
14357 "};\n"
14358 "void main(){\n"
14359 " x[0] = 0; x[1] = 0;\n"
14360 " gl_Position = vec4(1);\n"
14361 "}\n";
14362 char const *fsSource = "#version 450\n"
14363 "\n"
14364 "layout(location=0) in float x[3];\n"
14365 "layout(location=0) out vec4 color;\n"
14366 "void main(){\n"
14367 " color = vec4(x[0] + x[1] + x[2]);\n"
14368 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130014369
14370 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14371 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14372
14373 VkPipelineObj pipe(m_device);
14374 pipe.AddColorAttachment();
14375 pipe.AddShader(&vs);
14376 pipe.AddShader(&fs);
14377
14378 VkDescriptorSetObj descriptorSet(m_device);
14379 descriptorSet.AppendDummy();
14380 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14381
14382 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14383
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014384 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130014385}
14386
Karl Schultz6addd812016-02-02 17:17:23 -070014387TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014388 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
14389 "the VS->FS interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014390 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014391
Chris Forbesb56af562015-05-25 11:13:17 +120014392 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014393 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120014394
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014395 char const *vsSource = "#version 450\n"
14396 "\n"
14397 "layout(location=0) out int x;\n"
14398 "out gl_PerVertex {\n"
14399 " vec4 gl_Position;\n"
14400 "};\n"
14401 "void main(){\n"
14402 " x = 0;\n"
14403 " gl_Position = vec4(1);\n"
14404 "}\n";
14405 char const *fsSource = "#version 450\n"
14406 "\n"
14407 "layout(location=0) in float x;\n" /* VS writes int */
14408 "layout(location=0) out vec4 color;\n"
14409 "void main(){\n"
14410 " color = vec4(x);\n"
14411 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120014412
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014413 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14414 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120014415
14416 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014417 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120014418 pipe.AddShader(&vs);
14419 pipe.AddShader(&fs);
14420
Chris Forbesb56af562015-05-25 11:13:17 +120014421 VkDescriptorSetObj descriptorSet(m_device);
14422 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014423 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120014424
Tony Barbour5781e8f2015-08-04 16:23:11 -060014425 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120014426
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014427 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120014428}
14429
Karl Schultz6addd812016-02-02 17:17:23 -070014430TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014431 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
14432 "the VS->FS interface, when the variable is contained within "
14433 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014434 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014435
14436 ASSERT_NO_FATAL_FAILURE(InitState());
14437 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14438
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014439 char const *vsSource = "#version 450\n"
14440 "\n"
14441 "out block { layout(location=0) int x; } outs;\n"
14442 "out gl_PerVertex {\n"
14443 " vec4 gl_Position;\n"
14444 "};\n"
14445 "void main(){\n"
14446 " outs.x = 0;\n"
14447 " gl_Position = vec4(1);\n"
14448 "}\n";
14449 char const *fsSource = "#version 450\n"
14450 "\n"
14451 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
14452 "layout(location=0) out vec4 color;\n"
14453 "void main(){\n"
14454 " color = vec4(ins.x);\n"
14455 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014456
14457 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14458 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14459
14460 VkPipelineObj pipe(m_device);
14461 pipe.AddColorAttachment();
14462 pipe.AddShader(&vs);
14463 pipe.AddShader(&fs);
14464
14465 VkDescriptorSetObj descriptorSet(m_device);
14466 descriptorSet.AppendDummy();
14467 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14468
14469 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14470
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014471 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014472}
14473
14474TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014475 TEST_DESCRIPTION("Test that an error is produced for location mismatches across "
14476 "the VS->FS interface; This should manifest as a not-written/not-consumed "
14477 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014478 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 +130014479
14480 ASSERT_NO_FATAL_FAILURE(InitState());
14481 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14482
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014483 char const *vsSource = "#version 450\n"
14484 "\n"
14485 "out block { layout(location=1) float x; } outs;\n"
14486 "out gl_PerVertex {\n"
14487 " vec4 gl_Position;\n"
14488 "};\n"
14489 "void main(){\n"
14490 " outs.x = 0;\n"
14491 " gl_Position = vec4(1);\n"
14492 "}\n";
14493 char const *fsSource = "#version 450\n"
14494 "\n"
14495 "in block { layout(location=0) float x; } ins;\n"
14496 "layout(location=0) out vec4 color;\n"
14497 "void main(){\n"
14498 " color = vec4(ins.x);\n"
14499 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014500
14501 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14502 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14503
14504 VkPipelineObj pipe(m_device);
14505 pipe.AddColorAttachment();
14506 pipe.AddShader(&vs);
14507 pipe.AddShader(&fs);
14508
14509 VkDescriptorSetObj descriptorSet(m_device);
14510 descriptorSet.AppendDummy();
14511 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14512
14513 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14514
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014515 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014516}
14517
14518TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014519 TEST_DESCRIPTION("Test that an error is produced for component mismatches across the "
14520 "VS->FS interface. It's not enough to have the same set of locations in "
14521 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014522 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 +130014523
14524 ASSERT_NO_FATAL_FAILURE(InitState());
14525 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14526
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014527 char const *vsSource = "#version 450\n"
14528 "\n"
14529 "out block { layout(location=0, component=0) float x; } outs;\n"
14530 "out gl_PerVertex {\n"
14531 " vec4 gl_Position;\n"
14532 "};\n"
14533 "void main(){\n"
14534 " outs.x = 0;\n"
14535 " gl_Position = vec4(1);\n"
14536 "}\n";
14537 char const *fsSource = "#version 450\n"
14538 "\n"
14539 "in block { layout(location=0, component=1) float x; } ins;\n"
14540 "layout(location=0) out vec4 color;\n"
14541 "void main(){\n"
14542 " color = vec4(ins.x);\n"
14543 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014544
14545 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14546 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14547
14548 VkPipelineObj pipe(m_device);
14549 pipe.AddColorAttachment();
14550 pipe.AddShader(&vs);
14551 pipe.AddShader(&fs);
14552
14553 VkDescriptorSetObj descriptorSet(m_device);
14554 descriptorSet.AppendDummy();
14555 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14556
14557 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14558
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014559 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014560}
14561
Karl Schultz6addd812016-02-02 17:17:23 -070014562TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014563 TEST_DESCRIPTION("Test that a warning is produced for a vertex attribute which is "
14564 "not consumed by the vertex shader");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014565 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014566
Chris Forbesde136e02015-05-25 11:13:28 +120014567 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014568 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120014569
14570 VkVertexInputBindingDescription input_binding;
14571 memset(&input_binding, 0, sizeof(input_binding));
14572
14573 VkVertexInputAttributeDescription input_attrib;
14574 memset(&input_attrib, 0, sizeof(input_attrib));
14575 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14576
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014577 char const *vsSource = "#version 450\n"
14578 "\n"
14579 "out gl_PerVertex {\n"
14580 " vec4 gl_Position;\n"
14581 "};\n"
14582 "void main(){\n"
14583 " gl_Position = vec4(1);\n"
14584 "}\n";
14585 char const *fsSource = "#version 450\n"
14586 "\n"
14587 "layout(location=0) out vec4 color;\n"
14588 "void main(){\n"
14589 " color = vec4(1);\n"
14590 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120014591
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014592 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14593 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120014594
14595 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014596 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120014597 pipe.AddShader(&vs);
14598 pipe.AddShader(&fs);
14599
14600 pipe.AddVertexInputBindings(&input_binding, 1);
14601 pipe.AddVertexInputAttribs(&input_attrib, 1);
14602
Chris Forbesde136e02015-05-25 11:13:28 +120014603 VkDescriptorSetObj descriptorSet(m_device);
14604 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014605 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120014606
Tony Barbour5781e8f2015-08-04 16:23:11 -060014607 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120014608
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014609 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120014610}
14611
Karl Schultz6addd812016-02-02 17:17:23 -070014612TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014613 TEST_DESCRIPTION("Test that a warning is produced for a location mismatch on "
14614 "vertex attributes. This flushes out bad behavior in the interface walker");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014615 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014616
14617 ASSERT_NO_FATAL_FAILURE(InitState());
14618 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14619
14620 VkVertexInputBindingDescription input_binding;
14621 memset(&input_binding, 0, sizeof(input_binding));
14622
14623 VkVertexInputAttributeDescription input_attrib;
14624 memset(&input_attrib, 0, sizeof(input_attrib));
14625 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14626
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014627 char const *vsSource = "#version 450\n"
14628 "\n"
14629 "layout(location=1) in float x;\n"
14630 "out gl_PerVertex {\n"
14631 " vec4 gl_Position;\n"
14632 "};\n"
14633 "void main(){\n"
14634 " gl_Position = vec4(x);\n"
14635 "}\n";
14636 char const *fsSource = "#version 450\n"
14637 "\n"
14638 "layout(location=0) out vec4 color;\n"
14639 "void main(){\n"
14640 " color = vec4(1);\n"
14641 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130014642
14643 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14644 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14645
14646 VkPipelineObj pipe(m_device);
14647 pipe.AddColorAttachment();
14648 pipe.AddShader(&vs);
14649 pipe.AddShader(&fs);
14650
14651 pipe.AddVertexInputBindings(&input_binding, 1);
14652 pipe.AddVertexInputAttribs(&input_attrib, 1);
14653
14654 VkDescriptorSetObj descriptorSet(m_device);
14655 descriptorSet.AppendDummy();
14656 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14657
14658 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14659
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014660 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130014661}
14662
Karl Schultz6addd812016-02-02 17:17:23 -070014663TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mike Weiblen15bd38e2016-10-03 19:19:41 -060014664 TEST_DESCRIPTION("Test that an error is produced for a vertex shader input which is not "
Chris Forbes1cc79542016-07-20 11:13:44 +120014665 "provided by a vertex attribute");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060014666 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 -060014667
Chris Forbes62e8e502015-05-25 11:13:29 +120014668 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014669 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120014670
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014671 char const *vsSource = "#version 450\n"
14672 "\n"
14673 "layout(location=0) in vec4 x;\n" /* not provided */
14674 "out gl_PerVertex {\n"
14675 " vec4 gl_Position;\n"
14676 "};\n"
14677 "void main(){\n"
14678 " gl_Position = x;\n"
14679 "}\n";
14680 char const *fsSource = "#version 450\n"
14681 "\n"
14682 "layout(location=0) out vec4 color;\n"
14683 "void main(){\n"
14684 " color = vec4(1);\n"
14685 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120014686
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014687 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14688 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120014689
14690 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014691 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120014692 pipe.AddShader(&vs);
14693 pipe.AddShader(&fs);
14694
Chris Forbes62e8e502015-05-25 11:13:29 +120014695 VkDescriptorSetObj descriptorSet(m_device);
14696 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014697 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120014698
Tony Barbour5781e8f2015-08-04 16:23:11 -060014699 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120014700
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014701 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120014702}
14703
Karl Schultz6addd812016-02-02 17:17:23 -070014704TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014705 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the "
14706 "fundamental type (float/int/uint) of an attribute and the "
Mike Weiblen15bd38e2016-10-03 19:19:41 -060014707 "vertex shader input that consumes it");
14708 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 -060014709
Chris Forbesc97d98e2015-05-25 11:13:31 +120014710 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014711 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014712
14713 VkVertexInputBindingDescription input_binding;
14714 memset(&input_binding, 0, sizeof(input_binding));
14715
14716 VkVertexInputAttributeDescription input_attrib;
14717 memset(&input_attrib, 0, sizeof(input_attrib));
14718 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14719
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014720 char const *vsSource = "#version 450\n"
14721 "\n"
14722 "layout(location=0) in int x;\n" /* attrib provided float */
14723 "out gl_PerVertex {\n"
14724 " vec4 gl_Position;\n"
14725 "};\n"
14726 "void main(){\n"
14727 " gl_Position = vec4(x);\n"
14728 "}\n";
14729 char const *fsSource = "#version 450\n"
14730 "\n"
14731 "layout(location=0) out vec4 color;\n"
14732 "void main(){\n"
14733 " color = vec4(1);\n"
14734 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120014735
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014736 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14737 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014738
14739 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014740 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014741 pipe.AddShader(&vs);
14742 pipe.AddShader(&fs);
14743
14744 pipe.AddVertexInputBindings(&input_binding, 1);
14745 pipe.AddVertexInputAttribs(&input_attrib, 1);
14746
Chris Forbesc97d98e2015-05-25 11:13:31 +120014747 VkDescriptorSetObj descriptorSet(m_device);
14748 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014749 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014750
Tony Barbour5781e8f2015-08-04 16:23:11 -060014751 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014752
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014753 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014754}
14755
Chris Forbesc68b43c2016-04-06 11:18:47 +120014756TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014757 TEST_DESCRIPTION("Test that an error is produced for a pipeline containing multiple "
14758 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014759 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14760 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120014761
14762 ASSERT_NO_FATAL_FAILURE(InitState());
14763 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14764
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014765 char const *vsSource = "#version 450\n"
14766 "\n"
14767 "out gl_PerVertex {\n"
14768 " vec4 gl_Position;\n"
14769 "};\n"
14770 "void main(){\n"
14771 " gl_Position = vec4(1);\n"
14772 "}\n";
14773 char const *fsSource = "#version 450\n"
14774 "\n"
14775 "layout(location=0) out vec4 color;\n"
14776 "void main(){\n"
14777 " color = vec4(1);\n"
14778 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120014779
14780 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14781 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14782
14783 VkPipelineObj pipe(m_device);
14784 pipe.AddColorAttachment();
14785 pipe.AddShader(&vs);
14786 pipe.AddShader(&vs);
14787 pipe.AddShader(&fs);
14788
14789 VkDescriptorSetObj descriptorSet(m_device);
14790 descriptorSet.AppendDummy();
14791 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14792
14793 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14794
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014795 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120014796}
14797
Karl Schultz6addd812016-02-02 17:17:23 -070014798TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014799 TEST_DESCRIPTION("Test that pipeline validation accepts matrices passed "
14800 "as vertex attributes");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014801 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130014802
14803 ASSERT_NO_FATAL_FAILURE(InitState());
14804 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14805
14806 VkVertexInputBindingDescription input_binding;
14807 memset(&input_binding, 0, sizeof(input_binding));
14808
14809 VkVertexInputAttributeDescription input_attribs[2];
14810 memset(input_attribs, 0, sizeof(input_attribs));
14811
14812 for (int i = 0; i < 2; i++) {
14813 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
14814 input_attribs[i].location = i;
14815 }
14816
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014817 char const *vsSource = "#version 450\n"
14818 "\n"
14819 "layout(location=0) in mat2x4 x;\n"
14820 "out gl_PerVertex {\n"
14821 " vec4 gl_Position;\n"
14822 "};\n"
14823 "void main(){\n"
14824 " gl_Position = x[0] + x[1];\n"
14825 "}\n";
14826 char const *fsSource = "#version 450\n"
14827 "\n"
14828 "layout(location=0) out vec4 color;\n"
14829 "void main(){\n"
14830 " color = vec4(1);\n"
14831 "}\n";
Chris Forbes2682b242015-11-24 11:13:14 +130014832
14833 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14834 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14835
14836 VkPipelineObj pipe(m_device);
14837 pipe.AddColorAttachment();
14838 pipe.AddShader(&vs);
14839 pipe.AddShader(&fs);
14840
14841 pipe.AddVertexInputBindings(&input_binding, 1);
14842 pipe.AddVertexInputAttribs(input_attribs, 2);
14843
14844 VkDescriptorSetObj descriptorSet(m_device);
14845 descriptorSet.AppendDummy();
14846 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14847
14848 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14849
14850 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014851 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130014852}
14853
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014854TEST_F(VkLayerTest, CreatePipelineAttribArrayType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014855 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130014856
14857 ASSERT_NO_FATAL_FAILURE(InitState());
14858 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14859
14860 VkVertexInputBindingDescription input_binding;
14861 memset(&input_binding, 0, sizeof(input_binding));
14862
14863 VkVertexInputAttributeDescription input_attribs[2];
14864 memset(input_attribs, 0, sizeof(input_attribs));
14865
14866 for (int i = 0; i < 2; i++) {
14867 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
14868 input_attribs[i].location = i;
14869 }
14870
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014871 char const *vsSource = "#version 450\n"
14872 "\n"
14873 "layout(location=0) in vec4 x[2];\n"
14874 "out gl_PerVertex {\n"
14875 " vec4 gl_Position;\n"
14876 "};\n"
14877 "void main(){\n"
14878 " gl_Position = x[0] + x[1];\n"
14879 "}\n";
14880 char const *fsSource = "#version 450\n"
14881 "\n"
14882 "layout(location=0) out vec4 color;\n"
14883 "void main(){\n"
14884 " color = vec4(1);\n"
14885 "}\n";
Chris Forbes2682b242015-11-24 11:13:14 +130014886
14887 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14888 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14889
14890 VkPipelineObj pipe(m_device);
14891 pipe.AddColorAttachment();
14892 pipe.AddShader(&vs);
14893 pipe.AddShader(&fs);
14894
14895 pipe.AddVertexInputBindings(&input_binding, 1);
14896 pipe.AddVertexInputAttribs(input_attribs, 2);
14897
14898 VkDescriptorSetObj descriptorSet(m_device);
14899 descriptorSet.AppendDummy();
14900 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14901
14902 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14903
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014904 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130014905}
Chris Forbes2682b242015-11-24 11:13:14 +130014906
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014907TEST_F(VkLayerTest, CreatePipelineAttribComponents) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014908 TEST_DESCRIPTION("Test that pipeline validation accepts consuming a vertex attribute "
Mike Weiblen15bd38e2016-10-03 19:19:41 -060014909 "through multiple vertex shader inputs, each consuming a different "
14910 "subset of the components.");
Chris Forbesbc290ce2016-07-06 12:01:49 +120014911 m_errorMonitor->ExpectSuccess();
14912
14913 ASSERT_NO_FATAL_FAILURE(InitState());
14914 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14915
14916 VkVertexInputBindingDescription input_binding;
14917 memset(&input_binding, 0, sizeof(input_binding));
14918
14919 VkVertexInputAttributeDescription input_attribs[3];
14920 memset(input_attribs, 0, sizeof(input_attribs));
14921
14922 for (int i = 0; i < 3; i++) {
14923 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
14924 input_attribs[i].location = i;
14925 }
14926
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014927 char const *vsSource = "#version 450\n"
14928 "\n"
14929 "layout(location=0) in vec4 x;\n"
14930 "layout(location=1) in vec3 y1;\n"
14931 "layout(location=1, component=3) in float y2;\n"
14932 "layout(location=2) in vec4 z;\n"
14933 "out gl_PerVertex {\n"
14934 " vec4 gl_Position;\n"
14935 "};\n"
14936 "void main(){\n"
14937 " gl_Position = x + vec4(y1, y2) + z;\n"
14938 "}\n";
14939 char const *fsSource = "#version 450\n"
14940 "\n"
14941 "layout(location=0) out vec4 color;\n"
14942 "void main(){\n"
14943 " color = vec4(1);\n"
14944 "}\n";
Chris Forbesbc290ce2016-07-06 12:01:49 +120014945
14946 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14947 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14948
14949 VkPipelineObj pipe(m_device);
14950 pipe.AddColorAttachment();
14951 pipe.AddShader(&vs);
14952 pipe.AddShader(&fs);
14953
14954 pipe.AddVertexInputBindings(&input_binding, 1);
14955 pipe.AddVertexInputAttribs(input_attribs, 3);
14956
14957 VkDescriptorSetObj descriptorSet(m_device);
14958 descriptorSet.AppendDummy();
14959 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14960
14961 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14962
14963 m_errorMonitor->VerifyNotFound();
14964}
14965
Chris Forbes82ff92a2016-09-09 10:50:24 +120014966TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
14967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14968 "No entrypoint found named `foo`");
14969
14970 ASSERT_NO_FATAL_FAILURE(InitState());
14971 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14972
14973 char const *vsSource = "#version 450\n"
14974 "out gl_PerVertex {\n"
14975 " vec4 gl_Position;\n"
14976 "};\n"
14977 "void main(){\n"
14978 " gl_Position = vec4(0);\n"
14979 "}\n";
14980 char const *fsSource = "#version 450\n"
14981 "\n"
14982 "layout(location=0) out vec4 color;\n"
14983 "void main(){\n"
14984 " color = vec4(1);\n"
14985 "}\n";
14986
14987 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14988 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
14989
14990 VkPipelineObj pipe(m_device);
14991 pipe.AddColorAttachment();
14992 pipe.AddShader(&vs);
14993 pipe.AddShader(&fs);
14994
14995 VkDescriptorSetObj descriptorSet(m_device);
14996 descriptorSet.AppendDummy();
14997 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14998
14999 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15000
15001 m_errorMonitor->VerifyFound();
15002}
15003
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015004TEST_F(VkLayerTest, CreatePipelineSimplePositive) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015005 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120015006
15007 ASSERT_NO_FATAL_FAILURE(InitState());
15008 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15009
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015010 char const *vsSource = "#version 450\n"
15011 "out gl_PerVertex {\n"
15012 " vec4 gl_Position;\n"
15013 "};\n"
15014 "void main(){\n"
15015 " gl_Position = vec4(0);\n"
15016 "}\n";
15017 char const *fsSource = "#version 450\n"
15018 "\n"
15019 "layout(location=0) out vec4 color;\n"
15020 "void main(){\n"
15021 " color = vec4(1);\n"
15022 "}\n";
Chris Forbes4ea14fc2016-04-04 18:52:54 +120015023
15024 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15025 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15026
15027 VkPipelineObj pipe(m_device);
15028 pipe.AddColorAttachment();
15029 pipe.AddShader(&vs);
15030 pipe.AddShader(&fs);
15031
15032 VkDescriptorSetObj descriptorSet(m_device);
15033 descriptorSet.AppendDummy();
15034 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15035
15036 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15037
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015038 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120015039}
15040
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015041TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
15042 m_errorMonitor->SetDesiredFailureMsg(
15043 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15044 "pDepthStencilState is NULL when rasterization is enabled and subpass "
15045 "uses a depth/stencil attachment");
15046
15047 ASSERT_NO_FATAL_FAILURE(InitState());
15048 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15049
15050 char const *vsSource = "#version 450\n"
15051 "void main(){ gl_Position = vec4(0); }\n";
15052 char const *fsSource = "#version 450\n"
15053 "\n"
15054 "layout(location=0) out vec4 color;\n"
15055 "void main(){\n"
15056 " color = vec4(1);\n"
15057 "}\n";
15058
15059 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15060 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15061
15062 VkPipelineObj pipe(m_device);
15063 pipe.AddColorAttachment();
15064 pipe.AddShader(&vs);
15065 pipe.AddShader(&fs);
15066
15067 VkDescriptorSetObj descriptorSet(m_device);
15068 descriptorSet.AppendDummy();
15069 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15070
15071 VkAttachmentDescription attachments[] = {
15072 { 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
15073 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
15074 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
15075 VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15076 },
15077 { 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT,
15078 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
15079 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
15080 VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
15081 },
15082 };
15083 VkAttachmentReference refs[] = {
15084 { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL },
15085 { 1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL },
15086 };
15087 VkSubpassDescription subpass = {
15088 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
15089 1, &refs[0], nullptr, &refs[1],
15090 0, nullptr
15091 };
15092 VkRenderPassCreateInfo rpci = {
15093 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
15094 0, 2, attachments, 1, &subpass, 0, nullptr
15095 };
15096 VkRenderPass rp;
15097 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15098 ASSERT_VK_SUCCESS(err);
15099
15100 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
15101
15102 m_errorMonitor->VerifyFound();
15103
15104 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15105}
15106
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015107TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120015108 TEST_DESCRIPTION("Test that pipeline validation accepts the relaxed type matching rules "
15109 "set out in 14.1.3: fundamental type must match, and producer side must "
15110 "have at least as many components");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015111 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +120015112
15113 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
15114
15115 ASSERT_NO_FATAL_FAILURE(InitState());
15116 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15117
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015118 char const *vsSource = "#version 450\n"
15119 "out gl_PerVertex {\n"
15120 " vec4 gl_Position;\n"
15121 "};\n"
15122 "layout(location=0) out vec3 x;\n"
15123 "layout(location=1) out ivec3 y;\n"
15124 "layout(location=2) out vec3 z;\n"
15125 "void main(){\n"
15126 " gl_Position = vec4(0);\n"
15127 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
15128 "}\n";
15129 char const *fsSource = "#version 450\n"
15130 "\n"
15131 "layout(location=0) out vec4 color;\n"
15132 "layout(location=0) in float x;\n"
15133 "layout(location=1) flat in int y;\n"
15134 "layout(location=2) in vec2 z;\n"
15135 "void main(){\n"
15136 " color = vec4(1 + x + y + z.x);\n"
15137 "}\n";
Chris Forbes912c9192016-04-05 17:50:35 +120015138
15139 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15140 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15141
15142 VkPipelineObj pipe(m_device);
15143 pipe.AddColorAttachment();
15144 pipe.AddShader(&vs);
15145 pipe.AddShader(&fs);
15146
15147 VkDescriptorSetObj descriptorSet(m_device);
15148 descriptorSet.AppendDummy();
15149 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15150
Mike Stroyan255e9582016-06-24 09:49:32 -060015151 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015152 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Mike Stroyan255e9582016-06-24 09:49:32 -060015153 ASSERT_VK_SUCCESS(err);
15154
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015155 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +120015156}
15157
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015158TEST_F(VkLayerTest, CreatePipelineTessPerVertex) {
Chris Forbes1cc79542016-07-20 11:13:44 +120015159 TEST_DESCRIPTION("Test that pipeline validation accepts per-vertex variables "
15160 "passed between the TCS and TES stages");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015161 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120015162
15163 ASSERT_NO_FATAL_FAILURE(InitState());
15164 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15165
Chris Forbesc1e852d2016-04-04 19:26:42 +120015166 if (!m_device->phy().features().tessellationShader) {
15167 printf("Device does not support tessellation shaders; skipped.\n");
15168 return;
15169 }
15170
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015171 char const *vsSource = "#version 450\n"
15172 "void main(){}\n";
15173 char const *tcsSource = "#version 450\n"
15174 "layout(location=0) out int x[];\n"
15175 "layout(vertices=3) out;\n"
15176 "void main(){\n"
15177 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
15178 " gl_TessLevelInner[0] = 1;\n"
15179 " x[gl_InvocationID] = gl_InvocationID;\n"
15180 "}\n";
15181 char const *tesSource = "#version 450\n"
15182 "layout(triangles, equal_spacing, cw) in;\n"
15183 "layout(location=0) in int x[];\n"
15184 "out gl_PerVertex { vec4 gl_Position; };\n"
15185 "void main(){\n"
15186 " gl_Position.xyz = gl_TessCoord;\n"
15187 " gl_Position.w = x[0] + x[1] + x[2];\n"
15188 "}\n";
15189 char const *fsSource = "#version 450\n"
15190 "layout(location=0) out vec4 color;\n"
15191 "void main(){\n"
15192 " color = vec4(1);\n"
15193 "}\n";
Chris Forbes4ea14fc2016-04-04 18:52:54 +120015194
15195 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15196 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
15197 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
15198 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15199
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015200 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
15201 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbes4ea14fc2016-04-04 18:52:54 +120015202
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015203 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesb4cacb62016-04-04 19:15:00 +120015204
Chris Forbes4ea14fc2016-04-04 18:52:54 +120015205 VkPipelineObj pipe(m_device);
15206 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +120015207 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +120015208 pipe.AddColorAttachment();
15209 pipe.AddShader(&vs);
15210 pipe.AddShader(&tcs);
15211 pipe.AddShader(&tes);
15212 pipe.AddShader(&fs);
15213
15214 VkDescriptorSetObj descriptorSet(m_device);
15215 descriptorSet.AppendDummy();
15216 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15217
15218 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15219
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015220 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120015221}
15222
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015223TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive) {
Chris Forbes1cc79542016-07-20 11:13:44 +120015224 TEST_DESCRIPTION("Test that pipeline validation accepts a user-defined "
15225 "interface block passed into the geometry shader. This "
15226 "is interesting because the 'extra' array level is not "
15227 "present on the member type, but on the block instance.");
Chris Forbesa0ab8152016-04-20 13:34:27 +120015228 m_errorMonitor->ExpectSuccess();
15229
15230 ASSERT_NO_FATAL_FAILURE(InitState());
15231 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15232
15233 if (!m_device->phy().features().geometryShader) {
15234 printf("Device does not support geometry shaders; skipped.\n");
15235 return;
15236 }
15237
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015238 char const *vsSource = "#version 450\n"
15239 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
15240 "void main(){\n"
15241 " vs_out.x = vec4(1);\n"
15242 "}\n";
15243 char const *gsSource = "#version 450\n"
15244 "layout(triangles) in;\n"
15245 "layout(triangle_strip, max_vertices=3) out;\n"
15246 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
15247 "out gl_PerVertex { vec4 gl_Position; };\n"
15248 "void main() {\n"
15249 " gl_Position = gs_in[0].x;\n"
15250 " EmitVertex();\n"
15251 "}\n";
15252 char const *fsSource = "#version 450\n"
15253 "layout(location=0) out vec4 color;\n"
15254 "void main(){\n"
15255 " color = vec4(1);\n"
15256 "}\n";
Chris Forbesa0ab8152016-04-20 13:34:27 +120015257
15258 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15259 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
15260 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15261
15262 VkPipelineObj pipe(m_device);
15263 pipe.AddColorAttachment();
15264 pipe.AddShader(&vs);
15265 pipe.AddShader(&gs);
15266 pipe.AddShader(&fs);
15267
15268 VkDescriptorSetObj descriptorSet(m_device);
15269 descriptorSet.AppendDummy();
15270 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15271
15272 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15273
15274 m_errorMonitor->VerifyNotFound();
15275}
15276
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015277TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120015278 TEST_DESCRIPTION("Test that an error is produced for a variable output from "
15279 "the TCS without the patch decoration, but consumed in the TES "
15280 "with the decoration.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015281 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is per-vertex in tessellation control shader stage "
15282 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120015283
15284 ASSERT_NO_FATAL_FAILURE(InitState());
15285 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15286
Chris Forbesc1e852d2016-04-04 19:26:42 +120015287 if (!m_device->phy().features().tessellationShader) {
15288 printf("Device does not support tessellation shaders; skipped.\n");
15289 return;
15290 }
15291
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015292 char const *vsSource = "#version 450\n"
15293 "void main(){}\n";
15294 char const *tcsSource = "#version 450\n"
15295 "layout(location=0) out int x[];\n"
15296 "layout(vertices=3) out;\n"
15297 "void main(){\n"
15298 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
15299 " gl_TessLevelInner[0] = 1;\n"
15300 " x[gl_InvocationID] = gl_InvocationID;\n"
15301 "}\n";
15302 char const *tesSource = "#version 450\n"
15303 "layout(triangles, equal_spacing, cw) in;\n"
15304 "layout(location=0) patch in int x;\n"
15305 "out gl_PerVertex { vec4 gl_Position; };\n"
15306 "void main(){\n"
15307 " gl_Position.xyz = gl_TessCoord;\n"
15308 " gl_Position.w = x;\n"
15309 "}\n";
15310 char const *fsSource = "#version 450\n"
15311 "layout(location=0) out vec4 color;\n"
15312 "void main(){\n"
15313 " color = vec4(1);\n"
15314 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120015315
15316 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15317 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
15318 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
15319 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15320
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015321 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
15322 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120015323
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015324 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120015325
15326 VkPipelineObj pipe(m_device);
15327 pipe.SetInputAssembly(&iasci);
15328 pipe.SetTessellation(&tsci);
15329 pipe.AddColorAttachment();
15330 pipe.AddShader(&vs);
15331 pipe.AddShader(&tcs);
15332 pipe.AddShader(&tes);
15333 pipe.AddShader(&fs);
15334
15335 VkDescriptorSetObj descriptorSet(m_device);
15336 descriptorSet.AppendDummy();
15337 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15338
15339 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15340
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015341 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120015342}
15343
Karl Schultz6addd812016-02-02 17:17:23 -070015344TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Chris Forbes1cc79542016-07-20 11:13:44 +120015345 TEST_DESCRIPTION("Test that an error is produced for a vertex attribute setup where multiple "
15346 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015347 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15348 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015349
Chris Forbes280ba2c2015-06-12 11:16:41 +120015350 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015351 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015352
15353 /* Two binding descriptions for binding 0 */
15354 VkVertexInputBindingDescription input_bindings[2];
15355 memset(input_bindings, 0, sizeof(input_bindings));
15356
15357 VkVertexInputAttributeDescription input_attrib;
15358 memset(&input_attrib, 0, sizeof(input_attrib));
15359 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15360
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015361 char const *vsSource = "#version 450\n"
15362 "\n"
15363 "layout(location=0) in float x;\n" /* attrib provided float */
15364 "out gl_PerVertex {\n"
15365 " vec4 gl_Position;\n"
15366 "};\n"
15367 "void main(){\n"
15368 " gl_Position = vec4(x);\n"
15369 "}\n";
15370 char const *fsSource = "#version 450\n"
15371 "\n"
15372 "layout(location=0) out vec4 color;\n"
15373 "void main(){\n"
15374 " color = vec4(1);\n"
15375 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120015376
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015377 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15378 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015379
15380 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015381 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015382 pipe.AddShader(&vs);
15383 pipe.AddShader(&fs);
15384
15385 pipe.AddVertexInputBindings(input_bindings, 2);
15386 pipe.AddVertexInputAttribs(&input_attrib, 1);
15387
Chris Forbes280ba2c2015-06-12 11:16:41 +120015388 VkDescriptorSetObj descriptorSet(m_device);
15389 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015390 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015391
Tony Barbour5781e8f2015-08-04 16:23:11 -060015392 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015393
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015394 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015395}
Chris Forbes8f68b562015-05-25 11:13:32 +120015396
Chris Forbes35efec72016-04-21 14:32:08 +120015397TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
Chris Forbes1cc79542016-07-20 11:13:44 +120015398 TEST_DESCRIPTION("Test that pipeline validation accepts basic use of 64bit vertex "
15399 "attributes. This is interesting because they consume multiple "
15400 "locations.");
Chris Forbes35efec72016-04-21 14:32:08 +120015401 m_errorMonitor->ExpectSuccess();
15402
15403 ASSERT_NO_FATAL_FAILURE(InitState());
15404 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15405
Chris Forbes91cf3a82016-06-28 17:51:35 +120015406 if (!m_device->phy().features().shaderFloat64) {
Chris Forbes35efec72016-04-21 14:32:08 +120015407 printf("Device does not support 64bit vertex attributes; skipped.\n");
15408 return;
15409 }
15410
15411 VkVertexInputBindingDescription input_bindings[1];
15412 memset(input_bindings, 0, sizeof(input_bindings));
15413
15414 VkVertexInputAttributeDescription input_attribs[4];
15415 memset(input_attribs, 0, sizeof(input_attribs));
15416 input_attribs[0].location = 0;
15417 input_attribs[0].offset = 0;
15418 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
15419 input_attribs[1].location = 2;
15420 input_attribs[1].offset = 32;
15421 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
15422 input_attribs[2].location = 4;
15423 input_attribs[2].offset = 64;
15424 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
15425 input_attribs[3].location = 6;
15426 input_attribs[3].offset = 96;
15427 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
15428
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015429 char const *vsSource = "#version 450\n"
15430 "\n"
15431 "layout(location=0) in dmat4 x;\n"
15432 "out gl_PerVertex {\n"
15433 " vec4 gl_Position;\n"
15434 "};\n"
15435 "void main(){\n"
15436 " gl_Position = vec4(x[0][0]);\n"
15437 "}\n";
15438 char const *fsSource = "#version 450\n"
15439 "\n"
15440 "layout(location=0) out vec4 color;\n"
15441 "void main(){\n"
15442 " color = vec4(1);\n"
15443 "}\n";
Chris Forbes35efec72016-04-21 14:32:08 +120015444
15445 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15446 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15447
15448 VkPipelineObj pipe(m_device);
15449 pipe.AddColorAttachment();
15450 pipe.AddShader(&vs);
15451 pipe.AddShader(&fs);
15452
15453 pipe.AddVertexInputBindings(input_bindings, 1);
15454 pipe.AddVertexInputAttribs(input_attribs, 4);
15455
15456 VkDescriptorSetObj descriptorSet(m_device);
15457 descriptorSet.AppendDummy();
15458 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15459
15460 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15461
15462 m_errorMonitor->VerifyNotFound();
15463}
15464
Karl Schultz6addd812016-02-02 17:17:23 -070015465TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Chris Forbes1cc79542016-07-20 11:13:44 +120015466 TEST_DESCRIPTION("Test that an error is produced for a FS which does not "
15467 "provide an output for one of the pipeline's color attachments");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015468 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015469
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015470 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015471
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015472 char const *vsSource = "#version 450\n"
15473 "\n"
15474 "out gl_PerVertex {\n"
15475 " vec4 gl_Position;\n"
15476 "};\n"
15477 "void main(){\n"
15478 " gl_Position = vec4(1);\n"
15479 "}\n";
15480 char const *fsSource = "#version 450\n"
15481 "\n"
15482 "void main(){\n"
15483 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015484
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015485 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15486 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015487
15488 VkPipelineObj pipe(m_device);
15489 pipe.AddShader(&vs);
15490 pipe.AddShader(&fs);
15491
Chia-I Wu08accc62015-07-07 11:50:03 +080015492 /* set up CB 0, not written */
15493 pipe.AddColorAttachment();
15494 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015495
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015496 VkDescriptorSetObj descriptorSet(m_device);
15497 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015498 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015499
Tony Barbour5781e8f2015-08-04 16:23:11 -060015500 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015501
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015502 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015503}
15504
Karl Schultz6addd812016-02-02 17:17:23 -070015505TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120015506 TEST_DESCRIPTION("Test that a warning is produced for a FS which provides a spurious "
15507 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015508 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
15509 "FS writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015510
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015511 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015512
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015513 char const *vsSource = "#version 450\n"
15514 "\n"
15515 "out gl_PerVertex {\n"
15516 " vec4 gl_Position;\n"
15517 "};\n"
15518 "void main(){\n"
15519 " gl_Position = vec4(1);\n"
15520 "}\n";
15521 char const *fsSource = "#version 450\n"
15522 "\n"
15523 "layout(location=0) out vec4 x;\n"
15524 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
15525 "void main(){\n"
15526 " x = vec4(1);\n"
15527 " y = vec4(1);\n"
15528 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015529
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015530 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15531 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015532
15533 VkPipelineObj pipe(m_device);
15534 pipe.AddShader(&vs);
15535 pipe.AddShader(&fs);
15536
Chia-I Wu08accc62015-07-07 11:50:03 +080015537 /* set up CB 0, not written */
15538 pipe.AddColorAttachment();
15539 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015540 /* FS writes CB 1, but we don't configure it */
15541
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015542 VkDescriptorSetObj descriptorSet(m_device);
15543 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015544 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015545
Tony Barbour5781e8f2015-08-04 16:23:11 -060015546 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015547
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015548 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015549}
15550
Karl Schultz6addd812016-02-02 17:17:23 -070015551TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120015552 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the fundamental "
15553 "type of an FS output variable, and the format of the corresponding attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015554 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015555
Chris Forbesa36d69e2015-05-25 11:13:44 +120015556 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015557
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015558 char const *vsSource = "#version 450\n"
15559 "\n"
15560 "out gl_PerVertex {\n"
15561 " vec4 gl_Position;\n"
15562 "};\n"
15563 "void main(){\n"
15564 " gl_Position = vec4(1);\n"
15565 "}\n";
15566 char const *fsSource = "#version 450\n"
15567 "\n"
15568 "layout(location=0) out ivec4 x;\n" /* not UNORM */
15569 "void main(){\n"
15570 " x = ivec4(1);\n"
15571 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120015572
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015573 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15574 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015575
15576 VkPipelineObj pipe(m_device);
15577 pipe.AddShader(&vs);
15578 pipe.AddShader(&fs);
15579
Chia-I Wu08accc62015-07-07 11:50:03 +080015580 /* set up CB 0; type is UNORM by default */
15581 pipe.AddColorAttachment();
15582 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015583
Chris Forbesa36d69e2015-05-25 11:13:44 +120015584 VkDescriptorSetObj descriptorSet(m_device);
15585 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015586 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015587
Tony Barbour5781e8f2015-08-04 16:23:11 -060015588 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015589
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015590 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120015591}
Chris Forbes7b1b8932015-06-05 14:43:36 +120015592
Karl Schultz6addd812016-02-02 17:17:23 -070015593TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120015594 TEST_DESCRIPTION("Test that an error is produced for a shader consuming a uniform "
15595 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015596 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015597
Chris Forbes556c76c2015-08-14 12:04:59 +120015598 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120015599
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015600 char const *vsSource = "#version 450\n"
15601 "\n"
15602 "out gl_PerVertex {\n"
15603 " vec4 gl_Position;\n"
15604 "};\n"
15605 "void main(){\n"
15606 " gl_Position = vec4(1);\n"
15607 "}\n";
15608 char const *fsSource = "#version 450\n"
15609 "\n"
15610 "layout(location=0) out vec4 x;\n"
15611 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
15612 "void main(){\n"
15613 " x = vec4(bar.y);\n"
15614 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120015615
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015616 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15617 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120015618
Chris Forbes556c76c2015-08-14 12:04:59 +120015619 VkPipelineObj pipe(m_device);
15620 pipe.AddShader(&vs);
15621 pipe.AddShader(&fs);
15622
15623 /* set up CB 0; type is UNORM by default */
15624 pipe.AddColorAttachment();
15625 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15626
15627 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015628 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120015629
15630 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15631
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015632 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120015633}
15634
Chris Forbes5c59e902016-02-26 16:56:09 +130015635TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Chris Forbes1cc79542016-07-20 11:13:44 +120015636 TEST_DESCRIPTION("Test that an error is produced for a shader consuming push constants "
15637 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015638 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130015639
15640 ASSERT_NO_FATAL_FAILURE(InitState());
15641
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015642 char const *vsSource = "#version 450\n"
15643 "\n"
15644 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
15645 "out gl_PerVertex {\n"
15646 " vec4 gl_Position;\n"
15647 "};\n"
15648 "void main(){\n"
15649 " gl_Position = vec4(consts.x);\n"
15650 "}\n";
15651 char const *fsSource = "#version 450\n"
15652 "\n"
15653 "layout(location=0) out vec4 x;\n"
15654 "void main(){\n"
15655 " x = vec4(1);\n"
15656 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130015657
15658 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15659 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15660
15661 VkPipelineObj pipe(m_device);
15662 pipe.AddShader(&vs);
15663 pipe.AddShader(&fs);
15664
15665 /* set up CB 0; type is UNORM by default */
15666 pipe.AddColorAttachment();
15667 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15668
15669 VkDescriptorSetObj descriptorSet(m_device);
15670 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15671
15672 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15673
15674 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015675 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130015676}
15677
Chris Forbes3fb17902016-08-22 14:57:55 +120015678TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
15679 TEST_DESCRIPTION("Test that an error is produced for a shader consuming an input attachment "
15680 "which is not included in the subpass description");
15681 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15682 "consumes input attachment index 0 but not provided in subpass");
15683
15684 ASSERT_NO_FATAL_FAILURE(InitState());
15685
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015686 char const *vsSource = "#version 450\n"
15687 "\n"
15688 "out gl_PerVertex {\n"
15689 " vec4 gl_Position;\n"
15690 "};\n"
15691 "void main(){\n"
15692 " gl_Position = vec4(1);\n"
15693 "}\n";
15694 char const *fsSource = "#version 450\n"
15695 "\n"
15696 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15697 "layout(location=0) out vec4 color;\n"
15698 "void main() {\n"
15699 " color = subpassLoad(x);\n"
15700 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120015701
15702 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15703 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15704
15705 VkPipelineObj pipe(m_device);
15706 pipe.AddShader(&vs);
15707 pipe.AddShader(&fs);
15708 pipe.AddColorAttachment();
15709 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15710
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015711 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15712 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120015713 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015714 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015715 ASSERT_VK_SUCCESS(err);
15716
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015717 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120015718 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015719 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015720 ASSERT_VK_SUCCESS(err);
15721
15722 // error here.
15723 pipe.CreateVKPipeline(pl, renderPass());
15724
15725 m_errorMonitor->VerifyFound();
15726
15727 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15728 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15729}
15730
Chris Forbes663b5a82016-08-22 16:14:06 +120015731TEST_F(VkLayerTest, CreatePipelineInputAttachmentPositive) {
15732 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
15733 m_errorMonitor->ExpectSuccess();
15734
15735 ASSERT_NO_FATAL_FAILURE(InitState());
15736
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015737 char const *vsSource = "#version 450\n"
15738 "\n"
15739 "out gl_PerVertex {\n"
15740 " vec4 gl_Position;\n"
15741 "};\n"
15742 "void main(){\n"
15743 " gl_Position = vec4(1);\n"
15744 "}\n";
15745 char const *fsSource = "#version 450\n"
15746 "\n"
15747 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15748 "layout(location=0) out vec4 color;\n"
15749 "void main() {\n"
15750 " color = subpassLoad(x);\n"
15751 "}\n";
Chris Forbes663b5a82016-08-22 16:14:06 +120015752
15753 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15754 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15755
15756 VkPipelineObj pipe(m_device);
15757 pipe.AddShader(&vs);
15758 pipe.AddShader(&fs);
15759 pipe.AddColorAttachment();
15760 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15761
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015762 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15763 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes663b5a82016-08-22 16:14:06 +120015764 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015765 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes663b5a82016-08-22 16:14:06 +120015766 ASSERT_VK_SUCCESS(err);
15767
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015768 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes663b5a82016-08-22 16:14:06 +120015769 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015770 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes663b5a82016-08-22 16:14:06 +120015771 ASSERT_VK_SUCCESS(err);
15772
15773 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015774 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15775 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15776 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
15777 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15778 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL},
Chris Forbes663b5a82016-08-22 16:14:06 +120015779 };
15780 VkAttachmentReference color = {
15781 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15782 };
15783 VkAttachmentReference input = {
15784 1, VK_IMAGE_LAYOUT_GENERAL,
15785 };
15786
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015787 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes663b5a82016-08-22 16:14:06 +120015788
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015789 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes663b5a82016-08-22 16:14:06 +120015790 VkRenderPass rp;
15791 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15792 ASSERT_VK_SUCCESS(err);
15793
15794 // should be OK. would go wrong here if it's going to...
15795 pipe.CreateVKPipeline(pl, rp);
15796
15797 m_errorMonitor->VerifyNotFound();
15798
15799 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15800 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15801 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15802}
15803
Chris Forbes5a9a0472016-08-22 16:02:09 +120015804TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
15805 TEST_DESCRIPTION("Test that an error is produced for a shader consuming an input attachment "
15806 "with a format having a different fundamental type");
15807 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15808 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
15809
15810 ASSERT_NO_FATAL_FAILURE(InitState());
15811
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015812 char const *vsSource = "#version 450\n"
15813 "\n"
15814 "out gl_PerVertex {\n"
15815 " vec4 gl_Position;\n"
15816 "};\n"
15817 "void main(){\n"
15818 " gl_Position = vec4(1);\n"
15819 "}\n";
15820 char const *fsSource = "#version 450\n"
15821 "\n"
15822 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15823 "layout(location=0) out vec4 color;\n"
15824 "void main() {\n"
15825 " color = subpassLoad(x);\n"
15826 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120015827
15828 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15829 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15830
15831 VkPipelineObj pipe(m_device);
15832 pipe.AddShader(&vs);
15833 pipe.AddShader(&fs);
15834 pipe.AddColorAttachment();
15835 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15836
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015837 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15838 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015839 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015840 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015841 ASSERT_VK_SUCCESS(err);
15842
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015843 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015844 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015845 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015846 ASSERT_VK_SUCCESS(err);
15847
15848 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015849 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15850 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15851 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
15852 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15853 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 +120015854 };
15855 VkAttachmentReference color = {
15856 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15857 };
15858 VkAttachmentReference input = {
15859 1, VK_IMAGE_LAYOUT_GENERAL,
15860 };
15861
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015862 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015863
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015864 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015865 VkRenderPass rp;
15866 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15867 ASSERT_VK_SUCCESS(err);
15868
15869 // error here.
15870 pipe.CreateVKPipeline(pl, rp);
15871
15872 m_errorMonitor->VerifyFound();
15873
15874 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15875 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15876 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15877}
15878
Chris Forbes541f7b02016-08-22 15:30:27 +120015879TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
15880 TEST_DESCRIPTION("Test that an error is produced for a shader consuming an input attachment "
15881 "which is not included in the subpass description -- array case");
15882 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15883 "consumes input attachment index 1 but not provided in subpass");
15884
15885 ASSERT_NO_FATAL_FAILURE(InitState());
15886
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015887 char const *vsSource = "#version 450\n"
15888 "\n"
15889 "out gl_PerVertex {\n"
15890 " vec4 gl_Position;\n"
15891 "};\n"
15892 "void main(){\n"
15893 " gl_Position = vec4(1);\n"
15894 "}\n";
15895 char const *fsSource = "#version 450\n"
15896 "\n"
15897 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[2];\n"
15898 "layout(location=0) out vec4 color;\n"
15899 "void main() {\n"
15900 " color = subpassLoad(xs[1]);\n"
15901 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120015902
15903 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15904 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15905
15906 VkPipelineObj pipe(m_device);
15907 pipe.AddShader(&vs);
15908 pipe.AddShader(&fs);
15909 pipe.AddColorAttachment();
15910 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15911
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015912 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15913 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120015914 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015915 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015916 ASSERT_VK_SUCCESS(err);
15917
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015918 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120015919 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015920 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015921 ASSERT_VK_SUCCESS(err);
15922
15923 // error here.
15924 pipe.CreateVKPipeline(pl, renderPass());
15925
15926 m_errorMonitor->VerifyFound();
15927
15928 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15929 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15930}
15931
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015932TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Chris Forbes1cc79542016-07-20 11:13:44 +120015933 TEST_DESCRIPTION("Test that an error is produced for a compute pipeline consuming a "
15934 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015935 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015936
15937 ASSERT_NO_FATAL_FAILURE(InitState());
15938
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015939 char const *csSource = "#version 450\n"
15940 "\n"
15941 "layout(local_size_x=1) in;\n"
15942 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15943 "void main(){\n"
15944 " x = vec4(1);\n"
15945 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015946
15947 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15948
15949 VkDescriptorSetObj descriptorSet(m_device);
15950 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15951
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015952 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15953 nullptr,
15954 0,
15955 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15956 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15957 descriptorSet.GetPipelineLayout(),
15958 VK_NULL_HANDLE,
15959 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015960
15961 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015962 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015963
15964 m_errorMonitor->VerifyFound();
15965
15966 if (err == VK_SUCCESS) {
15967 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15968 }
15969}
15970
15971TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Chris Forbes1cc79542016-07-20 11:13:44 +120015972 TEST_DESCRIPTION("Test that pipeline validation accepts a compute pipeline which declares a "
15973 "descriptor-backed resource which is not provided, but the shader does not "
15974 "statically use it. This is interesting because it requires compute pipelines "
15975 "to have a proper descriptor use walk, which they didn't for some time.");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015976 m_errorMonitor->ExpectSuccess();
15977
15978 ASSERT_NO_FATAL_FAILURE(InitState());
15979
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015980 char const *csSource = "#version 450\n"
15981 "\n"
15982 "layout(local_size_x=1) in;\n"
15983 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15984 "void main(){\n"
15985 " // x is not used.\n"
15986 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015987
15988 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15989
15990 VkDescriptorSetObj descriptorSet(m_device);
15991 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15992
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015993 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15994 nullptr,
15995 0,
15996 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15997 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15998 descriptorSet.GetPipelineLayout(),
15999 VK_NULL_HANDLE,
16000 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016001
16002 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016003 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016004
16005 m_errorMonitor->VerifyNotFound();
16006
16007 if (err == VK_SUCCESS) {
16008 vkDestroyPipeline(m_device->device(), pipe, nullptr);
16009 }
16010}
16011
Chris Forbes22a9b092016-07-19 14:34:05 +120016012TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120016013 TEST_DESCRIPTION("Test that an error is produced for a pipeline consuming a "
16014 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016015 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16016 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120016017
16018 ASSERT_NO_FATAL_FAILURE(InitState());
16019
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016020 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
16021 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120016022 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016023 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120016024 ASSERT_VK_SUCCESS(err);
16025
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016026 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120016027 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016028 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120016029 ASSERT_VK_SUCCESS(err);
16030
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016031 char const *csSource = "#version 450\n"
16032 "\n"
16033 "layout(local_size_x=1) in;\n"
16034 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
16035 "void main() {\n"
16036 " x.x = 1.0f;\n"
16037 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120016038 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
16039
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016040 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
16041 nullptr,
16042 0,
16043 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
16044 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
16045 pl,
16046 VK_NULL_HANDLE,
16047 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120016048
16049 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016050 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120016051
16052 m_errorMonitor->VerifyFound();
16053
16054 if (err == VK_SUCCESS) {
16055 vkDestroyPipeline(m_device->device(), pipe, nullptr);
16056 }
16057
16058 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16059 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16060}
16061
Chris Forbese10a51f2016-07-19 14:42:51 +120016062TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Chris Forbes1cc79542016-07-20 11:13:44 +120016063 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
16064 "sampler portion of a combined image + sampler");
Chris Forbese10a51f2016-07-19 14:42:51 +120016065 m_errorMonitor->ExpectSuccess();
16066
16067 ASSERT_NO_FATAL_FAILURE(InitState());
16068
16069 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016070 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
16071 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
16072 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Chris Forbese10a51f2016-07-19 14:42:51 +120016073 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016074 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Chris Forbese10a51f2016-07-19 14:42:51 +120016075 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016076 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbese10a51f2016-07-19 14:42:51 +120016077 ASSERT_VK_SUCCESS(err);
16078
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016079 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbese10a51f2016-07-19 14:42:51 +120016080 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016081 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbese10a51f2016-07-19 14:42:51 +120016082 ASSERT_VK_SUCCESS(err);
16083
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016084 char const *csSource = "#version 450\n"
16085 "\n"
16086 "layout(local_size_x=1) in;\n"
16087 "layout(set=0, binding=0) uniform sampler s;\n"
16088 "layout(set=0, binding=1) uniform texture2D t;\n"
16089 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
16090 "void main() {\n"
16091 " x = texture(sampler2D(t, s), vec2(0));\n"
16092 "}\n";
Chris Forbese10a51f2016-07-19 14:42:51 +120016093 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
16094
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016095 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
16096 nullptr,
16097 0,
16098 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
16099 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
16100 pl,
16101 VK_NULL_HANDLE,
16102 -1};
Chris Forbese10a51f2016-07-19 14:42:51 +120016103
16104 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016105 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbese10a51f2016-07-19 14:42:51 +120016106
16107 m_errorMonitor->VerifyNotFound();
16108
16109 if (err == VK_SUCCESS) {
16110 vkDestroyPipeline(m_device->device(), pipe, nullptr);
16111 }
16112
16113 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16114 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16115}
16116
Chris Forbes91c3b2a2016-07-19 14:46:38 +120016117TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Chris Forbes1cc79542016-07-20 11:13:44 +120016118 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
16119 "image portion of a combined image + sampler");
Chris Forbes91c3b2a2016-07-19 14:46:38 +120016120 m_errorMonitor->ExpectSuccess();
16121
16122 ASSERT_NO_FATAL_FAILURE(InitState());
16123
16124 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016125 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
16126 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
16127 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Chris Forbes91c3b2a2016-07-19 14:46:38 +120016128 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016129 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Chris Forbes91c3b2a2016-07-19 14:46:38 +120016130 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016131 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes91c3b2a2016-07-19 14:46:38 +120016132 ASSERT_VK_SUCCESS(err);
16133
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016134 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes91c3b2a2016-07-19 14:46:38 +120016135 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016136 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes91c3b2a2016-07-19 14:46:38 +120016137 ASSERT_VK_SUCCESS(err);
16138
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016139 char const *csSource = "#version 450\n"
16140 "\n"
16141 "layout(local_size_x=1) in;\n"
16142 "layout(set=0, binding=0) uniform texture2D t;\n"
16143 "layout(set=0, binding=1) uniform sampler s;\n"
16144 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
16145 "void main() {\n"
16146 " x = texture(sampler2D(t, s), vec2(0));\n"
16147 "}\n";
Chris Forbes91c3b2a2016-07-19 14:46:38 +120016148 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
16149
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016150 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
16151 nullptr,
16152 0,
16153 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
16154 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
16155 pl,
16156 VK_NULL_HANDLE,
16157 -1};
Chris Forbes91c3b2a2016-07-19 14:46:38 +120016158
16159 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016160 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes91c3b2a2016-07-19 14:46:38 +120016161
16162 m_errorMonitor->VerifyNotFound();
16163
16164 if (err == VK_SUCCESS) {
16165 vkDestroyPipeline(m_device->device(), pipe, nullptr);
16166 }
16167
16168 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16169 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16170}
16171
Chris Forbes6a4991a2016-07-19 15:07:32 +120016172TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Chris Forbes1cc79542016-07-20 11:13:44 +120016173 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming "
16174 "both the sampler and the image of a combined image+sampler "
16175 "but via separate variables");
Chris Forbes6a4991a2016-07-19 15:07:32 +120016176 m_errorMonitor->ExpectSuccess();
16177
16178 ASSERT_NO_FATAL_FAILURE(InitState());
16179
16180 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016181 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
16182 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Chris Forbes6a4991a2016-07-19 15:07:32 +120016183 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016184 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Chris Forbes6a4991a2016-07-19 15:07:32 +120016185 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016186 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes6a4991a2016-07-19 15:07:32 +120016187 ASSERT_VK_SUCCESS(err);
16188
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016189 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes6a4991a2016-07-19 15:07:32 +120016190 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016191 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes6a4991a2016-07-19 15:07:32 +120016192 ASSERT_VK_SUCCESS(err);
16193
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016194 char const *csSource = "#version 450\n"
16195 "\n"
16196 "layout(local_size_x=1) in;\n"
16197 "layout(set=0, binding=0) uniform texture2D t;\n"
16198 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
16199 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
16200 "void main() {\n"
16201 " x = texture(sampler2D(t, s), vec2(0));\n"
16202 "}\n";
Chris Forbes6a4991a2016-07-19 15:07:32 +120016203 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
16204
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016205 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
16206 nullptr,
16207 0,
16208 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
16209 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
16210 pl,
16211 VK_NULL_HANDLE,
16212 -1};
Chris Forbes6a4991a2016-07-19 15:07:32 +120016213
16214 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016215 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes6a4991a2016-07-19 15:07:32 +120016216
16217 m_errorMonitor->VerifyNotFound();
16218
16219 if (err == VK_SUCCESS) {
16220 vkDestroyPipeline(m_device->device(), pipe, nullptr);
16221 }
16222
16223 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16224 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16225}
16226
Chris Forbes50020592016-07-27 13:52:41 +120016227TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
16228 TEST_DESCRIPTION("Test that an error is produced when an image view type "
16229 "does not match the dimensionality declared in the shader");
16230
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016231 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 +120016232
16233 ASSERT_NO_FATAL_FAILURE(InitState());
16234 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16235
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016236 char const *vsSource = "#version 450\n"
16237 "\n"
16238 "out gl_PerVertex { vec4 gl_Position; };\n"
16239 "void main() { gl_Position = vec4(0); }\n";
16240 char const *fsSource = "#version 450\n"
16241 "\n"
16242 "layout(set=0, binding=0) uniform sampler3D s;\n"
16243 "layout(location=0) out vec4 color;\n"
16244 "void main() {\n"
16245 " color = texture(s, vec3(0));\n"
16246 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120016247 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16248 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16249
16250 VkPipelineObj pipe(m_device);
16251 pipe.AddShader(&vs);
16252 pipe.AddShader(&fs);
16253 pipe.AddColorAttachment();
16254
16255 VkTextureObj texture(m_device, nullptr);
16256 VkSamplerObj sampler(m_device);
16257
16258 VkDescriptorSetObj descriptorSet(m_device);
16259 descriptorSet.AppendSamplerTexture(&sampler, &texture);
16260 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16261
16262 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
16263 ASSERT_VK_SUCCESS(err);
16264
16265 BeginCommandBuffer();
16266
16267 m_commandBuffer->BindPipeline(pipe);
16268 m_commandBuffer->BindDescriptorSet(descriptorSet);
16269
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016270 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120016271 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016272 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120016273 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16274
16275 // error produced here.
16276 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
16277
16278 m_errorMonitor->VerifyFound();
16279
16280 EndCommandBuffer();
16281}
16282
Chris Forbes5533bfc2016-07-27 14:12:34 +120016283TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
16284 TEST_DESCRIPTION("Test that an error is produced when a multisampled images "
16285 "are consumed via singlesample images types in the shader, or vice versa.");
16286
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016287 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120016288
16289 ASSERT_NO_FATAL_FAILURE(InitState());
16290 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16291
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016292 char const *vsSource = "#version 450\n"
16293 "\n"
16294 "out gl_PerVertex { vec4 gl_Position; };\n"
16295 "void main() { gl_Position = vec4(0); }\n";
16296 char const *fsSource = "#version 450\n"
16297 "\n"
16298 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
16299 "layout(location=0) out vec4 color;\n"
16300 "void main() {\n"
16301 " color = texelFetch(s, ivec2(0), 0);\n"
16302 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120016303 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16304 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16305
16306 VkPipelineObj pipe(m_device);
16307 pipe.AddShader(&vs);
16308 pipe.AddShader(&fs);
16309 pipe.AddColorAttachment();
16310
16311 VkTextureObj texture(m_device, nullptr);
16312 VkSamplerObj sampler(m_device);
16313
16314 VkDescriptorSetObj descriptorSet(m_device);
16315 descriptorSet.AppendSamplerTexture(&sampler, &texture);
16316 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16317
16318 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
16319 ASSERT_VK_SUCCESS(err);
16320
16321 BeginCommandBuffer();
16322
16323 m_commandBuffer->BindPipeline(pipe);
16324 m_commandBuffer->BindDescriptorSet(descriptorSet);
16325
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016326 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120016327 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016328 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120016329 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16330
16331 // error produced here.
16332 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
16333
16334 m_errorMonitor->VerifyFound();
16335
16336 EndCommandBuffer();
16337}
16338
Mark Lobodzinski209b5292015-09-17 09:44:05 -060016339#endif // SHADER_CHECKER_TESTS
16340
16341#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -060016342TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016343 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016344
16345 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016346
16347 // Create an image
16348 VkImage image;
16349
Karl Schultz6addd812016-02-02 17:17:23 -070016350 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
16351 const int32_t tex_width = 32;
16352 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016353
16354 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016355 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16356 image_create_info.pNext = NULL;
16357 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16358 image_create_info.format = tex_format;
16359 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016360 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070016361 image_create_info.extent.depth = 1;
16362 image_create_info.mipLevels = 1;
16363 image_create_info.arrayLayers = 1;
16364 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16365 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16366 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16367 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016368
16369 // Introduce error by sending down a bogus width extent
16370 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080016371 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016372
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016373 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016374}
16375
Mark Youngc48c4c12016-04-11 14:26:49 -060016376TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016377 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16378 "CreateImage extents is 0 for at least one required dimension");
Mark Youngc48c4c12016-04-11 14:26:49 -060016379
16380 ASSERT_NO_FATAL_FAILURE(InitState());
16381
16382 // Create an image
16383 VkImage image;
16384
16385 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
16386 const int32_t tex_width = 32;
16387 const int32_t tex_height = 32;
16388
16389 VkImageCreateInfo image_create_info = {};
16390 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16391 image_create_info.pNext = NULL;
16392 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16393 image_create_info.format = tex_format;
16394 image_create_info.extent.width = tex_width;
16395 image_create_info.extent.height = tex_height;
16396 image_create_info.extent.depth = 1;
16397 image_create_info.mipLevels = 1;
16398 image_create_info.arrayLayers = 1;
16399 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16400 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16401 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16402 image_create_info.flags = 0;
16403
16404 // Introduce error by sending down a bogus width extent
16405 image_create_info.extent.width = 0;
16406 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
16407
16408 m_errorMonitor->VerifyFound();
16409}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060016410#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +120016411
Tobin Ehliscde08892015-09-22 10:11:37 -060016412#if IMAGE_TESTS
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060016413TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
16414 TEST_DESCRIPTION("Create a render pass with an attachment description "
16415 "format set to VK_FORMAT_UNDEFINED");
16416
16417 ASSERT_NO_FATAL_FAILURE(InitState());
16418 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16419
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016420 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060016421
16422 VkAttachmentReference color_attach = {};
16423 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
16424 color_attach.attachment = 0;
16425 VkSubpassDescription subpass = {};
16426 subpass.colorAttachmentCount = 1;
16427 subpass.pColorAttachments = &color_attach;
16428
16429 VkRenderPassCreateInfo rpci = {};
16430 rpci.subpassCount = 1;
16431 rpci.pSubpasses = &subpass;
16432 rpci.attachmentCount = 1;
16433 VkAttachmentDescription attach_desc = {};
16434 attach_desc.format = VK_FORMAT_UNDEFINED;
16435 rpci.pAttachments = &attach_desc;
16436 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
16437 VkRenderPass rp;
16438 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
16439
16440 m_errorMonitor->VerifyFound();
16441
16442 if (result == VK_SUCCESS) {
16443 vkDestroyRenderPass(m_device->device(), rp, NULL);
16444 }
16445}
16446
Karl Schultz6addd812016-02-02 17:17:23 -070016447TEST_F(VkLayerTest, InvalidImageView) {
16448 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060016449
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016450 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with baseMipLevel 10 ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016451
Tobin Ehliscde08892015-09-22 10:11:37 -060016452 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060016453
Mike Stroyana3082432015-09-25 13:39:21 -060016454 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070016455 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060016456
Karl Schultz6addd812016-02-02 17:17:23 -070016457 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
16458 const int32_t tex_width = 32;
16459 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060016460
16461 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016462 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16463 image_create_info.pNext = NULL;
16464 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16465 image_create_info.format = tex_format;
16466 image_create_info.extent.width = tex_width;
16467 image_create_info.extent.height = tex_height;
16468 image_create_info.extent.depth = 1;
16469 image_create_info.mipLevels = 1;
16470 image_create_info.arrayLayers = 1;
16471 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16472 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16473 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16474 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060016475
Chia-I Wuf7458c52015-10-26 21:10:41 +080016476 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060016477 ASSERT_VK_SUCCESS(err);
16478
16479 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016480 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16481 image_view_create_info.image = image;
16482 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16483 image_view_create_info.format = tex_format;
16484 image_view_create_info.subresourceRange.layerCount = 1;
16485 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
16486 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016487 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060016488
16489 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016490 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060016491
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016492 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060016493 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060016494}
Mike Stroyana3082432015-09-25 13:39:21 -060016495
Mark Youngd339ba32016-05-30 13:28:35 -060016496TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
16497 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060016498 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060016499 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060016500
16501 ASSERT_NO_FATAL_FAILURE(InitState());
16502
16503 // Create an image and try to create a view with no memory backing the image
16504 VkImage image;
16505
16506 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
16507 const int32_t tex_width = 32;
16508 const int32_t tex_height = 32;
16509
16510 VkImageCreateInfo image_create_info = {};
16511 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16512 image_create_info.pNext = NULL;
16513 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16514 image_create_info.format = tex_format;
16515 image_create_info.extent.width = tex_width;
16516 image_create_info.extent.height = tex_height;
16517 image_create_info.extent.depth = 1;
16518 image_create_info.mipLevels = 1;
16519 image_create_info.arrayLayers = 1;
16520 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16521 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16522 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16523 image_create_info.flags = 0;
16524
16525 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
16526 ASSERT_VK_SUCCESS(err);
16527
16528 VkImageViewCreateInfo image_view_create_info = {};
16529 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16530 image_view_create_info.image = image;
16531 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16532 image_view_create_info.format = tex_format;
16533 image_view_create_info.subresourceRange.layerCount = 1;
16534 image_view_create_info.subresourceRange.baseMipLevel = 0;
16535 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016536 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060016537
16538 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016539 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060016540
16541 m_errorMonitor->VerifyFound();
16542 vkDestroyImage(m_device->device(), image, NULL);
16543 // If last error is success, it still created the view, so delete it.
16544 if (err == VK_SUCCESS) {
16545 vkDestroyImageView(m_device->device(), view, NULL);
16546 }
Mark Youngd339ba32016-05-30 13:28:35 -060016547}
16548
Karl Schultz6addd812016-02-02 17:17:23 -070016549TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016550 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
16551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView: Color image "
16552 "formats must have ONLY the "
16553 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016554
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016555 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016556
Karl Schultz6addd812016-02-02 17:17:23 -070016557 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016558 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016559 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016560 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016561
16562 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016563 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016564 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070016565 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16566 image_view_create_info.format = tex_format;
16567 image_view_create_info.subresourceRange.baseMipLevel = 0;
16568 image_view_create_info.subresourceRange.levelCount = 1;
16569 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016570 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016571
16572 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016573 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016574
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016575 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016576}
16577
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016578TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070016579 VkResult err;
16580 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016581
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016582 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16583 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016584
Mike Stroyana3082432015-09-25 13:39:21 -060016585 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060016586
16587 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016588 VkImage srcImage;
16589 VkImage dstImage;
16590 VkDeviceMemory srcMem;
16591 VkDeviceMemory destMem;
16592 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016593
16594 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016595 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16596 image_create_info.pNext = NULL;
16597 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16598 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16599 image_create_info.extent.width = 32;
16600 image_create_info.extent.height = 32;
16601 image_create_info.extent.depth = 1;
16602 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016603 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070016604 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16605 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16606 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16607 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016608
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016609 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016610 ASSERT_VK_SUCCESS(err);
16611
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016612 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016613 ASSERT_VK_SUCCESS(err);
16614
16615 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016616 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016617 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16618 memAlloc.pNext = NULL;
16619 memAlloc.allocationSize = 0;
16620 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016621
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016622 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016623 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016624 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016625 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016626 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016627 ASSERT_VK_SUCCESS(err);
16628
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016629 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016630 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016631 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016632 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016633 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016634 ASSERT_VK_SUCCESS(err);
16635
16636 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16637 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016638 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016639 ASSERT_VK_SUCCESS(err);
16640
16641 BeginCommandBuffer();
16642 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016643 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016644 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016645 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016646 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016647 copyRegion.srcOffset.x = 0;
16648 copyRegion.srcOffset.y = 0;
16649 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016650 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016651 copyRegion.dstSubresource.mipLevel = 0;
16652 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016653 // Introduce failure by forcing the dst layerCount to differ from src
16654 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016655 copyRegion.dstOffset.x = 0;
16656 copyRegion.dstOffset.y = 0;
16657 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016658 copyRegion.extent.width = 1;
16659 copyRegion.extent.height = 1;
16660 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016661 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060016662 EndCommandBuffer();
16663
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016664 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016665
Chia-I Wuf7458c52015-10-26 21:10:41 +080016666 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016667 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016668 vkFreeMemory(m_device->device(), srcMem, NULL);
16669 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016670}
16671
Tony Barbourd6673642016-05-05 14:46:39 -060016672TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
16673
16674 TEST_DESCRIPTION("Creating images with unsuported formats ");
16675
16676 ASSERT_NO_FATAL_FAILURE(InitState());
16677 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16678 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016679 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 -060016680 VK_IMAGE_TILING_OPTIMAL, 0);
16681 ASSERT_TRUE(image.initialized());
16682
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016683 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
16684 VkImageCreateInfo image_create_info;
16685 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16686 image_create_info.pNext = NULL;
16687 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16688 image_create_info.format = VK_FORMAT_UNDEFINED;
16689 image_create_info.extent.width = 32;
16690 image_create_info.extent.height = 32;
16691 image_create_info.extent.depth = 1;
16692 image_create_info.mipLevels = 1;
16693 image_create_info.arrayLayers = 1;
16694 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16695 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16696 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16697 image_create_info.flags = 0;
16698
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016699 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16700 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016701
16702 VkImage localImage;
16703 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
16704 m_errorMonitor->VerifyFound();
16705
Tony Barbourd6673642016-05-05 14:46:39 -060016706 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016707 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060016708 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
16709 VkFormat format = static_cast<VkFormat>(f);
16710 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016711 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060016712 unsupported = format;
16713 break;
16714 }
16715 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016716
Tony Barbourd6673642016-05-05 14:46:39 -060016717 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060016718 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016719 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060016720
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016721 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060016722 m_errorMonitor->VerifyFound();
16723 }
16724}
16725
16726TEST_F(VkLayerTest, ImageLayerViewTests) {
16727 VkResult ret;
16728 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
16729
16730 ASSERT_NO_FATAL_FAILURE(InitState());
16731
16732 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016733 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 -060016734 VK_IMAGE_TILING_OPTIMAL, 0);
16735 ASSERT_TRUE(image.initialized());
16736
16737 VkImageView imgView;
16738 VkImageViewCreateInfo imgViewInfo = {};
16739 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
16740 imgViewInfo.image = image.handle();
16741 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
16742 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16743 imgViewInfo.subresourceRange.layerCount = 1;
16744 imgViewInfo.subresourceRange.baseMipLevel = 0;
16745 imgViewInfo.subresourceRange.levelCount = 1;
16746 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16747
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016748 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with baseMipLevel");
Tony Barbourd6673642016-05-05 14:46:39 -060016749 // View can't have baseMipLevel >= image's mipLevels - Expect
16750 // VIEW_CREATE_ERROR
16751 imgViewInfo.subresourceRange.baseMipLevel = 1;
16752 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16753 m_errorMonitor->VerifyFound();
16754 imgViewInfo.subresourceRange.baseMipLevel = 0;
16755
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016756 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with baseArrayLayer");
Tony Barbourd6673642016-05-05 14:46:39 -060016757 // View can't have baseArrayLayer >= image's arraySize - Expect
16758 // VIEW_CREATE_ERROR
16759 imgViewInfo.subresourceRange.baseArrayLayer = 1;
16760 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16761 m_errorMonitor->VerifyFound();
16762 imgViewInfo.subresourceRange.baseArrayLayer = 0;
16763
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with 0 in "
16765 "pCreateInfo->subresourceRange."
16766 "levelCount");
Tony Barbourd6673642016-05-05 14:46:39 -060016767 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
16768 imgViewInfo.subresourceRange.levelCount = 0;
16769 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16770 m_errorMonitor->VerifyFound();
16771 imgViewInfo.subresourceRange.levelCount = 1;
16772
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016773 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with 0 in "
16774 "pCreateInfo->subresourceRange."
16775 "layerCount");
Tony Barbourd6673642016-05-05 14:46:39 -060016776 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
16777 imgViewInfo.subresourceRange.layerCount = 0;
16778 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16779 m_errorMonitor->VerifyFound();
16780 imgViewInfo.subresourceRange.layerCount = 1;
16781
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016782 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "but both must be color formats");
Tony Barbourd6673642016-05-05 14:46:39 -060016783 // Can't use depth format for view into color image - Expect INVALID_FORMAT
16784 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
16785 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16786 m_errorMonitor->VerifyFound();
16787 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16788
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016789 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Formats MUST be IDENTICAL unless "
16790 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
16791 "was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060016792 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
16793 // VIEW_CREATE_ERROR
16794 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
16795 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16796 m_errorMonitor->VerifyFound();
16797 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16798
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016799 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "can support ImageViews with "
16800 "differing formats but they must be "
16801 "in the same compatibility class.");
Tony Barbourd6673642016-05-05 14:46:39 -060016802 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
16803 // VIEW_CREATE_ERROR
16804 VkImageCreateInfo mutImgInfo = image.create_info();
16805 VkImage mutImage;
16806 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016807 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060016808 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
16809 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
16810 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
16811 ASSERT_VK_SUCCESS(ret);
16812 imgViewInfo.image = mutImage;
16813 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16814 m_errorMonitor->VerifyFound();
16815 imgViewInfo.image = image.handle();
16816 vkDestroyImage(m_device->handle(), mutImage, NULL);
16817}
16818
16819TEST_F(VkLayerTest, MiscImageLayerTests) {
16820
16821 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
16822
16823 ASSERT_NO_FATAL_FAILURE(InitState());
16824
16825 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016826 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 -060016827 VK_IMAGE_TILING_OPTIMAL, 0);
16828 ASSERT_TRUE(image.initialized());
16829
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "number of layers in image subresource is zero");
Tony Barbourd6673642016-05-05 14:46:39 -060016831 vk_testing::Buffer buffer;
16832 VkMemoryPropertyFlags reqs = 0;
16833 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
16834 VkBufferImageCopy region = {};
16835 region.bufferRowLength = 128;
16836 region.bufferImageHeight = 128;
16837 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16838 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
16839 region.imageSubresource.layerCount = 0;
16840 region.imageExtent.height = 4;
16841 region.imageExtent.width = 4;
16842 region.imageExtent.depth = 1;
16843 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016844 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16845 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourd6673642016-05-05 14:46:39 -060016846 m_errorMonitor->VerifyFound();
16847 region.imageSubresource.layerCount = 1;
16848
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016849 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
16850 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
16851 region.bufferOffset = 6;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be a multiple of this format's texel size");
16853 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16854 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016855 m_errorMonitor->VerifyFound();
16856
16857 // BufferOffset must be a multiple of 4
16858 // Introduce failure by setting bufferOffset to a value not divisible by 4
16859 region.bufferOffset = 6;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be a multiple of 4");
16861 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16862 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016863 m_errorMonitor->VerifyFound();
16864
16865 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
16866 region.bufferOffset = 0;
16867 region.imageExtent.height = 128;
16868 region.imageExtent.width = 128;
16869 // Introduce failure by setting bufferRowLength > 0 but less than width
16870 region.bufferRowLength = 64;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016871 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16872 "must be zero or greater-than-or-equal-to imageExtent.width");
16873 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16874 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016875 m_errorMonitor->VerifyFound();
16876
16877 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
16878 region.bufferRowLength = 128;
16879 // Introduce failure by setting bufferRowHeight > 0 but less than height
16880 region.bufferImageHeight = 64;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016881 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16882 "must be zero or greater-than-or-equal-to imageExtent.height");
16883 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16884 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016885 m_errorMonitor->VerifyFound();
16886
16887 region.bufferImageHeight = 128;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016888 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "aspectMasks for each region must "
16889 "specify only COLOR or DEPTH or "
16890 "STENCIL");
Tony Barbourd6673642016-05-05 14:46:39 -060016891 // Expect MISMATCHED_IMAGE_ASPECT
16892 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016893 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16894 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourd6673642016-05-05 14:46:39 -060016895 m_errorMonitor->VerifyFound();
16896 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16897
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016898 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16899 "If the format of srcImage is a depth, stencil, depth stencil or "
16900 "integer-based format then filter must be VK_FILTER_NEAREST");
Tony Barbourd6673642016-05-05 14:46:39 -060016901 // Expect INVALID_FILTER
16902 VkImageObj intImage1(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016903 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 -060016904 VkImageObj intImage2(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016905 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 -060016906 VkImageBlit blitRegion = {};
16907 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16908 blitRegion.srcSubresource.baseArrayLayer = 0;
16909 blitRegion.srcSubresource.layerCount = 1;
16910 blitRegion.srcSubresource.mipLevel = 0;
16911 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16912 blitRegion.dstSubresource.baseArrayLayer = 0;
16913 blitRegion.dstSubresource.layerCount = 1;
16914 blitRegion.dstSubresource.mipLevel = 0;
16915
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016916 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
16917 intImage2.layout(), 16, &blitRegion, VK_FILTER_LINEAR);
Tony Barbourd6673642016-05-05 14:46:39 -060016918 m_errorMonitor->VerifyFound();
16919
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016920 // Look for NULL-blit warning
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016921 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "Offsets specify a zero-volume area.");
16922 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
16923 intImage2.layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016924 m_errorMonitor->VerifyFound();
16925
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016926 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with 0 in ppMemoryBarriers");
Tony Barbourd6673642016-05-05 14:46:39 -060016927 VkImageMemoryBarrier img_barrier;
16928 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16929 img_barrier.pNext = NULL;
16930 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16931 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16932 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16933 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16934 img_barrier.image = image.handle();
16935 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16936 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16937 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16938 img_barrier.subresourceRange.baseArrayLayer = 0;
16939 img_barrier.subresourceRange.baseMipLevel = 0;
16940 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
16941 img_barrier.subresourceRange.layerCount = 0;
16942 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016943 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
16944 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060016945 m_errorMonitor->VerifyFound();
16946 img_barrier.subresourceRange.layerCount = 1;
16947}
16948
16949TEST_F(VkLayerTest, ImageFormatLimits) {
16950
16951 TEST_DESCRIPTION("Exceed the limits of image format ");
16952
Cody Northropc31a84f2016-08-22 10:41:47 -060016953 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060016955 VkImageCreateInfo image_create_info = {};
16956 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16957 image_create_info.pNext = NULL;
16958 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16959 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16960 image_create_info.extent.width = 32;
16961 image_create_info.extent.height = 32;
16962 image_create_info.extent.depth = 1;
16963 image_create_info.mipLevels = 1;
16964 image_create_info.arrayLayers = 1;
16965 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16966 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16967 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16968 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16969 image_create_info.flags = 0;
16970
16971 VkImage nullImg;
16972 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016973 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
16974 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Tony Barbourd6673642016-05-05 14:46:39 -060016975 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
16976 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16977 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16978 m_errorMonitor->VerifyFound();
16979 image_create_info.extent.depth = 1;
16980
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016981 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060016982 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
16983 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16984 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16985 m_errorMonitor->VerifyFound();
16986 image_create_info.mipLevels = 1;
16987
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016988 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060016989 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
16990 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16991 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16992 m_errorMonitor->VerifyFound();
16993 image_create_info.arrayLayers = 1;
16994
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016995 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060016996 int samples = imgFmtProps.sampleCounts >> 1;
16997 image_create_info.samples = (VkSampleCountFlagBits)samples;
16998 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16999 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17000 m_errorMonitor->VerifyFound();
17001 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17002
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017003 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pCreateInfo->initialLayout, must be "
17004 "VK_IMAGE_LAYOUT_UNDEFINED or "
17005 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060017006 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17007 // Expect INVALID_LAYOUT
17008 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17009 m_errorMonitor->VerifyFound();
17010 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17011}
17012
Karl Schultz6addd812016-02-02 17:17:23 -070017013TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060017014 VkResult err;
17015 bool pass;
17016
17017 // Create color images with different format sizes and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017018 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17019 "vkCmdCopyImage called with unmatched source and dest image format sizes");
Karl Schultzbdb75952016-04-19 11:36:49 -060017020
17021 ASSERT_NO_FATAL_FAILURE(InitState());
17022
17023 // Create two images of different types and try to copy between them
17024 VkImage srcImage;
17025 VkImage dstImage;
17026 VkDeviceMemory srcMem;
17027 VkDeviceMemory destMem;
17028 VkMemoryRequirements memReqs;
17029
17030 VkImageCreateInfo image_create_info = {};
17031 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17032 image_create_info.pNext = NULL;
17033 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17034 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17035 image_create_info.extent.width = 32;
17036 image_create_info.extent.height = 32;
17037 image_create_info.extent.depth = 1;
17038 image_create_info.mipLevels = 1;
17039 image_create_info.arrayLayers = 1;
17040 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17041 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17042 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17043 image_create_info.flags = 0;
17044
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017045 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017046 ASSERT_VK_SUCCESS(err);
17047
17048 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17049 // Introduce failure by creating second image with a different-sized format.
17050 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
17051
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017052 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017053 ASSERT_VK_SUCCESS(err);
17054
17055 // Allocate memory
17056 VkMemoryAllocateInfo memAlloc = {};
17057 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17058 memAlloc.pNext = NULL;
17059 memAlloc.allocationSize = 0;
17060 memAlloc.memoryTypeIndex = 0;
17061
17062 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
17063 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017064 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017065 ASSERT_TRUE(pass);
17066 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
17067 ASSERT_VK_SUCCESS(err);
17068
17069 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
17070 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017071 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017072 ASSERT_TRUE(pass);
17073 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
17074 ASSERT_VK_SUCCESS(err);
17075
17076 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17077 ASSERT_VK_SUCCESS(err);
17078 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
17079 ASSERT_VK_SUCCESS(err);
17080
17081 BeginCommandBuffer();
17082 VkImageCopy copyRegion;
17083 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17084 copyRegion.srcSubresource.mipLevel = 0;
17085 copyRegion.srcSubresource.baseArrayLayer = 0;
17086 copyRegion.srcSubresource.layerCount = 0;
17087 copyRegion.srcOffset.x = 0;
17088 copyRegion.srcOffset.y = 0;
17089 copyRegion.srcOffset.z = 0;
17090 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17091 copyRegion.dstSubresource.mipLevel = 0;
17092 copyRegion.dstSubresource.baseArrayLayer = 0;
17093 copyRegion.dstSubresource.layerCount = 0;
17094 copyRegion.dstOffset.x = 0;
17095 copyRegion.dstOffset.y = 0;
17096 copyRegion.dstOffset.z = 0;
17097 copyRegion.extent.width = 1;
17098 copyRegion.extent.height = 1;
17099 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017100 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Karl Schultzbdb75952016-04-19 11:36:49 -060017101 EndCommandBuffer();
17102
17103 m_errorMonitor->VerifyFound();
17104
17105 vkDestroyImage(m_device->device(), srcImage, NULL);
17106 vkDestroyImage(m_device->device(), dstImage, NULL);
17107 vkFreeMemory(m_device->device(), srcMem, NULL);
17108 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017109}
17110
Karl Schultz6addd812016-02-02 17:17:23 -070017111TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
17112 VkResult err;
17113 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017114
Mark Lobodzinskidb117632016-03-31 10:45:56 -060017115 // Create a color image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017116 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17117 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017118
Mike Stroyana3082432015-09-25 13:39:21 -060017119 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060017120
17121 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017122 VkImage srcImage;
17123 VkImage dstImage;
17124 VkDeviceMemory srcMem;
17125 VkDeviceMemory destMem;
17126 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017127
17128 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017129 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17130 image_create_info.pNext = NULL;
17131 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17132 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17133 image_create_info.extent.width = 32;
17134 image_create_info.extent.height = 32;
17135 image_create_info.extent.depth = 1;
17136 image_create_info.mipLevels = 1;
17137 image_create_info.arrayLayers = 1;
17138 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17139 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17140 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17141 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017142
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017143 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017144 ASSERT_VK_SUCCESS(err);
17145
Karl Schultzbdb75952016-04-19 11:36:49 -060017146 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17147
Mark Lobodzinskidb117632016-03-31 10:45:56 -060017148 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070017149 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060017150 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
17151 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017152
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017153 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017154 ASSERT_VK_SUCCESS(err);
17155
17156 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017157 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017158 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17159 memAlloc.pNext = NULL;
17160 memAlloc.allocationSize = 0;
17161 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017162
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017163 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017164 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017165 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017166 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017167 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017168 ASSERT_VK_SUCCESS(err);
17169
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017170 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017171 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017172 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017173 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017174 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017175 ASSERT_VK_SUCCESS(err);
17176
17177 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17178 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017179 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017180 ASSERT_VK_SUCCESS(err);
17181
17182 BeginCommandBuffer();
17183 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017184 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017185 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017186 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017187 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017188 copyRegion.srcOffset.x = 0;
17189 copyRegion.srcOffset.y = 0;
17190 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017191 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017192 copyRegion.dstSubresource.mipLevel = 0;
17193 copyRegion.dstSubresource.baseArrayLayer = 0;
17194 copyRegion.dstSubresource.layerCount = 0;
17195 copyRegion.dstOffset.x = 0;
17196 copyRegion.dstOffset.y = 0;
17197 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017198 copyRegion.extent.width = 1;
17199 copyRegion.extent.height = 1;
17200 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017201 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060017202 EndCommandBuffer();
17203
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017204 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017205
Chia-I Wuf7458c52015-10-26 21:10:41 +080017206 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017207 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017208 vkFreeMemory(m_device->device(), srcMem, NULL);
17209 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017210}
17211
Karl Schultz6addd812016-02-02 17:17:23 -070017212TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
17213 VkResult err;
17214 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017215
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017216 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17217 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017218
Mike Stroyana3082432015-09-25 13:39:21 -060017219 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060017220
17221 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017222 VkImage srcImage;
17223 VkImage dstImage;
17224 VkDeviceMemory srcMem;
17225 VkDeviceMemory destMem;
17226 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017227
17228 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017229 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17230 image_create_info.pNext = NULL;
17231 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17232 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17233 image_create_info.extent.width = 32;
17234 image_create_info.extent.height = 1;
17235 image_create_info.extent.depth = 1;
17236 image_create_info.mipLevels = 1;
17237 image_create_info.arrayLayers = 1;
17238 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17239 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17240 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17241 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017242
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017243 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017244 ASSERT_VK_SUCCESS(err);
17245
Karl Schultz6addd812016-02-02 17:17:23 -070017246 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017247
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017248 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017249 ASSERT_VK_SUCCESS(err);
17250
17251 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017252 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017253 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17254 memAlloc.pNext = NULL;
17255 memAlloc.allocationSize = 0;
17256 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017257
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017258 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017259 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017260 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017261 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017262 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017263 ASSERT_VK_SUCCESS(err);
17264
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017265 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017266 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017267 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017268 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017269 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017270 ASSERT_VK_SUCCESS(err);
17271
17272 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17273 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017274 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017275 ASSERT_VK_SUCCESS(err);
17276
17277 BeginCommandBuffer();
17278 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017279 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17280 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017281 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017282 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017283 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017284 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017285 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017286 resolveRegion.srcOffset.x = 0;
17287 resolveRegion.srcOffset.y = 0;
17288 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017289 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017290 resolveRegion.dstSubresource.mipLevel = 0;
17291 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017292 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017293 resolveRegion.dstOffset.x = 0;
17294 resolveRegion.dstOffset.y = 0;
17295 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017296 resolveRegion.extent.width = 1;
17297 resolveRegion.extent.height = 1;
17298 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017299 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060017300 EndCommandBuffer();
17301
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017302 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017303
Chia-I Wuf7458c52015-10-26 21:10:41 +080017304 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017305 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017306 vkFreeMemory(m_device->device(), srcMem, NULL);
17307 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017308}
17309
Karl Schultz6addd812016-02-02 17:17:23 -070017310TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
17311 VkResult err;
17312 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017313
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017314 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17315 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017316
Mike Stroyana3082432015-09-25 13:39:21 -060017317 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060017318
Chris Forbesa7530692016-05-08 12:35:39 +120017319 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017320 VkImage srcImage;
17321 VkImage dstImage;
17322 VkDeviceMemory srcMem;
17323 VkDeviceMemory destMem;
17324 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017325
17326 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017327 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17328 image_create_info.pNext = NULL;
17329 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17330 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17331 image_create_info.extent.width = 32;
17332 image_create_info.extent.height = 1;
17333 image_create_info.extent.depth = 1;
17334 image_create_info.mipLevels = 1;
17335 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120017336 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017337 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17338 // Note: Some implementations expect color attachment usage for any
17339 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017340 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017341 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017342
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017343 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017344 ASSERT_VK_SUCCESS(err);
17345
Karl Schultz6addd812016-02-02 17:17:23 -070017346 // Note: Some implementations expect color attachment usage for any
17347 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017348 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017349
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017350 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017351 ASSERT_VK_SUCCESS(err);
17352
17353 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017354 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017355 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17356 memAlloc.pNext = NULL;
17357 memAlloc.allocationSize = 0;
17358 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017359
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017360 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017361 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017362 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017363 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017364 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017365 ASSERT_VK_SUCCESS(err);
17366
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017367 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017368 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017369 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017370 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017371 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017372 ASSERT_VK_SUCCESS(err);
17373
17374 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17375 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017376 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017377 ASSERT_VK_SUCCESS(err);
17378
17379 BeginCommandBuffer();
17380 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017381 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17382 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017383 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017384 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017385 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017386 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017387 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017388 resolveRegion.srcOffset.x = 0;
17389 resolveRegion.srcOffset.y = 0;
17390 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017391 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017392 resolveRegion.dstSubresource.mipLevel = 0;
17393 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017394 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017395 resolveRegion.dstOffset.x = 0;
17396 resolveRegion.dstOffset.y = 0;
17397 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017398 resolveRegion.extent.width = 1;
17399 resolveRegion.extent.height = 1;
17400 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017401 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060017402 EndCommandBuffer();
17403
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017404 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017405
Chia-I Wuf7458c52015-10-26 21:10:41 +080017406 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017407 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017408 vkFreeMemory(m_device->device(), srcMem, NULL);
17409 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017410}
17411
Karl Schultz6addd812016-02-02 17:17:23 -070017412TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
17413 VkResult err;
17414 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017415
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017416 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17417 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017418
Mike Stroyana3082432015-09-25 13:39:21 -060017419 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060017420
17421 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017422 VkImage srcImage;
17423 VkImage dstImage;
17424 VkDeviceMemory srcMem;
17425 VkDeviceMemory destMem;
17426 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017427
17428 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017429 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17430 image_create_info.pNext = NULL;
17431 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17432 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17433 image_create_info.extent.width = 32;
17434 image_create_info.extent.height = 1;
17435 image_create_info.extent.depth = 1;
17436 image_create_info.mipLevels = 1;
17437 image_create_info.arrayLayers = 1;
17438 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17439 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17440 // Note: Some implementations expect color attachment usage for any
17441 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017442 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017443 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017444
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017445 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017446 ASSERT_VK_SUCCESS(err);
17447
Karl Schultz6addd812016-02-02 17:17:23 -070017448 // Set format to something other than source image
17449 image_create_info.format = VK_FORMAT_R32_SFLOAT;
17450 // Note: Some implementations expect color attachment usage for any
17451 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017452 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017453 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017454
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017455 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017456 ASSERT_VK_SUCCESS(err);
17457
17458 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017459 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017460 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17461 memAlloc.pNext = NULL;
17462 memAlloc.allocationSize = 0;
17463 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017464
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017465 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017466 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017467 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017468 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017469 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017470 ASSERT_VK_SUCCESS(err);
17471
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017472 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017473 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017474 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017475 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017476 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017477 ASSERT_VK_SUCCESS(err);
17478
17479 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17480 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017481 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017482 ASSERT_VK_SUCCESS(err);
17483
17484 BeginCommandBuffer();
17485 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017486 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17487 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017488 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017489 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017490 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017491 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017492 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017493 resolveRegion.srcOffset.x = 0;
17494 resolveRegion.srcOffset.y = 0;
17495 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017496 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017497 resolveRegion.dstSubresource.mipLevel = 0;
17498 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017499 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017500 resolveRegion.dstOffset.x = 0;
17501 resolveRegion.dstOffset.y = 0;
17502 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017503 resolveRegion.extent.width = 1;
17504 resolveRegion.extent.height = 1;
17505 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017506 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060017507 EndCommandBuffer();
17508
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017509 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017510
Chia-I Wuf7458c52015-10-26 21:10:41 +080017511 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017512 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017513 vkFreeMemory(m_device->device(), srcMem, NULL);
17514 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017515}
17516
Karl Schultz6addd812016-02-02 17:17:23 -070017517TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
17518 VkResult err;
17519 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017520
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017521 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17522 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017523
Mike Stroyana3082432015-09-25 13:39:21 -060017524 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060017525
17526 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017527 VkImage srcImage;
17528 VkImage dstImage;
17529 VkDeviceMemory srcMem;
17530 VkDeviceMemory destMem;
17531 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017532
17533 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017534 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17535 image_create_info.pNext = NULL;
17536 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17537 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17538 image_create_info.extent.width = 32;
17539 image_create_info.extent.height = 1;
17540 image_create_info.extent.depth = 1;
17541 image_create_info.mipLevels = 1;
17542 image_create_info.arrayLayers = 1;
17543 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17544 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17545 // Note: Some implementations expect color attachment usage for any
17546 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017547 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017548 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017549
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017550 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017551 ASSERT_VK_SUCCESS(err);
17552
Karl Schultz6addd812016-02-02 17:17:23 -070017553 image_create_info.imageType = VK_IMAGE_TYPE_1D;
17554 // Note: Some implementations expect color attachment usage for any
17555 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017556 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017557 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017558
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017559 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017560 ASSERT_VK_SUCCESS(err);
17561
17562 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017563 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017564 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17565 memAlloc.pNext = NULL;
17566 memAlloc.allocationSize = 0;
17567 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017568
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017569 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017570 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017571 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017572 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017573 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017574 ASSERT_VK_SUCCESS(err);
17575
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017576 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017577 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017578 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017579 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017580 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017581 ASSERT_VK_SUCCESS(err);
17582
17583 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17584 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017585 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017586 ASSERT_VK_SUCCESS(err);
17587
17588 BeginCommandBuffer();
17589 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017590 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17591 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017592 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017593 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017594 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017595 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017596 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017597 resolveRegion.srcOffset.x = 0;
17598 resolveRegion.srcOffset.y = 0;
17599 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017600 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017601 resolveRegion.dstSubresource.mipLevel = 0;
17602 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017603 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017604 resolveRegion.dstOffset.x = 0;
17605 resolveRegion.dstOffset.y = 0;
17606 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017607 resolveRegion.extent.width = 1;
17608 resolveRegion.extent.height = 1;
17609 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017610 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060017611 EndCommandBuffer();
17612
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017613 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017614
Chia-I Wuf7458c52015-10-26 21:10:41 +080017615 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017616 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017617 vkFreeMemory(m_device->device(), srcMem, NULL);
17618 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017619}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017620
Karl Schultz6addd812016-02-02 17:17:23 -070017621TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017622 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070017623 // to using a DS format, then cause it to hit error due to COLOR_BIT not
17624 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017625 // The image format check comes 2nd in validation so we trigger it first,
17626 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070017627 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017628
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017629 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17630 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017631
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017632 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017633
Chia-I Wu1b99bb22015-10-27 19:25:11 +080017634 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017635 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17636 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017637
17638 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017639 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17640 ds_pool_ci.pNext = NULL;
17641 ds_pool_ci.maxSets = 1;
17642 ds_pool_ci.poolSizeCount = 1;
17643 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017644
17645 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017646 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017647 ASSERT_VK_SUCCESS(err);
17648
17649 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017650 dsl_binding.binding = 0;
17651 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17652 dsl_binding.descriptorCount = 1;
17653 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
17654 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017655
17656 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017657 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17658 ds_layout_ci.pNext = NULL;
17659 ds_layout_ci.bindingCount = 1;
17660 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017661 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017662 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017663 ASSERT_VK_SUCCESS(err);
17664
17665 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017666 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080017667 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070017668 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017669 alloc_info.descriptorPool = ds_pool;
17670 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017671 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017672 ASSERT_VK_SUCCESS(err);
17673
Karl Schultz6addd812016-02-02 17:17:23 -070017674 VkImage image_bad;
17675 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017676 // One bad format and one good format for Color attachment
Tobin Ehlis269f0322016-05-25 16:24:21 -060017677 const VkFormat tex_format_bad = VK_FORMAT_D24_UNORM_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017678 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070017679 const int32_t tex_width = 32;
17680 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017681
17682 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017683 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17684 image_create_info.pNext = NULL;
17685 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17686 image_create_info.format = tex_format_bad;
17687 image_create_info.extent.width = tex_width;
17688 image_create_info.extent.height = tex_height;
17689 image_create_info.extent.depth = 1;
17690 image_create_info.mipLevels = 1;
17691 image_create_info.arrayLayers = 1;
17692 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17693 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017694 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017695 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017696
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017697 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017698 ASSERT_VK_SUCCESS(err);
17699 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017700 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
17701 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017702 ASSERT_VK_SUCCESS(err);
17703
17704 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017705 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17706 image_view_create_info.image = image_bad;
17707 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
17708 image_view_create_info.format = tex_format_bad;
17709 image_view_create_info.subresourceRange.baseArrayLayer = 0;
17710 image_view_create_info.subresourceRange.baseMipLevel = 0;
17711 image_view_create_info.subresourceRange.layerCount = 1;
17712 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017713 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017714
17715 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017716 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017717
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017718 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017719
Chia-I Wuf7458c52015-10-26 21:10:41 +080017720 vkDestroyImage(m_device->device(), image_bad, NULL);
17721 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017722 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17723 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017724}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017725
17726TEST_F(VkLayerTest, ClearImageErrors) {
17727 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and "
17728 "ClearDepthStencilImage with a color image.");
17729
17730 ASSERT_NO_FATAL_FAILURE(InitState());
17731 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
17732
17733 // Renderpass is started here so end it as Clear cmds can't be in renderpass
17734 BeginCommandBuffer();
17735 m_commandBuffer->EndRenderPass();
17736
17737 // Color image
17738 VkClearColorValue clear_color;
17739 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
17740 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
17741 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
17742 const int32_t img_width = 32;
17743 const int32_t img_height = 32;
17744 VkImageCreateInfo image_create_info = {};
17745 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17746 image_create_info.pNext = NULL;
17747 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17748 image_create_info.format = color_format;
17749 image_create_info.extent.width = img_width;
17750 image_create_info.extent.height = img_height;
17751 image_create_info.extent.depth = 1;
17752 image_create_info.mipLevels = 1;
17753 image_create_info.arrayLayers = 1;
17754 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17755 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17756 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
17757
17758 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017759 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017760
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017761 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017762
17763 // Depth/Stencil image
17764 VkClearDepthStencilValue clear_value = {0};
17765 reqs = 0; // don't need HOST_VISIBLE DS image
17766 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
17767 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
17768 ds_image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
17769 ds_image_create_info.extent.width = 64;
17770 ds_image_create_info.extent.height = 64;
17771 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17772 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
17773
17774 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017775 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017776
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017777 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 -060017778
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017779 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017780
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017781 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017782 &color_range);
17783
17784 m_errorMonitor->VerifyFound();
17785
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017786 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with "
17787 "image created without "
17788 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060017789
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017790 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060017791 &color_range);
17792
17793 m_errorMonitor->VerifyFound();
17794
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017795 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017796 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17797 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017798
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017799 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(),
17800 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017801
17802 m_errorMonitor->VerifyFound();
17803}
Tobin Ehliscde08892015-09-22 10:11:37 -060017804#endif // IMAGE_TESTS
17805
Cody Northrop1242dfd2016-07-13 17:24:59 -060017806#if defined(ANDROID) && defined(VALIDATION_APK)
17807static bool initialized = false;
17808static bool active = false;
17809
17810// Convert Intents to argv
17811// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017812std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060017813 std::vector<std::string> args;
17814 JavaVM &vm = *app.activity->vm;
17815 JNIEnv *p_env;
17816 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK)
17817 return args;
17818
17819 JNIEnv &env = *p_env;
17820 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017821 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060017822 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017823 jmethodID get_string_extra_method =
17824 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060017825 jvalue get_string_extra_args;
17826 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017827 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060017828
17829 std::string args_str;
17830 if (extra_str) {
17831 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
17832 args_str = extra_utf;
17833 env.ReleaseStringUTFChars(extra_str, extra_utf);
17834 env.DeleteLocalRef(extra_str);
17835 }
17836
17837 env.DeleteLocalRef(get_string_extra_args.l);
17838 env.DeleteLocalRef(intent);
17839 vm.DetachCurrentThread();
17840
17841 // split args_str
17842 std::stringstream ss(args_str);
17843 std::string arg;
17844 while (std::getline(ss, arg, ' ')) {
17845 if (!arg.empty())
17846 args.push_back(arg);
17847 }
17848
17849 return args;
17850}
17851
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017852static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060017853
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017854static void processCommand(struct android_app *app, int32_t cmd) {
17855 switch (cmd) {
17856 case APP_CMD_INIT_WINDOW: {
17857 if (app->window) {
17858 initialized = true;
Cody Northrop1242dfd2016-07-13 17:24:59 -060017859 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017860 break;
17861 }
17862 case APP_CMD_GAINED_FOCUS: {
17863 active = true;
17864 break;
17865 }
17866 case APP_CMD_LOST_FOCUS: {
17867 active = false;
17868 break;
17869 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060017870 }
17871}
17872
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017873void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060017874 app_dummy();
17875
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017876 const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060017877
17878 int vulkanSupport = InitVulkan();
17879 if (vulkanSupport == 0) {
17880 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
17881 return;
17882 }
17883
17884 app->onAppCmd = processCommand;
17885 app->onInputEvent = processInput;
17886
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017887 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060017888 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017889 struct android_poll_source *source;
17890 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060017891 if (source) {
17892 source->process(app, source);
17893 }
17894
17895 if (app->destroyRequested != 0) {
17896 VkTestFramework::Finish();
17897 return;
17898 }
17899 }
17900
17901 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017902 // Use the following key to send arguments to gtest, i.e.
17903 // --es args "--gtest_filter=-VkLayerTest.foo"
17904 const char key[] = "args";
17905 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060017906
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017907 std::string filter = "";
17908 if (args.size() > 0) {
17909 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
17910 filter += args[0];
17911 } else {
17912 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
17913 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060017914
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017915 int argc = 2;
17916 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
17917 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060017918
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017919 // Route output to files until we can override the gtest output
17920 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
17921 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060017922
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017923 ::testing::InitGoogleTest(&argc, argv);
17924 VkTestFramework::InitArgs(&argc, argv);
17925 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060017926
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017927 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060017928
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017929 if (result != 0) {
17930 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
17931 } else {
17932 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
17933 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060017934
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017935 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060017936
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017937 fclose(stdout);
17938 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060017939
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017940 ANativeActivity_finish(app->activity);
Cody Northrop1242dfd2016-07-13 17:24:59 -060017941
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017942 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060017943 }
17944 }
17945}
17946#endif
17947
Tony Barbour300a6082015-04-07 13:44:53 -060017948int main(int argc, char **argv) {
17949 int result;
17950
Cody Northrop8e54a402016-03-08 22:25:52 -070017951#ifdef ANDROID
17952 int vulkanSupport = InitVulkan();
17953 if (vulkanSupport == 0)
17954 return 1;
17955#endif
17956
Tony Barbour300a6082015-04-07 13:44:53 -060017957 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060017958 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060017959
17960 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
17961
17962 result = RUN_ALL_TESTS();
17963
Tony Barbour6918cd52015-04-09 12:58:51 -060017964 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060017965 return result;
17966}