blob: e91a3d13501e429a1bb91bb545dc073bfcd2f534 [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>
20 */
Tony Barbour65c48b32015-11-17 10:02:56 -070021
Cody Northrop8e54a402016-03-08 22:25:52 -070022#ifdef ANDROID
23#include "vulkan_wrapper.h"
24#else
David Pinedo9316d3b2015-11-06 12:54:48 -070025#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070026#endif
Courtney Goeltzenleuchter58f3eff2015-10-07 13:28:58 -060027#include "test_common.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060028#include "vkrenderframework.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060029#include "vk_layer_config.h"
Jon Ashburn7fa7e222016-02-02 12:08:10 -070030#include "icd-spv.h"
Tony Barbour300a6082015-04-07 13:44:53 -060031
Mark Lobodzinski3780e142015-05-14 15:08:13 -050032#define GLM_FORCE_RADIANS
33#include "glm/glm.hpp"
34#include <glm/gtc/matrix_transform.hpp>
35
Dustin Gravesffa90fa2016-05-06 11:20:38 -060036#define PARAMETER_VALIDATION_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060037#define MEM_TRACKER_TESTS 1
38#define OBJ_TRACKER_TESTS 1
39#define DRAW_STATE_TESTS 1
40#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120041#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060042#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060043#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060044
Mark Lobodzinski3780e142015-05-14 15:08:13 -050045//--------------------------------------------------------------------------------------
46// Mesh and VertexFormat Data
47//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070048struct Vertex {
49 float posX, posY, posZ, posW; // Position data
50 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050051};
52
Karl Schultz6addd812016-02-02 17:17:23 -070053#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050054
55typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070056 BsoFailNone = 0x00000000,
57 BsoFailLineWidth = 0x00000001,
58 BsoFailDepthBias = 0x00000002,
59 BsoFailViewport = 0x00000004,
60 BsoFailScissor = 0x00000008,
61 BsoFailBlend = 0x00000010,
62 BsoFailDepthBounds = 0x00000020,
63 BsoFailStencilReadMask = 0x00000040,
64 BsoFailStencilWriteMask = 0x00000080,
65 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060066 BsoFailCmdClearAttachments = 0x00000200,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050067} BsoFailSelect;
68
69struct vktriangle_vs_uniform {
70 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070071 float mvp[4][4];
72 float position[3][4];
73 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050074};
75
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050076static const char bindStateVertShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120077 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070078 "vec2 vertices[3];\n"
79 "out gl_PerVertex {\n"
80 " vec4 gl_Position;\n"
81 "};\n"
82 "void main() {\n"
83 " vertices[0] = vec2(-1.0, -1.0);\n"
84 " vertices[1] = vec2( 1.0, -1.0);\n"
85 " vertices[2] = vec2( 0.0, 1.0);\n"
86 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
87 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050088
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050089static const char bindStateFragShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120090 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070091 "\n"
92 "layout(location = 0) out vec4 uFragColor;\n"
93 "void main(){\n"
94 " uFragColor = vec4(0,1,0,1);\n"
95 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050096
Karl Schultz6addd812016-02-02 17:17:23 -070097static VKAPI_ATTR VkBool32 VKAPI_CALL
98myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
99 uint64_t srcObject, size_t location, int32_t msgCode,
100 const char *pLayerPrefix, const char *pMsg, void *pUserData);
Tony Barbour300a6082015-04-07 13:44:53 -0600101
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600102// ********************************************************
103// ErrorMonitor Usage:
104//
105// Call SetDesiredFailureMsg with a string to be compared against all
106// encountered log messages. Passing NULL will match all log messages.
107// logMsg will return true for skipCall only if msg is matched or NULL.
108//
109// Call DesiredMsgFound to determine if the desired failure message
110// was encountered.
111
Tony Barbour300a6082015-04-07 13:44:53 -0600112class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700113 public:
114 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600115 test_platform_thread_create_mutex(&m_mutex);
116 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700117 m_msgFlags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700118 m_bailout = NULL;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600119 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600120 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600121
Dustin Graves48458142016-04-29 16:11:55 -0600122 ~ErrorMonitor() { test_platform_thread_delete_mutex(&m_mutex); }
123
Karl Schultz6addd812016-02-02 17:17:23 -0700124 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200125 // also discard all collected messages to this point
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600126 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600127 m_failureMsg.clear();
128 m_otherMsgs.clear();
129 m_desiredMsg = msgString;
Karl Schultz6addd812016-02-02 17:17:23 -0700130 m_msgFound = VK_FALSE;
131 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600132 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600133 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600134
Karl Schultz6addd812016-02-02 17:17:23 -0700135 VkBool32 CheckForDesiredMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600136 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600137 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600138 if (m_bailout != NULL) {
139 *m_bailout = true;
140 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600141 string errorString(msgString);
142 if (msgFlags & m_msgFlags) {
143 if (errorString.find(m_desiredMsg) != string::npos) {
Chris Forbesc7b8ad72016-04-04 18:50:38 +1200144 if (m_msgFound) { /* if multiple matches, don't lose all but the last! */
145 m_otherMsgs.push_back(m_failureMsg);
146 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600147 m_failureMsg = errorString;
Karl Schultz6addd812016-02-02 17:17:23 -0700148 m_msgFound = VK_TRUE;
149 result = VK_TRUE;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600150 } else {
151 m_otherMsgs.push_back(errorString);
152 }
153 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600154 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600155 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600156 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600157
Karl Schultz6addd812016-02-02 17:17:23 -0700158 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600159
Karl Schultz6addd812016-02-02 17:17:23 -0700160 string GetFailureMsg(void) { return m_failureMsg; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600161
Karl Schultz6addd812016-02-02 17:17:23 -0700162 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600163
Karl Schultz6addd812016-02-02 17:17:23 -0700164 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600165
Karl Schultz6addd812016-02-02 17:17:23 -0700166 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600167 vector<string> otherMsgs = GetOtherFailureMsgs();
168 cout << "Other error messages logged for this test were:" << endl;
169 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
170 cout << " " << *iter << endl;
171 }
172 }
173
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200174 /* helpers */
175
176 void ExpectSuccess() {
177 // match anything
178 SetDesiredFailureMsg(~0u, "");
179 }
180
181 void VerifyFound() {
182 // Not seeing the desired message is a failure. /Before/ throwing, dump
183 // any other messages.
184 if (!DesiredMsgFound()) {
185 DumpFailureMsgs();
186 FAIL() << "Did not receive expected error '" << m_desiredMsg << "'";
187 }
188 }
189
190 void VerifyNotFound() {
191 // ExpectSuccess() configured us to match anything. Any error is a
192 // failure.
193 if (DesiredMsgFound()) {
194 DumpFailureMsgs();
195 FAIL() << "Expected to succeed but got error: " << GetFailureMsg();
196 }
197 }
198
Karl Schultz6addd812016-02-02 17:17:23 -0700199 private:
200 VkFlags m_msgFlags;
201 string m_desiredMsg;
202 string m_failureMsg;
203 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600204 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700205 bool *m_bailout;
206 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600207};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500208
Karl Schultz6addd812016-02-02 17:17:23 -0700209static VKAPI_ATTR VkBool32 VKAPI_CALL
210myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
211 uint64_t srcObject, size_t location, int32_t msgCode,
212 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
213 if (msgFlags &
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700214 (VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT |
Karl Schultz6addd812016-02-02 17:17:23 -0700215 VK_DEBUG_REPORT_ERROR_BIT_EXT)) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600216 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600217 return errMonitor->CheckForDesiredMsg(msgFlags, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600218 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600219 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600220}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500221
Karl Schultz6addd812016-02-02 17:17:23 -0700222class VkLayerTest : public VkRenderFramework {
223 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800224 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
225 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700226 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText,
227 BsoFailSelect failMask);
228 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
229 VkPipelineObj &pipelineobj,
230 VkDescriptorSetObj &descriptorSet,
231 BsoFailSelect failMask);
232 void GenericDrawPreparation(VkPipelineObj &pipelineobj,
233 VkDescriptorSetObj &descriptorSet,
234 BsoFailSelect failMask) {
235 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet,
236 failMask);
237 }
Tony Barbour300a6082015-04-07 13:44:53 -0600238
Tony Barbourfe3351b2015-07-28 10:17:20 -0600239 /* Convenience functions that use built-in command buffer */
Karl Schultz6addd812016-02-02 17:17:23 -0700240 VkResult BeginCommandBuffer() {
241 return BeginCommandBuffer(*m_commandBuffer);
242 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800243 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Karl Schultz6addd812016-02-02 17:17:23 -0700244 void Draw(uint32_t vertexCount, uint32_t instanceCount,
245 uint32_t firstVertex, uint32_t firstInstance) {
246 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex,
247 firstInstance);
248 }
249 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
250 uint32_t firstIndex, int32_t vertexOffset,
251 uint32_t firstInstance) {
252 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex,
253 vertexOffset, firstInstance);
254 }
Mark Muellerdfe37552016-07-07 14:47:42 -0600255 void QueueCommandBuffer(bool checkSuccess = true) {
256 m_commandBuffer->QueueCommandBuffer(checkSuccess); }
Karl Schultz6addd812016-02-02 17:17:23 -0700257 void QueueCommandBuffer(const VkFence &fence) {
258 m_commandBuffer->QueueCommandBuffer(fence);
259 }
260 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
261 VkDeviceSize offset, uint32_t binding) {
262 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
263 }
264 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
265 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
266 }
267
268 protected:
269 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600270 bool m_enableWSI;
Tony Barbour300a6082015-04-07 13:44:53 -0600271
272 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600273 std::vector<const char *> instance_layer_names;
274 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600275 std::vector<const char *> instance_extension_names;
276 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600277
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700278 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600279 /*
280 * Since CreateDbgMsgCallback is an instance level extension call
281 * any extension / layer that utilizes that feature also needs
282 * to be enabled at create instance time.
283 */
Karl Schultz6addd812016-02-02 17:17:23 -0700284 // Use Threading layer first to protect others from
285 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700286 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600287 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800288 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700289 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800290 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600291 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700292 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600293
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700294 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600295 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800296 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700297 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800298 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600299 device_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700300 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour300a6082015-04-07 13:44:53 -0600301
Ian Elliott2c1daf52016-05-12 09:41:46 -0600302 if (m_enableWSI) {
303 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
304 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
305#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
306#if defined(VK_USE_PLATFORM_ANDROID_KHR)
307 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
308#endif // VK_USE_PLATFORM_ANDROID_KHR
309#if defined(VK_USE_PLATFORM_MIR_KHR)
310 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
311#endif // VK_USE_PLATFORM_MIR_KHR
312#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
313 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
314#endif // VK_USE_PLATFORM_WAYLAND_KHR
315#if defined(VK_USE_PLATFORM_WIN32_KHR)
316 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
317#endif // VK_USE_PLATFORM_WIN32_KHR
318#endif // NEED_TO_TEST_THIS_ON_PLATFORM
319#if defined(VK_USE_PLATFORM_XCB_KHR)
320 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
321#elif defined(VK_USE_PLATFORM_XLIB_KHR)
322 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
323#endif // VK_USE_PLATFORM_XLIB_KHR
324 }
325
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600326 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600327 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800328 this->app_info.pApplicationName = "layer_tests";
329 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600330 this->app_info.pEngineName = "unittest";
331 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600332 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600333
Tony Barbour15524c32015-04-29 17:34:29 -0600334 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600335 InitFramework(instance_layer_names, device_layer_names,
336 instance_extension_names, device_extension_names,
337 myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600338 }
339
340 virtual void TearDown() {
341 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600342 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600343 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600344 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600345
346 VkLayerTest() {
347 m_enableWSI = false;
348 }
Tony Barbour300a6082015-04-07 13:44:53 -0600349};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500350
Karl Schultz6addd812016-02-02 17:17:23 -0700351VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600352 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600353
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800354 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600355
356 /*
357 * For render test all drawing happens in a single render pass
358 * on a single command buffer.
359 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200360 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800361 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600362 }
363
364 return result;
365}
366
Karl Schultz6addd812016-02-02 17:17:23 -0700367VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600368 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600369
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200370 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800371 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200372 }
Tony Barbour300a6082015-04-07 13:44:53 -0600373
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800374 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600375
376 return result;
377}
378
Karl Schultz6addd812016-02-02 17:17:23 -0700379void VkLayerTest::VKTriangleTest(const char *vertShaderText,
380 const char *fragShaderText,
381 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500382 // Create identity matrix
383 int i;
384 struct vktriangle_vs_uniform data;
385
386 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700387 glm::mat4 View = glm::mat4(1.0f);
388 glm::mat4 Model = glm::mat4(1.0f);
389 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500390 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700391 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500392
393 memcpy(&data.mvp, &MVP[0][0], matrixSize);
394
Karl Schultz6addd812016-02-02 17:17:23 -0700395 static const Vertex tri_data[] = {
396 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
397 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
398 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500399 };
400
Karl Schultz6addd812016-02-02 17:17:23 -0700401 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500402 data.position[i][0] = tri_data[i].posX;
403 data.position[i][1] = tri_data[i].posY;
404 data.position[i][2] = tri_data[i].posZ;
405 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700406 data.color[i][0] = tri_data[i].r;
407 data.color[i][1] = tri_data[i].g;
408 data.color[i][2] = tri_data[i].b;
409 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500410 }
411
412 ASSERT_NO_FATAL_FAILURE(InitState());
413 ASSERT_NO_FATAL_FAILURE(InitViewport());
414
Karl Schultz6addd812016-02-02 17:17:23 -0700415 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
416 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500417
Karl Schultz6addd812016-02-02 17:17:23 -0700418 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
419 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
420 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500421
422 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800423 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500424 pipelineobj.AddShader(&vs);
425 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600426 if (failMask & BsoFailLineWidth) {
427 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600428 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
429 ia_state.sType =
430 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
431 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
432 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600433 }
434 if (failMask & BsoFailDepthBias) {
435 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600436 VkPipelineRasterizationStateCreateInfo rs_state = {};
437 rs_state.sType =
438 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
439 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600440 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600441 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600442 }
Karl Schultz6addd812016-02-02 17:17:23 -0700443 // Viewport and scissors must stay in synch or other errors will occur than
444 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600445 if (failMask & BsoFailViewport) {
446 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600447 m_viewports.clear();
448 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600449 }
450 if (failMask & BsoFailScissor) {
451 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600452 m_scissors.clear();
453 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600454 }
455 if (failMask & BsoFailBlend) {
456 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600457 VkPipelineColorBlendAttachmentState att_state = {};
458 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
459 att_state.blendEnable = VK_TRUE;
460 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600461 }
462 if (failMask & BsoFailDepthBounds) {
463 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
464 }
465 if (failMask & BsoFailStencilReadMask) {
466 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
467 }
468 if (failMask & BsoFailStencilWriteMask) {
469 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
470 }
471 if (failMask & BsoFailStencilReference) {
472 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
473 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500474
475 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700476 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
477 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500478
479 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600480 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500481
Tony Barbourfe3351b2015-07-28 10:17:20 -0600482 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500483
484 // render triangle
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -0600485 Draw(3, 1, 0, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500486
Mark Muellerd4914412016-06-13 17:52:06 -0600487 if (failMask & BsoFailCmdClearAttachments) {
488 VkClearAttachment color_attachment = {};
489 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
490 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
491 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
492
493 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
494 &color_attachment, 1, &clear_rect);
495 }
496
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500497 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600498 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500499
Tony Barbourfe3351b2015-07-28 10:17:20 -0600500 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500501}
502
Karl Schultz6addd812016-02-02 17:17:23 -0700503void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
504 VkPipelineObj &pipelineobj,
505 VkDescriptorSetObj &descriptorSet,
506 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500507 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700508 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
509 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500510 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700511 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
512 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500513 }
514
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800515 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700516 // Make sure depthWriteEnable is set so that Depth fail test will work
517 // correctly
518 // Make sure stencilTestEnable is set so that Stencil fail test will work
519 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600520 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800521 stencil.failOp = VK_STENCIL_OP_KEEP;
522 stencil.passOp = VK_STENCIL_OP_KEEP;
523 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
524 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600525
526 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
527 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600528 ds_ci.pNext = NULL;
529 ds_ci.depthTestEnable = VK_FALSE;
530 ds_ci.depthWriteEnable = VK_TRUE;
531 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
532 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600533 if (failMask & BsoFailDepthBounds) {
534 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600535 ds_ci.maxDepthBounds = 0.0f;
536 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600537 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600538 ds_ci.stencilTestEnable = VK_TRUE;
539 ds_ci.front = stencil;
540 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600541
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600542 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600543 pipelineobj.SetViewport(m_viewports);
544 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800545 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700546 VkResult err = pipelineobj.CreateVKPipeline(
547 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600548 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800549 commandBuffer->BindPipeline(pipelineobj);
550 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500551}
552
Ian Elliott2c1daf52016-05-12 09:41:46 -0600553class VkWsiEnabledLayerTest : public VkLayerTest {
554 public:
555protected:
556 VkWsiEnabledLayerTest() {
557 m_enableWSI = true;
558 }
559};
560
Mark Muellerdfe37552016-07-07 14:47:42 -0600561class VkBufferTest {
562public:
563 enum eTestEnFlags {
564 eDoubleDelete,
565 eInvalidDeviceOffset,
566 eInvalidMemoryOffset,
567 eBindNullBuffer,
568 eFreeInvalidHandle,
569 };
570
571 enum eTestConditions {
572 eOffsetAlignment = 1
573 };
574
575 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice,
576 eTestEnFlags aTestFlag,
577 VkBufferUsageFlags aBufferUsage = 0) {
578 if (eInvalidDeviceOffset != aTestFlag &&
579 eInvalidMemoryOffset != aTestFlag) {
580 return true;
581 }
582 VkDeviceSize offset_limit = 0;
583 if (eInvalidMemoryOffset == aTestFlag) {
584 VkBuffer vulkanBuffer;
585 VkBufferCreateInfo buffer_create_info = {};
586 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
587 buffer_create_info.size = 32;
588 buffer_create_info.usage = aBufferUsage;
589
590 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr,
591 &vulkanBuffer);
592 VkMemoryRequirements memory_reqs = {0};
593
594 vkGetBufferMemoryRequirements(aVulkanDevice->device(),
595 vulkanBuffer, &memory_reqs);
596 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
597 offset_limit = memory_reqs.alignment;
598 }
599 else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT |
600 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
601 offset_limit =
602 aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
603 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
604 offset_limit =
605 aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
606 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
607 offset_limit =
608 aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
609 }
610 if (eOffsetAlignment < offset_limit) {
611 return true;
612 }
613 return false;
614 }
615
616 // A constructor which performs validation tests within construction.
617 VkBufferTest(VkDeviceObj *aVulkanDevice,
618 VkBufferUsageFlags aBufferUsage,
619 eTestEnFlags aTestFlag)
620 : AllocateCurrent(false), BoundCurrent(false),
621 CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
622
623 if (eBindNullBuffer == aTestFlag) {
624 VulkanMemory = 0;
625 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
626 } else {
627 VkBufferCreateInfo buffer_create_info = {};
628 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
629 buffer_create_info.size = 32;
630 buffer_create_info.usage = aBufferUsage;
631
632 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr,
633 &VulkanBuffer);
634
635 CreateCurrent = true;
636
637 VkMemoryRequirements memory_requirements;
638 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer,
639 &memory_requirements);
640
641 VkMemoryAllocateInfo memory_allocate_info = {};
642 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
643 memory_allocate_info.allocationSize = memory_requirements.size;
644 bool pass = aVulkanDevice->phy().
645 set_memory_type(memory_requirements.memoryTypeBits,
646 &memory_allocate_info,
647 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
648 if (!pass) {
649 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
650 return;
651 }
652
653 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL,
654 &VulkanMemory);
655 AllocateCurrent = true;
656 // NB: 1 is intentionally an invalid offset value
657 const bool offset_en = eInvalidDeviceOffset == aTestFlag ||
658 eInvalidMemoryOffset == aTestFlag;
659 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory,
660 offset_en ? eOffsetAlignment : 0);
661 BoundCurrent = true;
662
663 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
664 }
665 }
666
667 ~VkBufferTest() {
668 if (CreateCurrent) {
669 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
670 }
671 if (AllocateCurrent) {
672 if (InvalidDeleteEn) {
673 union {
674 VkDeviceMemory device_memory;
675 unsigned long long index_access;
676 } bad_index;
677
678 bad_index.device_memory = VulkanMemory;
679 bad_index.index_access++;
680
681 vkFreeMemory(VulkanDevice,
682 bad_index.device_memory,
683 nullptr);
684 }
685 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
686 }
687 }
688
689 bool GetBufferCurrent() {
690 return AllocateCurrent && BoundCurrent && CreateCurrent;
691 }
692
693 const VkBuffer &GetBuffer() {
694 return VulkanBuffer;
695 }
696
697 void TestDoubleDestroy() {
698 // Destroy the buffer but leave the flag set, which will cause
699 // the buffer to be destroyed again in the destructor.
700 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
701 }
702
703protected:
704 bool AllocateCurrent;
705 bool BoundCurrent;
706 bool CreateCurrent;
707 bool InvalidDeleteEn;
708
709 VkBuffer VulkanBuffer;
710 VkDevice VulkanDevice;
711 VkDeviceMemory VulkanMemory;
712
713};
714
715class VkVerticesObj {
716public:
717 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount,
718 unsigned aBindingCount, unsigned aByteStride,
719 VkDeviceSize aVertexCount, const float *aVerticies)
720 : BoundCurrent(false),
721 AttributeCount(aAttributeCount),
722 BindingCount(aBindingCount),
723 BindId(BindIdGenerator),
724 PipelineVertexInputStateCreateInfo(),
725 VulkanMemoryBuffer(aVulkanDevice, 1,
726 static_cast<int>(aByteStride * aVertexCount),
727 reinterpret_cast<const void *>(aVerticies),
728 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
729 BindIdGenerator++; // NB: This can wrap w/misuse
730
731 VertexInputAttributeDescription =
732 new VkVertexInputAttributeDescription[AttributeCount];
733 VertexInputBindingDescription =
734 new VkVertexInputBindingDescription[BindingCount];
735
736 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions =
737 VertexInputAttributeDescription;
738 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount =
739 AttributeCount;
740 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions =
741 VertexInputBindingDescription;
742 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount =
743 BindingCount;
744 PipelineVertexInputStateCreateInfo.sType =
745 VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
746
747 unsigned i = 0;
748 do {
749 VertexInputAttributeDescription[i].binding = BindId;
750 VertexInputAttributeDescription[i].location = i;
751 VertexInputAttributeDescription[i].format =
752 VK_FORMAT_R32G32B32_SFLOAT;
753 VertexInputAttributeDescription[i].offset =
754 sizeof(float) * aByteStride;
755 i++;
756 } while (AttributeCount < i);
757
758 i = 0;
759 do {
760 VertexInputBindingDescription[i].binding = BindId;
761 VertexInputBindingDescription[i].stride = aByteStride;
762 VertexInputBindingDescription[i].inputRate =
763 VK_VERTEX_INPUT_RATE_VERTEX;
764 i++;
765 } while (BindingCount < i);
766 }
767
768 ~VkVerticesObj() {
769 if (VertexInputAttributeDescription) {
770 delete[] VertexInputAttributeDescription;
771 }
772 if (VertexInputBindingDescription) {
773 delete[] VertexInputBindingDescription;
774 }
775 }
776
777 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
778 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription,
779 AttributeCount);
780 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription,
781 BindingCount);
782 return true;
783 }
784
785 void BindVertexBuffers(VkCommandBuffer aCommandBuffer,
786 unsigned aOffsetCount = 0,
787 VkDeviceSize *aOffsetList = nullptr) {
788 VkDeviceSize *offsetList;
789 unsigned offsetCount;
790
791 if (aOffsetCount) {
792 offsetList = aOffsetList;
793 offsetCount = aOffsetCount;
794 } else {
795 offsetList = new VkDeviceSize[1]();
796 offsetCount = 1;
797 }
798
799 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount,
800 &VulkanMemoryBuffer.handle(), offsetList);
801 BoundCurrent = true;
802
803 if (!aOffsetCount) {
804 delete [] offsetList;
805 }
806 }
807
808protected:
809 static uint32_t BindIdGenerator;
810
811 bool BoundCurrent;
812 unsigned AttributeCount;
813 unsigned BindingCount;
814 uint32_t BindId;
815
816 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
817 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
818 VkVertexInputBindingDescription *VertexInputBindingDescription;
819 VkConstantBufferObj VulkanMemoryBuffer;
820};
821
822uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500823// ********************************************************************************************************************
824// ********************************************************************************************************************
825// ********************************************************************************************************************
826// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600827#if PARAMETER_VALIDATION_TESTS
828TEST_F(VkLayerTest, RequiredParameter) {
829 TEST_DESCRIPTION("Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
830 "pointer, array, and array count parameters");
831
832 ASSERT_NO_FATAL_FAILURE(InitState());
833
834 m_errorMonitor->SetDesiredFailureMsg(
835 VK_DEBUG_REPORT_ERROR_BIT_EXT,
836 "required parameter pFeatures specified as NULL");
837 // Specify NULL for a pointer to a handle
838 // Expected to trigger an error with
839 // parameter_validation::validate_required_pointer
840 vkGetPhysicalDeviceFeatures(gpu(), NULL);
841 m_errorMonitor->VerifyFound();
842
843 m_errorMonitor->SetDesiredFailureMsg(
844 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600845 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600846 // Specify NULL for pointer to array count
847 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600848 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600849 m_errorMonitor->VerifyFound();
850
851 m_errorMonitor->SetDesiredFailureMsg(
852 VK_DEBUG_REPORT_ERROR_BIT_EXT,
853 "parameter viewportCount must be greater than 0");
854 // Specify 0 for a required array count
855 // Expected to trigger an error with parameter_validation::validate_array
856 VkViewport view_port = {};
857 m_commandBuffer->SetViewport(0, 0, &view_port);
858 m_errorMonitor->VerifyFound();
859
860 m_errorMonitor->SetDesiredFailureMsg(
861 VK_DEBUG_REPORT_ERROR_BIT_EXT,
862 "required parameter pViewports specified as NULL");
863 // Specify NULL for a required array
864 // Expected to trigger an error with parameter_validation::validate_array
865 m_commandBuffer->SetViewport(0, 1, NULL);
866 m_errorMonitor->VerifyFound();
867
868 m_errorMonitor->SetDesiredFailureMsg(
869 VK_DEBUG_REPORT_ERROR_BIT_EXT,
870 "required parameter memory specified as VK_NULL_HANDLE");
871 // Specify VK_NULL_HANDLE for a required handle
872 // Expected to trigger an error with
873 // parameter_validation::validate_required_handle
874 vkUnmapMemory(device(), VK_NULL_HANDLE);
875 m_errorMonitor->VerifyFound();
876
877 m_errorMonitor->SetDesiredFailureMsg(
878 VK_DEBUG_REPORT_ERROR_BIT_EXT,
879 "required parameter pFences[0] specified as VK_NULL_HANDLE");
880 // Specify VK_NULL_HANDLE for a required handle array entry
881 // Expected to trigger an error with
882 // parameter_validation::validate_required_handle_array
883 VkFence fence = VK_NULL_HANDLE;
884 vkResetFences(device(), 1, &fence);
885 m_errorMonitor->VerifyFound();
886
887 m_errorMonitor->SetDesiredFailureMsg(
888 VK_DEBUG_REPORT_ERROR_BIT_EXT,
889 "required parameter pAllocateInfo specified as NULL");
890 // Specify NULL for a required struct pointer
891 // Expected to trigger an error with
892 // parameter_validation::validate_struct_type
893 VkDeviceMemory memory = VK_NULL_HANDLE;
894 vkAllocateMemory(device(), NULL, NULL, &memory);
895 m_errorMonitor->VerifyFound();
896
897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
898 "value of faceMask must not be 0");
899 // Specify 0 for a required VkFlags parameter
900 // Expected to trigger an error with parameter_validation::validate_flags
901 m_commandBuffer->SetStencilReference(0, 0);
902 m_errorMonitor->VerifyFound();
903
904 m_errorMonitor->SetDesiredFailureMsg(
905 VK_DEBUG_REPORT_ERROR_BIT_EXT,
906 "value of pSubmits[i].pWaitDstStageMask[0] must not be 0");
907 // Specify 0 for a required VkFlags array entry
908 // Expected to trigger an error with
909 // parameter_validation::validate_flags_array
910 VkSemaphore semaphore = VK_NULL_HANDLE;
911 VkPipelineStageFlags stageFlags = 0;
912 VkSubmitInfo submitInfo = {};
913 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
914 submitInfo.waitSemaphoreCount = 1;
915 submitInfo.pWaitSemaphores = &semaphore;
916 submitInfo.pWaitDstStageMask = &stageFlags;
917 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
918 m_errorMonitor->VerifyFound();
919}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600920
Dustin Gravesfce74c02016-05-10 11:42:58 -0600921TEST_F(VkLayerTest, ReservedParameter) {
922 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
923
924 ASSERT_NO_FATAL_FAILURE(InitState());
925
926 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
927 " must be 0");
928 // Specify 0 for a reserved VkFlags parameter
929 // Expected to trigger an error with
930 // parameter_validation::validate_reserved_flags
931 VkEvent event_handle = VK_NULL_HANDLE;
932 VkEventCreateInfo event_info = {};
933 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
934 event_info.flags = 1;
935 vkCreateEvent(device(), &event_info, NULL, &event_handle);
936 m_errorMonitor->VerifyFound();
937}
938
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600939TEST_F(VkLayerTest, InvalidStructSType) {
940 TEST_DESCRIPTION("Specify an invalid VkStructureType for a Vulkan "
941 "structure's sType field");
942
943 ASSERT_NO_FATAL_FAILURE(InitState());
944
945 m_errorMonitor->SetDesiredFailureMsg(
946 VK_DEBUG_REPORT_ERROR_BIT_EXT,
947 "parameter pAllocateInfo->sType must be");
948 // Zero struct memory, effectively setting sType to
949 // VK_STRUCTURE_TYPE_APPLICATION_INFO
950 // Expected to trigger an error with
951 // parameter_validation::validate_struct_type
952 VkMemoryAllocateInfo alloc_info = {};
953 VkDeviceMemory memory = VK_NULL_HANDLE;
954 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
955 m_errorMonitor->VerifyFound();
956
957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
958 "parameter pSubmits[0].sType must be");
959 // Zero struct memory, effectively setting sType to
960 // VK_STRUCTURE_TYPE_APPLICATION_INFO
961 // Expected to trigger an error with
962 // parameter_validation::validate_struct_type_array
963 VkSubmitInfo submit_info = {};
964 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
965 m_errorMonitor->VerifyFound();
966}
967
968TEST_F(VkLayerTest, InvalidStructPNext) {
969 TEST_DESCRIPTION(
970 "Specify an invalid value for a Vulkan structure's pNext field");
971
972 ASSERT_NO_FATAL_FAILURE(InitState());
973
974 m_errorMonitor->SetDesiredFailureMsg(
Dustin Gravesaf5c0292016-07-19 13:43:53 -0600975 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz38b50992016-07-11 16:09:09 -0600976 "value of pCreateInfo->pNext must be NULL");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600977 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be
Karl Schultz38b50992016-07-11 16:09:09 -0600978 // NULL.
979 // Need to pick a function that has no allowed pNext structure types.
980 // Expected to trigger an error with
981 // parameter_validation::validate_struct_pnext
982 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600983 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600984 // Zero-initialization will provide the correct sType
985 VkApplicationInfo app_info = {};
986 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
987 event_alloc_info.pNext = &app_info;
988 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
989 m_errorMonitor->VerifyFound();
990
991 m_errorMonitor->SetDesiredFailureMsg(
Dustin Gravesaf5c0292016-07-19 13:43:53 -0600992 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz38b50992016-07-11 16:09:09 -0600993 " chain includes a structure with unexpected VkStructureType ");
994 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
995 // a function that has allowed pNext structure types and specify
996 // a structure type that is not allowed.
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600997 // Expected to trigger an error with
998 // parameter_validation::validate_struct_pnext
999 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -06001000 VkMemoryAllocateInfo memory_alloc_info = {};
1001 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1002 memory_alloc_info.pNext = &app_info;
1003 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -06001004 m_errorMonitor->VerifyFound();
1005
Dustin Graves47b6cba2016-05-10 17:34:38 -06001006 m_errorMonitor->SetDesiredFailureMsg(
Dustin Gravesaf5c0292016-07-19 13:43:53 -06001007 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Dustin Graves47b6cba2016-05-10 17:34:38 -06001008 " chain includes a structure with unexpected VkStructureType ");
1009 // Set VkGraphicsPipelineCreateInfo::VkPipelineRasterizationStateCreateInfo::pNext to an invalid structure, when pNext is allowed to be a non-NULL value
1010 // Expected to trigger an error with
1011 // parameter_validation::validate_struct_pnext
1012 VkDescriptorPoolSize ds_type_count = {};
1013 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1014 ds_type_count.descriptorCount = 1;
1015
1016 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1017 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1018 ds_pool_ci.pNext = NULL;
1019 ds_pool_ci.maxSets = 1;
1020 ds_pool_ci.poolSizeCount = 1;
1021 ds_pool_ci.pPoolSizes = &ds_type_count;
1022
1023 VkDescriptorPool ds_pool;
1024 VkResult err =
1025 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
1026 ASSERT_VK_SUCCESS(err);
1027
1028 VkDescriptorSetLayoutBinding dsl_binding = {};
1029 dsl_binding.binding = 0;
1030 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1031 dsl_binding.descriptorCount = 1;
1032 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1033 dsl_binding.pImmutableSamplers = NULL;
1034
1035 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1036 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1037 ds_layout_ci.pNext = NULL;
1038 ds_layout_ci.bindingCount = 1;
1039 ds_layout_ci.pBindings = &dsl_binding;
1040
1041 VkDescriptorSetLayout ds_layout;
1042 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1043 &ds_layout);
1044 ASSERT_VK_SUCCESS(err);
1045
1046 VkDescriptorSet descriptorSet;
1047 VkDescriptorSetAllocateInfo ds_alloc_info = {};
1048 ds_alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1049 ds_alloc_info.descriptorSetCount = 1;
1050 ds_alloc_info.descriptorPool = ds_pool;
1051 ds_alloc_info.pSetLayouts = &ds_layout;
1052 err = vkAllocateDescriptorSets(m_device->device(), &ds_alloc_info,
1053 &descriptorSet);
1054 ASSERT_VK_SUCCESS(err);
1055
1056 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1057 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1058 pipeline_layout_ci.setLayoutCount = 1;
1059 pipeline_layout_ci.pSetLayouts = &ds_layout;
1060
1061 VkPipelineLayout pipeline_layout;
1062 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1063 &pipeline_layout);
1064 ASSERT_VK_SUCCESS(err);
1065
1066 VkViewport vp = {}; // Just need dummy vp to point to
1067 VkRect2D sc = {}; // dummy scissor to point to
1068
1069 VkPipelineViewportStateCreateInfo vp_state_ci = {};
1070 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
1071 vp_state_ci.scissorCount = 1;
1072 vp_state_ci.pScissors = &sc;
1073 vp_state_ci.viewportCount = 1;
1074 vp_state_ci.pViewports = &vp;
1075
1076 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
1077 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1078 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
1079 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
1080 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
1081 rs_state_ci.depthClampEnable = VK_FALSE;
1082 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
1083 rs_state_ci.depthBiasEnable = VK_FALSE;
1084
1085 VkGraphicsPipelineCreateInfo gp_ci = {};
1086 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
1087 gp_ci.pViewportState = &vp_state_ci;
1088 gp_ci.pRasterizationState = &rs_state_ci;
1089 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
1090 gp_ci.layout = pipeline_layout;
1091 gp_ci.renderPass = renderPass();
1092
1093 VkPipelineCacheCreateInfo pc_ci = {};
1094 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
1095 pc_ci.initialDataSize = 0;
1096 pc_ci.pInitialData = 0;
1097
1098 VkPipeline pipeline;
1099 VkPipelineCache pipelineCache;
1100
1101 err =
1102 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
1103 ASSERT_VK_SUCCESS(err);
1104
1105 // Set VkPipelineRasterizationStateCreateInfo::pNext to an invalid value
1106 VkApplicationInfo invalid_pnext_struct = {};
1107 rs_state_ci.pNext = &invalid_pnext_struct;
1108
1109 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
1110 &gp_ci, NULL, &pipeline);
1111 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06001112 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
1113 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1114 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1115 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1116
Dustin Gravesfd1c8fe2016-07-15 11:40:20 -06001117 // Positive test to check parameter_validation and unique_objects support
1118 // for NV_dedicated_allocation
1119 uint32_t extension_count = 0;
1120 bool supports_nv_dedicated_allocation = false;
1121 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count,
1122 nullptr);
1123 ASSERT_VK_SUCCESS(err);
1124
1125 if (extension_count > 0) {
1126 std::vector<VkExtensionProperties> available_extensions(
1127 extension_count);
1128
1129 err = vkEnumerateDeviceExtensionProperties(
1130 gpu(), nullptr, &extension_count, &available_extensions[0]);
1131 ASSERT_VK_SUCCESS(err);
1132
1133 for (const auto &extension_props : available_extensions) {
1134 if (strcmp(extension_props.extensionName,
1135 VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
1136 supports_nv_dedicated_allocation = true;
1137 }
1138 }
1139 }
1140
1141 if (supports_nv_dedicated_allocation) {
1142 m_errorMonitor->ExpectSuccess();
1143
1144 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info =
1145 {};
1146 dedicated_buffer_create_info.sType =
1147 VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
1148 dedicated_buffer_create_info.pNext = nullptr;
1149 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
1150
1151 uint32_t queue_family_index = 0;
1152 VkBufferCreateInfo buffer_create_info = {};
1153 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1154 buffer_create_info.pNext = &dedicated_buffer_create_info;
1155 buffer_create_info.size = 1024;
1156 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1157 buffer_create_info.queueFamilyIndexCount = 1;
1158 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1159
1160 VkBuffer buffer;
1161 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info,
1162 NULL, &buffer);
1163 ASSERT_VK_SUCCESS(err);
1164
1165 VkMemoryRequirements memory_reqs;
1166 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1167
1168 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
1169 dedicated_memory_info.sType =
1170 VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
1171 dedicated_memory_info.pNext = nullptr;
1172 dedicated_memory_info.buffer = buffer;
1173 dedicated_memory_info.image = VK_NULL_HANDLE;
1174
1175 VkMemoryAllocateInfo memory_info = {};
1176 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1177 memory_info.pNext = &dedicated_memory_info;
1178 memory_info.allocationSize = memory_reqs.size;
1179
1180 bool pass;
1181 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1182 &memory_info, 0);
1183 ASSERT_TRUE(pass);
1184
1185 VkDeviceMemory buffer_memory;
1186 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1187 &buffer_memory);
1188 ASSERT_VK_SUCCESS(err);
1189
1190 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1191 ASSERT_VK_SUCCESS(err);
1192
1193 vkDestroyBuffer(m_device->device(), buffer, NULL);
1194 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1195
1196 m_errorMonitor->VerifyNotFound();
1197 }
Dustin Gravesc99cf5a2016-05-09 14:40:29 -06001198}
Dustin Graves5d33d532016-05-09 16:21:12 -06001199
1200TEST_F(VkLayerTest, UnrecognizedValue) {
1201 TEST_DESCRIPTION(
1202 "Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
1203
1204 ASSERT_NO_FATAL_FAILURE(InitState());
1205
1206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1207 "does not fall within the begin..end "
1208 "range of the core VkFormat "
1209 "enumeration tokens");
1210 // Specify an invalid VkFormat value
1211 // Expected to trigger an error with
1212 // parameter_validation::validate_ranged_enum
1213 VkFormatProperties format_properties;
1214 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000),
1215 &format_properties);
1216 m_errorMonitor->VerifyFound();
1217
1218 m_errorMonitor->SetDesiredFailureMsg(
1219 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1220 "contains flag bits that are not recognized members of");
1221 // Specify an invalid VkFlags bitmask value
1222 // Expected to trigger an error with parameter_validation::validate_flags
1223 VkImageFormatProperties image_format_properties;
1224 vkGetPhysicalDeviceImageFormatProperties(
1225 gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D,
1226 VK_IMAGE_TILING_OPTIMAL, static_cast<VkImageUsageFlags>(1 << 25), 0,
1227 &image_format_properties);
1228 m_errorMonitor->VerifyFound();
1229
1230 m_errorMonitor->SetDesiredFailureMsg(
1231 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1232 "contains flag bits that are not recognized members of");
1233 // Specify an invalid VkFlags array entry
1234 // Expected to trigger an error with
1235 // parameter_validation::validate_flags_array
1236 VkSemaphore semaphore = VK_NULL_HANDLE;
1237 VkPipelineStageFlags stage_flags =
1238 static_cast<VkPipelineStageFlags>(1 << 25);
1239 VkSubmitInfo submit_info = {};
1240 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1241 submit_info.waitSemaphoreCount = 1;
1242 submit_info.pWaitSemaphores = &semaphore;
1243 submit_info.pWaitDstStageMask = &stage_flags;
1244 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1245 m_errorMonitor->VerifyFound();
1246
1247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1248 "is neither VK_TRUE nor VK_FALSE");
1249 // Specify an invalid VkBool32 value
1250 // Expected to trigger a warning with
1251 // parameter_validation::validate_bool32
1252 VkSampler sampler = VK_NULL_HANDLE;
1253 VkSamplerCreateInfo sampler_info = {};
1254 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1255 sampler_info.pNext = NULL;
1256 sampler_info.magFilter = VK_FILTER_NEAREST;
1257 sampler_info.minFilter = VK_FILTER_NEAREST;
1258 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1259 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1260 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1261 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1262 sampler_info.mipLodBias = 1.0;
1263 sampler_info.maxAnisotropy = 1;
1264 sampler_info.compareEnable = VK_FALSE;
1265 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1266 sampler_info.minLod = 1.0;
1267 sampler_info.maxLod = 1.0;
1268 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1269 sampler_info.unnormalizedCoordinates = VK_FALSE;
1270 // Not VK_TRUE or VK_FALSE
1271 sampler_info.anisotropyEnable = 3;
1272 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1273 m_errorMonitor->VerifyFound();
1274}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001275
1276TEST_F(VkLayerTest, FailedReturnValue) {
1277 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1278
1279 ASSERT_NO_FATAL_FAILURE(InitState());
1280
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001281 // Find an unsupported image format
1282 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1283 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1284 VkFormat format = static_cast<VkFormat>(f);
1285 VkFormatProperties fProps = m_device->format_properties(format);
1286 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
1287 fProps.optimalTilingFeatures == 0) {
1288 unsupported = format;
1289 break;
1290 }
1291 }
1292
1293 if (unsupported != VK_FORMAT_UNDEFINED) {
1294 m_errorMonitor->SetDesiredFailureMsg(
1295 VK_DEBUG_REPORT_WARNING_BIT_EXT,
1296 "the requested format is not supported on this device");
1297 // Specify an unsupported VkFormat value to generate a
1298 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1299 // Expected to trigger a warning from
1300 // parameter_validation::validate_result
1301 VkImageFormatProperties image_format_properties;
1302 VkResult err = vkGetPhysicalDeviceImageFormatProperties(
1303 gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1304 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
1305 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1306 m_errorMonitor->VerifyFound();
1307 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001308}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001309
1310TEST_F(VkLayerTest, UpdateBufferAlignment) {
1311 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
1312 uint32_t updateData[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
1313
1314 ASSERT_NO_FATAL_FAILURE(InitState());
1315
1316 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1317 vk_testing::Buffer buffer;
1318 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1319
1320 BeginCommandBuffer();
1321 // Introduce failure by using dstOffset that is not multiple of 4
1322 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1323 " is not a multiple of 4");
1324 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1325 m_errorMonitor->VerifyFound();
1326
1327 // Introduce failure by using dataSize that is not multiple of 4
1328 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1329 " is not a multiple of 4");
1330 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1331 m_errorMonitor->VerifyFound();
1332
1333 // Introduce failure by using dataSize that is < 0
1334 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1335 "must be greater than zero and less than or equal to 65536");
1336 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1337 m_errorMonitor->VerifyFound();
1338
1339 // Introduce failure by using dataSize that is > 65536
1340 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1341 "must be greater than zero and less than or equal to 65536");
1342 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1343 m_errorMonitor->VerifyFound();
1344
1345 EndCommandBuffer();
1346}
1347
1348TEST_F(VkLayerTest, FillBufferAlignment) {
1349 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1350
1351 ASSERT_NO_FATAL_FAILURE(InitState());
1352
1353 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1354 vk_testing::Buffer buffer;
1355 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1356
1357 BeginCommandBuffer();
1358
1359 // Introduce failure by using dstOffset that is not multiple of 4
1360 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1361 " is not a multiple of 4");
1362 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1363 m_errorMonitor->VerifyFound();
1364
1365 // Introduce failure by using size that is not multiple of 4
1366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1367 " is not a multiple of 4");
1368 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1369 m_errorMonitor->VerifyFound();
1370
1371 // Introduce failure by using size that is zero
1372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1373 "must be greater than zero");
1374 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1375 m_errorMonitor->VerifyFound();
1376
1377 EndCommandBuffer();
1378}
Dustin Graves40f35822016-06-23 11:12:53 -06001379
1380// This is a positive test. No failures are expected.
1381TEST_F(VkLayerTest, IgnoreUnrelatedDescriptor) {
1382 TEST_DESCRIPTION("Ensure that the vkUpdateDescriptorSet validation code "
1383 "is ignoring VkWriteDescriptorSet members that are not "
1384 "related to the descriptor type specified by "
1385 "VkWriteDescriptorSet::descriptorType. Correct "
1386 "validation behavior will result in the test running to "
1387 "completion without validation errors.");
1388
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001389 const uintptr_t invalid_ptr = 0xcdcdcdcd;
1390
Dustin Graves40f35822016-06-23 11:12:53 -06001391 ASSERT_NO_FATAL_FAILURE(InitState());
1392
1393 // Image Case
1394 {
1395 m_errorMonitor->ExpectSuccess();
1396
1397 VkImage image;
1398 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1399 const int32_t tex_width = 32;
1400 const int32_t tex_height = 32;
1401 VkImageCreateInfo image_create_info = {};
1402 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1403 image_create_info.pNext = NULL;
1404 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1405 image_create_info.format = tex_format;
1406 image_create_info.extent.width = tex_width;
1407 image_create_info.extent.height = tex_height;
1408 image_create_info.extent.depth = 1;
1409 image_create_info.mipLevels = 1;
1410 image_create_info.arrayLayers = 1;
1411 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis51cde412016-07-11 16:08:30 -06001412 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Dustin Graves40f35822016-06-23 11:12:53 -06001413 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1414 image_create_info.flags = 0;
1415 VkResult err =
1416 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1417 ASSERT_VK_SUCCESS(err);
1418
1419 VkMemoryRequirements memory_reqs;
1420 VkDeviceMemory image_memory;
1421 bool pass;
1422 VkMemoryAllocateInfo memory_info = {};
1423 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1424 memory_info.pNext = NULL;
1425 memory_info.allocationSize = 0;
1426 memory_info.memoryTypeIndex = 0;
1427 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
1428 memory_info.allocationSize = memory_reqs.size;
1429 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1430 &memory_info, 0);
1431 ASSERT_TRUE(pass);
1432 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1433 &image_memory);
1434 ASSERT_VK_SUCCESS(err);
1435 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
1436 ASSERT_VK_SUCCESS(err);
1437
1438 VkImageViewCreateInfo image_view_create_info = {};
1439 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
1440 image_view_create_info.image = image;
1441 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
1442 image_view_create_info.format = tex_format;
1443 image_view_create_info.subresourceRange.layerCount = 1;
1444 image_view_create_info.subresourceRange.baseMipLevel = 0;
1445 image_view_create_info.subresourceRange.levelCount = 1;
1446 image_view_create_info.subresourceRange.aspectMask =
1447 VK_IMAGE_ASPECT_COLOR_BIT;
1448
1449 VkImageView view;
1450 err = vkCreateImageView(m_device->device(), &image_view_create_info,
1451 NULL, &view);
1452 ASSERT_VK_SUCCESS(err);
1453
1454 VkDescriptorPoolSize ds_type_count = {};
1455 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1456 ds_type_count.descriptorCount = 1;
1457
1458 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1459 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1460 ds_pool_ci.pNext = NULL;
1461 ds_pool_ci.maxSets = 1;
1462 ds_pool_ci.poolSizeCount = 1;
1463 ds_pool_ci.pPoolSizes = &ds_type_count;
1464
1465 VkDescriptorPool ds_pool;
1466 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL,
1467 &ds_pool);
1468 ASSERT_VK_SUCCESS(err);
1469
1470 VkDescriptorSetLayoutBinding dsl_binding = {};
1471 dsl_binding.binding = 0;
1472 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1473 dsl_binding.descriptorCount = 1;
1474 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1475 dsl_binding.pImmutableSamplers = NULL;
1476
1477 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1478 ds_layout_ci.sType =
1479 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1480 ds_layout_ci.pNext = NULL;
1481 ds_layout_ci.bindingCount = 1;
1482 ds_layout_ci.pBindings = &dsl_binding;
1483 VkDescriptorSetLayout ds_layout;
1484 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
1485 NULL, &ds_layout);
1486 ASSERT_VK_SUCCESS(err);
1487
1488 VkDescriptorSet descriptor_set;
1489 VkDescriptorSetAllocateInfo alloc_info = {};
1490 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1491 alloc_info.descriptorSetCount = 1;
1492 alloc_info.descriptorPool = ds_pool;
1493 alloc_info.pSetLayouts = &ds_layout;
1494 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1495 &descriptor_set);
1496 ASSERT_VK_SUCCESS(err);
1497
1498 VkDescriptorImageInfo image_info = {};
1499 image_info.imageView = view;
1500 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
1501
1502 VkWriteDescriptorSet descriptor_write;
1503 memset(&descriptor_write, 0, sizeof(descriptor_write));
1504 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1505 descriptor_write.dstSet = descriptor_set;
1506 descriptor_write.dstBinding = 0;
1507 descriptor_write.descriptorCount = 1;
1508 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1509 descriptor_write.pImageInfo = &image_info;
1510
1511 // Set pBufferInfo and pTexelBufferView to invalid values, which should
1512 // be
1513 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
1514 // This will most likely produce a crash if the parameter_validation
1515 // layer
1516 // does not correctly ignore pBufferInfo.
1517 descriptor_write.pBufferInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001518 reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001519 descriptor_write.pTexelBufferView =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001520 reinterpret_cast<const VkBufferView *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001521
1522 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
1523 NULL);
1524
1525 m_errorMonitor->VerifyNotFound();
1526
Dustin Graves40f35822016-06-23 11:12:53 -06001527 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1528 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1529 vkDestroyImageView(m_device->device(), view, NULL);
1530 vkDestroyImage(m_device->device(), image, NULL);
1531 vkFreeMemory(m_device->device(), image_memory, NULL);
1532 }
1533
1534 // Buffer Case
1535 {
1536 m_errorMonitor->ExpectSuccess();
1537
1538 VkBuffer buffer;
1539 uint32_t queue_family_index = 0;
1540 VkBufferCreateInfo buffer_create_info = {};
1541 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1542 buffer_create_info.size = 1024;
1543 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1544 buffer_create_info.queueFamilyIndexCount = 1;
1545 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1546
1547 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info,
1548 NULL, &buffer);
1549 ASSERT_VK_SUCCESS(err);
1550
1551 VkMemoryRequirements memory_reqs;
1552 VkDeviceMemory buffer_memory;
1553 bool pass;
1554 VkMemoryAllocateInfo memory_info = {};
1555 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1556 memory_info.pNext = NULL;
1557 memory_info.allocationSize = 0;
1558 memory_info.memoryTypeIndex = 0;
1559
1560 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1561 memory_info.allocationSize = memory_reqs.size;
1562 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1563 &memory_info, 0);
1564 ASSERT_TRUE(pass);
1565
1566 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1567 &buffer_memory);
1568 ASSERT_VK_SUCCESS(err);
1569 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1570 ASSERT_VK_SUCCESS(err);
1571
1572 VkDescriptorPoolSize ds_type_count = {};
1573 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1574 ds_type_count.descriptorCount = 1;
1575
1576 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1577 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1578 ds_pool_ci.pNext = NULL;
1579 ds_pool_ci.maxSets = 1;
1580 ds_pool_ci.poolSizeCount = 1;
1581 ds_pool_ci.pPoolSizes = &ds_type_count;
1582
1583 VkDescriptorPool ds_pool;
1584 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL,
1585 &ds_pool);
1586 ASSERT_VK_SUCCESS(err);
1587
1588 VkDescriptorSetLayoutBinding dsl_binding = {};
1589 dsl_binding.binding = 0;
1590 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1591 dsl_binding.descriptorCount = 1;
1592 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1593 dsl_binding.pImmutableSamplers = NULL;
1594
1595 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1596 ds_layout_ci.sType =
1597 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1598 ds_layout_ci.pNext = NULL;
1599 ds_layout_ci.bindingCount = 1;
1600 ds_layout_ci.pBindings = &dsl_binding;
1601 VkDescriptorSetLayout ds_layout;
1602 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
1603 NULL, &ds_layout);
1604 ASSERT_VK_SUCCESS(err);
1605
1606 VkDescriptorSet descriptor_set;
1607 VkDescriptorSetAllocateInfo alloc_info = {};
1608 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1609 alloc_info.descriptorSetCount = 1;
1610 alloc_info.descriptorPool = ds_pool;
1611 alloc_info.pSetLayouts = &ds_layout;
1612 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1613 &descriptor_set);
1614 ASSERT_VK_SUCCESS(err);
1615
1616 VkDescriptorBufferInfo buffer_info = {};
1617 buffer_info.buffer = buffer;
1618 buffer_info.offset = 0;
1619 buffer_info.range = 1024;
1620
1621 VkWriteDescriptorSet descriptor_write;
1622 memset(&descriptor_write, 0, sizeof(descriptor_write));
1623 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1624 descriptor_write.dstSet = descriptor_set;
1625 descriptor_write.dstBinding = 0;
1626 descriptor_write.descriptorCount = 1;
1627 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1628 descriptor_write.pBufferInfo = &buffer_info;
1629
1630 // Set pImageInfo and pTexelBufferView to invalid values, which should
1631 // be
1632 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
1633 // This will most likely produce a crash if the parameter_validation
1634 // layer
1635 // does not correctly ignore pImageInfo.
1636 descriptor_write.pImageInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001637 reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001638 descriptor_write.pTexelBufferView =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001639 reinterpret_cast<const VkBufferView *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001640
1641 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
1642 NULL);
1643
1644 m_errorMonitor->VerifyNotFound();
1645
1646 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
1647 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1648 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1649 vkDestroyBuffer(m_device->device(), buffer, NULL);
1650 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1651 }
1652
1653 // Texel Buffer Case
1654 {
1655 m_errorMonitor->ExpectSuccess();
1656
1657 VkBuffer buffer;
1658 uint32_t queue_family_index = 0;
1659 VkBufferCreateInfo buffer_create_info = {};
1660 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1661 buffer_create_info.size = 1024;
1662 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
1663 buffer_create_info.queueFamilyIndexCount = 1;
1664 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1665
1666 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info,
1667 NULL, &buffer);
1668 ASSERT_VK_SUCCESS(err);
1669
1670 VkMemoryRequirements memory_reqs;
1671 VkDeviceMemory buffer_memory;
1672 bool pass;
1673 VkMemoryAllocateInfo memory_info = {};
1674 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1675 memory_info.pNext = NULL;
1676 memory_info.allocationSize = 0;
1677 memory_info.memoryTypeIndex = 0;
1678
1679 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1680 memory_info.allocationSize = memory_reqs.size;
1681 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1682 &memory_info, 0);
1683 ASSERT_TRUE(pass);
1684
1685 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1686 &buffer_memory);
1687 ASSERT_VK_SUCCESS(err);
1688 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1689 ASSERT_VK_SUCCESS(err);
1690
1691 VkBufferViewCreateInfo buff_view_ci = {};
1692 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
1693 buff_view_ci.buffer = buffer;
1694 buff_view_ci.format = VK_FORMAT_R8_UNORM;
1695 buff_view_ci.range = VK_WHOLE_SIZE;
1696 VkBufferView buffer_view;
1697 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL,
1698 &buffer_view);
1699
1700 VkDescriptorPoolSize ds_type_count = {};
1701 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1702 ds_type_count.descriptorCount = 1;
1703
1704 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1705 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1706 ds_pool_ci.pNext = NULL;
1707 ds_pool_ci.maxSets = 1;
1708 ds_pool_ci.poolSizeCount = 1;
1709 ds_pool_ci.pPoolSizes = &ds_type_count;
1710
1711 VkDescriptorPool ds_pool;
1712 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL,
1713 &ds_pool);
1714 ASSERT_VK_SUCCESS(err);
1715
1716 VkDescriptorSetLayoutBinding dsl_binding = {};
1717 dsl_binding.binding = 0;
1718 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1719 dsl_binding.descriptorCount = 1;
1720 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1721 dsl_binding.pImmutableSamplers = NULL;
1722
1723 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1724 ds_layout_ci.sType =
1725 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1726 ds_layout_ci.pNext = NULL;
1727 ds_layout_ci.bindingCount = 1;
1728 ds_layout_ci.pBindings = &dsl_binding;
1729 VkDescriptorSetLayout ds_layout;
1730 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
1731 NULL, &ds_layout);
1732 ASSERT_VK_SUCCESS(err);
1733
1734 VkDescriptorSet descriptor_set;
1735 VkDescriptorSetAllocateInfo alloc_info = {};
1736 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1737 alloc_info.descriptorSetCount = 1;
1738 alloc_info.descriptorPool = ds_pool;
1739 alloc_info.pSetLayouts = &ds_layout;
1740 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1741 &descriptor_set);
1742 ASSERT_VK_SUCCESS(err);
1743
1744 VkWriteDescriptorSet descriptor_write;
1745 memset(&descriptor_write, 0, sizeof(descriptor_write));
1746 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1747 descriptor_write.dstSet = descriptor_set;
1748 descriptor_write.dstBinding = 0;
1749 descriptor_write.descriptorCount = 1;
1750 descriptor_write.descriptorType =
1751 VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1752 descriptor_write.pTexelBufferView = &buffer_view;
1753
1754 // Set pImageInfo and pBufferInfo to invalid values, which should be
1755 // ignored for descriptorType ==
1756 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
1757 // This will most likely produce a crash if the parameter_validation
1758 // layer
1759 // does not correctly ignore pImageInfo and pBufferInfo.
1760 descriptor_write.pImageInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001761 reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001762 descriptor_write.pBufferInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001763 reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001764
1765 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
1766 NULL);
1767
1768 m_errorMonitor->VerifyNotFound();
1769
1770 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
1771 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1772 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1773 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
1774 vkDestroyBuffer(m_device->device(), buffer, NULL);
1775 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1776 }
1777}
Dustin Gravesffa90fa2016-05-06 11:20:38 -06001778#endif // PARAMETER_VALIDATION_TESTS
1779
Tobin Ehlis0788f522015-05-26 16:11:58 -06001780#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001781#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001782TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001783{
1784 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001785 VkFenceCreateInfo fenceInfo = {};
1786 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1787 fenceInfo.pNext = NULL;
1788 fenceInfo.flags = 0;
1789
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001790 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001791
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001792 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001793
1794 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1795 vk_testing::Buffer buffer;
1796 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001797
Tony Barbourfe3351b2015-07-28 10:17:20 -06001798 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001799 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001800 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001801
1802 testFence.init(*m_device, fenceInfo);
1803
1804 // Bypass framework since it does the waits automatically
1805 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001806 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001807 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1808 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001809 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001810 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001811 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001812 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001813 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001814 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001815 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001816
1817 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001818 ASSERT_VK_SUCCESS( err );
1819
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001820 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001821 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001822
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001823 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001824}
1825
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001826TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001827{
1828 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001829 VkFenceCreateInfo fenceInfo = {};
1830 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1831 fenceInfo.pNext = NULL;
1832 fenceInfo.flags = 0;
1833
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001834 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001835
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001836 ASSERT_NO_FATAL_FAILURE(InitState());
1837 ASSERT_NO_FATAL_FAILURE(InitViewport());
1838 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1839
Tony Barbourfe3351b2015-07-28 10:17:20 -06001840 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001841 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001842 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001843
1844 testFence.init(*m_device, fenceInfo);
1845
1846 // Bypass framework since it does the waits automatically
1847 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001848 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001849 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1850 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001851 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001852 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001853 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001854 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001855 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001856 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001857 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001858
1859 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001860 ASSERT_VK_SUCCESS( err );
1861
Jon Ashburnf19916e2016-01-11 13:12:43 -07001862 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001863 VkCommandBufferBeginInfo info = {};
1864 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1865 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001866 info.renderPass = VK_NULL_HANDLE;
1867 info.subpass = 0;
1868 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001869 info.occlusionQueryEnable = VK_FALSE;
1870 info.queryFlags = 0;
1871 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001872
1873 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001874 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001875
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001876 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001877}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001878#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001879
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001880// This is a positive test. No failures are expected.
1881TEST_F(VkLayerTest, TestAliasedMemoryTracking) {
1882 VkResult err;
1883 bool pass;
1884
1885 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
1886 "the buffer, create an image, and bind the same memory to "
1887 "it");
1888
1889 m_errorMonitor->ExpectSuccess();
1890
1891 ASSERT_NO_FATAL_FAILURE(InitState());
1892
1893 VkBuffer buffer;
1894 VkImage image;
1895 VkDeviceMemory mem;
1896 VkMemoryRequirements mem_reqs;
1897
1898 VkBufferCreateInfo buf_info = {};
1899 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1900 buf_info.pNext = NULL;
1901 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1902 buf_info.size = 256;
1903 buf_info.queueFamilyIndexCount = 0;
1904 buf_info.pQueueFamilyIndices = NULL;
1905 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1906 buf_info.flags = 0;
1907 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1908 ASSERT_VK_SUCCESS(err);
1909
1910 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1911
1912 VkMemoryAllocateInfo alloc_info = {};
1913 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1914 alloc_info.pNext = NULL;
1915 alloc_info.memoryTypeIndex = 0;
1916
1917 // Ensure memory is big enough for both bindings
1918 alloc_info.allocationSize = 0x10000;
1919
1920 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
1921 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1922 if (!pass) {
1923 vkDestroyBuffer(m_device->device(), buffer, NULL);
1924 return;
1925 }
1926
1927 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1928 ASSERT_VK_SUCCESS(err);
1929
1930 uint8_t *pData;
1931 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
1932 (void **)&pData);
1933 ASSERT_VK_SUCCESS(err);
1934
Mark Lobodzinski2abefa92016-05-05 11:45:57 -06001935 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001936
1937 vkUnmapMemory(m_device->device(), mem);
1938
1939 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1940 ASSERT_VK_SUCCESS(err);
1941
1942 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
1943 // memory. In fact, it was never used by the GPU.
1944 // Just be be sure, wait for idle.
1945 vkDestroyBuffer(m_device->device(), buffer, NULL);
1946 vkDeviceWaitIdle(m_device->device());
1947
1948 VkImageCreateInfo image_create_info = {};
1949 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1950 image_create_info.pNext = NULL;
1951 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1952 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1953 image_create_info.extent.width = 64;
1954 image_create_info.extent.height = 64;
1955 image_create_info.extent.depth = 1;
1956 image_create_info.mipLevels = 1;
1957 image_create_info.arrayLayers = 1;
1958 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1959 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1960 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1961 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1962 image_create_info.queueFamilyIndexCount = 0;
1963 image_create_info.pQueueFamilyIndices = NULL;
1964 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1965 image_create_info.flags = 0;
1966
1967 VkMemoryAllocateInfo mem_alloc = {};
1968 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1969 mem_alloc.pNext = NULL;
1970 mem_alloc.allocationSize = 0;
1971 mem_alloc.memoryTypeIndex = 0;
1972
1973 /* Create a mappable image. It will be the texture if linear images are ok
1974 * to be textures or it will be the staging image if they are not.
1975 */
1976 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1977 ASSERT_VK_SUCCESS(err);
1978
1979 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
1980
1981 mem_alloc.allocationSize = mem_reqs.size;
1982
1983 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
1984 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1985 if (!pass) {
1986 vkDestroyImage(m_device->device(), image, NULL);
1987 return;
1988 }
1989
Tobin Ehlis077ded32016-05-12 17:39:13 -06001990 // VALIDATION FAILURE:
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001991 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1992 ASSERT_VK_SUCCESS(err);
1993
1994 m_errorMonitor->VerifyNotFound();
1995
Tony Barbourdf4c0042016-06-01 15:55:43 -06001996 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001997 vkDestroyBuffer(m_device->device(), buffer, NULL);
1998 vkDestroyImage(m_device->device(), image, NULL);
1999}
2000
Tobin Ehlisf11be982016-05-11 13:52:53 -06002001TEST_F(VkLayerTest, InvalidMemoryAliasing) {
2002 TEST_DESCRIPTION("Create a buffer and image, allocate memory, and bind the "
2003 "buffer and image to memory such that they will alias.");
2004 VkResult err;
2005 bool pass;
2006 ASSERT_NO_FATAL_FAILURE(InitState());
2007
Tobin Ehlis077ded32016-05-12 17:39:13 -06002008 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06002009 VkImage image;
2010 VkDeviceMemory mem; // buffer will be bound first
2011 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06002012 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Tobin Ehlisf11be982016-05-11 13:52:53 -06002013
2014 VkBufferCreateInfo buf_info = {};
2015 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2016 buf_info.pNext = NULL;
2017 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2018 buf_info.size = 256;
2019 buf_info.queueFamilyIndexCount = 0;
2020 buf_info.pQueueFamilyIndices = NULL;
2021 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2022 buf_info.flags = 0;
2023 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
2024 ASSERT_VK_SUCCESS(err);
2025
Tobin Ehlis077ded32016-05-12 17:39:13 -06002026 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002027
2028 VkImageCreateInfo image_create_info = {};
2029 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2030 image_create_info.pNext = NULL;
2031 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2032 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
2033 image_create_info.extent.width = 64;
2034 image_create_info.extent.height = 64;
2035 image_create_info.extent.depth = 1;
2036 image_create_info.mipLevels = 1;
2037 image_create_info.arrayLayers = 1;
2038 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2039 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2040 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
2041 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
2042 image_create_info.queueFamilyIndexCount = 0;
2043 image_create_info.pQueueFamilyIndices = NULL;
2044 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2045 image_create_info.flags = 0;
2046
Tobin Ehlisf11be982016-05-11 13:52:53 -06002047 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2048 ASSERT_VK_SUCCESS(err);
2049
Tobin Ehlis077ded32016-05-12 17:39:13 -06002050 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
2051
2052 VkMemoryAllocateInfo alloc_info = {};
2053 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2054 alloc_info.pNext = NULL;
2055 alloc_info.memoryTypeIndex = 0;
2056 // Ensure memory is big enough for both bindings
2057 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
2058 pass = m_device->phy().set_memory_type(
2059 buff_mem_reqs.memoryTypeBits | img_mem_reqs.memoryTypeBits, &alloc_info,
2060 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002061 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06002062 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002063 vkDestroyImage(m_device->device(), image, NULL);
2064 return;
2065 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06002066 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
2067 ASSERT_VK_SUCCESS(err);
2068 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
2069 ASSERT_VK_SUCCESS(err);
2070
Tobin Ehlisf11be982016-05-11 13:52:53 -06002071 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2072 " is aliased with buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06002073 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06002074 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2075 m_errorMonitor->VerifyFound();
2076
2077 // Now correctly bind image to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06002078 // aliasing buffer2
2079 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
2080 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002081 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
2082 ASSERT_VK_SUCCESS(err);
2083 err = vkBindImageMemory(m_device->device(), image, mem_img, 0);
2084 ASSERT_VK_SUCCESS(err);
2085 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2086 " is aliased with image 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06002087 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002088 m_errorMonitor->VerifyFound();
2089
2090 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06002091 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002092 vkDestroyImage(m_device->device(), image, NULL);
2093 vkFreeMemory(m_device->device(), mem, NULL);
2094 vkFreeMemory(m_device->device(), mem_img, NULL);
2095}
2096
Tobin Ehlis35372522016-05-12 08:32:31 -06002097TEST_F(VkLayerTest, InvalidMemoryMapping) {
2098 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
2099 VkResult err;
2100 bool pass;
2101 ASSERT_NO_FATAL_FAILURE(InitState());
2102
2103 VkBuffer buffer;
2104 VkDeviceMemory mem;
2105 VkMemoryRequirements mem_reqs;
2106
2107 VkBufferCreateInfo buf_info = {};
2108 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2109 buf_info.pNext = NULL;
2110 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2111 buf_info.size = 256;
2112 buf_info.queueFamilyIndexCount = 0;
2113 buf_info.pQueueFamilyIndices = NULL;
2114 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2115 buf_info.flags = 0;
2116 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
2117 ASSERT_VK_SUCCESS(err);
2118
2119 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
2120 VkMemoryAllocateInfo alloc_info = {};
2121 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2122 alloc_info.pNext = NULL;
2123 alloc_info.memoryTypeIndex = 0;
2124
2125 // Ensure memory is big enough for both bindings
2126 static const VkDeviceSize allocation_size = 0x10000;
2127 alloc_info.allocationSize = allocation_size;
2128 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
2129 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
2130 if (!pass) {
2131 vkDestroyBuffer(m_device->device(), buffer, NULL);
2132 return;
2133 }
2134 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
2135 ASSERT_VK_SUCCESS(err);
2136
2137 uint8_t *pData;
2138 // Attempt to map memory size 0 is invalid
2139 m_errorMonitor->SetDesiredFailureMsg(
2140 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2141 "VkMapMemory: Attempting to map memory range of size zero");
2142 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
2143 m_errorMonitor->VerifyFound();
2144 // Map memory twice
2145 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
2146 (void **)&pData);
2147 ASSERT_VK_SUCCESS(err);
2148 m_errorMonitor->SetDesiredFailureMsg(
2149 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2150 "VkMapMemory: Attempting to map memory on an already-mapped object ");
2151 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
2152 (void **)&pData);
2153 m_errorMonitor->VerifyFound();
2154
2155 // Unmap the memory to avoid re-map error
2156 vkUnmapMemory(m_device->device(), mem);
2157 // overstep allocation with VK_WHOLE_SIZE
2158 m_errorMonitor->SetDesiredFailureMsg(
2159 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2160 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
2161 err = vkMapMemory(m_device->device(), mem, allocation_size + 1,
2162 VK_WHOLE_SIZE, 0, (void **)&pData);
2163 m_errorMonitor->VerifyFound();
2164 // overstep allocation w/o VK_WHOLE_SIZE
2165 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2166 " oversteps total array size 0x");
2167 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0,
2168 (void **)&pData);
2169 m_errorMonitor->VerifyFound();
2170 // Now error due to unmapping memory that's not mapped
2171 m_errorMonitor->SetDesiredFailureMsg(
2172 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2173 "Unmapping Memory without memory being mapped: ");
2174 vkUnmapMemory(m_device->device(), mem);
2175 m_errorMonitor->VerifyFound();
2176 // Now map memory and cause errors due to flushing invalid ranges
2177 err = vkMapMemory(m_device->device(), mem, 16, VK_WHOLE_SIZE, 0,
2178 (void **)&pData);
2179 ASSERT_VK_SUCCESS(err);
2180 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12002181 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06002182 mmr.memory = mem;
2183 mmr.offset = 15; // Error b/c offset less than offset of mapped mem
2184 m_errorMonitor->SetDesiredFailureMsg(
2185 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2186 ") is less than Memory Object's offset (");
2187 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2188 m_errorMonitor->VerifyFound();
2189 // Now flush range that oversteps mapped range
2190 vkUnmapMemory(m_device->device(), mem);
2191 err = vkMapMemory(m_device->device(), mem, 0, 256, 0, (void **)&pData);
2192 ASSERT_VK_SUCCESS(err);
2193 mmr.offset = 16;
2194 mmr.size = 256; // flushing bounds (272) exceed mapped bounds (256)
2195 m_errorMonitor->SetDesiredFailureMsg(
2196 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2197 ") exceeds the Memory Object's upper-bound (");
2198 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2199 m_errorMonitor->VerifyFound();
2200
2201 pass =
2202 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
2203 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
2204 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
2205 if (!pass) {
2206 vkFreeMemory(m_device->device(), mem, NULL);
2207 vkDestroyBuffer(m_device->device(), buffer, NULL);
2208 return;
2209 }
2210 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
2211 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
2212
2213 vkDestroyBuffer(m_device->device(), buffer, NULL);
2214 vkFreeMemory(m_device->device(), mem, NULL);
2215}
2216
Ian Elliott1c32c772016-04-28 14:47:13 -06002217TEST_F(VkLayerTest, EnableWsiBeforeUse) {
2218 VkResult err;
2219 bool pass;
2220
Ian Elliott489eec02016-05-05 14:12:44 -06002221// FIXME: After we turn on this code for non-Linux platforms, uncomment the
2222// following declaration (which is temporarily being moved below):
2223// VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002224 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2225 VkSwapchainCreateInfoKHR swapchain_create_info = {};
2226 uint32_t swapchain_image_count = 0;
2227// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
2228 uint32_t image_index = 0;
2229// VkPresentInfoKHR present_info = {};
2230
2231 ASSERT_NO_FATAL_FAILURE(InitState());
2232
Ian Elliott3f06ce52016-04-29 14:46:21 -06002233#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
2234#if defined(VK_USE_PLATFORM_ANDROID_KHR)
2235 // Use the functions from the VK_KHR_android_surface extension without
2236 // enabling that extension:
2237
2238 // Create a surface:
2239 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002240 m_errorMonitor->SetDesiredFailureMsg(
2241 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2242 "extension was not enabled for this");
2243 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
2244 &surface);
2245 pass = (err != VK_SUCCESS);
2246 ASSERT_TRUE(pass);
2247 m_errorMonitor->VerifyFound();
2248#endif // VK_USE_PLATFORM_ANDROID_KHR
2249
2250
2251#if defined(VK_USE_PLATFORM_MIR_KHR)
2252 // Use the functions from the VK_KHR_mir_surface extension without enabling
2253 // that extension:
2254
2255 // Create a surface:
2256 VkMirSurfaceCreateInfoKHR mir_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002257 m_errorMonitor->SetDesiredFailureMsg(
2258 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2259 "extension was not enabled for this");
2260 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
2261 pass = (err != VK_SUCCESS);
2262 ASSERT_TRUE(pass);
2263 m_errorMonitor->VerifyFound();
2264
2265 // Tell whether an mir_connection supports presentation:
2266 MirConnection *mir_connection = NULL;
2267 m_errorMonitor->SetDesiredFailureMsg(
2268 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2269 "extension was not enabled for this");
2270 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
2271 visual_id);
2272 m_errorMonitor->VerifyFound();
2273#endif // VK_USE_PLATFORM_MIR_KHR
2274
2275
2276#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
2277 // Use the functions from the VK_KHR_wayland_surface extension without
2278 // enabling that extension:
2279
2280 // Create a surface:
2281 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002282 m_errorMonitor->SetDesiredFailureMsg(
2283 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2284 "extension was not enabled for this");
2285 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
2286 &surface);
2287 pass = (err != VK_SUCCESS);
2288 ASSERT_TRUE(pass);
2289 m_errorMonitor->VerifyFound();
2290
2291 // Tell whether an wayland_display supports presentation:
2292 struct wl_display wayland_display = {};
2293 m_errorMonitor->SetDesiredFailureMsg(
2294 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2295 "extension was not enabled for this");
2296 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
2297 &wayland_display);
2298 m_errorMonitor->VerifyFound();
2299#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -06002300#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06002301
2302
2303#if defined(VK_USE_PLATFORM_WIN32_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06002304// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2305// TO NON-LINUX PLATFORMS:
2306VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06002307 // Use the functions from the VK_KHR_win32_surface extension without
2308 // enabling that extension:
2309
2310 // Create a surface:
2311 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002312 m_errorMonitor->SetDesiredFailureMsg(
2313 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2314 "extension was not enabled for this");
2315 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
2316 &surface);
2317 pass = (err != VK_SUCCESS);
2318 ASSERT_TRUE(pass);
2319 m_errorMonitor->VerifyFound();
2320
2321 // Tell whether win32 supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06002322 m_errorMonitor->SetDesiredFailureMsg(
2323 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2324 "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06002325 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06002326 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002327// Set this (for now, until all platforms are supported and tested):
2328#define NEED_TO_TEST_THIS_ON_PLATFORM
2329#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06002330
2331
Ian Elliott1c32c772016-04-28 14:47:13 -06002332#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06002333// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2334// TO NON-LINUX PLATFORMS:
2335VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002336 // Use the functions from the VK_KHR_xcb_surface extension without enabling
2337 // that extension:
2338
2339 // Create a surface:
2340 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06002341 m_errorMonitor->SetDesiredFailureMsg(
2342 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2343 "extension was not enabled for this");
2344 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2345 pass = (err != VK_SUCCESS);
2346 ASSERT_TRUE(pass);
2347 m_errorMonitor->VerifyFound();
2348
2349 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06002350 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06002351 xcb_visualid_t visual_id = 0;
2352 m_errorMonitor->SetDesiredFailureMsg(
2353 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2354 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06002355 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -06002356 visual_id);
2357 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002358// Set this (for now, until all platforms are supported and tested):
2359#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002360#endif // VK_USE_PLATFORM_XCB_KHR
2361
2362
Ian Elliott12630812016-04-29 14:35:43 -06002363#if defined(VK_USE_PLATFORM_XLIB_KHR)
2364 // Use the functions from the VK_KHR_xlib_surface extension without enabling
2365 // that extension:
2366
2367 // Create a surface:
2368 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
Ian Elliott12630812016-04-29 14:35:43 -06002369 m_errorMonitor->SetDesiredFailureMsg(
2370 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2371 "extension was not enabled for this");
2372 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
2373 pass = (err != VK_SUCCESS);
2374 ASSERT_TRUE(pass);
2375 m_errorMonitor->VerifyFound();
2376
2377 // Tell whether an Xlib VisualID supports presentation:
2378 Display *dpy = NULL;
2379 VisualID visual = 0;
2380 m_errorMonitor->SetDesiredFailureMsg(
2381 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2382 "extension was not enabled for this");
2383 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
2384 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002385// Set this (for now, until all platforms are supported and tested):
2386#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06002387#endif // VK_USE_PLATFORM_XLIB_KHR
2388
2389
Ian Elliott1c32c772016-04-28 14:47:13 -06002390 // Use the functions from the VK_KHR_surface extension without enabling
2391 // that extension:
2392
Ian Elliott489eec02016-05-05 14:12:44 -06002393#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002394 // Destroy a surface:
2395 m_errorMonitor->SetDesiredFailureMsg(
2396 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2397 "extension was not enabled for this");
2398 vkDestroySurfaceKHR(instance(), surface, NULL);
2399 m_errorMonitor->VerifyFound();
2400
2401 // Check if surface supports presentation:
2402 VkBool32 supported = false;
2403 m_errorMonitor->SetDesiredFailureMsg(
2404 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2405 "extension was not enabled for this");
2406 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2407 pass = (err != VK_SUCCESS);
2408 ASSERT_TRUE(pass);
2409 m_errorMonitor->VerifyFound();
2410
2411 // Check surface capabilities:
2412 VkSurfaceCapabilitiesKHR capabilities = {};
2413 m_errorMonitor->SetDesiredFailureMsg(
2414 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2415 "extension was not enabled for this");
2416 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
2417 &capabilities);
2418 pass = (err != VK_SUCCESS);
2419 ASSERT_TRUE(pass);
2420 m_errorMonitor->VerifyFound();
2421
2422 // Check surface formats:
2423 uint32_t format_count = 0;
2424 VkSurfaceFormatKHR *formats = NULL;
2425 m_errorMonitor->SetDesiredFailureMsg(
2426 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2427 "extension was not enabled for this");
2428 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
2429 &format_count, formats);
2430 pass = (err != VK_SUCCESS);
2431 ASSERT_TRUE(pass);
2432 m_errorMonitor->VerifyFound();
2433
2434 // Check surface present modes:
2435 uint32_t present_mode_count = 0;
2436 VkSurfaceFormatKHR *present_modes = NULL;
2437 m_errorMonitor->SetDesiredFailureMsg(
2438 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2439 "extension was not enabled for this");
2440 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
2441 &present_mode_count, present_modes);
2442 pass = (err != VK_SUCCESS);
2443 ASSERT_TRUE(pass);
2444 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002445#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002446
2447
2448 // Use the functions from the VK_KHR_swapchain extension without enabling
2449 // that extension:
2450
2451 // Create a swapchain:
2452 m_errorMonitor->SetDesiredFailureMsg(
2453 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2454 "extension was not enabled for this");
2455 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2456 swapchain_create_info.pNext = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06002457 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
2458 NULL, &swapchain);
2459 pass = (err != VK_SUCCESS);
2460 ASSERT_TRUE(pass);
2461 m_errorMonitor->VerifyFound();
2462
2463 // Get the images from the swapchain:
2464 m_errorMonitor->SetDesiredFailureMsg(
2465 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2466 "extension was not enabled for this");
2467 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
2468 &swapchain_image_count, NULL);
2469 pass = (err != VK_SUCCESS);
2470 ASSERT_TRUE(pass);
2471 m_errorMonitor->VerifyFound();
2472
2473 // Try to acquire an image:
2474 m_errorMonitor->SetDesiredFailureMsg(
2475 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2476 "extension was not enabled for this");
2477 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
2478 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
2479 pass = (err != VK_SUCCESS);
2480 ASSERT_TRUE(pass);
2481 m_errorMonitor->VerifyFound();
2482
2483 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002484 //
2485 // NOTE: Currently can't test this because a real swapchain is needed (as
2486 // opposed to the fake one we created) in order for the layer to lookup the
2487 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06002488
2489 // Destroy the swapchain:
2490 m_errorMonitor->SetDesiredFailureMsg(
2491 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2492 "extension was not enabled for this");
2493 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
2494 m_errorMonitor->VerifyFound();
2495}
2496
Ian Elliott2c1daf52016-05-12 09:41:46 -06002497TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
Ian Elliott2c1daf52016-05-12 09:41:46 -06002498
Dustin Graves6c6d8982016-05-17 10:09:21 -06002499#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott2c1daf52016-05-12 09:41:46 -06002500 VkSurfaceKHR surface = VK_NULL_HANDLE;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002501
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002502 VkResult err;
2503 bool pass;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002504 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2505 VkSwapchainCreateInfoKHR swapchain_create_info = {};
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002506 // uint32_t swapchain_image_count = 0;
2507 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
2508 // uint32_t image_index = 0;
2509 // VkPresentInfoKHR present_info = {};
Ian Elliott2c1daf52016-05-12 09:41:46 -06002510
2511 ASSERT_NO_FATAL_FAILURE(InitState());
2512
2513 // Use the create function from one of the VK_KHR_*_surface extension in
2514 // order to create a surface, testing all known errors in the process,
2515 // before successfully creating a surface:
2516 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002517 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2518 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002519 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
2520 pass = (err != VK_SUCCESS);
2521 ASSERT_TRUE(pass);
2522 m_errorMonitor->VerifyFound();
2523
2524 // Next, try to create a surface with the wrong
2525 // VkXcbSurfaceCreateInfoKHR::sType:
2526 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
2527 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002528 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2529 "called with the wrong value for");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002530 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2531 pass = (err != VK_SUCCESS);
2532 ASSERT_TRUE(pass);
2533 m_errorMonitor->VerifyFound();
2534
Ian Elliott2c1daf52016-05-12 09:41:46 -06002535 // Create a native window, and then correctly create a surface:
2536 xcb_connection_t *connection;
2537 xcb_screen_t *screen;
2538 xcb_window_t xcb_window;
2539 xcb_intern_atom_reply_t *atom_wm_delete_window;
2540
2541 const xcb_setup_t *setup;
2542 xcb_screen_iterator_t iter;
2543 int scr;
2544 uint32_t value_mask, value_list[32];
2545 int width = 1;
2546 int height = 1;
2547
2548 connection = xcb_connect(NULL, &scr);
2549 ASSERT_TRUE(connection != NULL);
2550 setup = xcb_get_setup(connection);
2551 iter = xcb_setup_roots_iterator(setup);
2552 while (scr-- > 0)
2553 xcb_screen_next(&iter);
2554 screen = iter.data;
2555
2556 xcb_window = xcb_generate_id(connection);
2557
2558 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
2559 value_list[0] = screen->black_pixel;
2560 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE |
2561 XCB_EVENT_MASK_STRUCTURE_NOTIFY;
2562
2563 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window,
2564 screen->root, 0, 0, width, height, 0,
2565 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual,
2566 value_mask, value_list);
2567
2568 /* Magic code that will send notification when window is destroyed */
2569 xcb_intern_atom_cookie_t cookie =
2570 xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
2571 xcb_intern_atom_reply_t *reply =
2572 xcb_intern_atom_reply(connection, cookie, 0);
2573
2574 xcb_intern_atom_cookie_t cookie2 =
2575 xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002576 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002577 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window,
2578 (*reply).atom, 4, 32, 1,
2579 &(*atom_wm_delete_window).atom);
2580 free(reply);
2581
2582 xcb_map_window(connection, xcb_window);
2583
2584 // Force the x/y coordinates to 100,100 results are identical in consecutive
2585 // runs
2586 const uint32_t coords[] = {100, 100};
2587 xcb_configure_window(connection, xcb_window,
2588 XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
2589
Ian Elliott2c1daf52016-05-12 09:41:46 -06002590 // Finally, try to correctly create a surface:
2591 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
2592 xcb_create_info.pNext = NULL;
2593 xcb_create_info.flags = 0;
2594 xcb_create_info.connection = connection;
2595 xcb_create_info.window = xcb_window;
2596 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2597 pass = (err == VK_SUCCESS);
2598 ASSERT_TRUE(pass);
2599
Ian Elliott2c1daf52016-05-12 09:41:46 -06002600 // Check if surface supports presentation:
2601
2602 // 1st, do so without having queried the queue families:
2603 VkBool32 supported = false;
2604 // TODO: Get the following error to come out:
2605 m_errorMonitor->SetDesiredFailureMsg(
2606 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2607 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
2608 "function");
2609 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2610 pass = (err != VK_SUCCESS);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002611 // ASSERT_TRUE(pass);
2612 // m_errorMonitor->VerifyFound();
Ian Elliott2c1daf52016-05-12 09:41:46 -06002613
2614 // Next, query a queue family index that's too large:
2615 m_errorMonitor->SetDesiredFailureMsg(
2616 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2617 "called with a queueFamilyIndex that is too large");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002618 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface,
2619 &supported);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002620 pass = (err != VK_SUCCESS);
2621 ASSERT_TRUE(pass);
2622 m_errorMonitor->VerifyFound();
2623
2624 // Finally, do so correctly:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002625 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2626 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002627 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2628 pass = (err == VK_SUCCESS);
2629 ASSERT_TRUE(pass);
2630
Ian Elliott2c1daf52016-05-12 09:41:46 -06002631 // Before proceeding, try to create a swapchain without having called
2632 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
2633 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2634 swapchain_create_info.pNext = NULL;
2635 swapchain_create_info.flags = 0;
2636 m_errorMonitor->SetDesiredFailureMsg(
2637 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2638 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002639 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2640 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002641 pass = (err != VK_SUCCESS);
2642 ASSERT_TRUE(pass);
2643 m_errorMonitor->VerifyFound();
2644
Ian Elliott2c1daf52016-05-12 09:41:46 -06002645 // Get the surface capabilities:
2646 VkSurfaceCapabilitiesKHR surface_capabilities;
2647
2648 // Do so correctly (only error logged by this entrypoint is if the
2649 // extension isn't enabled):
2650 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
2651 &surface_capabilities);
2652 pass = (err == VK_SUCCESS);
2653 ASSERT_TRUE(pass);
2654
Ian Elliott2c1daf52016-05-12 09:41:46 -06002655 // Get the surface formats:
2656 uint32_t surface_format_count;
2657
2658 // First, try without a pointer to surface_format_count:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002659 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2660 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002661 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
2662 pass = (err == VK_SUCCESS);
2663 ASSERT_TRUE(pass);
2664 m_errorMonitor->VerifyFound();
2665
2666 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
2667 // correctly done a 1st try (to get the count):
2668 m_errorMonitor->SetDesiredFailureMsg(
2669 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2670 "but no prior positive value has been seen for");
2671 surface_format_count = 0;
2672 vkGetPhysicalDeviceSurfaceFormatsKHR(
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002673 gpu(), surface, &surface_format_count,
2674 (VkSurfaceFormatKHR *)&surface_format_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002675 pass = (err == VK_SUCCESS);
2676 ASSERT_TRUE(pass);
2677 m_errorMonitor->VerifyFound();
2678
2679 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002680 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
2681 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002682 pass = (err == VK_SUCCESS);
2683 ASSERT_TRUE(pass);
2684
2685 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002686 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(
2687 surface_format_count * sizeof(VkSurfaceFormatKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002688
2689 // Next, do a 2nd try with surface_format_count being set too high:
2690 surface_format_count += 5;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002691 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2692 "that is greater than the value");
2693 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002694 surface_formats);
2695 pass = (err == VK_SUCCESS);
2696 ASSERT_TRUE(pass);
2697 m_errorMonitor->VerifyFound();
2698
2699 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002700 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
2701 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002702 pass = (err == VK_SUCCESS);
2703 ASSERT_TRUE(pass);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002704 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002705 surface_formats);
2706 pass = (err == VK_SUCCESS);
2707 ASSERT_TRUE(pass);
2708
Ian Elliott2c1daf52016-05-12 09:41:46 -06002709 // Get the surface present modes:
2710 uint32_t surface_present_mode_count;
2711
2712 // First, try without a pointer to surface_format_count:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002713 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2714 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002715 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
2716 pass = (err == VK_SUCCESS);
2717 ASSERT_TRUE(pass);
2718 m_errorMonitor->VerifyFound();
2719
2720 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
2721 // correctly done a 1st try (to get the count):
2722 m_errorMonitor->SetDesiredFailureMsg(
2723 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2724 "but no prior positive value has been seen for");
2725 surface_present_mode_count = 0;
2726 vkGetPhysicalDeviceSurfacePresentModesKHR(
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002727 gpu(), surface, &surface_present_mode_count,
2728 (VkPresentModeKHR *)&surface_present_mode_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002729 pass = (err == VK_SUCCESS);
2730 ASSERT_TRUE(pass);
2731 m_errorMonitor->VerifyFound();
2732
2733 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002734 vkGetPhysicalDeviceSurfacePresentModesKHR(
2735 gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002736 pass = (err == VK_SUCCESS);
2737 ASSERT_TRUE(pass);
2738
2739 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002740 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(
2741 surface_present_mode_count * sizeof(VkPresentModeKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002742
2743 // Next, do a 2nd try with surface_format_count being set too high:
2744 surface_present_mode_count += 5;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002745 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2746 "that is greater than the value");
2747 vkGetPhysicalDeviceSurfacePresentModesKHR(
2748 gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002749 pass = (err == VK_SUCCESS);
2750 ASSERT_TRUE(pass);
2751 m_errorMonitor->VerifyFound();
2752
2753 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002754 vkGetPhysicalDeviceSurfacePresentModesKHR(
2755 gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002756 pass = (err == VK_SUCCESS);
2757 ASSERT_TRUE(pass);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002758 vkGetPhysicalDeviceSurfacePresentModesKHR(
2759 gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002760 pass = (err == VK_SUCCESS);
2761 ASSERT_TRUE(pass);
2762
Ian Elliott2c1daf52016-05-12 09:41:46 -06002763 // Create a swapchain:
2764
2765 // First, try without a pointer to swapchain_create_info:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002766 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2767 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002768 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
2769 pass = (err != VK_SUCCESS);
2770 ASSERT_TRUE(pass);
2771 m_errorMonitor->VerifyFound();
2772
2773 // Next, call with a non-NULL swapchain_create_info, that has the wrong
2774 // sType:
2775 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002776 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2777 "called with the wrong value for");
2778 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2779 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002780 pass = (err != VK_SUCCESS);
2781 ASSERT_TRUE(pass);
2782 m_errorMonitor->VerifyFound();
2783
2784 // Next, call with a NULL swapchain pointer:
2785 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2786 swapchain_create_info.pNext = NULL;
2787 swapchain_create_info.flags = 0;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002788 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2789 "called with NULL pointer");
2790 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2791 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002792 pass = (err != VK_SUCCESS);
2793 ASSERT_TRUE(pass);
2794 m_errorMonitor->VerifyFound();
2795
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002796 // TODO: Enhance swapchain layer so that
2797 // swapchain_create_info.queueFamilyIndexCount is checked against something?
Ian Elliott2c1daf52016-05-12 09:41:46 -06002798
2799 // Next, call with a queue family index that's too large:
2800 uint32_t queueFamilyIndex[2] = {100000, 0};
2801 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2802 swapchain_create_info.queueFamilyIndexCount = 2;
2803 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
2804 m_errorMonitor->SetDesiredFailureMsg(
2805 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2806 "called with a queueFamilyIndex that is too large");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002807 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2808 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002809 pass = (err != VK_SUCCESS);
2810 ASSERT_TRUE(pass);
2811 m_errorMonitor->VerifyFound();
2812
2813 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
2814 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2815 swapchain_create_info.queueFamilyIndexCount = 1;
2816 m_errorMonitor->SetDesiredFailureMsg(
2817 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2818 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
2819 "pCreateInfo->pQueueFamilyIndices).");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002820 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2821 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002822 pass = (err != VK_SUCCESS);
2823 ASSERT_TRUE(pass);
2824 m_errorMonitor->VerifyFound();
2825
2826 // Next, call with an invalid imageSharingMode:
2827 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
2828 swapchain_create_info.queueFamilyIndexCount = 1;
2829 m_errorMonitor->SetDesiredFailureMsg(
2830 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2831 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002832 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2833 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002834 pass = (err != VK_SUCCESS);
2835 ASSERT_TRUE(pass);
2836 m_errorMonitor->VerifyFound();
2837 // Fix for the future:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002838 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2839 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002840 swapchain_create_info.queueFamilyIndexCount = 0;
2841 queueFamilyIndex[0] = 0;
2842 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
2843
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002844 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
Ian Elliott2c1daf52016-05-12 09:41:46 -06002845 // Get the images from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002846 // Acquire an image from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002847 // Present an image to a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002848 // Destroy the swapchain:
2849
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002850 // TODOs:
2851 //
2852 // - Try destroying the device without first destroying the swapchain
2853 //
2854 // - Try destroying the device without first destroying the surface
2855 //
2856 // - Try destroying the surface without first destroying the swapchain
Ian Elliott2c1daf52016-05-12 09:41:46 -06002857
2858 // Destroy the surface:
2859 vkDestroySurfaceKHR(instance(), surface, NULL);
2860
Ian Elliott2c1daf52016-05-12 09:41:46 -06002861 // Tear down the window:
2862 xcb_destroy_window(connection, xcb_window);
2863 xcb_disconnect(connection);
2864
2865#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002866 return;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002867#endif // VK_USE_PLATFORM_XCB_KHR
2868}
2869
Karl Schultz6addd812016-02-02 17:17:23 -07002870TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
2871 VkResult err;
2872 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002873
Karl Schultz6addd812016-02-02 17:17:23 -07002874 m_errorMonitor->SetDesiredFailureMsg(
2875 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002876 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
2877
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002878 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002879
2880 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002881 VkImage image;
2882 VkDeviceMemory mem;
2883 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002884
Karl Schultz6addd812016-02-02 17:17:23 -07002885 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2886 const int32_t tex_width = 32;
2887 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002888
Tony Barboureb254902015-07-15 12:50:33 -06002889 VkImageCreateInfo image_create_info = {};
2890 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002891 image_create_info.pNext = NULL;
2892 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2893 image_create_info.format = tex_format;
2894 image_create_info.extent.width = tex_width;
2895 image_create_info.extent.height = tex_height;
2896 image_create_info.extent.depth = 1;
2897 image_create_info.mipLevels = 1;
2898 image_create_info.arrayLayers = 1;
2899 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2900 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2901 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2902 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002903
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002904 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002905 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002906 mem_alloc.pNext = NULL;
2907 mem_alloc.allocationSize = 0;
2908 // Introduce failure, do NOT set memProps to
2909 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
2910 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002911
Chia-I Wuf7458c52015-10-26 21:10:41 +08002912 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002913 ASSERT_VK_SUCCESS(err);
2914
Karl Schultz6addd812016-02-02 17:17:23 -07002915 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002916
Mark Lobodzinski23065352015-05-29 09:32:35 -05002917 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002918
Karl Schultz6addd812016-02-02 17:17:23 -07002919 pass =
2920 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
2921 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
2922 if (!pass) { // If we can't find any unmappable memory this test doesn't
2923 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002924 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002925 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002926 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002927
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002928 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002929 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002930 ASSERT_VK_SUCCESS(err);
2931
2932 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002933 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002934 ASSERT_VK_SUCCESS(err);
2935
2936 // Map memory as if to initialize the image
2937 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07002938 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
2939 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002940
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002941 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002942
Chia-I Wuf7458c52015-10-26 21:10:41 +08002943 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002944 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002945}
2946
Karl Schultz6addd812016-02-02 17:17:23 -07002947TEST_F(VkLayerTest, RebindMemory) {
2948 VkResult err;
2949 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002950
Karl Schultz6addd812016-02-02 17:17:23 -07002951 m_errorMonitor->SetDesiredFailureMsg(
2952 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002953 "which has already been bound to mem object");
2954
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002955 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002956
2957 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002958 VkImage image;
2959 VkDeviceMemory mem1;
2960 VkDeviceMemory mem2;
2961 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002962
Karl Schultz6addd812016-02-02 17:17:23 -07002963 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2964 const int32_t tex_width = 32;
2965 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002966
Tony Barboureb254902015-07-15 12:50:33 -06002967 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002968 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2969 image_create_info.pNext = NULL;
2970 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2971 image_create_info.format = tex_format;
2972 image_create_info.extent.width = tex_width;
2973 image_create_info.extent.height = tex_height;
2974 image_create_info.extent.depth = 1;
2975 image_create_info.mipLevels = 1;
2976 image_create_info.arrayLayers = 1;
2977 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2978 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2979 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2980 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002981
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002982 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002983 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2984 mem_alloc.pNext = NULL;
2985 mem_alloc.allocationSize = 0;
2986 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002987
Karl Schultz6addd812016-02-02 17:17:23 -07002988 // Introduce failure, do NOT set memProps to
2989 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002990 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002991 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002992 ASSERT_VK_SUCCESS(err);
2993
Karl Schultz6addd812016-02-02 17:17:23 -07002994 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002995
2996 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002997 pass =
2998 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002999 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003000
3001 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003002 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003003 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003004 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003005 ASSERT_VK_SUCCESS(err);
3006
3007 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06003008 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003009 ASSERT_VK_SUCCESS(err);
3010
Karl Schultz6addd812016-02-02 17:17:23 -07003011 // Introduce validation failure, try to bind a different memory object to
3012 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06003013 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003014
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003015 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003016
Chia-I Wuf7458c52015-10-26 21:10:41 +08003017 vkDestroyImage(m_device->device(), image, NULL);
3018 vkFreeMemory(m_device->device(), mem1, NULL);
3019 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003020}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05003021
Karl Schultz6addd812016-02-02 17:17:23 -07003022TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003023 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003024
Karl Schultz6addd812016-02-02 17:17:23 -07003025 m_errorMonitor->SetDesiredFailureMsg(
3026 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
3027 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06003028
3029 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06003030 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3031 fenceInfo.pNext = NULL;
3032 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06003033
Tony Barbour300a6082015-04-07 13:44:53 -06003034 ASSERT_NO_FATAL_FAILURE(InitState());
3035 ASSERT_NO_FATAL_FAILURE(InitViewport());
3036 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3037
Tony Barbourfe3351b2015-07-28 10:17:20 -06003038 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003039 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
3040 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06003041 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06003042
3043 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06003044
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003045 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08003046 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3047 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003048 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003049 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07003050 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003051 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003052 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08003053 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003054 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06003055
3056 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07003057 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06003058
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003059 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06003060}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003061// This is a positive test. We used to expect error in this case but spec now
3062// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07003063TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003064 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06003065 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06003066 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06003067 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3068 fenceInfo.pNext = NULL;
3069
Tony Barbour0b4d9562015-04-09 10:48:04 -06003070 ASSERT_NO_FATAL_FAILURE(InitState());
3071 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08003072 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003073 VkResult result = vkResetFences(m_device->device(), 1, fences);
3074 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06003075
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003076 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06003077}
Tobin Ehlis41376e12015-07-03 08:45:14 -06003078
Chris Forbese70b7d32016-06-15 15:49:12 +12003079#if 0
3080TEST_F(VkLayerTest, LongFenceChain)
3081{
3082 m_errorMonitor->ExpectSuccess();
3083
3084 ASSERT_NO_FATAL_FAILURE(InitState());
3085 VkResult err;
3086
3087 std::vector<VkFence> fences;
3088
3089 const int chainLength = 32768;
3090
3091 for (int i = 0; i < chainLength; i++) {
3092 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3093 VkFence fence;
3094 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
3095 ASSERT_VK_SUCCESS(err);
3096
3097 fences.push_back(fence);
3098
3099 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3100 0, nullptr, 0, nullptr };
3101 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
3102 ASSERT_VK_SUCCESS(err);
3103
3104 }
3105
3106 // BOOM, stack overflow.
3107 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
3108
3109 for (auto fence : fences)
3110 vkDestroyFence(m_device->device(), fence, nullptr);
3111
3112 m_errorMonitor->VerifyNotFound();
3113}
3114#endif
3115
Chris Forbes18127d12016-06-08 16:52:28 +12003116TEST_F(VkLayerTest, CommandBufferSimultaneousUseSync)
3117{
3118 m_errorMonitor->ExpectSuccess();
3119
3120 ASSERT_NO_FATAL_FAILURE(InitState());
3121 VkResult err;
3122
3123 // Record (empty!) command buffer that can be submitted multiple times
3124 // simultaneously.
3125 VkCommandBufferBeginInfo cbbi = {
3126 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
3127 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr
3128 };
3129 m_commandBuffer->BeginCommandBuffer(&cbbi);
3130 m_commandBuffer->EndCommandBuffer();
3131
3132 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3133 VkFence fence;
3134 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
3135 ASSERT_VK_SUCCESS(err);
3136
3137 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
3138 VkSemaphore s1, s2;
3139 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
3140 ASSERT_VK_SUCCESS(err);
3141 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
3142 ASSERT_VK_SUCCESS(err);
3143
3144 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
3145 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3146 1, &m_commandBuffer->handle(), 1, &s1 };
3147 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
3148 ASSERT_VK_SUCCESS(err);
3149
3150 // Submit CB again, signaling s2.
3151 si.pSignalSemaphores = &s2;
3152 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
3153 ASSERT_VK_SUCCESS(err);
3154
3155 // Wait for fence.
3156 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3157 ASSERT_VK_SUCCESS(err);
3158
3159 // CB is still in flight from second submission, but semaphore s1 is no
3160 // longer in flight. delete it.
3161 vkDestroySemaphore(m_device->device(), s1, nullptr);
3162
3163 m_errorMonitor->VerifyNotFound();
3164
3165 // Force device idle and clean up remaining objects
3166 vkDeviceWaitIdle(m_device->device());
3167 vkDestroySemaphore(m_device->device(), s2, nullptr);
3168 vkDestroyFence(m_device->device(), fence, nullptr);
3169}
3170
Chris Forbes4e44c912016-06-16 10:20:00 +12003171TEST_F(VkLayerTest, FenceCreateSignaledWaitHandling)
3172{
3173 m_errorMonitor->ExpectSuccess();
3174
3175 ASSERT_NO_FATAL_FAILURE(InitState());
3176 VkResult err;
3177
3178 // A fence created signaled
3179 VkFenceCreateInfo fci1 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT };
3180 VkFence f1;
3181 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
3182 ASSERT_VK_SUCCESS(err);
3183
3184 // A fence created not
3185 VkFenceCreateInfo fci2 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3186 VkFence f2;
3187 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
3188 ASSERT_VK_SUCCESS(err);
3189
3190 // Submit the unsignaled fence
3191 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3192 0, nullptr, 0, nullptr };
3193 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
3194
3195 // Wait on both fences, with signaled first.
3196 VkFence fences[] = { f1, f2 };
3197 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
3198
3199 // Should have both retired!
3200 vkDestroyFence(m_device->device(), f1, nullptr);
3201 vkDestroyFence(m_device->device(), f2, nullptr);
3202
3203 m_errorMonitor->VerifyNotFound();
3204}
3205
Tobin Ehlis41376e12015-07-03 08:45:14 -06003206TEST_F(VkLayerTest, InvalidUsageBits)
3207{
Tony Barbourf92621a2016-05-02 14:28:12 -06003208 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06003209 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06003210 "Initialize buffer with wrong usage then perform copy expecting errors "
3211 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003212 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003213 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06003214
3215 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06003216 VkImageObj image(m_device);
3217 // Initialize image with USAGE_INPUT_ATTACHMENT
Tobin Ehlis8b313c02016-05-25 15:01:52 -06003218 image.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06003219 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
3220 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06003221
Tony Barbourf92621a2016-05-02 14:28:12 -06003222 VkImageView dsv;
3223 VkImageViewCreateInfo dsvci = {};
3224 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3225 dsvci.image = image.handle();
3226 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3227 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
3228 dsvci.subresourceRange.layerCount = 1;
3229 dsvci.subresourceRange.baseMipLevel = 0;
3230 dsvci.subresourceRange.levelCount = 1;
3231 dsvci.subresourceRange.aspectMask =
3232 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06003233
Tony Barbourf92621a2016-05-02 14:28:12 -06003234 // Create a view with depth / stencil aspect for image with different usage
3235 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003236
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003237 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06003238
3239 // Initialize buffer with TRANSFER_DST usage
3240 vk_testing::Buffer buffer;
3241 VkMemoryPropertyFlags reqs = 0;
3242 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3243 VkBufferImageCopy region = {};
3244 region.bufferRowLength = 128;
3245 region.bufferImageHeight = 128;
3246 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3247 region.imageSubresource.layerCount = 1;
3248 region.imageExtent.height = 16;
3249 region.imageExtent.width = 16;
3250 region.imageExtent.depth = 1;
3251
3252 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3253 "Invalid usage flag for buffer ");
3254 // Buffer usage not set to TRANSFER_SRC and image usage not set to
3255 // TRANSFER_DST
3256 BeginCommandBuffer();
3257 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
3258 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
3259 1, &region);
3260 m_errorMonitor->VerifyFound();
3261
3262 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3263 "Invalid usage flag for image ");
3264 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
3265 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
3266 1, &region);
3267 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06003268}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003269#endif // MEM_TRACKER_TESTS
3270
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06003271#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003272
3273TEST_F(VkLayerTest, LeakAnObject) {
3274 VkResult err;
3275
3276 TEST_DESCRIPTION(
3277 "Create a fence and destroy its device without first destroying the fence.");
3278
3279 // Note that we have to create a new device since destroying the
3280 // framework's device causes Teardown() to fail and just calling Teardown
3281 // will destroy the errorMonitor.
3282
3283 m_errorMonitor->SetDesiredFailureMsg(
3284 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3285 "OBJ ERROR : VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT object");
3286
3287 ASSERT_NO_FATAL_FAILURE(InitState());
3288
3289 const std::vector<VkQueueFamilyProperties> queue_props =
3290 m_device->queue_props;
3291 std::vector<VkDeviceQueueCreateInfo> queue_info;
3292 queue_info.reserve(queue_props.size());
3293 std::vector<std::vector<float>> queue_priorities;
3294 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
3295 VkDeviceQueueCreateInfo qi = {};
3296 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
3297 qi.pNext = NULL;
3298 qi.queueFamilyIndex = i;
3299 qi.queueCount = queue_props[i].queueCount;
3300 queue_priorities.emplace_back(qi.queueCount, 0.0f);
3301 qi.pQueuePriorities = queue_priorities[i].data();
3302 queue_info.push_back(qi);
3303 }
3304
3305 std::vector<const char *> device_layer_names;
3306 std::vector<const char *> device_extension_names;
3307 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
3308 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
3309 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
3310 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003311 device_layer_names.push_back("VK_LAYER_LUNARG_image");
3312 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
3313
3314 // The sacrificial device object
3315 VkDevice testDevice;
3316 VkDeviceCreateInfo device_create_info = {};
3317 auto features = m_device->phy().features();
3318 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
3319 device_create_info.pNext = NULL;
3320 device_create_info.queueCreateInfoCount = queue_info.size();
3321 device_create_info.pQueueCreateInfos = queue_info.data();
3322 device_create_info.enabledLayerCount = device_layer_names.size();
3323 device_create_info.ppEnabledLayerNames = device_layer_names.data();
3324 device_create_info.pEnabledFeatures = &features;
3325 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
3326 ASSERT_VK_SUCCESS(err);
3327
3328 VkFence fence;
3329 VkFenceCreateInfo fence_create_info = {};
3330 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3331 fence_create_info.pNext = NULL;
3332 fence_create_info.flags = 0;
3333 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
3334 ASSERT_VK_SUCCESS(err);
3335
3336 // Induce failure by not calling vkDestroyFence
3337 vkDestroyDevice(testDevice, NULL);
3338 m_errorMonitor->VerifyFound();
3339}
3340
3341TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
3342
3343 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
3344 "attempt to delete them from another.");
3345
3346 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3347 "FreeCommandBuffers is attempting to free Command Buffer");
3348
3349 VkCommandPool command_pool_one;
3350 VkCommandPool command_pool_two;
3351
3352 VkCommandPoolCreateInfo pool_create_info{};
3353 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3354 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3355 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3356
3357 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3358 &command_pool_one);
3359
3360 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3361 &command_pool_two);
3362
3363 VkCommandBuffer command_buffer[9];
3364 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3365 command_buffer_allocate_info.sType =
3366 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3367 command_buffer_allocate_info.commandPool = command_pool_one;
3368 command_buffer_allocate_info.commandBufferCount = 9;
3369 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3370 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3371 command_buffer);
3372
3373 vkFreeCommandBuffers(m_device->device(), command_pool_two, 4,
3374 &command_buffer[3]);
3375
3376 m_errorMonitor->VerifyFound();
3377
3378 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
3379 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
3380}
3381
3382TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
3383 VkResult err;
3384
3385 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
3386 "attempt to delete them from another.");
3387
3388 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3389 "FreeDescriptorSets is attempting to free descriptorSet");
3390
3391 ASSERT_NO_FATAL_FAILURE(InitState());
3392 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3393
3394 VkDescriptorPoolSize ds_type_count = {};
3395 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
3396 ds_type_count.descriptorCount = 1;
3397
3398 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3399 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3400 ds_pool_ci.pNext = NULL;
3401 ds_pool_ci.flags = 0;
3402 ds_pool_ci.maxSets = 1;
3403 ds_pool_ci.poolSizeCount = 1;
3404 ds_pool_ci.pPoolSizes = &ds_type_count;
3405
3406 VkDescriptorPool ds_pool_one;
3407 err =
3408 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
3409 ASSERT_VK_SUCCESS(err);
3410
3411 // Create a second descriptor pool
3412 VkDescriptorPool ds_pool_two;
3413 err =
3414 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
3415 ASSERT_VK_SUCCESS(err);
3416
3417 VkDescriptorSetLayoutBinding dsl_binding = {};
3418 dsl_binding.binding = 0;
3419 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3420 dsl_binding.descriptorCount = 1;
3421 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3422 dsl_binding.pImmutableSamplers = NULL;
3423
3424 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3425 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3426 ds_layout_ci.pNext = NULL;
3427 ds_layout_ci.bindingCount = 1;
3428 ds_layout_ci.pBindings = &dsl_binding;
3429
3430 VkDescriptorSetLayout ds_layout;
3431 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3432 &ds_layout);
3433 ASSERT_VK_SUCCESS(err);
3434
3435 VkDescriptorSet descriptorSet;
3436 VkDescriptorSetAllocateInfo alloc_info = {};
3437 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3438 alloc_info.descriptorSetCount = 1;
3439 alloc_info.descriptorPool = ds_pool_one;
3440 alloc_info.pSetLayouts = &ds_layout;
3441 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3442 &descriptorSet);
3443 ASSERT_VK_SUCCESS(err);
3444
3445 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
3446
3447 m_errorMonitor->VerifyFound();
3448
3449 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3450 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
3451 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
3452}
3453
3454TEST_F(VkLayerTest, CreateUnknownObject) {
3455 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3456 "Invalid VkImage Object ");
3457
3458 TEST_DESCRIPTION(
3459 "Pass an invalid image object handle into a Vulkan API call.");
3460
3461 ASSERT_NO_FATAL_FAILURE(InitState());
3462
3463 // Pass bogus handle into GetImageMemoryRequirements
3464 VkMemoryRequirements mem_reqs;
3465 uint64_t fakeImageHandle = 0xCADECADE;
3466 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
3467
3468 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
3469
3470 m_errorMonitor->VerifyFound();
3471}
3472
Karl Schultz6addd812016-02-02 17:17:23 -07003473TEST_F(VkLayerTest, PipelineNotBound) {
3474 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003475
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003476 TEST_DESCRIPTION(
3477 "Pass in an invalid pipeline object handle into a Vulkan API call.");
3478
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003480 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003481
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003482 ASSERT_NO_FATAL_FAILURE(InitState());
3483 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003484
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003485 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003486 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3487 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003488
3489 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003490 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3491 ds_pool_ci.pNext = NULL;
3492 ds_pool_ci.maxSets = 1;
3493 ds_pool_ci.poolSizeCount = 1;
3494 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003495
3496 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003497 err =
3498 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003499 ASSERT_VK_SUCCESS(err);
3500
3501 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003502 dsl_binding.binding = 0;
3503 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3504 dsl_binding.descriptorCount = 1;
3505 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3506 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003507
3508 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003509 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3510 ds_layout_ci.pNext = NULL;
3511 ds_layout_ci.bindingCount = 1;
3512 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003513
3514 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003515 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3516 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003517 ASSERT_VK_SUCCESS(err);
3518
3519 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003520 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003521 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003522 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003523 alloc_info.descriptorPool = ds_pool;
3524 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003525 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3526 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003527 ASSERT_VK_SUCCESS(err);
3528
3529 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003530 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3531 pipeline_layout_ci.pNext = NULL;
3532 pipeline_layout_ci.setLayoutCount = 1;
3533 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003534
3535 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003536 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3537 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003538 ASSERT_VK_SUCCESS(err);
3539
Mark Youngad779052016-01-06 14:26:04 -07003540 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003541
3542 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003543 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3544 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003545
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003546 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003547
Chia-I Wuf7458c52015-10-26 21:10:41 +08003548 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3549 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3550 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003551}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003552
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003553TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
3554 VkResult err;
3555
3556 TEST_DESCRIPTION("Test validation check for an invalid memory type index "
3557 "during bind[Buffer|Image]Memory time");
3558
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003559 ASSERT_NO_FATAL_FAILURE(InitState());
3560
3561 // Create an image, allocate memory, set a bad typeIndex and then try to
3562 // bind it
3563 VkImage image;
3564 VkDeviceMemory mem;
3565 VkMemoryRequirements mem_reqs;
3566 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3567 const int32_t tex_width = 32;
3568 const int32_t tex_height = 32;
3569
3570 VkImageCreateInfo image_create_info = {};
3571 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3572 image_create_info.pNext = NULL;
3573 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3574 image_create_info.format = tex_format;
3575 image_create_info.extent.width = tex_width;
3576 image_create_info.extent.height = tex_height;
3577 image_create_info.extent.depth = 1;
3578 image_create_info.mipLevels = 1;
3579 image_create_info.arrayLayers = 1;
3580 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3581 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3582 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3583 image_create_info.flags = 0;
3584
3585 VkMemoryAllocateInfo mem_alloc = {};
3586 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3587 mem_alloc.pNext = NULL;
3588 mem_alloc.allocationSize = 0;
3589 mem_alloc.memoryTypeIndex = 0;
3590
3591 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3592 ASSERT_VK_SUCCESS(err);
3593
3594 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
3595 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003596
3597 // Introduce Failure, select invalid TypeIndex
3598 VkPhysicalDeviceMemoryProperties memory_info;
3599
3600 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
3601 unsigned int i;
3602 for (i = 0; i < memory_info.memoryTypeCount; i++) {
3603 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
3604 mem_alloc.memoryTypeIndex = i;
3605 break;
3606 }
3607 }
3608 if (i >= memory_info.memoryTypeCount) {
3609 printf("No invalid memory type index could be found; skipped.\n");
3610 vkDestroyImage(m_device->device(), image, NULL);
3611 return;
3612 }
3613
3614 m_errorMonitor->SetDesiredFailureMsg(
3615 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3616 "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003617
3618 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
3619 ASSERT_VK_SUCCESS(err);
3620
3621 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3622 (void)err;
3623
3624 m_errorMonitor->VerifyFound();
3625
3626 vkDestroyImage(m_device->device(), image, NULL);
3627 vkFreeMemory(m_device->device(), mem, NULL);
3628}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003629
Karl Schultz6addd812016-02-02 17:17:23 -07003630TEST_F(VkLayerTest, BindInvalidMemory) {
3631 VkResult err;
3632 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003633
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003634 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003635 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003636
Tobin Ehlisec598302015-09-15 15:02:17 -06003637 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003638
3639 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07003640 VkImage image;
3641 VkDeviceMemory mem;
3642 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003643
Karl Schultz6addd812016-02-02 17:17:23 -07003644 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3645 const int32_t tex_width = 32;
3646 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003647
3648 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003649 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3650 image_create_info.pNext = NULL;
3651 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3652 image_create_info.format = tex_format;
3653 image_create_info.extent.width = tex_width;
3654 image_create_info.extent.height = tex_height;
3655 image_create_info.extent.depth = 1;
3656 image_create_info.mipLevels = 1;
3657 image_create_info.arrayLayers = 1;
3658 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3659 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3660 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3661 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003662
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003663 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003664 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3665 mem_alloc.pNext = NULL;
3666 mem_alloc.allocationSize = 0;
3667 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003668
Chia-I Wuf7458c52015-10-26 21:10:41 +08003669 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003670 ASSERT_VK_SUCCESS(err);
3671
Karl Schultz6addd812016-02-02 17:17:23 -07003672 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003673
3674 mem_alloc.allocationSize = mem_reqs.size;
3675
Karl Schultz6addd812016-02-02 17:17:23 -07003676 pass =
3677 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003678 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003679
3680 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003681 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003682 ASSERT_VK_SUCCESS(err);
3683
3684 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003685 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003686
3687 // Try to bind free memory that has been freed
3688 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3689 // This may very well return an error.
3690 (void)err;
3691
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003692 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003693
Chia-I Wuf7458c52015-10-26 21:10:41 +08003694 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003695}
3696
Karl Schultz6addd812016-02-02 17:17:23 -07003697TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
3698 VkResult err;
3699 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003700
Karl Schultz6addd812016-02-02 17:17:23 -07003701 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3702 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003703
Tobin Ehlisec598302015-09-15 15:02:17 -06003704 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003705
Karl Schultz6addd812016-02-02 17:17:23 -07003706 // Create an image object, allocate memory, destroy the object and then try
3707 // to bind it
3708 VkImage image;
3709 VkDeviceMemory mem;
3710 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003711
Karl Schultz6addd812016-02-02 17:17:23 -07003712 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3713 const int32_t tex_width = 32;
3714 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003715
3716 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003717 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3718 image_create_info.pNext = NULL;
3719 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3720 image_create_info.format = tex_format;
3721 image_create_info.extent.width = tex_width;
3722 image_create_info.extent.height = tex_height;
3723 image_create_info.extent.depth = 1;
3724 image_create_info.mipLevels = 1;
3725 image_create_info.arrayLayers = 1;
3726 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3727 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3728 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3729 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003730
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003731 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003732 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3733 mem_alloc.pNext = NULL;
3734 mem_alloc.allocationSize = 0;
3735 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003736
Chia-I Wuf7458c52015-10-26 21:10:41 +08003737 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003738 ASSERT_VK_SUCCESS(err);
3739
Karl Schultz6addd812016-02-02 17:17:23 -07003740 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003741
3742 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003743 pass =
3744 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003745 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003746
3747 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003748 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003749 ASSERT_VK_SUCCESS(err);
3750
3751 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003752 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003753 ASSERT_VK_SUCCESS(err);
3754
3755 // Now Try to bind memory to this destroyed object
3756 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3757 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07003758 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06003759
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003760 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003761
Chia-I Wuf7458c52015-10-26 21:10:41 +08003762 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003763}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003764
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003765#endif // OBJ_TRACKER_TESTS
3766
Tobin Ehlis0788f522015-05-26 16:11:58 -06003767#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06003768
Chris Forbes48a53902016-06-30 11:46:27 +12003769TEST_F(VkLayerTest, RenderPassInitialLayoutUndefined) {
3770 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass with an attachment's "
3771 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
3772 "the command buffer has prior knowledge of that "
3773 "attachment's layout.");
3774
3775 m_errorMonitor->ExpectSuccess();
3776
3777 ASSERT_NO_FATAL_FAILURE(InitState());
3778
3779 // A renderpass with one color attachment.
3780 VkAttachmentDescription attachment = {
3781 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3782 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3783 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3784 VK_IMAGE_LAYOUT_UNDEFINED,
3785 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3786 };
3787
3788 VkAttachmentReference att_ref = {
3789 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3790 };
3791
3792 VkSubpassDescription subpass = {
3793 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3794 1, &att_ref, nullptr, nullptr, 0, nullptr
3795 };
3796
3797 VkRenderPassCreateInfo rpci = {
3798 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3799 0, 1, &attachment, 1, &subpass, 0, nullptr
3800 };
3801
3802 VkRenderPass rp;
3803 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3804 ASSERT_VK_SUCCESS(err);
3805
3806 // A compatible framebuffer.
3807 VkImageObj image(m_device);
3808 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3809 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3810 VK_IMAGE_TILING_OPTIMAL, 0);
3811 ASSERT_TRUE(image.initialized());
3812
3813 VkImageViewCreateInfo ivci = {
3814 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3815 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3816 {
3817 VK_COMPONENT_SWIZZLE_IDENTITY,
3818 VK_COMPONENT_SWIZZLE_IDENTITY,
3819 VK_COMPONENT_SWIZZLE_IDENTITY,
3820 VK_COMPONENT_SWIZZLE_IDENTITY
3821 },
3822 {
3823 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3824 },
3825 };
3826 VkImageView view;
3827 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3828 ASSERT_VK_SUCCESS(err);
3829
3830 VkFramebufferCreateInfo fci = {
3831 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3832 0, rp, 1, &view,
3833 32, 32, 1
3834 };
3835 VkFramebuffer fb;
3836 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3837 ASSERT_VK_SUCCESS(err);
3838
3839 // Record a single command buffer which uses this renderpass twice. The
3840 // bug is triggered at the beginning of the second renderpass, when the
3841 // command buffer already has a layout recorded for the attachment.
3842 VkRenderPassBeginInfo rpbi = {
3843 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06003844 rp, fb, { { 0, 0 } , { 32, 32 } },
Chris Forbes48a53902016-06-30 11:46:27 +12003845 0, nullptr
3846 };
3847 BeginCommandBuffer();
3848 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3849 VK_SUBPASS_CONTENTS_INLINE);
3850 vkCmdEndRenderPass(m_commandBuffer->handle());
3851 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3852 VK_SUBPASS_CONTENTS_INLINE);
3853
3854 m_errorMonitor->VerifyNotFound();
3855
3856 vkCmdEndRenderPass(m_commandBuffer->handle());
3857 EndCommandBuffer();
3858
3859 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3860 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3861 vkDestroyImageView(m_device->device(), view, nullptr);
3862}
3863
Chris Forbes51bf7c92016-06-30 15:22:08 +12003864TEST_F(VkLayerTest, RenderPassSubpassZeroTransitionsApplied) {
3865 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass applies the layout "
3866 "transitions for the first subpass");
3867
3868 m_errorMonitor->ExpectSuccess();
3869
3870 ASSERT_NO_FATAL_FAILURE(InitState());
3871
3872 // A renderpass with one color attachment.
3873 VkAttachmentDescription attachment = {
3874 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3875 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3876 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3877 VK_IMAGE_LAYOUT_UNDEFINED,
3878 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3879 };
3880
3881 VkAttachmentReference att_ref = {
3882 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3883 };
3884
3885 VkSubpassDescription subpass = {
3886 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3887 1, &att_ref, nullptr, nullptr, 0, nullptr
3888 };
3889
3890 VkSubpassDependency dep = {
Chris Forbescb4c7ad2016-07-06 10:28:18 +12003891 0, 0, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3892 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Chris Forbes51bf7c92016-06-30 15:22:08 +12003893 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3894 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3895 VK_DEPENDENCY_BY_REGION_BIT
3896 };
3897
3898 VkRenderPassCreateInfo rpci = {
3899 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3900 0, 1, &attachment, 1, &subpass, 1, &dep
3901 };
3902
3903 VkResult err;
3904 VkRenderPass rp;
3905 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3906 ASSERT_VK_SUCCESS(err);
3907
3908 // A compatible framebuffer.
3909 VkImageObj image(m_device);
3910 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3911 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3912 VK_IMAGE_TILING_OPTIMAL, 0);
3913 ASSERT_TRUE(image.initialized());
3914
3915 VkImageViewCreateInfo ivci = {
3916 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3917 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3918 {
3919 VK_COMPONENT_SWIZZLE_IDENTITY,
3920 VK_COMPONENT_SWIZZLE_IDENTITY,
3921 VK_COMPONENT_SWIZZLE_IDENTITY,
3922 VK_COMPONENT_SWIZZLE_IDENTITY
3923 },
3924 {
3925 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3926 },
3927 };
3928 VkImageView view;
3929 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3930 ASSERT_VK_SUCCESS(err);
3931
3932 VkFramebufferCreateInfo fci = {
3933 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3934 0, rp, 1, &view,
3935 32, 32, 1
3936 };
3937 VkFramebuffer fb;
3938 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3939 ASSERT_VK_SUCCESS(err);
3940
3941 // Record a single command buffer which issues a pipeline barrier w/
3942 // image memory barrier for the attachment. This detects the previously
3943 // missing tracking of the subpass layout by throwing a validation error
3944 // if it doesn't occur.
3945 VkRenderPassBeginInfo rpbi = {
3946 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06003947 rp, fb, { { 0, 0 }, { 32, 32 } },
Chris Forbes51bf7c92016-06-30 15:22:08 +12003948 0, nullptr
3949 };
3950 BeginCommandBuffer();
3951 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3952 VK_SUBPASS_CONTENTS_INLINE);
3953
3954 VkImageMemoryBarrier imb = {
3955 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, nullptr,
3956 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3957 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3958 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3959 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3960 VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
3961 image.handle(),
3962 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
3963 };
3964 vkCmdPipelineBarrier(m_commandBuffer->handle(),
Chris Forbescb4c7ad2016-07-06 10:28:18 +12003965 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3966 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Chris Forbes51bf7c92016-06-30 15:22:08 +12003967 VK_DEPENDENCY_BY_REGION_BIT,
3968 0, nullptr, 0, nullptr, 1, &imb);
3969
3970 vkCmdEndRenderPass(m_commandBuffer->handle());
3971 m_errorMonitor->VerifyNotFound();
3972 EndCommandBuffer();
3973
3974 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3975 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3976 vkDestroyImageView(m_device->device(), view, nullptr);
3977}
3978
Chris Forbes6b3d3f42016-06-30 16:09:47 +12003979TEST_F(VkLayerTest, RenderPassTransitionsAttachmentUnused) {
3980 TEST_DESCRIPTION("Ensure that layout transitions work correctly without "
3981 "errors, when an attachment reference is "
3982 "VK_ATTACHMENT_UNUSED");
3983
3984 m_errorMonitor->ExpectSuccess();
3985
3986 ASSERT_NO_FATAL_FAILURE(InitState());
3987
3988 // A renderpass with no attachments
3989 VkAttachmentReference att_ref = {
3990 VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3991 };
3992
3993 VkSubpassDescription subpass = {
3994 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3995 1, &att_ref, nullptr, nullptr, 0, nullptr
3996 };
3997
3998 VkRenderPassCreateInfo rpci = {
3999 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4000 0, 0, nullptr, 1, &subpass, 0, nullptr
4001 };
4002
4003 VkRenderPass rp;
4004 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4005 ASSERT_VK_SUCCESS(err);
4006
4007 // A compatible framebuffer.
4008 VkFramebufferCreateInfo fci = {
4009 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
4010 0, rp, 0, nullptr,
4011 32, 32, 1
4012 };
4013 VkFramebuffer fb;
4014 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4015 ASSERT_VK_SUCCESS(err);
4016
4017 // Record a command buffer which just begins and ends the renderpass. The
4018 // bug manifests in BeginRenderPass.
4019 VkRenderPassBeginInfo rpbi = {
4020 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06004021 rp, fb, { { 0, 0 }, { 32, 32 } },
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004022 0, nullptr
4023 };
4024 BeginCommandBuffer();
4025 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
4026 VK_SUBPASS_CONTENTS_INLINE);
4027 vkCmdEndRenderPass(m_commandBuffer->handle());
4028 m_errorMonitor->VerifyNotFound();
4029 EndCommandBuffer();
4030
4031 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4032 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4033}
4034
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004035// This is a positive test. No errors are expected.
4036TEST_F(VkLayerTest, StencilLoadOp) {
4037 TEST_DESCRIPTION("Create a stencil-only attachment with a LOAD_OP set to "
4038 "CLEAR. stencil[Load|Store]Op used to be ignored.");
4039 VkResult result = VK_SUCCESS;
4040 VkImageFormatProperties formatProps;
4041 vkGetPhysicalDeviceImageFormatProperties(
4042 gpu(), VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_TYPE_2D,
4043 VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4044 VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
4045 0, &formatProps);
4046 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
4047 return;
4048 }
4049
4050 ASSERT_NO_FATAL_FAILURE(InitState());
4051 VkFormat depth_stencil_fmt = VK_FORMAT_D24_UNORM_S8_UINT;
4052 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
4053 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4054 VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
4055 VkAttachmentDescription att = {};
4056 VkAttachmentReference ref = {};
4057 att.format = depth_stencil_fmt;
4058 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
4059 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
4060 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
4061 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
4062 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4063 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4064
4065 VkClearValue clear;
4066 clear.depthStencil.depth = 1.0;
4067 clear.depthStencil.stencil = 0;
4068 ref.attachment = 0;
4069 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4070
4071 VkSubpassDescription subpass = {};
4072 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
4073 subpass.flags = 0;
4074 subpass.inputAttachmentCount = 0;
4075 subpass.pInputAttachments = NULL;
4076 subpass.colorAttachmentCount = 0;
4077 subpass.pColorAttachments = NULL;
4078 subpass.pResolveAttachments = NULL;
4079 subpass.pDepthStencilAttachment = &ref;
4080 subpass.preserveAttachmentCount = 0;
4081 subpass.pPreserveAttachments = NULL;
4082
4083 VkRenderPass rp;
4084 VkRenderPassCreateInfo rp_info = {};
4085 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4086 rp_info.attachmentCount = 1;
4087 rp_info.pAttachments = &att;
4088 rp_info.subpassCount = 1;
4089 rp_info.pSubpasses = &subpass;
4090 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
4091 ASSERT_VK_SUCCESS(result);
4092
4093 VkImageView *depthView = m_depthStencil->BindInfo();
4094 VkFramebufferCreateInfo fb_info = {};
4095 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4096 fb_info.pNext = NULL;
4097 fb_info.renderPass = rp;
4098 fb_info.attachmentCount = 1;
4099 fb_info.pAttachments = depthView;
4100 fb_info.width = 100;
4101 fb_info.height = 100;
4102 fb_info.layers = 1;
4103 VkFramebuffer fb;
4104 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4105 ASSERT_VK_SUCCESS(result);
4106
4107
4108 VkRenderPassBeginInfo rpbinfo = {};
4109 rpbinfo.clearValueCount = 1;
4110 rpbinfo.pClearValues = &clear;
4111 rpbinfo.pNext = NULL;
4112 rpbinfo.renderPass = rp;
4113 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4114 rpbinfo.renderArea.extent.width = 100;
4115 rpbinfo.renderArea.extent.height = 100;
4116 rpbinfo.renderArea.offset.x = 0;
4117 rpbinfo.renderArea.offset.y = 0;
4118 rpbinfo.framebuffer = fb;
4119
4120 VkFence fence = {};
4121 VkFenceCreateInfo fence_ci = {};
4122 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4123 fence_ci.pNext = nullptr;
4124 fence_ci.flags = 0;
4125 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
4126 ASSERT_VK_SUCCESS(result);
4127
4128
4129 m_commandBuffer->BeginCommandBuffer();
4130 m_commandBuffer->BeginRenderPass(rpbinfo);
4131 m_commandBuffer->EndRenderPass();
4132 m_commandBuffer->EndCommandBuffer();
4133 m_commandBuffer->QueueCommandBuffer(fence);
4134
4135 VkImageObj destImage(m_device);
4136 destImage.init(100, 100, depth_stencil_fmt,
4137 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4138 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4139 VK_IMAGE_TILING_OPTIMAL, 0);
4140 VkImageMemoryBarrier barrier = {};
4141 VkImageSubresourceRange range;
4142 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
4143 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
4144 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4145 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT |
4146 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
4147 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4148 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
4149 barrier.image = m_depthStencil->handle();
4150 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4151 range.baseMipLevel = 0;
4152 range.levelCount = 1;
4153 range.baseArrayLayer = 0;
4154 range.layerCount = 1;
4155 barrier.subresourceRange = range;
4156 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
4157 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
4158 cmdbuf.BeginCommandBuffer();
4159 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4160 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
4161 nullptr, 1, &barrier);
4162 barrier.srcAccessMask = 0;
4163 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4164 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
4165 barrier.image = destImage.handle();
4166 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
4167 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4168 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4169 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
4170 nullptr, 1, &barrier);
4171 VkImageCopy cregion;
4172 cregion.srcSubresource.aspectMask =
4173 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4174 cregion.srcSubresource.mipLevel = 0;
4175 cregion.srcSubresource.baseArrayLayer = 0;
4176 cregion.srcSubresource.layerCount = 1;
4177 cregion.srcOffset.x = 0;
4178 cregion.srcOffset.y = 0;
4179 cregion.srcOffset.z = 0;
4180 cregion.dstSubresource.aspectMask =
4181 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4182 cregion.dstSubresource.mipLevel = 0;
4183 cregion.dstSubresource.baseArrayLayer = 0;
4184 cregion.dstSubresource.layerCount = 1;
4185 cregion.dstOffset.x = 0;
4186 cregion.dstOffset.y = 0;
4187 cregion.dstOffset.z = 0;
4188 cregion.extent.width = 100;
4189 cregion.extent.height = 100;
4190 cregion.extent.depth = 1;
4191 cmdbuf.CopyImage(m_depthStencil->handle(),
4192 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
4193 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
4194 cmdbuf.EndCommandBuffer();
4195
4196 VkSubmitInfo submit_info;
4197 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4198 submit_info.pNext = NULL;
4199 submit_info.waitSemaphoreCount = 0;
4200 submit_info.pWaitSemaphores = NULL;
4201 submit_info.pWaitDstStageMask = NULL;
4202 submit_info.commandBufferCount = 1;
4203 submit_info.pCommandBuffers = &cmdbuf.handle();
4204 submit_info.signalSemaphoreCount = 0;
4205 submit_info.pSignalSemaphores = NULL;
4206
4207 m_errorMonitor->ExpectSuccess();
4208 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4209 m_errorMonitor->VerifyNotFound();
4210
Mark Lobodzinskid0440da2016-06-17 15:10:03 -06004211 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004212 vkDestroyFence(m_device->device(), fence, nullptr);
4213 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4214 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4215}
4216
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004217TEST_F(VkLayerTest, UnusedPreserveAttachment) {
4218 TEST_DESCRIPTION("Create a framebuffer where a subpass has a preserve "
4219 "attachment reference of VK_ATTACHMENT_UNUSED");
4220
4221 ASSERT_NO_FATAL_FAILURE(InitState());
4222 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4223
4224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4225 "must not be VK_ATTACHMENT_UNUSED");
4226
4227 VkAttachmentReference color_attach = {};
4228 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4229 color_attach.attachment = 0;
4230 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
4231 VkSubpassDescription subpass = {};
4232 subpass.colorAttachmentCount = 1;
4233 subpass.pColorAttachments = &color_attach;
4234 subpass.preserveAttachmentCount = 1;
4235 subpass.pPreserveAttachments = &preserve_attachment;
4236
4237 VkRenderPassCreateInfo rpci = {};
4238 rpci.subpassCount = 1;
4239 rpci.pSubpasses = &subpass;
4240 rpci.attachmentCount = 1;
4241 VkAttachmentDescription attach_desc = {};
4242 attach_desc.format = VK_FORMAT_UNDEFINED;
4243 rpci.pAttachments = &attach_desc;
4244 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4245 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004246 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004247
4248 m_errorMonitor->VerifyFound();
4249
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004250 if (result == VK_SUCCESS) {
4251 vkDestroyRenderPass(m_device->device(), rp, NULL);
4252 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004253}
4254
Chris Forbesc5389742016-06-29 11:49:23 +12004255TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004256 TEST_DESCRIPTION("Ensure that CreateRenderPass produces a validation error "
4257 "when the source of a subpass multisample resolve "
4258 "does not have multiple samples.");
4259
Chris Forbesc5389742016-06-29 11:49:23 +12004260 ASSERT_NO_FATAL_FAILURE(InitState());
4261
4262 m_errorMonitor->SetDesiredFailureMsg(
4263 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbes6655bb32016-07-01 18:27:30 +12004264 "Subpass 0 requests multisample resolve from attachment 0 which has "
4265 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12004266
4267 VkAttachmentDescription attachments[] = {
4268 {
4269 0, VK_FORMAT_R8G8B8A8_UNORM,
4270 VK_SAMPLE_COUNT_1_BIT,
4271 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4272 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4273 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4274 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4275 },
4276 {
4277 0, VK_FORMAT_R8G8B8A8_UNORM,
4278 VK_SAMPLE_COUNT_1_BIT,
4279 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4280 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4281 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4282 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4283 },
4284 };
4285
4286 VkAttachmentReference color = {
4287 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4288 };
4289
4290 VkAttachmentReference resolve = {
4291 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4292 };
4293
4294 VkSubpassDescription subpass = {
4295 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4296 0, nullptr,
4297 1, &color,
4298 &resolve,
4299 nullptr,
4300 0, nullptr
4301 };
4302
4303 VkRenderPassCreateInfo rpci = {
4304 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4305 0, 2, attachments, 1, &subpass, 0, nullptr
4306 };
4307
4308 VkRenderPass rp;
4309 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4310
4311 m_errorMonitor->VerifyFound();
4312
4313 if (err == VK_SUCCESS)
4314 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4315}
4316
4317TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004318 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4319 "when a subpass multisample resolve operation is "
4320 "requested, and the destination of that resolve has "
4321 "multiple samples.");
4322
Chris Forbesc5389742016-06-29 11:49:23 +12004323 ASSERT_NO_FATAL_FAILURE(InitState());
4324
4325 m_errorMonitor->SetDesiredFailureMsg(
4326 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4327 "Subpass 0 requests multisample resolve into attachment 1, which "
4328 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
4329
4330 VkAttachmentDescription attachments[] = {
4331 {
4332 0, VK_FORMAT_R8G8B8A8_UNORM,
4333 VK_SAMPLE_COUNT_4_BIT,
4334 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4335 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4336 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4337 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4338 },
4339 {
4340 0, VK_FORMAT_R8G8B8A8_UNORM,
4341 VK_SAMPLE_COUNT_4_BIT,
4342 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4343 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4344 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4345 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4346 },
4347 };
4348
4349 VkAttachmentReference color = {
4350 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4351 };
4352
4353 VkAttachmentReference resolve = {
4354 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4355 };
4356
4357 VkSubpassDescription subpass = {
4358 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4359 0, nullptr,
4360 1, &color,
4361 &resolve,
4362 nullptr,
4363 0, nullptr
4364 };
4365
4366 VkRenderPassCreateInfo rpci = {
4367 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4368 0, 2, attachments, 1, &subpass, 0, nullptr
4369 };
4370
4371 VkRenderPass rp;
4372 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4373
4374 m_errorMonitor->VerifyFound();
4375
4376 if (err == VK_SUCCESS)
4377 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4378}
4379
Chris Forbes3f128ef2016-06-29 14:58:53 +12004380TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004381 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4382 "when the color and depth attachments used by a subpass "
4383 "have inconsistent sample counts");
4384
Chris Forbes3f128ef2016-06-29 14:58:53 +12004385 ASSERT_NO_FATAL_FAILURE(InitState());
4386
4387 m_errorMonitor->SetDesiredFailureMsg(
4388 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4389 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
4390
4391 VkAttachmentDescription attachments[] = {
4392 {
4393 0, VK_FORMAT_R8G8B8A8_UNORM,
4394 VK_SAMPLE_COUNT_1_BIT,
4395 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4396 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4397 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4398 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4399 },
4400 {
4401 0, VK_FORMAT_R8G8B8A8_UNORM,
4402 VK_SAMPLE_COUNT_4_BIT,
4403 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4404 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4405 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4406 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4407 },
4408 };
4409
4410 VkAttachmentReference color[] = {
4411 {
4412 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4413 },
4414 {
4415 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4416 },
4417 };
4418
4419 VkSubpassDescription subpass = {
4420 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4421 0, nullptr,
4422 2, color,
4423 nullptr,
4424 nullptr,
4425 0, nullptr
4426 };
4427
4428 VkRenderPassCreateInfo rpci = {
4429 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4430 0, 2, attachments, 1, &subpass, 0, nullptr
4431 };
4432
4433 VkRenderPass rp;
4434 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4435
4436 m_errorMonitor->VerifyFound();
4437
4438 if (err == VK_SUCCESS)
4439 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4440}
4441
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004442TEST_F(VkLayerTest, FramebufferCreateErrors) {
4443 TEST_DESCRIPTION("Hit errors when attempting to create a framebuffer :\n"
4444 " 1. Mismatch between fb & renderPass attachmentCount\n"
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004445 " 2. Use a color image as depthStencil attachment\n"
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004446 " 3. Mismatch fb & renderPass attachment formats\n"
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004447 " 4. Mismatch fb & renderPass attachment #samples\n"
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004448 " 5. FB attachment w/ non-1 mip-levels\n"
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004449 " 6. FB attachment where dimensions don't match\n"
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004450 " 7. FB attachment w/o identity swizzle\n"
4451 " 8. FB dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004452
4453 ASSERT_NO_FATAL_FAILURE(InitState());
4454 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4455
4456 m_errorMonitor->SetDesiredFailureMsg(
4457 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004458 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 "
4459 "does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004460
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004461 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004462 VkAttachmentReference attach = {};
4463 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4464 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004465 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004466 VkRenderPassCreateInfo rpci = {};
4467 rpci.subpassCount = 1;
4468 rpci.pSubpasses = &subpass;
4469 rpci.attachmentCount = 1;
4470 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004471 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004472 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004473 rpci.pAttachments = &attach_desc;
4474 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4475 VkRenderPass rp;
4476 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4477 ASSERT_VK_SUCCESS(err);
4478
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004479 VkImageView ivs[2];
4480 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
4481 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004482 VkFramebufferCreateInfo fb_info = {};
4483 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4484 fb_info.pNext = NULL;
4485 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004486 // Set mis-matching attachmentCount
4487 fb_info.attachmentCount = 2;
4488 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004489 fb_info.width = 100;
4490 fb_info.height = 100;
4491 fb_info.layers = 1;
4492
4493 VkFramebuffer fb;
4494 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4495
4496 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004497 if (err == VK_SUCCESS) {
4498 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4499 }
4500 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004501
4502 // Create a renderPass with a depth-stencil attachment created with
4503 // IMAGE_USAGE_COLOR_ATTACHMENT
4504 // Add our color attachment to pDepthStencilAttachment
4505 subpass.pDepthStencilAttachment = &attach;
4506 subpass.pColorAttachments = NULL;
4507 VkRenderPass rp_ds;
4508 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
4509 ASSERT_VK_SUCCESS(err);
4510 // Set correct attachment count, but attachment has COLOR usage bit set
4511 fb_info.attachmentCount = 1;
4512 fb_info.renderPass = rp_ds;
4513
4514 m_errorMonitor->SetDesiredFailureMsg(
4515 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4516 " conflicts with the image's IMAGE_USAGE flags ");
4517 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4518
4519 m_errorMonitor->VerifyFound();
4520 if (err == VK_SUCCESS) {
4521 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4522 }
4523 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004524
4525 // Create new renderpass with alternate attachment format from fb
4526 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
4527 subpass.pDepthStencilAttachment = NULL;
4528 subpass.pColorAttachments = &attach;
4529 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4530 ASSERT_VK_SUCCESS(err);
4531
4532 // Cause error due to mis-matched formats between rp & fb
4533 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
4534 fb_info.renderPass = rp;
4535 m_errorMonitor->SetDesiredFailureMsg(
4536 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4537 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
4538 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4539
4540 m_errorMonitor->VerifyFound();
4541 if (err == VK_SUCCESS) {
4542 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4543 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004544 vkDestroyRenderPass(m_device->device(), rp, NULL);
4545
4546 // Create new renderpass with alternate sample count from fb
4547 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
4548 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
4549 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4550 ASSERT_VK_SUCCESS(err);
4551
4552 // Cause error due to mis-matched sample count between rp & fb
4553 fb_info.renderPass = rp;
4554 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4555 " has VK_SAMPLE_COUNT_1_BIT samples "
4556 "that do not match the "
4557 "VK_SAMPLE_COUNT_4_BIT ");
4558 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4559
4560 m_errorMonitor->VerifyFound();
4561 if (err == VK_SUCCESS) {
4562 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4563 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004564
4565 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004566
4567 // Create a custom imageView with non-1 mip levels
4568 VkImageObj image(m_device);
4569 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
4570 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4571 ASSERT_TRUE(image.initialized());
4572
4573 VkImageView view;
4574 VkImageViewCreateInfo ivci = {};
4575 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4576 ivci.image = image.handle();
4577 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4578 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4579 ivci.subresourceRange.layerCount = 1;
4580 ivci.subresourceRange.baseMipLevel = 0;
4581 // Set level count 2 (only 1 is allowed for FB attachment)
4582 ivci.subresourceRange.levelCount = 2;
4583 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4584 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4585 ASSERT_VK_SUCCESS(err);
4586 // Re-create renderpass to have matching sample count
4587 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4588 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4589 ASSERT_VK_SUCCESS(err);
4590
4591 fb_info.renderPass = rp;
4592 fb_info.pAttachments = &view;
4593 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4594 " has mip levelCount of 2 but only ");
4595 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4596
4597 m_errorMonitor->VerifyFound();
4598 if (err == VK_SUCCESS) {
4599 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4600 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004601 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004602 // Update view to original color buffer and grow FB dimensions too big
4603 fb_info.pAttachments = ivs;
4604 fb_info.height = 1024;
4605 fb_info.width = 1024;
4606 fb_info.layers = 2;
4607 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4608 " Attachment dimensions must be at "
4609 "least as large. ");
4610 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4611
4612 m_errorMonitor->VerifyFound();
4613 if (err == VK_SUCCESS) {
4614 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4615 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004616 // Create view attachment with non-identity swizzle
4617 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4618 ivci.image = image.handle();
4619 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4620 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4621 ivci.subresourceRange.layerCount = 1;
4622 ivci.subresourceRange.baseMipLevel = 0;
4623 ivci.subresourceRange.levelCount = 1;
4624 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4625 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4626 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4627 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4628 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4629 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4630 ASSERT_VK_SUCCESS(err);
4631
4632 fb_info.pAttachments = &view;
4633 fb_info.height = 100;
4634 fb_info.width = 100;
4635 fb_info.layers = 1;
4636 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4637 " has non-identy swizzle. All "
4638 "framebuffer attachments must have "
4639 "been created with the identity "
4640 "swizzle. ");
4641 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4642
4643 m_errorMonitor->VerifyFound();
4644 if (err == VK_SUCCESS) {
4645 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4646 }
4647 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004648 // Request fb that exceeds max dimensions
4649 // reset attachment to color attachment
4650 fb_info.pAttachments = ivs;
4651 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
4652 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
4653 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
4654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4655 " Requested VkFramebufferCreateInfo "
4656 "dimensions exceed physical device "
4657 "limits. ");
4658 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4659
4660 m_errorMonitor->VerifyFound();
4661 if (err == VK_SUCCESS) {
4662 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4663 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004664
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004665 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004666}
4667
Mark Lobodzinskic808d442016-04-14 10:57:23 -06004668// This is a positive test. No errors should be generated.
Michael Lentine860b0fe2016-05-20 10:14:00 -05004669TEST_F(VkLayerTest, WaitEventThenSet) {
4670 TEST_DESCRIPTION(
4671 "Wait on a event then set it after the wait has been submitted.");
4672
Michael Lentine860b0fe2016-05-20 10:14:00 -05004673 m_errorMonitor->ExpectSuccess();
4674
4675 VkEvent event;
4676 VkEventCreateInfo event_create_info{};
4677 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4678 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
4679
4680 VkCommandPool command_pool;
4681 VkCommandPoolCreateInfo pool_create_info{};
4682 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4683 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4684 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4685 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4686 &command_pool);
4687
4688 VkCommandBuffer command_buffer;
4689 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4690 command_buffer_allocate_info.sType =
4691 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4692 command_buffer_allocate_info.commandPool = command_pool;
4693 command_buffer_allocate_info.commandBufferCount = 1;
4694 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4695 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4696 &command_buffer);
4697
4698 VkQueue queue = VK_NULL_HANDLE;
4699 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06004700 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05004701
4702 {
4703 VkCommandBufferBeginInfo begin_info{};
4704 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4705 vkBeginCommandBuffer(command_buffer, &begin_info);
4706
4707 vkCmdWaitEvents(command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT,
4708 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
4709 nullptr, 0, nullptr);
4710 vkCmdResetEvent(command_buffer, event,
4711 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
4712 vkEndCommandBuffer(command_buffer);
4713 }
4714 {
4715 VkSubmitInfo submit_info{};
4716 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4717 submit_info.commandBufferCount = 1;
4718 submit_info.pCommandBuffers = &command_buffer;
4719 submit_info.signalSemaphoreCount = 0;
4720 submit_info.pSignalSemaphores = nullptr;
4721 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4722 }
4723 { vkSetEvent(m_device->device(), event); }
4724
4725 vkQueueWaitIdle(queue);
4726
4727 vkDestroyEvent(m_device->device(), event, nullptr);
4728 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
4729 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
4730
4731 m_errorMonitor->VerifyNotFound();
4732}
Michael Lentine5627e692016-05-20 17:45:02 -05004733// This is a positive test. No errors should be generated.
4734TEST_F(VkLayerTest, QueryAndCopyMultipleCommandBuffers) {
4735 TEST_DESCRIPTION(
4736 "Issue a query and copy from it on a second command buffer.");
4737
4738 if ((m_device->queue_props.empty()) ||
4739 (m_device->queue_props[0].queueCount < 2))
4740 return;
4741
4742 m_errorMonitor->ExpectSuccess();
4743
4744 VkQueryPool query_pool;
4745 VkQueryPoolCreateInfo query_pool_create_info{};
4746 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
4747 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
4748 query_pool_create_info.queryCount = 1;
4749 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr,
4750 &query_pool);
4751
4752 VkCommandPool command_pool;
4753 VkCommandPoolCreateInfo pool_create_info{};
4754 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4755 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4756 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4757 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4758 &command_pool);
4759
4760 VkCommandBuffer command_buffer[2];
4761 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4762 command_buffer_allocate_info.sType =
4763 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4764 command_buffer_allocate_info.commandPool = command_pool;
4765 command_buffer_allocate_info.commandBufferCount = 2;
4766 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4767 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4768 command_buffer);
4769
4770 VkQueue queue = VK_NULL_HANDLE;
4771 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
4772 1, &queue);
4773
4774 uint32_t qfi = 0;
4775 VkBufferCreateInfo buff_create_info = {};
4776 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4777 buff_create_info.size = 1024;
4778 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
4779 buff_create_info.queueFamilyIndexCount = 1;
4780 buff_create_info.pQueueFamilyIndices = &qfi;
4781
4782 VkResult err;
4783 VkBuffer buffer;
4784 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
4785 ASSERT_VK_SUCCESS(err);
4786 VkMemoryAllocateInfo mem_alloc = {};
4787 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4788 mem_alloc.pNext = NULL;
4789 mem_alloc.allocationSize = 1024;
4790 mem_alloc.memoryTypeIndex = 0;
4791
4792 VkMemoryRequirements memReqs;
4793 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
4794 bool pass =
4795 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
4796 if (!pass) {
4797 vkDestroyBuffer(m_device->device(), buffer, NULL);
4798 return;
4799 }
4800
4801 VkDeviceMemory mem;
4802 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
4803 ASSERT_VK_SUCCESS(err);
4804 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4805 ASSERT_VK_SUCCESS(err);
4806
4807 {
4808 VkCommandBufferBeginInfo begin_info{};
4809 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4810 vkBeginCommandBuffer(command_buffer[0], &begin_info);
4811
4812 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
4813 vkCmdWriteTimestamp(command_buffer[0],
4814 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
4815
4816 vkEndCommandBuffer(command_buffer[0]);
4817
4818 vkBeginCommandBuffer(command_buffer[1], &begin_info);
4819
4820 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer,
4821 0, 0, 0);
4822
4823 vkEndCommandBuffer(command_buffer[1]);
4824 }
4825 {
4826 VkSubmitInfo submit_info{};
4827 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4828 submit_info.commandBufferCount = 2;
4829 submit_info.pCommandBuffers = command_buffer;
4830 submit_info.signalSemaphoreCount = 0;
4831 submit_info.pSignalSemaphores = nullptr;
4832 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4833 }
4834
4835 vkQueueWaitIdle(queue);
4836
4837 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
4838 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
4839 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06004840 vkDestroyBuffer(m_device->device(), buffer, NULL);
4841 vkFreeMemory(m_device->device(), mem, NULL);
Michael Lentine5627e692016-05-20 17:45:02 -05004842
4843 m_errorMonitor->VerifyNotFound();
4844}
Michael Lentine860b0fe2016-05-20 10:14:00 -05004845
4846TEST_F(VkLayerTest, ResetEventThenSet) {
4847 TEST_DESCRIPTION(
4848 "Reset an event then set it after the reset has been submitted.");
4849
Michael Lentine860b0fe2016-05-20 10:14:00 -05004850 m_errorMonitor->ExpectSuccess();
4851
4852 VkEvent event;
4853 VkEventCreateInfo event_create_info{};
4854 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4855 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
4856
4857 VkCommandPool command_pool;
4858 VkCommandPoolCreateInfo pool_create_info{};
4859 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4860 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4861 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4862 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4863 &command_pool);
4864
4865 VkCommandBuffer command_buffer;
4866 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4867 command_buffer_allocate_info.sType =
4868 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4869 command_buffer_allocate_info.commandPool = command_pool;
4870 command_buffer_allocate_info.commandBufferCount = 1;
4871 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4872 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4873 &command_buffer);
4874
4875 VkQueue queue = VK_NULL_HANDLE;
4876 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06004877 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05004878
4879 {
4880 VkCommandBufferBeginInfo begin_info{};
4881 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4882 vkBeginCommandBuffer(command_buffer, &begin_info);
4883
4884 vkCmdResetEvent(command_buffer, event,
4885 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
4886 vkCmdWaitEvents(command_buffer, 1, &event,
4887 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4888 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
4889 nullptr, 0, nullptr);
4890 vkEndCommandBuffer(command_buffer);
4891 }
4892 {
4893 VkSubmitInfo submit_info{};
4894 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4895 submit_info.commandBufferCount = 1;
4896 submit_info.pCommandBuffers = &command_buffer;
4897 submit_info.signalSemaphoreCount = 0;
4898 submit_info.pSignalSemaphores = nullptr;
4899 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4900 }
4901 {
4902 m_errorMonitor->SetDesiredFailureMsg(
4903 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkSetEvent() on event "
4904 "0x1 that is already in use by a "
4905 "command buffer.");
4906 vkSetEvent(m_device->device(), event);
4907 m_errorMonitor->VerifyFound();
4908 }
4909
4910 vkQueueWaitIdle(queue);
4911
4912 vkDestroyEvent(m_device->device(), event, nullptr);
4913 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
4914 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
4915}
4916
4917// This is a positive test. No errors should be generated.
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004918TEST_F(VkLayerTest, TwoFencesThreeFrames) {
4919 TEST_DESCRIPTION("Two command buffers with two separate fences are each "
4920 "run through a Submit & WaitForFences cycle 3 times. This "
4921 "previously revealed a bug so running this positive test "
4922 "to prevent a regression.");
4923 m_errorMonitor->ExpectSuccess();
4924
4925 ASSERT_NO_FATAL_FAILURE(InitState());
4926 VkQueue queue = VK_NULL_HANDLE;
4927 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
4928 0, &queue);
4929
4930 static const uint32_t NUM_OBJECTS = 2;
4931 static const uint32_t NUM_FRAMES = 3;
4932 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
4933 VkFence fences[NUM_OBJECTS] = {};
4934
4935 VkCommandPool cmd_pool;
4936 VkCommandPoolCreateInfo cmd_pool_ci = {};
4937 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4938 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
4939 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4940 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci,
4941 nullptr, &cmd_pool);
4942 ASSERT_VK_SUCCESS(err);
4943
4944 VkCommandBufferAllocateInfo cmd_buf_info = {};
4945 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4946 cmd_buf_info.commandPool = cmd_pool;
4947 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4948 cmd_buf_info.commandBufferCount = 1;
4949
4950 VkFenceCreateInfo fence_ci = {};
4951 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4952 fence_ci.pNext = nullptr;
4953 fence_ci.flags = 0;
4954
4955 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
4956 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info,
4957 &cmd_buffers[i]);
4958 ASSERT_VK_SUCCESS(err);
4959 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
4960 ASSERT_VK_SUCCESS(err);
4961 }
4962
4963 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
Tobin Ehlisf9025162016-05-26 06:55:21 -06004964 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
4965 // Create empty cmd buffer
4966 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
4967 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004968
Tobin Ehlisf9025162016-05-26 06:55:21 -06004969 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
4970 ASSERT_VK_SUCCESS(err);
4971 err = vkEndCommandBuffer(cmd_buffers[obj]);
4972 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004973
Tobin Ehlisf9025162016-05-26 06:55:21 -06004974 VkSubmitInfo submit_info = {};
4975 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4976 submit_info.commandBufferCount = 1;
4977 submit_info.pCommandBuffers = &cmd_buffers[obj];
4978 // Submit cmd buffer and wait for fence
4979 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
4980 ASSERT_VK_SUCCESS(err);
4981 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE,
4982 UINT64_MAX);
4983 ASSERT_VK_SUCCESS(err);
4984 err = vkResetFences(m_device->device(), 1, &fences[obj]);
4985 ASSERT_VK_SUCCESS(err);
4986 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004987 }
4988 m_errorMonitor->VerifyNotFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06004989 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
4990 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
4991 vkDestroyFence(m_device->device(), fences[i], nullptr);
4992 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004993}
4994// This is a positive test. No errors should be generated.
Mark Lobodzinskic808d442016-04-14 10:57:23 -06004995TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
4996
4997 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
4998 "submitted on separate queues followed by a QueueWaitIdle.");
4999
Dustin Graves48458142016-04-29 16:11:55 -06005000 if ((m_device->queue_props.empty()) ||
5001 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005002 return;
5003
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005004 m_errorMonitor->ExpectSuccess();
5005
5006 VkSemaphore semaphore;
5007 VkSemaphoreCreateInfo semaphore_create_info{};
5008 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5009 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5010 &semaphore);
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;
5017 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5018 &command_pool);
5019
5020 VkCommandBuffer command_buffer[2];
5021 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5022 command_buffer_allocate_info.sType =
5023 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5024 command_buffer_allocate_info.commandPool = command_pool;
5025 command_buffer_allocate_info.commandBufferCount = 2;
5026 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5027 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5028 command_buffer);
5029
5030 VkQueue queue = VK_NULL_HANDLE;
5031 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5032 1, &queue);
5033
5034 {
5035 VkCommandBufferBeginInfo begin_info{};
5036 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5037 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5038
5039 vkCmdPipelineBarrier(command_buffer[0],
5040 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5041 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5042 0, nullptr, 0, nullptr);
5043
5044 VkViewport viewport{};
5045 viewport.maxDepth = 1.0f;
5046 viewport.minDepth = 0.0f;
5047 viewport.width = 512;
5048 viewport.height = 512;
5049 viewport.x = 0;
5050 viewport.y = 0;
5051 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5052 vkEndCommandBuffer(command_buffer[0]);
5053 }
5054 {
5055 VkCommandBufferBeginInfo begin_info{};
5056 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5057 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5058
5059 VkViewport viewport{};
5060 viewport.maxDepth = 1.0f;
5061 viewport.minDepth = 0.0f;
5062 viewport.width = 512;
5063 viewport.height = 512;
5064 viewport.x = 0;
5065 viewport.y = 0;
5066 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5067 vkEndCommandBuffer(command_buffer[1]);
5068 }
5069 {
5070 VkSubmitInfo submit_info{};
5071 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5072 submit_info.commandBufferCount = 1;
5073 submit_info.pCommandBuffers = &command_buffer[0];
5074 submit_info.signalSemaphoreCount = 1;
5075 submit_info.pSignalSemaphores = &semaphore;
5076 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5077 }
5078 {
5079 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5080 VkSubmitInfo submit_info{};
5081 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5082 submit_info.commandBufferCount = 1;
5083 submit_info.pCommandBuffers = &command_buffer[1];
5084 submit_info.waitSemaphoreCount = 1;
5085 submit_info.pWaitSemaphores = &semaphore;
5086 submit_info.pWaitDstStageMask = flags;
5087 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5088 }
5089
5090 vkQueueWaitIdle(m_device->m_queue);
5091
5092 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5093 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5094 &command_buffer[0]);
5095 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5096
5097 m_errorMonitor->VerifyNotFound();
5098}
5099
5100// This is a positive test. No errors should be generated.
5101TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
5102
5103 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5104 "submitted on separate queues, the second having a fence"
5105 "followed by a QueueWaitIdle.");
5106
Dustin Graves48458142016-04-29 16:11:55 -06005107 if ((m_device->queue_props.empty()) ||
5108 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005109 return;
5110
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005111 m_errorMonitor->ExpectSuccess();
5112
5113 VkFence fence;
5114 VkFenceCreateInfo fence_create_info{};
5115 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5116 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5117
5118 VkSemaphore semaphore;
5119 VkSemaphoreCreateInfo semaphore_create_info{};
5120 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5121 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5122 &semaphore);
5123
5124 VkCommandPool command_pool;
5125 VkCommandPoolCreateInfo pool_create_info{};
5126 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5127 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5128 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5129 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5130 &command_pool);
5131
5132 VkCommandBuffer command_buffer[2];
5133 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5134 command_buffer_allocate_info.sType =
5135 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5136 command_buffer_allocate_info.commandPool = command_pool;
5137 command_buffer_allocate_info.commandBufferCount = 2;
5138 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5139 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5140 command_buffer);
5141
5142 VkQueue queue = VK_NULL_HANDLE;
5143 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5144 1, &queue);
5145
5146 {
5147 VkCommandBufferBeginInfo begin_info{};
5148 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5149 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5150
5151 vkCmdPipelineBarrier(command_buffer[0],
5152 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5153 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5154 0, nullptr, 0, nullptr);
5155
5156 VkViewport viewport{};
5157 viewport.maxDepth = 1.0f;
5158 viewport.minDepth = 0.0f;
5159 viewport.width = 512;
5160 viewport.height = 512;
5161 viewport.x = 0;
5162 viewport.y = 0;
5163 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5164 vkEndCommandBuffer(command_buffer[0]);
5165 }
5166 {
5167 VkCommandBufferBeginInfo begin_info{};
5168 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5169 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5170
5171 VkViewport viewport{};
5172 viewport.maxDepth = 1.0f;
5173 viewport.minDepth = 0.0f;
5174 viewport.width = 512;
5175 viewport.height = 512;
5176 viewport.x = 0;
5177 viewport.y = 0;
5178 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5179 vkEndCommandBuffer(command_buffer[1]);
5180 }
5181 {
5182 VkSubmitInfo submit_info{};
5183 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5184 submit_info.commandBufferCount = 1;
5185 submit_info.pCommandBuffers = &command_buffer[0];
5186 submit_info.signalSemaphoreCount = 1;
5187 submit_info.pSignalSemaphores = &semaphore;
5188 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5189 }
5190 {
5191 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5192 VkSubmitInfo submit_info{};
5193 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5194 submit_info.commandBufferCount = 1;
5195 submit_info.pCommandBuffers = &command_buffer[1];
5196 submit_info.waitSemaphoreCount = 1;
5197 submit_info.pWaitSemaphores = &semaphore;
5198 submit_info.pWaitDstStageMask = flags;
5199 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5200 }
5201
5202 vkQueueWaitIdle(m_device->m_queue);
5203
5204 vkDestroyFence(m_device->device(), fence, nullptr);
5205 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5206 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5207 &command_buffer[0]);
5208 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5209
5210 m_errorMonitor->VerifyNotFound();
5211}
5212
5213// This is a positive test. No errors should be generated.
5214TEST_F(VkLayerTest,
5215 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
5216
5217 TEST_DESCRIPTION(
5218 "Two command buffers, each in a separate QueueSubmit call "
5219 "submitted on separate queues, the second having a fence"
5220 "followed by two consecutive WaitForFences calls on the same fence.");
5221
Dustin Graves48458142016-04-29 16:11:55 -06005222 if ((m_device->queue_props.empty()) ||
5223 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005224 return;
5225
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005226 m_errorMonitor->ExpectSuccess();
5227
5228 VkFence fence;
5229 VkFenceCreateInfo fence_create_info{};
5230 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5231 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5232
5233 VkSemaphore semaphore;
5234 VkSemaphoreCreateInfo semaphore_create_info{};
5235 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5236 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5237 &semaphore);
5238
5239 VkCommandPool command_pool;
5240 VkCommandPoolCreateInfo pool_create_info{};
5241 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5242 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5243 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5244 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5245 &command_pool);
5246
5247 VkCommandBuffer command_buffer[2];
5248 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5249 command_buffer_allocate_info.sType =
5250 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5251 command_buffer_allocate_info.commandPool = command_pool;
5252 command_buffer_allocate_info.commandBufferCount = 2;
5253 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5254 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5255 command_buffer);
5256
5257 VkQueue queue = VK_NULL_HANDLE;
5258 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5259 1, &queue);
5260
5261 {
5262 VkCommandBufferBeginInfo begin_info{};
5263 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5264 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5265
5266 vkCmdPipelineBarrier(command_buffer[0],
5267 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5268 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5269 0, nullptr, 0, nullptr);
5270
5271 VkViewport viewport{};
5272 viewport.maxDepth = 1.0f;
5273 viewport.minDepth = 0.0f;
5274 viewport.width = 512;
5275 viewport.height = 512;
5276 viewport.x = 0;
5277 viewport.y = 0;
5278 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5279 vkEndCommandBuffer(command_buffer[0]);
5280 }
5281 {
5282 VkCommandBufferBeginInfo begin_info{};
5283 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5284 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5285
5286 VkViewport viewport{};
5287 viewport.maxDepth = 1.0f;
5288 viewport.minDepth = 0.0f;
5289 viewport.width = 512;
5290 viewport.height = 512;
5291 viewport.x = 0;
5292 viewport.y = 0;
5293 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5294 vkEndCommandBuffer(command_buffer[1]);
5295 }
5296 {
5297 VkSubmitInfo submit_info{};
5298 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5299 submit_info.commandBufferCount = 1;
5300 submit_info.pCommandBuffers = &command_buffer[0];
5301 submit_info.signalSemaphoreCount = 1;
5302 submit_info.pSignalSemaphores = &semaphore;
5303 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5304 }
5305 {
5306 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5307 VkSubmitInfo submit_info{};
5308 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5309 submit_info.commandBufferCount = 1;
5310 submit_info.pCommandBuffers = &command_buffer[1];
5311 submit_info.waitSemaphoreCount = 1;
5312 submit_info.pWaitSemaphores = &semaphore;
5313 submit_info.pWaitDstStageMask = flags;
5314 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5315 }
5316
5317 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5318 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5319
5320 vkDestroyFence(m_device->device(), fence, nullptr);
5321 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5322 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5323 &command_buffer[0]);
5324 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5325
5326 m_errorMonitor->VerifyNotFound();
5327}
5328
Chris Forbes0f8126b2016-06-20 17:48:22 +12005329#if 0
5330TEST_F(VkLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
5331 if ((m_device->queue_props.empty()) ||
5332 (m_device->queue_props[0].queueCount < 2)) {
5333 printf("Test requires two queues, skipping\n");
5334 return;
5335 }
5336
5337 VkResult err;
5338
5339 m_errorMonitor->ExpectSuccess();
5340
5341 VkQueue q0 = m_device->m_queue;
5342 VkQueue q1 = nullptr;
5343 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
5344 ASSERT_NE(q1, nullptr);
5345
5346 // An (empty) command buffer. We must have work in the first submission --
5347 // the layer treats unfenced work differently from fenced work.
5348 VkCommandPoolCreateInfo cpci = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0 };
5349 VkCommandPool pool;
5350 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
5351 ASSERT_VK_SUCCESS(err);
5352 VkCommandBufferAllocateInfo cbai = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr,
5353 pool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1
5354 };
5355 VkCommandBuffer cb;
5356 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
5357 ASSERT_VK_SUCCESS(err);
5358 VkCommandBufferBeginInfo cbbi = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
5359 0, nullptr
5360 };
5361 err = vkBeginCommandBuffer(cb, &cbbi);
5362 ASSERT_VK_SUCCESS(err);
5363 err = vkEndCommandBuffer(cb);
5364 ASSERT_VK_SUCCESS(err);
5365
5366 // A semaphore
5367 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
5368 VkSemaphore s;
5369 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
5370 ASSERT_VK_SUCCESS(err);
5371
5372 // First submission, to q0
5373 VkSubmitInfo s0 = {
5374 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
5375 0, nullptr, nullptr,
5376 1, &cb,
5377 1, &s
5378 };
5379
5380 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
5381 ASSERT_VK_SUCCESS(err);
5382
5383 // Second submission, to q1, waiting on s
5384 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
5385 VkSubmitInfo s1 = {
5386 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
5387 1, &s, &waitmask,
5388 0, nullptr,
5389 0, nullptr
5390 };
5391
5392 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
5393 ASSERT_VK_SUCCESS(err);
5394
5395 // Wait for q0 idle
5396 err = vkQueueWaitIdle(q0);
5397 ASSERT_VK_SUCCESS(err);
5398
5399 // Command buffer should have been completed (it was on q0); reset the pool.
5400 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
5401
5402 m_errorMonitor->VerifyNotFound();
5403
5404 // Force device completely idle and clean up resources
5405 vkDeviceWaitIdle(m_device->device());
5406 vkDestroyCommandPool(m_device->device(), pool, nullptr);
5407 vkDestroySemaphore(m_device->device(), s, nullptr);
5408}
5409#endif
5410
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005411// This is a positive test. No errors should be generated.
5412TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
5413
5414 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5415 "submitted on separate queues, the second having a fence, "
5416 "followed by a WaitForFences call.");
5417
Dustin Graves48458142016-04-29 16:11:55 -06005418 if ((m_device->queue_props.empty()) ||
5419 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005420 return;
5421
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005422 m_errorMonitor->ExpectSuccess();
5423
5424 VkFence fence;
5425 VkFenceCreateInfo fence_create_info{};
5426 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5427 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5428
5429 VkSemaphore semaphore;
5430 VkSemaphoreCreateInfo semaphore_create_info{};
5431 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5432 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5433 &semaphore);
5434
5435 VkCommandPool command_pool;
5436 VkCommandPoolCreateInfo pool_create_info{};
5437 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5438 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5439 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5440 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5441 &command_pool);
5442
5443 VkCommandBuffer command_buffer[2];
5444 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5445 command_buffer_allocate_info.sType =
5446 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5447 command_buffer_allocate_info.commandPool = command_pool;
5448 command_buffer_allocate_info.commandBufferCount = 2;
5449 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5450 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5451 command_buffer);
5452
5453 VkQueue queue = VK_NULL_HANDLE;
5454 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5455 1, &queue);
5456
5457
5458 {
5459 VkCommandBufferBeginInfo begin_info{};
5460 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5461 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5462
5463 vkCmdPipelineBarrier(command_buffer[0],
5464 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5465 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5466 0, nullptr, 0, nullptr);
5467
5468 VkViewport viewport{};
5469 viewport.maxDepth = 1.0f;
5470 viewport.minDepth = 0.0f;
5471 viewport.width = 512;
5472 viewport.height = 512;
5473 viewport.x = 0;
5474 viewport.y = 0;
5475 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5476 vkEndCommandBuffer(command_buffer[0]);
5477 }
5478 {
5479 VkCommandBufferBeginInfo begin_info{};
5480 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5481 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5482
5483 VkViewport viewport{};
5484 viewport.maxDepth = 1.0f;
5485 viewport.minDepth = 0.0f;
5486 viewport.width = 512;
5487 viewport.height = 512;
5488 viewport.x = 0;
5489 viewport.y = 0;
5490 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5491 vkEndCommandBuffer(command_buffer[1]);
5492 }
5493 {
5494 VkSubmitInfo submit_info{};
5495 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5496 submit_info.commandBufferCount = 1;
5497 submit_info.pCommandBuffers = &command_buffer[0];
5498 submit_info.signalSemaphoreCount = 1;
5499 submit_info.pSignalSemaphores = &semaphore;
5500 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5501 }
5502 {
5503 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5504 VkSubmitInfo submit_info{};
5505 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5506 submit_info.commandBufferCount = 1;
5507 submit_info.pCommandBuffers = &command_buffer[1];
5508 submit_info.waitSemaphoreCount = 1;
5509 submit_info.pWaitSemaphores = &semaphore;
5510 submit_info.pWaitDstStageMask = flags;
5511 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5512 }
5513
5514 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5515
5516 vkDestroyFence(m_device->device(), fence, nullptr);
5517 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5518 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5519 &command_buffer[0]);
5520 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5521
5522 m_errorMonitor->VerifyNotFound();
5523}
5524
5525// This is a positive test. No errors should be generated.
5526TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
5527
5528 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5529 "on the same queue, sharing a signal/wait semaphore, the "
5530 "second having a fence, "
5531 "followed by a WaitForFences call.");
5532
5533 m_errorMonitor->ExpectSuccess();
5534
5535 VkFence fence;
5536 VkFenceCreateInfo fence_create_info{};
5537 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5538 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5539
5540 VkSemaphore semaphore;
5541 VkSemaphoreCreateInfo semaphore_create_info{};
5542 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5543 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5544 &semaphore);
5545
5546 VkCommandPool command_pool;
5547 VkCommandPoolCreateInfo pool_create_info{};
5548 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5549 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5550 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5551 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5552 &command_pool);
5553
5554 VkCommandBuffer command_buffer[2];
5555 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5556 command_buffer_allocate_info.sType =
5557 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5558 command_buffer_allocate_info.commandPool = command_pool;
5559 command_buffer_allocate_info.commandBufferCount = 2;
5560 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5561 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5562 command_buffer);
5563
5564 {
5565 VkCommandBufferBeginInfo begin_info{};
5566 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5567 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5568
5569 vkCmdPipelineBarrier(command_buffer[0],
5570 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5571 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5572 0, nullptr, 0, nullptr);
5573
5574 VkViewport viewport{};
5575 viewport.maxDepth = 1.0f;
5576 viewport.minDepth = 0.0f;
5577 viewport.width = 512;
5578 viewport.height = 512;
5579 viewport.x = 0;
5580 viewport.y = 0;
5581 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5582 vkEndCommandBuffer(command_buffer[0]);
5583 }
5584 {
5585 VkCommandBufferBeginInfo begin_info{};
5586 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5587 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5588
5589 VkViewport viewport{};
5590 viewport.maxDepth = 1.0f;
5591 viewport.minDepth = 0.0f;
5592 viewport.width = 512;
5593 viewport.height = 512;
5594 viewport.x = 0;
5595 viewport.y = 0;
5596 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5597 vkEndCommandBuffer(command_buffer[1]);
5598 }
5599 {
5600 VkSubmitInfo submit_info{};
5601 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5602 submit_info.commandBufferCount = 1;
5603 submit_info.pCommandBuffers = &command_buffer[0];
5604 submit_info.signalSemaphoreCount = 1;
5605 submit_info.pSignalSemaphores = &semaphore;
5606 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5607 }
5608 {
5609 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5610 VkSubmitInfo submit_info{};
5611 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5612 submit_info.commandBufferCount = 1;
5613 submit_info.pCommandBuffers = &command_buffer[1];
5614 submit_info.waitSemaphoreCount = 1;
5615 submit_info.pWaitSemaphores = &semaphore;
5616 submit_info.pWaitDstStageMask = flags;
5617 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5618 }
5619
5620 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5621
5622 vkDestroyFence(m_device->device(), fence, nullptr);
5623 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5624 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5625 &command_buffer[0]);
5626 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5627
5628 m_errorMonitor->VerifyNotFound();
5629}
5630
5631// This is a positive test. No errors should be generated.
5632TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
5633
5634 TEST_DESCRIPTION(
5635 "Two command buffers, each in a separate QueueSubmit call "
5636 "on the same queue, no fences, followed by a third QueueSubmit with NO "
5637 "SubmitInfos but with a fence, followed by a WaitForFences call.");
5638
5639 m_errorMonitor->ExpectSuccess();
5640
5641 VkFence fence;
5642 VkFenceCreateInfo fence_create_info{};
5643 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5644 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5645
5646 VkCommandPool command_pool;
5647 VkCommandPoolCreateInfo pool_create_info{};
5648 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5649 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5650 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5651 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5652 &command_pool);
5653
5654 VkCommandBuffer command_buffer[2];
5655 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5656 command_buffer_allocate_info.sType =
5657 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5658 command_buffer_allocate_info.commandPool = command_pool;
5659 command_buffer_allocate_info.commandBufferCount = 2;
5660 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5661 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5662 command_buffer);
5663
5664 {
5665 VkCommandBufferBeginInfo begin_info{};
5666 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5667 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5668
5669 vkCmdPipelineBarrier(command_buffer[0],
5670 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5671 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5672 0, nullptr, 0, nullptr);
5673
5674 VkViewport viewport{};
5675 viewport.maxDepth = 1.0f;
5676 viewport.minDepth = 0.0f;
5677 viewport.width = 512;
5678 viewport.height = 512;
5679 viewport.x = 0;
5680 viewport.y = 0;
5681 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5682 vkEndCommandBuffer(command_buffer[0]);
5683 }
5684 {
5685 VkCommandBufferBeginInfo begin_info{};
5686 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5687 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5688
5689 VkViewport viewport{};
5690 viewport.maxDepth = 1.0f;
5691 viewport.minDepth = 0.0f;
5692 viewport.width = 512;
5693 viewport.height = 512;
5694 viewport.x = 0;
5695 viewport.y = 0;
5696 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5697 vkEndCommandBuffer(command_buffer[1]);
5698 }
5699 {
5700 VkSubmitInfo submit_info{};
5701 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5702 submit_info.commandBufferCount = 1;
5703 submit_info.pCommandBuffers = &command_buffer[0];
5704 submit_info.signalSemaphoreCount = 0;
5705 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
5706 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5707 }
5708 {
5709 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5710 VkSubmitInfo submit_info{};
5711 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5712 submit_info.commandBufferCount = 1;
5713 submit_info.pCommandBuffers = &command_buffer[1];
5714 submit_info.waitSemaphoreCount = 0;
5715 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
5716 submit_info.pWaitDstStageMask = flags;
5717 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5718 }
5719
5720 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
5721
Mike Stroyancd1c3e52016-06-21 09:20:01 -06005722 VkResult err =
5723 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5724 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005725
5726 vkDestroyFence(m_device->device(), fence, nullptr);
5727 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5728 &command_buffer[0]);
5729 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5730
5731 m_errorMonitor->VerifyNotFound();
5732}
5733
5734// This is a positive test. No errors should be generated.
5735TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
5736
5737 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5738 "on the same queue, the second having a fence, followed "
5739 "by a WaitForFences call.");
5740
5741 m_errorMonitor->ExpectSuccess();
5742
5743 VkFence fence;
5744 VkFenceCreateInfo fence_create_info{};
5745 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5746 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5747
5748 VkCommandPool command_pool;
5749 VkCommandPoolCreateInfo pool_create_info{};
5750 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5751 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5752 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5753 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5754 &command_pool);
5755
5756 VkCommandBuffer command_buffer[2];
5757 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5758 command_buffer_allocate_info.sType =
5759 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5760 command_buffer_allocate_info.commandPool = command_pool;
5761 command_buffer_allocate_info.commandBufferCount = 2;
5762 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5763 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5764 command_buffer);
5765
5766 {
5767 VkCommandBufferBeginInfo begin_info{};
5768 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5769 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5770
5771 vkCmdPipelineBarrier(command_buffer[0],
5772 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5773 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5774 0, nullptr, 0, nullptr);
5775
5776 VkViewport viewport{};
5777 viewport.maxDepth = 1.0f;
5778 viewport.minDepth = 0.0f;
5779 viewport.width = 512;
5780 viewport.height = 512;
5781 viewport.x = 0;
5782 viewport.y = 0;
5783 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5784 vkEndCommandBuffer(command_buffer[0]);
5785 }
5786 {
5787 VkCommandBufferBeginInfo begin_info{};
5788 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5789 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5790
5791 VkViewport viewport{};
5792 viewport.maxDepth = 1.0f;
5793 viewport.minDepth = 0.0f;
5794 viewport.width = 512;
5795 viewport.height = 512;
5796 viewport.x = 0;
5797 viewport.y = 0;
5798 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5799 vkEndCommandBuffer(command_buffer[1]);
5800 }
5801 {
5802 VkSubmitInfo submit_info{};
5803 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5804 submit_info.commandBufferCount = 1;
5805 submit_info.pCommandBuffers = &command_buffer[0];
5806 submit_info.signalSemaphoreCount = 0;
5807 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
5808 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5809 }
5810 {
5811 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5812 VkSubmitInfo submit_info{};
5813 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5814 submit_info.commandBufferCount = 1;
5815 submit_info.pCommandBuffers = &command_buffer[1];
5816 submit_info.waitSemaphoreCount = 0;
5817 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
5818 submit_info.pWaitDstStageMask = flags;
5819 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5820 }
5821
5822 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5823
5824 vkDestroyFence(m_device->device(), fence, nullptr);
5825 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5826 &command_buffer[0]);
5827 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5828
5829 m_errorMonitor->VerifyNotFound();
5830}
5831
5832// This is a positive test. No errors should be generated.
5833TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
5834
5835 TEST_DESCRIPTION(
5836 "Two command buffers each in a separate SubmitInfo sent in a single "
5837 "QueueSubmit call followed by a WaitForFences call.");
5838
5839 m_errorMonitor->ExpectSuccess();
5840
5841 VkFence fence;
5842 VkFenceCreateInfo fence_create_info{};
5843 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5844 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5845
5846 VkSemaphore semaphore;
5847 VkSemaphoreCreateInfo semaphore_create_info{};
5848 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5849 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5850 &semaphore);
5851
5852 VkCommandPool command_pool;
5853 VkCommandPoolCreateInfo pool_create_info{};
5854 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5855 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5856 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5857 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5858 &command_pool);
5859
5860 VkCommandBuffer command_buffer[2];
5861 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5862 command_buffer_allocate_info.sType =
5863 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5864 command_buffer_allocate_info.commandPool = command_pool;
5865 command_buffer_allocate_info.commandBufferCount = 2;
5866 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5867 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5868 command_buffer);
5869
5870 {
5871 VkCommandBufferBeginInfo begin_info{};
5872 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5873 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5874
5875 vkCmdPipelineBarrier(command_buffer[0],
5876 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5877 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5878 0, nullptr, 0, nullptr);
5879
5880 VkViewport viewport{};
5881 viewport.maxDepth = 1.0f;
5882 viewport.minDepth = 0.0f;
5883 viewport.width = 512;
5884 viewport.height = 512;
5885 viewport.x = 0;
5886 viewport.y = 0;
5887 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5888 vkEndCommandBuffer(command_buffer[0]);
5889 }
5890 {
5891 VkCommandBufferBeginInfo begin_info{};
5892 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5893 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5894
5895 VkViewport viewport{};
5896 viewport.maxDepth = 1.0f;
5897 viewport.minDepth = 0.0f;
5898 viewport.width = 512;
5899 viewport.height = 512;
5900 viewport.x = 0;
5901 viewport.y = 0;
5902 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5903 vkEndCommandBuffer(command_buffer[1]);
5904 }
5905 {
5906 VkSubmitInfo submit_info[2];
5907 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5908
5909 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5910 submit_info[0].pNext = NULL;
5911 submit_info[0].commandBufferCount = 1;
5912 submit_info[0].pCommandBuffers = &command_buffer[0];
5913 submit_info[0].signalSemaphoreCount = 1;
5914 submit_info[0].pSignalSemaphores = &semaphore;
5915 submit_info[0].waitSemaphoreCount = 0;
5916 submit_info[0].pWaitSemaphores = NULL;
5917 submit_info[0].pWaitDstStageMask = 0;
5918
5919 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5920 submit_info[1].pNext = NULL;
5921 submit_info[1].commandBufferCount = 1;
5922 submit_info[1].pCommandBuffers = &command_buffer[1];
5923 submit_info[1].waitSemaphoreCount = 1;
5924 submit_info[1].pWaitSemaphores = &semaphore;
5925 submit_info[1].pWaitDstStageMask = flags;
5926 submit_info[1].signalSemaphoreCount = 0;
5927 submit_info[1].pSignalSemaphores = NULL;
5928 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
5929 }
5930
5931 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5932
5933 vkDestroyFence(m_device->device(), fence, nullptr);
5934 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5935 &command_buffer[0]);
5936 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06005937 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005938
5939 m_errorMonitor->VerifyNotFound();
5940}
5941
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005942TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005943 TEST_DESCRIPTION(
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005944 "Run a simple draw calls to validate failure when Depth Bias dynamic "
5945 "state is required but not correctly bound.");
5946
5947 // Dynamic depth bias
5948 m_errorMonitor->SetDesiredFailureMsg(
5949 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5950 "Dynamic depth bias state not set for this command buffer");
5951 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5952 BsoFailDepthBias);
5953 m_errorMonitor->VerifyFound();
5954}
5955
5956TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
5957 TEST_DESCRIPTION(
5958 "Run a simple draw calls to validate failure when Line Width dynamic "
5959 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005960
5961 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07005962 m_errorMonitor->SetDesiredFailureMsg(
5963 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005964 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005965 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5966 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005967 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005968}
5969
5970TEST_F(VkLayerTest, DynamicViewportNotBound) {
5971 TEST_DESCRIPTION(
5972 "Run a simple draw calls to validate failure when Viewport dynamic "
5973 "state is required but not correctly bound.");
5974
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005975 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07005976 m_errorMonitor->SetDesiredFailureMsg(
5977 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005978 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005979 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5980 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005981 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005982}
5983
5984TEST_F(VkLayerTest, DynamicScissorNotBound) {
5985 TEST_DESCRIPTION(
5986 "Run a simple draw calls to validate failure when Scissor dynamic "
5987 "state is required but not correctly bound.");
5988
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005989 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07005990 m_errorMonitor->SetDesiredFailureMsg(
5991 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005992 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005993 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5994 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005995 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005996}
5997
Tobin Ehlis21c88352016-05-26 06:15:45 -06005998TEST_F(VkLayerTest, DynamiBlendConstantsNotBound) {
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005999 TEST_DESCRIPTION(
Tobin Ehlis21c88352016-05-26 06:15:45 -06006000 "Run a simple draw calls to validate failure when Blend Constants "
6001 "dynamic state is required but not correctly bound.");
6002 // Dynamic blend constant state
6003 m_errorMonitor->SetDesiredFailureMsg(
6004 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6005 "Dynamic blend constants state not set for this command buffer");
6006 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6007 BsoFailBlend);
6008 m_errorMonitor->VerifyFound();
6009}
6010
6011TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
6012 TEST_DESCRIPTION(
6013 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006014 "state is required but not correctly bound.");
Tobin Ehlis21c88352016-05-26 06:15:45 -06006015 if (!m_device->phy().features().depthBounds) {
6016 printf("Device does not support depthBounds test; skipped.\n");
6017 return;
6018 }
6019 // Dynamic depth bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006020 m_errorMonitor->SetDesiredFailureMsg(
6021 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006022 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006023 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6024 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006025 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006026}
6027
6028TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
6029 TEST_DESCRIPTION(
6030 "Run a simple draw calls to validate failure when Stencil Read dynamic "
6031 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006032 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07006033 m_errorMonitor->SetDesiredFailureMsg(
6034 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006035 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006036 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6037 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006038 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006039}
6040
6041TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
6042 TEST_DESCRIPTION(
6043 "Run a simple draw calls to validate failure when Stencil Write dynamic"
6044 " state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006045 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07006046 m_errorMonitor->SetDesiredFailureMsg(
6047 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006048 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006049 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6050 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006051 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006052}
6053
6054TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
6055 TEST_DESCRIPTION(
6056 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
6057 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006058 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07006059 m_errorMonitor->SetDesiredFailureMsg(
6060 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006061 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006062 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6063 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006064 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06006065}
6066
Karl Schultz6addd812016-02-02 17:17:23 -07006067TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Karl Schultz6addd812016-02-02 17:17:23 -07006068 m_errorMonitor->SetDesiredFailureMsg(
6069 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6070 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
6071 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006072
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006073 ASSERT_NO_FATAL_FAILURE(InitState());
6074 ASSERT_NO_FATAL_FAILURE(InitViewport());
6075 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6076
Karl Schultz6addd812016-02-02 17:17:23 -07006077 // We luck out b/c by default the framework creates CB w/ the
6078 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006079 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006080 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
6081 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006082 EndCommandBuffer();
6083
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006084 // Bypass framework since it does the waits automatically
6085 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006086 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08006087 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6088 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006089 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006090 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07006091 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006092 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006093 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08006094 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006095 submit_info.pSignalSemaphores = NULL;
6096
Chris Forbes40028e22016-06-13 09:59:34 +12006097 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07006098 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006099
Karl Schultz6addd812016-02-02 17:17:23 -07006100 // Cause validation error by re-submitting cmd buffer that should only be
6101 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12006102 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006103
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006104 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006105}
6106
Karl Schultz6addd812016-02-02 17:17:23 -07006107TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006108 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07006109 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006110
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006111 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006112 "Unable to allocate 1 descriptors of "
6113 "type "
6114 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006115
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006116 ASSERT_NO_FATAL_FAILURE(InitState());
6117 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006118
Karl Schultz6addd812016-02-02 17:17:23 -07006119 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
6120 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006121 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006122 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
6123 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006124
6125 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006126 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6127 ds_pool_ci.pNext = NULL;
6128 ds_pool_ci.flags = 0;
6129 ds_pool_ci.maxSets = 1;
6130 ds_pool_ci.poolSizeCount = 1;
6131 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006132
6133 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006134 err =
6135 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006136 ASSERT_VK_SUCCESS(err);
6137
6138 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006139 dsl_binding.binding = 0;
6140 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6141 dsl_binding.descriptorCount = 1;
6142 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6143 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006144
6145 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006146 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6147 ds_layout_ci.pNext = NULL;
6148 ds_layout_ci.bindingCount = 1;
6149 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006150
6151 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006152 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6153 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006154 ASSERT_VK_SUCCESS(err);
6155
6156 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006157 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006158 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006159 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006160 alloc_info.descriptorPool = ds_pool;
6161 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006162 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6163 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006164
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006165 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006166
Chia-I Wuf7458c52015-10-26 21:10:41 +08006167 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6168 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006169}
6170
Karl Schultz6addd812016-02-02 17:17:23 -07006171TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
6172 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06006173
Karl Schultz6addd812016-02-02 17:17:23 -07006174 m_errorMonitor->SetDesiredFailureMsg(
6175 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6176 "It is invalid to call vkFreeDescriptorSets() with a pool created "
6177 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006178
Tobin Ehlise735c692015-10-08 13:13:50 -06006179 ASSERT_NO_FATAL_FAILURE(InitState());
6180 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06006181
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006182 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006183 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6184 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06006185
6186 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006187 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6188 ds_pool_ci.pNext = NULL;
6189 ds_pool_ci.maxSets = 1;
6190 ds_pool_ci.poolSizeCount = 1;
6191 ds_pool_ci.flags = 0;
6192 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
6193 // app can only call vkResetDescriptorPool on this pool.;
6194 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06006195
6196 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006197 err =
6198 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06006199 ASSERT_VK_SUCCESS(err);
6200
6201 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006202 dsl_binding.binding = 0;
6203 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6204 dsl_binding.descriptorCount = 1;
6205 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6206 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06006207
6208 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006209 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6210 ds_layout_ci.pNext = NULL;
6211 ds_layout_ci.bindingCount = 1;
6212 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06006213
6214 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006215 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6216 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06006217 ASSERT_VK_SUCCESS(err);
6218
6219 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006220 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006221 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006222 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006223 alloc_info.descriptorPool = ds_pool;
6224 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006225 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6226 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06006227 ASSERT_VK_SUCCESS(err);
6228
6229 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006230 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06006231
Chia-I Wuf7458c52015-10-26 21:10:41 +08006232 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6233 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06006234}
6235
Karl Schultz6addd812016-02-02 17:17:23 -07006236TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006237 // Attempt to clear Descriptor Pool with bad object.
6238 // ObjectTracker should catch this.
6239 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6240 "Invalid VkDescriptorPool Object 0xbaad6001");
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006241 uint64_t fake_pool_handle = 0xbaad6001;
6242 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
6243 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06006244 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006245}
6246
Karl Schultz6addd812016-02-02 17:17:23 -07006247TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006248 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
6249 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006250 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06006251 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006252
6253 uint64_t fake_set_handle = 0xbaad6001;
6254 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006255 VkResult err;
6256 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6257 "Invalid VkDescriptorSet Object 0xbaad6001");
6258
6259 ASSERT_NO_FATAL_FAILURE(InitState());
6260
6261 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
6262 layout_bindings[0].binding = 0;
6263 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6264 layout_bindings[0].descriptorCount = 1;
6265 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
6266 layout_bindings[0].pImmutableSamplers = NULL;
6267
6268 VkDescriptorSetLayout descriptor_set_layout;
6269 VkDescriptorSetLayoutCreateInfo dslci = {};
6270 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6271 dslci.pNext = NULL;
6272 dslci.bindingCount = 1;
6273 dslci.pBindings = layout_bindings;
6274 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006275 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006276
6277 VkPipelineLayout pipeline_layout;
6278 VkPipelineLayoutCreateInfo plci = {};
6279 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6280 plci.pNext = NULL;
6281 plci.setLayoutCount = 1;
6282 plci.pSetLayouts = &descriptor_set_layout;
6283 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006284 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006285
6286 BeginCommandBuffer();
6287 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006288 pipeline_layout, 0, 1, &bad_set, 0, NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06006289 m_errorMonitor->VerifyFound();
6290 EndCommandBuffer();
6291 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
6292 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006293}
6294
Karl Schultz6addd812016-02-02 17:17:23 -07006295TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006296 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
6297 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006298 uint64_t fake_layout_handle = 0xbaad6001;
6299 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006300 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6301 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
6302
6303 VkPipelineLayout pipeline_layout;
6304 VkPipelineLayoutCreateInfo plci = {};
6305 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6306 plci.pNext = NULL;
6307 plci.setLayoutCount = 1;
6308 plci.pSetLayouts = &bad_layout;
6309 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
6310
6311 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006312}
6313
Mark Muellerd4914412016-06-13 17:52:06 -06006314TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
6315 TEST_DESCRIPTION("This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
6316 "1) A uniform buffer update must have a valid buffer index."
6317 "2) When using an array of descriptors in a single WriteDescriptor,"
6318 " the descriptor types and stageflags must all be the same."
6319 "3) Immutable Sampler state must match across descriptors");
6320
6321 const char *invalid_BufferInfo_ErrorMessage =
6322 "vkUpdateDescriptorSets: if pDescriptorWrites[0].descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, "
6323 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or "
6324 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pDescriptorWrites[0].pBufferInfo must not be NULL";
6325 const char *stateFlag_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06006326 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006327 const char *immutable_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06006328 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006329
Mark Muellerd4914412016-06-13 17:52:06 -06006330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_BufferInfo_ErrorMessage);
6331
6332 ASSERT_NO_FATAL_FAILURE(InitState());
6333 VkDescriptorPoolSize ds_type_count[4] = {};
6334 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6335 ds_type_count[0].descriptorCount = 1;
6336 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6337 ds_type_count[1].descriptorCount = 1;
6338 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6339 ds_type_count[2].descriptorCount = 1;
6340 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
6341 ds_type_count[3].descriptorCount = 1;
6342
6343 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6344 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6345 ds_pool_ci.maxSets = 1;
6346 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
6347 ds_pool_ci.pPoolSizes = ds_type_count;
6348
6349 VkDescriptorPool ds_pool;
6350 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6351 ASSERT_VK_SUCCESS(err);
6352
Mark Muellerb9896722016-06-16 09:54:29 -06006353 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006354 layout_binding[0].binding = 0;
6355 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6356 layout_binding[0].descriptorCount = 1;
6357 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6358 layout_binding[0].pImmutableSamplers = NULL;
6359
6360 layout_binding[1].binding = 1;
6361 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6362 layout_binding[1].descriptorCount = 1;
6363 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6364 layout_binding[1].pImmutableSamplers = NULL;
6365
6366 VkSamplerCreateInfo sampler_ci = {};
6367 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6368 sampler_ci.pNext = NULL;
6369 sampler_ci.magFilter = VK_FILTER_NEAREST;
6370 sampler_ci.minFilter = VK_FILTER_NEAREST;
6371 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6372 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6373 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6374 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6375 sampler_ci.mipLodBias = 1.0;
6376 sampler_ci.anisotropyEnable = VK_FALSE;
6377 sampler_ci.maxAnisotropy = 1;
6378 sampler_ci.compareEnable = VK_FALSE;
6379 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6380 sampler_ci.minLod = 1.0;
6381 sampler_ci.maxLod = 1.0;
6382 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6383 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6384 VkSampler sampler;
6385
6386 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6387 ASSERT_VK_SUCCESS(err);
6388
6389 layout_binding[2].binding = 2;
6390 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6391 layout_binding[2].descriptorCount = 1;
6392 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6393 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
6394
Mark Muellerd4914412016-06-13 17:52:06 -06006395 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6396 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6397 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
6398 ds_layout_ci.pBindings = layout_binding;
6399 VkDescriptorSetLayout ds_layout;
6400 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6401 ASSERT_VK_SUCCESS(err);
6402
6403 VkDescriptorSetAllocateInfo alloc_info = {};
6404 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6405 alloc_info.descriptorSetCount = 1;
6406 alloc_info.descriptorPool = ds_pool;
6407 alloc_info.pSetLayouts = &ds_layout;
6408 VkDescriptorSet descriptorSet;
6409 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6410 ASSERT_VK_SUCCESS(err);
6411
6412 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6413 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6414 pipeline_layout_ci.pNext = NULL;
6415 pipeline_layout_ci.setLayoutCount = 1;
6416 pipeline_layout_ci.pSetLayouts = &ds_layout;
6417
6418 VkPipelineLayout pipeline_layout;
6419 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6420 ASSERT_VK_SUCCESS(err);
6421
Mark Mueller5c838ce2016-06-16 09:54:29 -06006422 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006423 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6424 descriptor_write.dstSet = descriptorSet;
6425 descriptor_write.dstBinding = 0;
6426 descriptor_write.descriptorCount = 1;
6427 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6428
Mark Mueller5c838ce2016-06-16 09:54:29 -06006429 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06006430 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6431 m_errorMonitor->VerifyFound();
6432
6433 // Create a buffer to update the descriptor with
6434 uint32_t qfi = 0;
6435 VkBufferCreateInfo buffCI = {};
6436 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6437 buffCI.size = 1024;
6438 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6439 buffCI.queueFamilyIndexCount = 1;
6440 buffCI.pQueueFamilyIndices = &qfi;
6441
6442 VkBuffer dyub;
6443 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6444 ASSERT_VK_SUCCESS(err);
6445 VkDescriptorBufferInfo buffInfo = {};
6446 buffInfo.buffer = dyub;
6447 buffInfo.offset = 0;
6448 buffInfo.range = 1024;
6449
6450 descriptor_write.pBufferInfo = &buffInfo;
6451 descriptor_write.descriptorCount = 2;
6452
Mark Mueller5c838ce2016-06-16 09:54:29 -06006453 // 2) The stateFlags don't match between the first and second descriptor
Mark Muellerd4914412016-06-13 17:52:06 -06006454 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, stateFlag_ErrorMessage);
6455 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6456 m_errorMonitor->VerifyFound();
6457
Mark Mueller5c838ce2016-06-16 09:54:29 -06006458 // 3) The second descriptor has a null_ptr pImmutableSamplers and
6459 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06006460 descriptor_write.dstBinding = 1;
6461 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06006462
6463
6464 // Make pImageInfo index non-null to avoid complaints of it missing
6465 VkDescriptorImageInfo imageInfo = {};
6466 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6467 descriptor_write.pImageInfo = &imageInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06006468 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, immutable_ErrorMessage);
6469 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6470 m_errorMonitor->VerifyFound();
6471
Mark Muellerd4914412016-06-13 17:52:06 -06006472 vkDestroyBuffer(m_device->device(), dyub, NULL);
6473 vkDestroySampler(m_device->device(), sampler, NULL);
6474 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6475 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6476 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6477}
6478
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06006479TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
6480 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6481 "due to a buffer dependency being destroyed.");
6482 ASSERT_NO_FATAL_FAILURE(InitState());
6483
6484 VkImageObj image(m_device);
6485 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
6486 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
6487 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
6488 VK_IMAGE_TILING_OPTIMAL, 0);
6489 ASSERT_TRUE(image.initialized());
6490
6491 VkBuffer buffer;
6492 VkDeviceMemory mem;
6493 VkMemoryRequirements mem_reqs;
6494
6495 VkBufferCreateInfo buf_info = {};
6496 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6497 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6498 buf_info.size = 256;
6499 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6500 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
6501 ASSERT_VK_SUCCESS(err);
6502
6503 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
6504
6505 VkMemoryAllocateInfo alloc_info = {};
6506 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6507 alloc_info.allocationSize = 256;
6508 bool pass = false;
6509 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
6510 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
6511 if (!pass) {
6512 vkDestroyBuffer(m_device->device(), buffer, NULL);
6513 return;
6514 }
6515 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
6516 ASSERT_VK_SUCCESS(err);
6517
6518 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
6519 ASSERT_VK_SUCCESS(err);
6520
6521 VkBufferImageCopy region = {};
6522 region.bufferRowLength = 128;
6523 region.bufferImageHeight = 128;
6524 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6525
6526 region.imageSubresource.layerCount = 1;
6527 region.imageExtent.height = 4;
6528 region.imageExtent.width = 4;
6529 region.imageExtent.depth = 1;
6530 m_commandBuffer->BeginCommandBuffer();
6531 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer,
6532 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
6533 1, &region);
6534 m_commandBuffer->EndCommandBuffer();
6535
6536 m_errorMonitor->SetDesiredFailureMsg(
6537 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6538 " that is invalid because bound buffer ");
6539 // Destroy buffer dependency prior to submit to cause ERROR
6540 vkDestroyBuffer(m_device->device(), buffer, NULL);
6541
6542 VkSubmitInfo submit_info = {};
6543 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6544 submit_info.commandBufferCount = 1;
6545 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6546 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6547
6548 m_errorMonitor->VerifyFound();
6549 vkFreeMemory(m_device->handle(), mem, NULL);
6550}
6551
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006552TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
6553 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6554 "due to an image dependency being destroyed.");
6555 ASSERT_NO_FATAL_FAILURE(InitState());
6556
6557 VkImage image;
6558 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6559 VkImageCreateInfo image_create_info = {};
6560 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6561 image_create_info.pNext = NULL;
6562 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6563 image_create_info.format = tex_format;
6564 image_create_info.extent.width = 32;
6565 image_create_info.extent.height = 32;
6566 image_create_info.extent.depth = 1;
6567 image_create_info.mipLevels = 1;
6568 image_create_info.arrayLayers = 1;
6569 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6570 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6571 image_create_info.usage =
6572 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
6573 image_create_info.flags = 0;
6574 VkResult err =
6575 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6576 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06006577 // Have to bind memory to image before recording cmd in cmd buffer using it
6578 VkMemoryRequirements mem_reqs;
6579 VkDeviceMemory image_mem;
6580 bool pass;
6581 VkMemoryAllocateInfo mem_alloc = {};
6582 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6583 mem_alloc.pNext = NULL;
6584 mem_alloc.memoryTypeIndex = 0;
6585 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
6586 mem_alloc.allocationSize = mem_reqs.size;
6587 pass =
6588 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
6589 ASSERT_TRUE(pass);
6590 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
6591 ASSERT_VK_SUCCESS(err);
6592 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
6593 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006594
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006595 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06006596 VkClearColorValue ccv;
6597 ccv.float32[0] = 1.0f;
6598 ccv.float32[1] = 1.0f;
6599 ccv.float32[2] = 1.0f;
6600 ccv.float32[3] = 1.0f;
6601 VkImageSubresourceRange isr = {};
6602 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06006603 isr.baseArrayLayer = 0;
6604 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06006605 isr.layerCount = 1;
6606 isr.levelCount = 1;
6607 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image,
6608 VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006609 m_commandBuffer->EndCommandBuffer();
6610
6611 m_errorMonitor->SetDesiredFailureMsg(
6612 VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
6613 // Destroy image dependency prior to submit to cause ERROR
6614 vkDestroyImage(m_device->device(), image, NULL);
6615
6616 VkSubmitInfo submit_info = {};
6617 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6618 submit_info.commandBufferCount = 1;
6619 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6620 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6621
6622 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06006623 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006624}
6625
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06006626TEST_F(VkLayerTest, ImageMemoryNotBound) {
6627 TEST_DESCRIPTION(
6628 "Attempt to draw with an image which has not had memory bound to it.");
6629 ASSERT_NO_FATAL_FAILURE(InitState());
6630
6631 VkImage image;
6632 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6633 VkImageCreateInfo image_create_info = {};
6634 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6635 image_create_info.pNext = NULL;
6636 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6637 image_create_info.format = tex_format;
6638 image_create_info.extent.width = 32;
6639 image_create_info.extent.height = 32;
6640 image_create_info.extent.depth = 1;
6641 image_create_info.mipLevels = 1;
6642 image_create_info.arrayLayers = 1;
6643 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6644 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6645 image_create_info.usage =
6646 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
6647 image_create_info.flags = 0;
6648 VkResult err =
6649 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6650 ASSERT_VK_SUCCESS(err);
6651 // Have to bind memory to image before recording cmd in cmd buffer using it
6652 VkMemoryRequirements mem_reqs;
6653 VkDeviceMemory image_mem;
6654 bool pass;
6655 VkMemoryAllocateInfo mem_alloc = {};
6656 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6657 mem_alloc.pNext = NULL;
6658 mem_alloc.memoryTypeIndex = 0;
6659 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
6660 mem_alloc.allocationSize = mem_reqs.size;
6661 pass =
6662 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
6663 ASSERT_TRUE(pass);
6664 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
6665 ASSERT_VK_SUCCESS(err);
6666
6667 // Introduce error, do not call vkBindImageMemory(m_device->device(), image,
6668 // image_mem, 0);
6669 m_errorMonitor->SetDesiredFailureMsg(
6670 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6671 "used without first calling vkBindImageMemory");
6672
6673 m_commandBuffer->BeginCommandBuffer();
6674 VkClearColorValue ccv;
6675 ccv.float32[0] = 1.0f;
6676 ccv.float32[1] = 1.0f;
6677 ccv.float32[2] = 1.0f;
6678 ccv.float32[3] = 1.0f;
6679 VkImageSubresourceRange isr = {};
6680 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6681 isr.baseArrayLayer = 0;
6682 isr.baseMipLevel = 0;
6683 isr.layerCount = 1;
6684 isr.levelCount = 1;
6685 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image,
6686 VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
6687 m_commandBuffer->EndCommandBuffer();
6688
6689 m_errorMonitor->VerifyFound();
6690 vkDestroyImage(m_device->device(), image, NULL);
6691 vkFreeMemory(m_device->device(), image_mem, nullptr);
6692}
6693
6694TEST_F(VkLayerTest, BufferMemoryNotBound) {
6695 TEST_DESCRIPTION(
6696 "Attempt to copy from a buffer which has not had memory bound to it.");
6697 ASSERT_NO_FATAL_FAILURE(InitState());
6698
6699 VkImageObj image(m_device);
6700 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
6701 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
6702 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
6703 VK_IMAGE_TILING_OPTIMAL, 0);
6704 ASSERT_TRUE(image.initialized());
6705
6706 VkBuffer buffer;
6707 VkDeviceMemory mem;
6708 VkMemoryRequirements mem_reqs;
6709
6710 VkBufferCreateInfo buf_info = {};
6711 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6712 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6713 buf_info.size = 256;
6714 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6715 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
6716 ASSERT_VK_SUCCESS(err);
6717
6718 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
6719
6720 VkMemoryAllocateInfo alloc_info = {};
6721 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6722 alloc_info.allocationSize = 256;
6723 bool pass = false;
6724 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
6725 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
6726 if (!pass) {
6727 vkDestroyBuffer(m_device->device(), buffer, NULL);
6728 return;
6729 }
6730 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
6731 ASSERT_VK_SUCCESS(err);
6732
6733 // Introduce failure by not calling vkBindBufferMemory(m_device->device(),
6734 // buffer, mem, 0);
6735 m_errorMonitor->SetDesiredFailureMsg(
6736 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6737 "used without first calling vkBindBufferMemory");
6738 VkBufferImageCopy region = {};
6739 region.bufferRowLength = 128;
6740 region.bufferImageHeight = 128;
6741 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6742
6743 region.imageSubresource.layerCount = 1;
6744 region.imageExtent.height = 4;
6745 region.imageExtent.width = 4;
6746 region.imageExtent.depth = 1;
6747 m_commandBuffer->BeginCommandBuffer();
6748 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer,
6749 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
6750 1, &region);
6751 m_commandBuffer->EndCommandBuffer();
6752
6753 m_errorMonitor->VerifyFound();
6754
6755 vkDestroyBuffer(m_device->device(), buffer, NULL);
6756 vkFreeMemory(m_device->handle(), mem, NULL);
6757}
6758
Tobin Ehlis85940f52016-07-07 16:57:21 -06006759TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
6760 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6761 "due to an event dependency being destroyed.");
6762 ASSERT_NO_FATAL_FAILURE(InitState());
6763
6764 VkEvent event;
6765 VkEventCreateInfo evci = {};
6766 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
6767 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
6768 ASSERT_VK_SUCCESS(result);
6769
6770 m_commandBuffer->BeginCommandBuffer();
6771 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event,
6772 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
6773 m_commandBuffer->EndCommandBuffer();
6774
6775 m_errorMonitor->SetDesiredFailureMsg(
6776 VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
6777 // Destroy event dependency prior to submit to cause ERROR
6778 vkDestroyEvent(m_device->device(), event, NULL);
6779
6780 VkSubmitInfo submit_info = {};
6781 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6782 submit_info.commandBufferCount = 1;
6783 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6784 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6785
6786 m_errorMonitor->VerifyFound();
6787}
6788
Tobin Ehlisdbea7552016-07-08 14:33:31 -06006789TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
6790 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6791 "due to a query pool dependency being destroyed.");
6792 ASSERT_NO_FATAL_FAILURE(InitState());
6793
6794 VkQueryPool query_pool;
6795 VkQueryPoolCreateInfo qpci{};
6796 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
6797 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
6798 qpci.queryCount = 1;
6799 VkResult result =
6800 vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
6801 ASSERT_VK_SUCCESS(result);
6802
6803 m_commandBuffer->BeginCommandBuffer();
6804 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
6805 m_commandBuffer->EndCommandBuffer();
6806
6807 m_errorMonitor->SetDesiredFailureMsg(
6808 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6809 " that is invalid because bound query pool ");
6810 // Destroy query pool dependency prior to submit to cause ERROR
6811 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
6812
6813 VkSubmitInfo submit_info = {};
6814 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6815 submit_info.commandBufferCount = 1;
6816 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6817 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6818
6819 m_errorMonitor->VerifyFound();
6820}
6821
Tobin Ehlis24130d92016-07-08 15:50:53 -06006822TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
6823 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6824 "due to a pipeline dependency being destroyed.");
6825 ASSERT_NO_FATAL_FAILURE(InitState());
6826 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6827
6828 VkResult err;
6829
6830 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6831 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6832
6833 VkPipelineLayout pipeline_layout;
6834 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6835 &pipeline_layout);
6836 ASSERT_VK_SUCCESS(err);
6837
6838 VkPipelineViewportStateCreateInfo vp_state_ci = {};
6839 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
6840 vp_state_ci.viewportCount = 1;
6841 VkViewport vp = {}; // Just need dummy vp to point to
6842 vp_state_ci.pViewports = &vp; // Null vp w/ count of 1 should cause error
6843 vp_state_ci.scissorCount = 1;
6844 VkRect2D scissors = {}; // Dummy scissors to point to
6845 vp_state_ci.pScissors = &scissors;
6846 // No dynamic state
6847 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
6848 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
6849
6850 VkPipelineShaderStageCreateInfo shaderStages[2];
6851 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
6852
6853 VkShaderObj vs(m_device, bindStateVertShaderText,
6854 VK_SHADER_STAGE_VERTEX_BIT, this);
6855 VkShaderObj fs(m_device, bindStateFragShaderText,
6856 VK_SHADER_STAGE_FRAGMENT_BIT,
6857 this); // We shouldn't need a fragment shader
6858 // but add it to be able to run on more devices
6859 shaderStages[0] = vs.GetStageCreateInfo();
6860 shaderStages[1] = fs.GetStageCreateInfo();
6861
6862 VkPipelineVertexInputStateCreateInfo vi_ci = {};
6863 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
6864
6865 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
6866 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
6867 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
6868
6869 VkPipelineRasterizationStateCreateInfo rs_ci = {};
6870 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
6871
6872 VkPipelineColorBlendAttachmentState att = {};
6873 att.blendEnable = VK_FALSE;
6874 att.colorWriteMask = 0xf;
6875
6876 VkPipelineColorBlendStateCreateInfo cb_ci = {};
6877 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
6878 cb_ci.attachmentCount = 1;
6879 cb_ci.pAttachments = &att;
6880
6881 VkGraphicsPipelineCreateInfo gp_ci = {};
6882 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
6883 gp_ci.stageCount = 2;
6884 gp_ci.pStages = shaderStages;
6885 gp_ci.pVertexInputState = &vi_ci;
6886 gp_ci.pInputAssemblyState = &ia_ci;
6887 gp_ci.pViewportState = &vp_state_ci;
6888 gp_ci.pRasterizationState = &rs_ci;
6889 gp_ci.pColorBlendState = &cb_ci;
6890 gp_ci.pDynamicState = &dyn_state_ci;
6891 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
6892 gp_ci.layout = pipeline_layout;
6893 gp_ci.renderPass = renderPass();
6894
6895 VkPipelineCacheCreateInfo pc_ci = {};
6896 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
6897
6898 VkPipeline pipeline;
6899 VkPipelineCache pipelineCache;
6900 err =
6901 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
6902 ASSERT_VK_SUCCESS(err);
6903
6904 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
6905 &gp_ci, NULL, &pipeline);
6906 ASSERT_VK_SUCCESS(err);
6907
6908 m_commandBuffer->BeginCommandBuffer();
6909 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6910 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
6911 m_commandBuffer->EndCommandBuffer();
6912 // Now destroy pipeline in order to cause error when submitting
6913 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
6914
6915 m_errorMonitor->SetDesiredFailureMsg(
6916 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6917 " that is invalid because bound pipeline ");
6918
6919 VkSubmitInfo submit_info = {};
6920 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6921 submit_info.commandBufferCount = 1;
6922 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6923 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6924
6925 m_errorMonitor->VerifyFound();
6926 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
6927 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6928}
6929
Karl Schultz6addd812016-02-02 17:17:23 -07006930TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006931 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6932 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006933 // Create a valid cmd buffer
6934 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006935 uint64_t fake_pipeline_handle = 0xbaad6001;
6936 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006937 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6938 "Invalid VkPipeline Object 0xbaad6001");
6939 ASSERT_NO_FATAL_FAILURE(InitState());
6940 BeginCommandBuffer();
6941 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6942 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
6943 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006944 // Now issue a draw call with no pipeline bound
6945 m_errorMonitor->SetDesiredFailureMsg(
6946 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6947 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tony Barbourdf4c0042016-06-01 15:55:43 -06006948
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006949 BeginCommandBuffer();
6950 Draw(1, 0, 0, 0);
6951 m_errorMonitor->VerifyFound();
6952 // Finally same check once more but with Dispatch/Compute
6953 m_errorMonitor->SetDesiredFailureMsg(
6954 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6955 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006956 BeginCommandBuffer();
6957 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6958 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006959}
6960
Karl Schultz6addd812016-02-02 17:17:23 -07006961TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
6962 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
6963 // CommandBuffer
6964 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006965
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006966 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006967 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006968
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006969 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006970 ASSERT_NO_FATAL_FAILURE(InitViewport());
6971 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006972 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006973 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6974 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006975
6976 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006977 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6978 ds_pool_ci.pNext = NULL;
6979 ds_pool_ci.maxSets = 1;
6980 ds_pool_ci.poolSizeCount = 1;
6981 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006982
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006983 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006984 err =
6985 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006986 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006987
Tony Barboureb254902015-07-15 12:50:33 -06006988 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006989 dsl_binding.binding = 0;
6990 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6991 dsl_binding.descriptorCount = 1;
6992 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6993 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006994
Tony Barboureb254902015-07-15 12:50:33 -06006995 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006996 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6997 ds_layout_ci.pNext = NULL;
6998 ds_layout_ci.bindingCount = 1;
6999 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007000 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007001 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7002 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007003 ASSERT_VK_SUCCESS(err);
7004
7005 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007006 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007007 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007008 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007009 alloc_info.descriptorPool = ds_pool;
7010 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007011 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7012 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007013 ASSERT_VK_SUCCESS(err);
7014
Tony Barboureb254902015-07-15 12:50:33 -06007015 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007016 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7017 pipeline_layout_ci.pNext = NULL;
7018 pipeline_layout_ci.setLayoutCount = 1;
7019 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007020
7021 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007022 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7023 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007024 ASSERT_VK_SUCCESS(err);
7025
Karl Schultz6addd812016-02-02 17:17:23 -07007026 VkShaderObj vs(m_device, bindStateVertShaderText,
7027 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06007028 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07007029 // on more devices
7030 VkShaderObj fs(m_device, bindStateFragShaderText,
7031 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007032
Tony Barbourc95e4ac2015-08-04 17:05:26 -06007033 VkPipelineObj pipe(m_device);
7034 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06007035 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06007036 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06007037 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06007038
7039 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007040 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7041 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7042 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7043 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7044 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007045
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007046 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007047
Chia-I Wuf7458c52015-10-26 21:10:41 +08007048 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7049 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7050 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007051}
7052
Karl Schultz6addd812016-02-02 17:17:23 -07007053TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007054 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07007055 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007056
Karl Schultz6addd812016-02-02 17:17:23 -07007057 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007058 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
7059 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007060
7061 ASSERT_NO_FATAL_FAILURE(InitState());
7062 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007063 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7064 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007065
7066 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007067 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7068 ds_pool_ci.pNext = NULL;
7069 ds_pool_ci.maxSets = 1;
7070 ds_pool_ci.poolSizeCount = 1;
7071 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007072
7073 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007074 err =
7075 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007076 ASSERT_VK_SUCCESS(err);
7077
7078 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007079 dsl_binding.binding = 0;
7080 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7081 dsl_binding.descriptorCount = 1;
7082 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7083 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007084
7085 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007086 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7087 ds_layout_ci.pNext = NULL;
7088 ds_layout_ci.bindingCount = 1;
7089 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007090 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007091 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7092 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007093 ASSERT_VK_SUCCESS(err);
7094
7095 VkDescriptorSet descriptorSet;
7096 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007097 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007098 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007099 alloc_info.descriptorPool = ds_pool;
7100 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007101 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7102 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007103 ASSERT_VK_SUCCESS(err);
7104
Karl Schultz6addd812016-02-02 17:17:23 -07007105 VkBufferView view =
7106 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007107 VkWriteDescriptorSet descriptor_write;
7108 memset(&descriptor_write, 0, sizeof(descriptor_write));
7109 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7110 descriptor_write.dstSet = descriptorSet;
7111 descriptor_write.dstBinding = 0;
7112 descriptor_write.descriptorCount = 1;
7113 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7114 descriptor_write.pTexelBufferView = &view;
7115
7116 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7117
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007118 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007119
7120 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7121 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7122}
7123
Mark Youngd339ba32016-05-30 13:28:35 -06007124TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
7125 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has"
7126 " no memory bound to it.");
7127
7128 VkResult err;
7129 m_errorMonitor->SetDesiredFailureMsg(
7130 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -06007131 "used without first calling vkBindBufferMemory");
Mark Youngd339ba32016-05-30 13:28:35 -06007132
7133 ASSERT_NO_FATAL_FAILURE(InitState());
7134
7135 // Create a buffer with no bound memory and then attempt to create
7136 // a buffer view.
7137 VkBufferCreateInfo buff_ci = {};
7138 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7139 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7140 buff_ci.size = 256;
7141 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7142 VkBuffer buffer;
7143 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
7144 ASSERT_VK_SUCCESS(err);
7145
7146 VkBufferViewCreateInfo buff_view_ci = {};
7147 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
7148 buff_view_ci.buffer = buffer;
7149 buff_view_ci.format = VK_FORMAT_R8_UNORM;
7150 buff_view_ci.range = VK_WHOLE_SIZE;
7151 VkBufferView buff_view;
7152 err =
7153 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
7154
7155 m_errorMonitor->VerifyFound();
7156 vkDestroyBuffer(m_device->device(), buffer, NULL);
7157 // If last error is success, it still created the view, so delete it.
7158 if (err == VK_SUCCESS) {
7159 vkDestroyBufferView(m_device->device(), buff_view, NULL);
7160 }
7161}
7162
Karl Schultz6addd812016-02-02 17:17:23 -07007163TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
7164 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
7165 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07007166 // 1. No dynamicOffset supplied
7167 // 2. Too many dynamicOffsets supplied
7168 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07007169 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007170 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007171 " requires 1 dynamicOffsets, but only "
7172 "0 dynamicOffsets are left in "
7173 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007174
7175 ASSERT_NO_FATAL_FAILURE(InitState());
7176 ASSERT_NO_FATAL_FAILURE(InitViewport());
7177 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7178
7179 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007180 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7181 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007182
7183 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007184 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7185 ds_pool_ci.pNext = NULL;
7186 ds_pool_ci.maxSets = 1;
7187 ds_pool_ci.poolSizeCount = 1;
7188 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007189
7190 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007191 err =
7192 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007193 ASSERT_VK_SUCCESS(err);
7194
7195 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007196 dsl_binding.binding = 0;
7197 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7198 dsl_binding.descriptorCount = 1;
7199 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7200 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007201
7202 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007203 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7204 ds_layout_ci.pNext = NULL;
7205 ds_layout_ci.bindingCount = 1;
7206 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007207 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007208 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7209 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007210 ASSERT_VK_SUCCESS(err);
7211
7212 VkDescriptorSet descriptorSet;
7213 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007214 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007215 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007216 alloc_info.descriptorPool = ds_pool;
7217 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007218 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7219 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007220 ASSERT_VK_SUCCESS(err);
7221
7222 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007223 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7224 pipeline_layout_ci.pNext = NULL;
7225 pipeline_layout_ci.setLayoutCount = 1;
7226 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007227
7228 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007229 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7230 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007231 ASSERT_VK_SUCCESS(err);
7232
7233 // Create a buffer to update the descriptor with
7234 uint32_t qfi = 0;
7235 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007236 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7237 buffCI.size = 1024;
7238 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7239 buffCI.queueFamilyIndexCount = 1;
7240 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007241
7242 VkBuffer dyub;
7243 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7244 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007245 // Allocate memory and bind to buffer so we can make it to the appropriate
7246 // error
7247 VkMemoryAllocateInfo mem_alloc = {};
7248 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7249 mem_alloc.pNext = NULL;
7250 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12007251 mem_alloc.memoryTypeIndex = 0;
7252
7253 VkMemoryRequirements memReqs;
7254 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
7255 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc,
7256 0);
7257 if (!pass) {
7258 vkDestroyBuffer(m_device->device(), dyub, NULL);
7259 return;
7260 }
7261
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007262 VkDeviceMemory mem;
7263 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
7264 ASSERT_VK_SUCCESS(err);
7265 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
7266 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007267 // Correctly update descriptor to avoid "NOT_UPDATED" error
7268 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007269 buffInfo.buffer = dyub;
7270 buffInfo.offset = 0;
7271 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007272
7273 VkWriteDescriptorSet descriptor_write;
7274 memset(&descriptor_write, 0, sizeof(descriptor_write));
7275 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7276 descriptor_write.dstSet = descriptorSet;
7277 descriptor_write.dstBinding = 0;
7278 descriptor_write.descriptorCount = 1;
7279 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7280 descriptor_write.pBufferInfo = &buffInfo;
7281
7282 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7283
7284 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007285 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7286 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7287 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007288 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07007289 uint32_t pDynOff[2] = {512, 756};
7290 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07007291 m_errorMonitor->SetDesiredFailureMsg(
7292 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07007293 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07007294 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7295 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7296 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12007297 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07007298 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007299 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7300 " dynamic offset 512 combined with "
7301 "offset 0 and range 1024 that "
7302 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07007303 // Create PSO to be used for draw-time errors below
7304 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007305 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007306 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007307 "out gl_PerVertex { \n"
7308 " vec4 gl_Position;\n"
7309 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007310 "void main(){\n"
7311 " gl_Position = vec4(1);\n"
7312 "}\n";
7313 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007314 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007315 "\n"
7316 "layout(location=0) out vec4 x;\n"
7317 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7318 "void main(){\n"
7319 " x = vec4(bar.y);\n"
7320 "}\n";
7321 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7322 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7323 VkPipelineObj pipe(m_device);
7324 pipe.AddShader(&vs);
7325 pipe.AddShader(&fs);
7326 pipe.AddColorAttachment();
7327 pipe.CreateVKPipeline(pipeline_layout, renderPass());
7328
Karl Schultz6addd812016-02-02 17:17:23 -07007329 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7330 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7331 // This update should succeed, but offset size of 512 will overstep buffer
7332 // /w range 1024 & size 1024
7333 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7334 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7335 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07007336 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007337 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007338
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007339 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06007340 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007341
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007342 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007343 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007344 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7345}
7346
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007347TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007348 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007349 ASSERT_NO_FATAL_FAILURE(InitState());
7350 ASSERT_NO_FATAL_FAILURE(InitViewport());
7351 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7352
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007353 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007354 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007355 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7356 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7357 pipeline_layout_ci.pushConstantRangeCount = 1;
7358 pipeline_layout_ci.pPushConstantRanges = &pc_range;
7359
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007360 //
7361 // Check for invalid push constant ranges in pipeline layouts.
7362 //
7363 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007364 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007365 char const *msg;
7366 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007367
Karl Schultzc81037d2016-05-12 08:11:23 -06007368 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
7369 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
7370 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7371 "vkCreatePipelineLayout() call has push constants index 0 with "
7372 "size 0."},
7373 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7374 "vkCreatePipelineLayout() call has push constants index 0 with "
7375 "size 1."},
7376 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
7377 "vkCreatePipelineLayout() call has push constants index 0 with "
7378 "size 1."},
7379 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
7380 "vkCreatePipelineLayout() call has push constants index 0 with "
7381 "size 0."},
7382 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7383 "vkCreatePipelineLayout() call has push constants index 0 with "
7384 "offset 1. Offset must"},
7385 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
7386 "vkCreatePipelineLayout() call has push constants index 0 "
7387 "with offset "},
7388 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
7389 "vkCreatePipelineLayout() call has push constants "
7390 "index 0 with offset "},
7391 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
7392 "vkCreatePipelineLayout() call has push constants index 0 "
7393 "with offset "},
7394 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
7395 "vkCreatePipelineLayout() call has push "
7396 "constants index 0 with offset "},
7397 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
7398 "vkCreatePipelineLayout() call has push "
7399 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007400 }};
7401
7402 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06007403 for (const auto &iter : range_tests) {
7404 pc_range = iter.range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007405 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7406 iter.msg);
7407 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7408 NULL, &pipeline_layout);
7409 m_errorMonitor->VerifyFound();
7410 if (VK_SUCCESS == err) {
7411 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7412 }
7413 }
7414
7415 // Check for invalid stage flag
7416 pc_range.offset = 0;
7417 pc_range.size = 16;
7418 pc_range.stageFlags = 0;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007419 m_errorMonitor->SetDesiredFailureMsg(
7420 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007421 "vkCreatePipelineLayout() call has no stageFlags set.");
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007422 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7423 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007424 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007425 if (VK_SUCCESS == err) {
7426 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7427 }
7428
7429 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06007430 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007431 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007432 VkPushConstantRange const ranges[ranges_per_test];
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007433 char const *msg;
7434 };
7435
Karl Schultzc81037d2016-05-12 08:11:23 -06007436 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007437 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7438 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7439 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7440 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7441 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7442 "vkCreatePipelineLayout() call has push constants with overlapping "
7443 "ranges: 0:[0, 4), 1:[0, 4)"},
7444 {
7445 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7446 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7447 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7448 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7449 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
7450 "vkCreatePipelineLayout() call has push constants with "
7451 "overlapping "
7452 "ranges: 3:[12, 20), 4:[16, 20)",
7453 },
7454 {
7455 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7456 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7457 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7458 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7459 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7460 "vkCreatePipelineLayout() call has push constants with "
7461 "overlapping "
7462 "ranges: 0:[16, 20), 1:[12, 20)",
7463 },
7464 {
7465 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7466 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7467 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7468 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7469 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7470 "vkCreatePipelineLayout() call has push constants with "
7471 "overlapping "
7472 "ranges: 0:[16, 20), 3:[12, 20)",
7473 },
7474 {
7475 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7476 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
7477 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
7478 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
7479 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
7480 "vkCreatePipelineLayout() call has push constants with "
7481 "overlapping "
7482 "ranges: 0:[16, 20), 2:[4, 100)",
7483 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007484
Karl Schultzc81037d2016-05-12 08:11:23 -06007485 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007486 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06007487 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
7488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007489 iter.msg);
7490 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7491 NULL, &pipeline_layout);
7492 m_errorMonitor->VerifyFound();
7493 if (VK_SUCCESS == err) {
7494 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7495 }
7496 }
7497
7498 // Run some positive tests to make sure overlap checking in the layer is OK
Karl Schultzc81037d2016-05-12 08:11:23 -06007499 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos =
7500 {{{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7501 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7502 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7503 {VK_SHADER_STAGE_VERTEX_BIT, 12, 4},
7504 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
7505 ""},
7506 {{{VK_SHADER_STAGE_VERTEX_BIT, 92, 24},
7507 {VK_SHADER_STAGE_VERTEX_BIT, 80, 4},
7508 {VK_SHADER_STAGE_VERTEX_BIT, 64, 8},
7509 {VK_SHADER_STAGE_VERTEX_BIT, 4, 16},
7510 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7511 ""}}};
7512 for (const auto &iter : overlapping_range_tests_pos) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007513 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
7514 m_errorMonitor->ExpectSuccess();
7515 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7516 NULL, &pipeline_layout);
7517 m_errorMonitor->VerifyNotFound();
7518 if (VK_SUCCESS == err) {
7519 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7520 }
7521 }
7522
7523 //
7524 // CmdPushConstants tests
7525 //
Karl Schultzc81037d2016-05-12 08:11:23 -06007526 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007527
7528 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzc81037d2016-05-12 08:11:23 -06007529 const std::array<PipelineLayoutTestCase, 16> cmd_range_tests = {{
7530 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7531 "vkCmdPushConstants() call has push constants with size 0. Size "
7532 "must be greater than zero and a multiple of 4."},
7533 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7534 "vkCmdPushConstants() call has push constants with size 1. Size "
7535 "must be greater than zero and a multiple of 4."},
7536 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
7537 "vkCmdPushConstants() call has push constants with size 1. Size "
7538 "must be greater than zero and a multiple of 4."},
7539 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
7540 "vkCmdPushConstants() call has push constants with offset 1. "
7541 "Offset must be a multiple of 4."},
7542 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7543 "vkCmdPushConstants() call has push constants with offset 1. "
7544 "Offset must be a multiple of 4."},
7545 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
7546 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
7547 "0x1 not within flag-matching ranges in pipeline layout"},
7548 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
7549 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
7550 "0x1 not within flag-matching ranges in pipeline layout"},
7551 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
7552 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
7553 "0x1 not within flag-matching ranges in pipeline layout"},
7554 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
7555 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
7556 "0x1 not within flag-matching ranges in pipeline layout"},
7557 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
7558 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
7559 "any of the ranges in pipeline layout"},
7560 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7561 0, 16},
7562 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
7563 "any of the ranges in pipeline layout"},
7564 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007565 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007566 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007567 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007568 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007569 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007570 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007571 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007572 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007573 "vkCmdPushConstants() call has push constants with offset "},
7574 }};
7575
7576 // Two ranges for testing robustness
Karl Schultzc81037d2016-05-12 08:11:23 -06007577 const VkPushConstantRange pc_range2[] = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007578 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06007579 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007580 };
Karl Schultzc81037d2016-05-12 08:11:23 -06007581 pipeline_layout_ci.pushConstantRangeCount =
7582 sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007583 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007584 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7585 &pipeline_layout);
7586 ASSERT_VK_SUCCESS(err);
7587 BeginCommandBuffer();
Karl Schultzc81037d2016-05-12 08:11:23 -06007588 for (const auto &iter : cmd_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007589 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7590 iter.msg);
7591 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
Karl Schultzc81037d2016-05-12 08:11:23 -06007592 iter.range.stageFlags, iter.range.offset,
7593 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007594 m_errorMonitor->VerifyFound();
7595 }
7596
7597 // Check for invalid stage flag
7598 m_errorMonitor->SetDesiredFailureMsg(
7599 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7600 "vkCmdPushConstants() call has no stageFlags set.");
7601 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0,
Karl Schultzc81037d2016-05-12 08:11:23 -06007602 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007603 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06007604 EndCommandBuffer();
7605 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
7606 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007607
Karl Schultzc81037d2016-05-12 08:11:23 -06007608 // overlapping range tests with cmd
7609 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
7610 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
7611 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
7612 "0x1 not within flag-matching ranges in pipeline layout"},
7613 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7614 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
7615 "0x1 not within flag-matching ranges in pipeline layout"},
7616 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
7617 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
7618 "0x1 not within flag-matching ranges in pipeline layout"},
7619 }};
7620 const VkPushConstantRange pc_range3[] = {
7621 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
7622 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7623 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7624 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
7625 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
7626 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
7627 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
7628 };
7629 pipeline_layout_ci.pushConstantRangeCount =
7630 sizeof(pc_range3) / sizeof(VkPushConstantRange);
7631 pipeline_layout_ci.pPushConstantRanges = pc_range3;
7632 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7633 &pipeline_layout);
7634 ASSERT_VK_SUCCESS(err);
7635 BeginCommandBuffer();
7636 for (const auto &iter : cmd_overlap_tests) {
7637 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7638 iter.msg);
7639 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
7640 iter.range.stageFlags, iter.range.offset,
7641 iter.range.size, dummy_values);
7642 m_errorMonitor->VerifyFound();
7643 }
7644 EndCommandBuffer();
7645 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
7646 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7647
7648 // positive overlapping range tests with cmd
7649 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = {{
7650 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, ""},
7651 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4}, ""},
7652 {{VK_SHADER_STAGE_VERTEX_BIT, 20, 12}, ""},
7653 {{VK_SHADER_STAGE_VERTEX_BIT, 56, 36}, ""},
7654 }};
7655 const VkPushConstantRange pc_range4[] = {
7656 {VK_SHADER_STAGE_VERTEX_BIT, 0, 64},
7657 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
7658 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7659 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7660 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
7661 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
7662 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
7663 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
7664 };
7665 pipeline_layout_ci.pushConstantRangeCount =
7666 sizeof(pc_range4) / sizeof(VkPushConstantRange);
7667 pipeline_layout_ci.pPushConstantRanges = pc_range4;
7668 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7669 &pipeline_layout);
7670 ASSERT_VK_SUCCESS(err);
7671 BeginCommandBuffer();
7672 for (const auto &iter : cmd_overlap_tests_pos) {
7673 m_errorMonitor->ExpectSuccess();
7674 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
7675 iter.range.stageFlags, iter.range.offset,
7676 iter.range.size, dummy_values);
7677 m_errorMonitor->VerifyNotFound();
7678 }
7679 EndCommandBuffer();
7680 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007681 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7682}
7683
Karl Schultz6addd812016-02-02 17:17:23 -07007684TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007685 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007686 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007687
7688 ASSERT_NO_FATAL_FAILURE(InitState());
7689 ASSERT_NO_FATAL_FAILURE(InitViewport());
7690 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7691
Mike Stroyanb8a61002016-06-20 16:00:28 -06007692 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
7693 VkImageTiling tiling;
7694 VkFormatProperties format_properties;
7695 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
7696 if (format_properties.linearTilingFeatures &
7697 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
7698 tiling = VK_IMAGE_TILING_LINEAR;
7699 } else if (format_properties.optimalTilingFeatures &
7700 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
7701 tiling = VK_IMAGE_TILING_OPTIMAL;
7702 } else {
7703 printf("Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
7704 "skipped.\n");
7705 return;
7706 }
7707
Tobin Ehlis559c6382015-11-05 09:52:49 -07007708 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7709 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007710 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7711 ds_type_count[0].descriptorCount = 10;
7712 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7713 ds_type_count[1].descriptorCount = 2;
7714 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7715 ds_type_count[2].descriptorCount = 2;
7716 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7717 ds_type_count[3].descriptorCount = 5;
7718 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7719 // type
7720 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7721 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7722 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007723
7724 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007725 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7726 ds_pool_ci.pNext = NULL;
7727 ds_pool_ci.maxSets = 5;
7728 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7729 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007730
7731 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007732 err =
7733 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007734 ASSERT_VK_SUCCESS(err);
7735
7736 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7737 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007738 dsl_binding[0].binding = 0;
7739 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7740 dsl_binding[0].descriptorCount = 5;
7741 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7742 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007743
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007744 // Create layout identical to set0 layout but w/ different stageFlags
7745 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007746 dsl_fs_stage_only.binding = 0;
7747 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7748 dsl_fs_stage_only.descriptorCount = 5;
7749 dsl_fs_stage_only.stageFlags =
7750 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7751 // bind time
7752 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007753 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007754 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7755 ds_layout_ci.pNext = NULL;
7756 ds_layout_ci.bindingCount = 1;
7757 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007758 static const uint32_t NUM_LAYOUTS = 4;
7759 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007760 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007761 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7762 // layout for error case
7763 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7764 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007765 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007766 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07007767 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7768 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007769 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007770 dsl_binding[0].binding = 0;
7771 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007772 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007773 dsl_binding[1].binding = 1;
7774 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7775 dsl_binding[1].descriptorCount = 2;
7776 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7777 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007778 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007779 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07007780 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7781 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007782 ASSERT_VK_SUCCESS(err);
7783 dsl_binding[0].binding = 0;
7784 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007785 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007786 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007787 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7788 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007789 ASSERT_VK_SUCCESS(err);
7790 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007791 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07007792 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7793 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007794 ASSERT_VK_SUCCESS(err);
7795
7796 static const uint32_t NUM_SETS = 4;
7797 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7798 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007799 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007800 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007801 alloc_info.descriptorPool = ds_pool;
7802 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007803 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7804 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007805 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007806 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007807 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007808 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07007809 err =
7810 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007811 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007812
7813 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007814 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7815 pipeline_layout_ci.pNext = NULL;
7816 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7817 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007818
7819 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007820 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7821 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007822 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007823 // Create pipelineLayout with only one setLayout
7824 pipeline_layout_ci.setLayoutCount = 1;
7825 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007826 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7827 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007828 ASSERT_VK_SUCCESS(err);
7829 // Create pipelineLayout with 2 descriptor setLayout at index 0
7830 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7831 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07007832 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7833 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007834 ASSERT_VK_SUCCESS(err);
7835 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7836 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7837 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07007838 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7839 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007840 ASSERT_VK_SUCCESS(err);
7841 // Create pipelineLayout with UB type, but stageFlags for FS only
7842 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7843 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07007844 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7845 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007846 ASSERT_VK_SUCCESS(err);
7847 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7848 VkDescriptorSetLayout pl_bad_s0[2] = {};
7849 pl_bad_s0[0] = ds_layout_fs_only;
7850 pl_bad_s0[1] = ds_layout[1];
7851 pipeline_layout_ci.setLayoutCount = 2;
7852 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7853 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07007854 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7855 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007856 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007857
7858 // Create a buffer to update the descriptor with
7859 uint32_t qfi = 0;
7860 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007861 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7862 buffCI.size = 1024;
7863 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7864 buffCI.queueFamilyIndexCount = 1;
7865 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007866
7867 VkBuffer dyub;
7868 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7869 ASSERT_VK_SUCCESS(err);
7870 // Correctly update descriptor to avoid "NOT_UPDATED" error
7871 static const uint32_t NUM_BUFFS = 5;
7872 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007873 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007874 buffInfo[i].buffer = dyub;
7875 buffInfo[i].offset = 0;
7876 buffInfo[i].range = 1024;
7877 }
Karl Schultz6addd812016-02-02 17:17:23 -07007878 VkImage image;
Karl Schultz6addd812016-02-02 17:17:23 -07007879 const int32_t tex_width = 32;
7880 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007881 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007882 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7883 image_create_info.pNext = NULL;
7884 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7885 image_create_info.format = tex_format;
7886 image_create_info.extent.width = tex_width;
7887 image_create_info.extent.height = tex_height;
7888 image_create_info.extent.depth = 1;
7889 image_create_info.mipLevels = 1;
7890 image_create_info.arrayLayers = 1;
7891 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyanb8a61002016-06-20 16:00:28 -06007892 image_create_info.tiling = tiling;
7893 image_create_info.usage =
7894 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07007895 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007896 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7897 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007898
Karl Schultz6addd812016-02-02 17:17:23 -07007899 VkMemoryRequirements memReqs;
7900 VkDeviceMemory imageMem;
7901 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007902 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007903 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7904 memAlloc.pNext = NULL;
7905 memAlloc.allocationSize = 0;
7906 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007907 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
7908 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007909 pass =
7910 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007911 ASSERT_TRUE(pass);
7912 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
7913 ASSERT_VK_SUCCESS(err);
7914 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
7915 ASSERT_VK_SUCCESS(err);
7916
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007917 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007918 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
7919 image_view_create_info.image = image;
7920 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7921 image_view_create_info.format = tex_format;
7922 image_view_create_info.subresourceRange.layerCount = 1;
7923 image_view_create_info.subresourceRange.baseMipLevel = 0;
7924 image_view_create_info.subresourceRange.levelCount = 1;
7925 image_view_create_info.subresourceRange.aspectMask =
7926 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007927
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007928 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007929 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7930 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007931 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007932 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007933 imageInfo[0].imageView = view;
7934 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
7935 imageInfo[1].imageView = view;
7936 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007937 imageInfo[2].imageView = view;
7938 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
7939 imageInfo[3].imageView = view;
7940 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007941
7942 static const uint32_t NUM_SET_UPDATES = 3;
7943 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
7944 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7945 descriptor_write[0].dstSet = descriptorSet[0];
7946 descriptor_write[0].dstBinding = 0;
7947 descriptor_write[0].descriptorCount = 5;
7948 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7949 descriptor_write[0].pBufferInfo = buffInfo;
7950 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7951 descriptor_write[1].dstSet = descriptorSet[1];
7952 descriptor_write[1].dstBinding = 0;
7953 descriptor_write[1].descriptorCount = 2;
7954 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7955 descriptor_write[1].pImageInfo = imageInfo;
7956 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7957 descriptor_write[2].dstSet = descriptorSet[1];
7958 descriptor_write[2].dstBinding = 1;
7959 descriptor_write[2].descriptorCount = 2;
7960 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007961 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007962
7963 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007964
Tobin Ehlis88452832015-12-03 09:40:56 -07007965 // Create PSO to be used for draw-time errors below
7966 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007967 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07007968 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007969 "out gl_PerVertex {\n"
7970 " vec4 gl_Position;\n"
7971 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07007972 "void main(){\n"
7973 " gl_Position = vec4(1);\n"
7974 "}\n";
7975 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007976 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07007977 "\n"
7978 "layout(location=0) out vec4 x;\n"
7979 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7980 "void main(){\n"
7981 " x = vec4(bar.y);\n"
7982 "}\n";
7983 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7984 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007985 VkPipelineObj pipe(m_device);
7986 pipe.AddShader(&vs);
7987 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007988 pipe.AddColorAttachment();
7989 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007990
7991 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07007992
Karl Schultz6addd812016-02-02 17:17:23 -07007993 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7994 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7995 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7996 // of PSO
7997 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7998 // cmd_pipeline.c
7999 // due to the fact that cmd_alloc_dset_data() has not been called in
8000 // cmd_bind_graphics_pipeline()
8001 // TODO : Want to cause various binding incompatibility issues here to test
8002 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07008003 // First cause various verify_layout_compatibility() fails
8004 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008005 // verify_set_layout_compatibility fail cases:
8006 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07008007 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis10fad692016-07-07 12:00:36 -06008008 "Invalid VkPipelineLayout Object ");
Karl Schultz6addd812016-02-02 17:17:23 -07008009 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8010 VK_PIPELINE_BIND_POINT_GRAPHICS,
8011 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
8012 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008013 m_errorMonitor->VerifyFound();
8014
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008015 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07008016 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8017 " attempting to bind set to index 1");
8018 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8019 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
8020 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008021 m_errorMonitor->VerifyFound();
8022
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008023 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008024 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
8025 // descriptors
8026 m_errorMonitor->SetDesiredFailureMsg(
8027 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06008028 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07008029 vkCmdBindDescriptorSets(
8030 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8031 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008032 m_errorMonitor->VerifyFound();
8033
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008034 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
8035 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07008036 m_errorMonitor->SetDesiredFailureMsg(
8037 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06008038 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07008039 vkCmdBindDescriptorSets(
8040 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8041 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008042 m_errorMonitor->VerifyFound();
8043
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008044 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
8045 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07008046 m_errorMonitor->SetDesiredFailureMsg(
8047 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06008048 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07008049 vkCmdBindDescriptorSets(
8050 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8051 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008052 m_errorMonitor->VerifyFound();
8053
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008054 // Cause INFO messages due to disturbing previously bound Sets
8055 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07008056 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8057 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8058 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008059 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07008060 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008061 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008062 " previously bound as set #0 was disturbed ");
8063 vkCmdBindDescriptorSets(
8064 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8065 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008066 m_errorMonitor->VerifyFound();
8067
Karl Schultz6addd812016-02-02 17:17:23 -07008068 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8069 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8070 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008071 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008073 " newly bound as set #0 so set #1 and "
8074 "any subsequent sets were disturbed ");
8075 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8076 VK_PIPELINE_BIND_POINT_GRAPHICS,
8077 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008078 m_errorMonitor->VerifyFound();
8079
Tobin Ehlis10fad692016-07-07 12:00:36 -06008080 // Now that we're done actively using the pipelineLayout that gfx pipeline
8081 // was created with, we should be able to delete it. Do that now to verify
8082 // that validation obeys pipelineLayout lifetime
8083 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
8084
Tobin Ehlis88452832015-12-03 09:40:56 -07008085 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07008086 // 1. Error due to not binding required set (we actually use same code as
8087 // above to disturb set0)
8088 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8089 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8090 2, &descriptorSet[0], 0, NULL);
8091 vkCmdBindDescriptorSets(
8092 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8093 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
8094 m_errorMonitor->SetDesiredFailureMsg(
8095 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8096 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07008097 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008098 m_errorMonitor->VerifyFound();
8099
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008100 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008101 // 2. Error due to bound set not being compatible with PSO's
8102 // VkPipelineLayout (diff stageFlags in this case)
8103 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8104 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8105 2, &descriptorSet[0], 0, NULL);
8106 m_errorMonitor->SetDesiredFailureMsg(
8107 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8108 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07008109 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008110 m_errorMonitor->VerifyFound();
8111
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008112 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07008113 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008114 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
8115 }
8116 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06008117 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
8118 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008119 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008120 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8121 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008122 vkFreeMemory(m_device->device(), imageMem, NULL);
8123 vkDestroyImage(m_device->device(), image, NULL);
8124 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008125}
Tobin Ehlis559c6382015-11-05 09:52:49 -07008126
Karl Schultz6addd812016-02-02 17:17:23 -07008127TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008128
Karl Schultz6addd812016-02-02 17:17:23 -07008129 m_errorMonitor->SetDesiredFailureMsg(
8130 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008131 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008132
8133 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008134 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008135 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008136 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008137
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008138 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008139}
8140
Karl Schultz6addd812016-02-02 17:17:23 -07008141TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
8142 VkResult err;
8143 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008144
Karl Schultz6addd812016-02-02 17:17:23 -07008145 m_errorMonitor->SetDesiredFailureMsg(
8146 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07008147 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008148
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008149 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008150
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008151 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008152 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06008153 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008154 cmd.commandPool = m_commandPool;
8155 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008156 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06008157
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008158 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06008159 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008160
8161 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008162 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07008163 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008164 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06008165 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008166 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
8167 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008168 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008169
8170 // The error should be caught by validation of the BeginCommandBuffer call
8171 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
8172
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008173 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008174 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008175}
8176
Karl Schultz6addd812016-02-02 17:17:23 -07008177TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008178 // Cause error due to Begin while recording CB
8179 // Then cause 2 errors for attempting to reset CB w/o having
8180 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
8181 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008182 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008183 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008184
8185 ASSERT_NO_FATAL_FAILURE(InitState());
8186
8187 // Calls AllocateCommandBuffers
8188 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
8189
Karl Schultz6addd812016-02-02 17:17:23 -07008190 // Force the failure by setting the Renderpass and Framebuffer fields with
8191 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008192 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07008193 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008194 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8195 cmd_buf_info.pNext = NULL;
8196 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008197 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008198
8199 // Begin CB to transition to recording state
8200 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
8201 // Can't re-begin. This should trigger error
8202 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008203 m_errorMonitor->VerifyFound();
8204
Karl Schultz6addd812016-02-02 17:17:23 -07008205 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8206 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008207 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
8208 // Reset attempt will trigger error due to incorrect CommandPool state
8209 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008210 m_errorMonitor->VerifyFound();
8211
Karl Schultz6addd812016-02-02 17:17:23 -07008212 m_errorMonitor->SetDesiredFailureMsg(
8213 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8214 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008215 // Transition CB to RECORDED state
8216 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
8217 // Now attempting to Begin will implicitly reset, which triggers error
8218 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008219 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008220}
8221
Karl Schultz6addd812016-02-02 17:17:23 -07008222TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008223 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07008224 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008225
Karl Schultz6addd812016-02-02 17:17:23 -07008226 m_errorMonitor->SetDesiredFailureMsg(
8227 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008228 "Invalid Pipeline CreateInfo State: Vtx Shader required");
8229
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008230 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008231 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008232
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008233 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008234 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8235 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06008236
8237 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008238 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8239 ds_pool_ci.pNext = NULL;
8240 ds_pool_ci.maxSets = 1;
8241 ds_pool_ci.poolSizeCount = 1;
8242 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008243
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008244 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008245 err =
8246 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008247 ASSERT_VK_SUCCESS(err);
8248
Tony Barboureb254902015-07-15 12:50:33 -06008249 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008250 dsl_binding.binding = 0;
8251 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8252 dsl_binding.descriptorCount = 1;
8253 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8254 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008255
Tony Barboureb254902015-07-15 12:50:33 -06008256 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008257 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8258 ds_layout_ci.pNext = NULL;
8259 ds_layout_ci.bindingCount = 1;
8260 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06008261
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008262 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008263 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8264 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008265 ASSERT_VK_SUCCESS(err);
8266
8267 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008268 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008269 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008270 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008271 alloc_info.descriptorPool = ds_pool;
8272 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008273 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8274 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008275 ASSERT_VK_SUCCESS(err);
8276
Tony Barboureb254902015-07-15 12:50:33 -06008277 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008278 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8279 pipeline_layout_ci.setLayoutCount = 1;
8280 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008281
8282 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008283 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8284 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008285 ASSERT_VK_SUCCESS(err);
8286
Tobin Ehlise68360f2015-10-01 11:15:13 -06008287 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008288 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06008289
8290 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008291 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8292 vp_state_ci.scissorCount = 1;
8293 vp_state_ci.pScissors = &sc;
8294 vp_state_ci.viewportCount = 1;
8295 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008296
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008297 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8298 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8299 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8300 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8301 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8302 rs_state_ci.depthClampEnable = VK_FALSE;
8303 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8304 rs_state_ci.depthBiasEnable = VK_FALSE;
8305
Tony Barboureb254902015-07-15 12:50:33 -06008306 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008307 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8308 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008309 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008310 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8311 gp_ci.layout = pipeline_layout;
8312 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06008313
8314 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008315 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8316 pc_ci.initialDataSize = 0;
8317 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008318
8319 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06008320 VkPipelineCache pipelineCache;
8321
Karl Schultz6addd812016-02-02 17:17:23 -07008322 err =
8323 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06008324 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008325 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8326 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008327
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008328 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008329
Chia-I Wuf7458c52015-10-26 21:10:41 +08008330 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8331 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8332 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8333 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008334}
Tobin Ehlis912df022015-09-17 08:46:18 -06008335/*// TODO : This test should be good, but needs Tess support in compiler to run
8336TEST_F(VkLayerTest, InvalidPatchControlPoints)
8337{
8338 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06008339 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008340
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008341 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008342 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
8343primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008344
Tobin Ehlis912df022015-09-17 08:46:18 -06008345 ASSERT_NO_FATAL_FAILURE(InitState());
8346 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06008347
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008348 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06008349 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008350 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008351
8352 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8353 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8354 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008355 ds_pool_ci.poolSizeCount = 1;
8356 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06008357
8358 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008359 err = vkCreateDescriptorPool(m_device->device(),
8360VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06008361 ASSERT_VK_SUCCESS(err);
8362
8363 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08008364 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06008365 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08008366 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008367 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8368 dsl_binding.pImmutableSamplers = NULL;
8369
8370 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008371 ds_layout_ci.sType =
8372VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06008373 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008374 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07008375 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06008376
8377 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008378 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8379&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06008380 ASSERT_VK_SUCCESS(err);
8381
8382 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07008383 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
8384VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06008385 ASSERT_VK_SUCCESS(err);
8386
8387 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008388 pipeline_layout_ci.sType =
8389VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06008390 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008391 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008392 pipeline_layout_ci.pSetLayouts = &ds_layout;
8393
8394 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008395 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8396&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06008397 ASSERT_VK_SUCCESS(err);
8398
8399 VkPipelineShaderStageCreateInfo shaderStages[3];
8400 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
8401
Karl Schultz6addd812016-02-02 17:17:23 -07008402 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
8403this);
Tobin Ehlis912df022015-09-17 08:46:18 -06008404 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07008405 VkShaderObj
8406tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
8407this);
8408 VkShaderObj
8409te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
8410this);
Tobin Ehlis912df022015-09-17 08:46:18 -06008411
Karl Schultz6addd812016-02-02 17:17:23 -07008412 shaderStages[0].sType =
8413VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008414 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008415 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07008416 shaderStages[1].sType =
8417VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008418 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008419 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07008420 shaderStages[2].sType =
8421VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008422 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008423 shaderStages[2].shader = te.handle();
8424
8425 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008426 iaCI.sType =
8427VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08008428 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06008429
8430 VkPipelineTessellationStateCreateInfo tsCI = {};
8431 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
8432 tsCI.patchControlPoints = 0; // This will cause an error
8433
8434 VkGraphicsPipelineCreateInfo gp_ci = {};
8435 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8436 gp_ci.pNext = NULL;
8437 gp_ci.stageCount = 3;
8438 gp_ci.pStages = shaderStages;
8439 gp_ci.pVertexInputState = NULL;
8440 gp_ci.pInputAssemblyState = &iaCI;
8441 gp_ci.pTessellationState = &tsCI;
8442 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008443 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06008444 gp_ci.pMultisampleState = NULL;
8445 gp_ci.pDepthStencilState = NULL;
8446 gp_ci.pColorBlendState = NULL;
8447 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8448 gp_ci.layout = pipeline_layout;
8449 gp_ci.renderPass = renderPass();
8450
8451 VkPipelineCacheCreateInfo pc_ci = {};
8452 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8453 pc_ci.pNext = NULL;
8454 pc_ci.initialSize = 0;
8455 pc_ci.initialData = 0;
8456 pc_ci.maxSize = 0;
8457
8458 VkPipeline pipeline;
8459 VkPipelineCache pipelineCache;
8460
Karl Schultz6addd812016-02-02 17:17:23 -07008461 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
8462&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06008463 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008464 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8465&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06008466
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008467 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008468
Chia-I Wuf7458c52015-10-26 21:10:41 +08008469 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8470 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8471 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8472 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06008473}
8474*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06008475// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07008476TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07008477 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008478
Karl Schultz6addd812016-02-02 17:17:23 -07008479 m_errorMonitor->SetDesiredFailureMsg(
8480 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008481 "Gfx Pipeline viewport count (1) must match scissor count (0).");
8482
Tobin Ehlise68360f2015-10-01 11:15:13 -06008483 ASSERT_NO_FATAL_FAILURE(InitState());
8484 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008485
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008486 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008487 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8488 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008489
8490 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008491 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8492 ds_pool_ci.maxSets = 1;
8493 ds_pool_ci.poolSizeCount = 1;
8494 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008495
8496 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008497 err =
8498 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008499 ASSERT_VK_SUCCESS(err);
8500
8501 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008502 dsl_binding.binding = 0;
8503 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8504 dsl_binding.descriptorCount = 1;
8505 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008506
8507 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008508 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8509 ds_layout_ci.bindingCount = 1;
8510 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008511
8512 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008513 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8514 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008515 ASSERT_VK_SUCCESS(err);
8516
8517 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008518 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008519 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008520 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008521 alloc_info.descriptorPool = ds_pool;
8522 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008523 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8524 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008525 ASSERT_VK_SUCCESS(err);
8526
8527 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008528 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8529 pipeline_layout_ci.setLayoutCount = 1;
8530 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008531
8532 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008533 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8534 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008535 ASSERT_VK_SUCCESS(err);
8536
8537 VkViewport vp = {}; // Just need dummy vp to point to
8538
8539 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008540 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8541 vp_state_ci.scissorCount = 0;
8542 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
8543 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008544
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008545 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8546 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8547 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8548 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8549 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8550 rs_state_ci.depthClampEnable = VK_FALSE;
8551 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8552 rs_state_ci.depthBiasEnable = VK_FALSE;
8553
Cody Northropeb3a6c12015-10-05 14:44:45 -06008554 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008555 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008556
Karl Schultz6addd812016-02-02 17:17:23 -07008557 VkShaderObj vs(m_device, bindStateVertShaderText,
8558 VK_SHADER_STAGE_VERTEX_BIT, this);
8559 VkShaderObj fs(m_device, bindStateFragShaderText,
8560 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008561 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008562 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008563 shaderStages[0] = vs.GetStageCreateInfo();
8564 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008565
8566 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008567 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8568 gp_ci.stageCount = 2;
8569 gp_ci.pStages = shaderStages;
8570 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008571 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008572 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8573 gp_ci.layout = pipeline_layout;
8574 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008575
8576 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008577 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008578
8579 VkPipeline pipeline;
8580 VkPipelineCache pipelineCache;
8581
Karl Schultz6addd812016-02-02 17:17:23 -07008582 err =
8583 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008584 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008585 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8586 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008587
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008588 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008589
Chia-I Wuf7458c52015-10-26 21:10:41 +08008590 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8591 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8592 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8593 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008594}
Karl Schultz6addd812016-02-02 17:17:23 -07008595// Don't set viewport state in PSO. This is an error b/c we always need this
8596// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06008597// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07008598TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06008599 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07008600 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008601
Karl Schultz6addd812016-02-02 17:17:23 -07008602 m_errorMonitor->SetDesiredFailureMsg(
8603 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008604 "Gfx Pipeline pViewportState is null. Even if ");
8605
Tobin Ehlise68360f2015-10-01 11:15:13 -06008606 ASSERT_NO_FATAL_FAILURE(InitState());
8607 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008608
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008609 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008610 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8611 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008612
8613 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008614 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8615 ds_pool_ci.maxSets = 1;
8616 ds_pool_ci.poolSizeCount = 1;
8617 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008618
8619 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008620 err =
8621 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008622 ASSERT_VK_SUCCESS(err);
8623
8624 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008625 dsl_binding.binding = 0;
8626 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8627 dsl_binding.descriptorCount = 1;
8628 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008629
8630 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008631 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8632 ds_layout_ci.bindingCount = 1;
8633 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008634
8635 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008636 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8637 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008638 ASSERT_VK_SUCCESS(err);
8639
8640 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008641 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008642 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008643 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008644 alloc_info.descriptorPool = ds_pool;
8645 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008646 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8647 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008648 ASSERT_VK_SUCCESS(err);
8649
8650 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008651 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8652 pipeline_layout_ci.setLayoutCount = 1;
8653 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008654
8655 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008656 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8657 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008658 ASSERT_VK_SUCCESS(err);
8659
8660 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8661 // Set scissor as dynamic to avoid second error
8662 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008663 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8664 dyn_state_ci.dynamicStateCount = 1;
8665 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008666
Cody Northropeb3a6c12015-10-05 14:44:45 -06008667 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008668 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008669
Karl Schultz6addd812016-02-02 17:17:23 -07008670 VkShaderObj vs(m_device, bindStateVertShaderText,
8671 VK_SHADER_STAGE_VERTEX_BIT, this);
8672 VkShaderObj fs(m_device, bindStateFragShaderText,
8673 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008674 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008675 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008676 shaderStages[0] = vs.GetStageCreateInfo();
8677 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008678
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008679
8680 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8681 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8682 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8683 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8684 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8685 rs_state_ci.depthClampEnable = VK_FALSE;
8686 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8687 rs_state_ci.depthBiasEnable = VK_FALSE;
8688
Tobin Ehlise68360f2015-10-01 11:15:13 -06008689 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008690 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8691 gp_ci.stageCount = 2;
8692 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008693 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008694 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
8695 // should cause validation error
8696 gp_ci.pDynamicState = &dyn_state_ci;
8697 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8698 gp_ci.layout = pipeline_layout;
8699 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008700
8701 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008702 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008703
8704 VkPipeline pipeline;
8705 VkPipelineCache pipelineCache;
8706
Karl Schultz6addd812016-02-02 17:17:23 -07008707 err =
8708 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008709 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008710 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8711 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008712
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008713 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008714
Chia-I Wuf7458c52015-10-26 21:10:41 +08008715 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8716 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8717 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8718 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008719}
8720// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07008721// Then run second test where dynamic scissor count doesn't match PSO scissor
8722// count
8723TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
8724 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008725
Karl Schultz6addd812016-02-02 17:17:23 -07008726 m_errorMonitor->SetDesiredFailureMsg(
8727 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008728 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
8729
Tobin Ehlise68360f2015-10-01 11:15:13 -06008730 ASSERT_NO_FATAL_FAILURE(InitState());
8731 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008732
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008733 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008734 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8735 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008736
8737 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008738 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8739 ds_pool_ci.maxSets = 1;
8740 ds_pool_ci.poolSizeCount = 1;
8741 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008742
8743 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008744 err =
8745 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008746 ASSERT_VK_SUCCESS(err);
8747
8748 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008749 dsl_binding.binding = 0;
8750 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8751 dsl_binding.descriptorCount = 1;
8752 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008753
8754 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008755 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8756 ds_layout_ci.bindingCount = 1;
8757 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008758
8759 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008760 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8761 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008762 ASSERT_VK_SUCCESS(err);
8763
8764 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008765 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008766 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008767 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008768 alloc_info.descriptorPool = ds_pool;
8769 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008770 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8771 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008772 ASSERT_VK_SUCCESS(err);
8773
8774 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008775 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8776 pipeline_layout_ci.setLayoutCount = 1;
8777 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008778
8779 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008780 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8781 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008782 ASSERT_VK_SUCCESS(err);
8783
8784 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008785 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8786 vp_state_ci.viewportCount = 1;
8787 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
8788 vp_state_ci.scissorCount = 1;
8789 vp_state_ci.pScissors =
8790 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008791
8792 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8793 // Set scissor as dynamic to avoid that error
8794 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008795 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8796 dyn_state_ci.dynamicStateCount = 1;
8797 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008798
Cody Northropeb3a6c12015-10-05 14:44:45 -06008799 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008800 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008801
Karl Schultz6addd812016-02-02 17:17:23 -07008802 VkShaderObj vs(m_device, bindStateVertShaderText,
8803 VK_SHADER_STAGE_VERTEX_BIT, this);
8804 VkShaderObj fs(m_device, bindStateFragShaderText,
8805 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008806 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008807 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008808 shaderStages[0] = vs.GetStageCreateInfo();
8809 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008810
Cody Northropf6622dc2015-10-06 10:33:21 -06008811 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8812 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8813 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008814 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008815 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008816 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008817 vi_ci.pVertexAttributeDescriptions = nullptr;
8818
8819 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8820 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8821 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8822
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008823 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008824 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06008825 rs_ci.pNext = nullptr;
8826
Mark Youngc89c6312016-03-31 16:03:20 -06008827 VkPipelineColorBlendAttachmentState att = {};
8828 att.blendEnable = VK_FALSE;
8829 att.colorWriteMask = 0xf;
8830
Cody Northropf6622dc2015-10-06 10:33:21 -06008831 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8832 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8833 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008834 cb_ci.attachmentCount = 1;
8835 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008836
Tobin Ehlise68360f2015-10-01 11:15:13 -06008837 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008838 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8839 gp_ci.stageCount = 2;
8840 gp_ci.pStages = shaderStages;
8841 gp_ci.pVertexInputState = &vi_ci;
8842 gp_ci.pInputAssemblyState = &ia_ci;
8843 gp_ci.pViewportState = &vp_state_ci;
8844 gp_ci.pRasterizationState = &rs_ci;
8845 gp_ci.pColorBlendState = &cb_ci;
8846 gp_ci.pDynamicState = &dyn_state_ci;
8847 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8848 gp_ci.layout = pipeline_layout;
8849 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008850
8851 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008852 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008853
8854 VkPipeline pipeline;
8855 VkPipelineCache pipelineCache;
8856
Karl Schultz6addd812016-02-02 17:17:23 -07008857 err =
8858 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008859 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008860 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8861 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008862
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008863 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008864
Tobin Ehlisd332f282015-10-02 11:00:56 -06008865 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008866 // First need to successfully create the PSO from above by setting
8867 // pViewports
8868 m_errorMonitor->SetDesiredFailureMsg(
8869 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8870 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
8871 "scissorCount is 1. These counts must match.");
8872
8873 VkViewport vp = {}; // Just need dummy vp to point to
8874 vp_state_ci.pViewports = &vp;
8875 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8876 &gp_ci, NULL, &pipeline);
8877 ASSERT_VK_SUCCESS(err);
8878 BeginCommandBuffer();
8879 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8880 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
8881 VkRect2D scissors[2] = {}; // don't care about data
8882 // Count of 2 doesn't match PSO count of 1
8883 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
8884 Draw(1, 0, 0, 0);
8885
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008886 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008887
8888 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8889 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8890 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8891 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008892 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008893}
8894// Create PSO w/o non-zero scissorCount but no scissor data
8895// Then run second test where dynamic viewportCount doesn't match PSO
8896// viewportCount
8897TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8898 VkResult err;
8899
8900 m_errorMonitor->SetDesiredFailureMsg(
8901 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8902 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
8903
8904 ASSERT_NO_FATAL_FAILURE(InitState());
8905 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8906
8907 VkDescriptorPoolSize ds_type_count = {};
8908 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8909 ds_type_count.descriptorCount = 1;
8910
8911 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8912 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8913 ds_pool_ci.maxSets = 1;
8914 ds_pool_ci.poolSizeCount = 1;
8915 ds_pool_ci.pPoolSizes = &ds_type_count;
8916
8917 VkDescriptorPool ds_pool;
8918 err =
8919 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
8920 ASSERT_VK_SUCCESS(err);
8921
8922 VkDescriptorSetLayoutBinding dsl_binding = {};
8923 dsl_binding.binding = 0;
8924 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8925 dsl_binding.descriptorCount = 1;
8926 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8927
8928 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8929 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8930 ds_layout_ci.bindingCount = 1;
8931 ds_layout_ci.pBindings = &dsl_binding;
8932
8933 VkDescriptorSetLayout ds_layout;
8934 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8935 &ds_layout);
8936 ASSERT_VK_SUCCESS(err);
8937
8938 VkDescriptorSet descriptorSet;
8939 VkDescriptorSetAllocateInfo alloc_info = {};
8940 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8941 alloc_info.descriptorSetCount = 1;
8942 alloc_info.descriptorPool = ds_pool;
8943 alloc_info.pSetLayouts = &ds_layout;
8944 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8945 &descriptorSet);
8946 ASSERT_VK_SUCCESS(err);
8947
8948 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8949 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8950 pipeline_layout_ci.setLayoutCount = 1;
8951 pipeline_layout_ci.pSetLayouts = &ds_layout;
8952
8953 VkPipelineLayout pipeline_layout;
8954 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8955 &pipeline_layout);
8956 ASSERT_VK_SUCCESS(err);
8957
8958 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8959 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8960 vp_state_ci.scissorCount = 1;
8961 vp_state_ci.pScissors =
8962 NULL; // Null scissor w/ count of 1 should cause error
8963 vp_state_ci.viewportCount = 1;
8964 vp_state_ci.pViewports =
8965 NULL; // vp is dynamic (below) so this won't cause error
8966
8967 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8968 // Set scissor as dynamic to avoid that error
8969 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8970 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8971 dyn_state_ci.dynamicStateCount = 1;
8972 dyn_state_ci.pDynamicStates = &vp_state;
8973
8974 VkPipelineShaderStageCreateInfo shaderStages[2];
8975 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8976
8977 VkShaderObj vs(m_device, bindStateVertShaderText,
8978 VK_SHADER_STAGE_VERTEX_BIT, this);
8979 VkShaderObj fs(m_device, bindStateFragShaderText,
8980 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008981 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008982 // but add it to be able to run on more devices
8983 shaderStages[0] = vs.GetStageCreateInfo();
8984 shaderStages[1] = fs.GetStageCreateInfo();
8985
8986 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8987 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8988 vi_ci.pNext = nullptr;
8989 vi_ci.vertexBindingDescriptionCount = 0;
8990 vi_ci.pVertexBindingDescriptions = nullptr;
8991 vi_ci.vertexAttributeDescriptionCount = 0;
8992 vi_ci.pVertexAttributeDescriptions = nullptr;
8993
8994 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8995 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8996 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8997
8998 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8999 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9000 rs_ci.pNext = nullptr;
9001
Mark Youngc89c6312016-03-31 16:03:20 -06009002 VkPipelineColorBlendAttachmentState att = {};
9003 att.blendEnable = VK_FALSE;
9004 att.colorWriteMask = 0xf;
9005
Karl Schultz6addd812016-02-02 17:17:23 -07009006 VkPipelineColorBlendStateCreateInfo cb_ci = {};
9007 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
9008 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06009009 cb_ci.attachmentCount = 1;
9010 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07009011
9012 VkGraphicsPipelineCreateInfo gp_ci = {};
9013 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9014 gp_ci.stageCount = 2;
9015 gp_ci.pStages = shaderStages;
9016 gp_ci.pVertexInputState = &vi_ci;
9017 gp_ci.pInputAssemblyState = &ia_ci;
9018 gp_ci.pViewportState = &vp_state_ci;
9019 gp_ci.pRasterizationState = &rs_ci;
9020 gp_ci.pColorBlendState = &cb_ci;
9021 gp_ci.pDynamicState = &dyn_state_ci;
9022 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9023 gp_ci.layout = pipeline_layout;
9024 gp_ci.renderPass = renderPass();
9025
9026 VkPipelineCacheCreateInfo pc_ci = {};
9027 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9028
9029 VkPipeline pipeline;
9030 VkPipelineCache pipelineCache;
9031
9032 err =
9033 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9034 ASSERT_VK_SUCCESS(err);
9035 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9036 &gp_ci, NULL, &pipeline);
9037
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009038 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07009039
9040 // Now hit second fail case where we set scissor w/ different count than PSO
9041 // First need to successfully create the PSO from above by setting
9042 // pViewports
9043 m_errorMonitor->SetDesiredFailureMsg(
9044 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9045 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
9046 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009047
Tobin Ehlisd332f282015-10-02 11:00:56 -06009048 VkRect2D sc = {}; // Just need dummy vp to point to
9049 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07009050 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9051 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06009052 ASSERT_VK_SUCCESS(err);
9053 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009054 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9055 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06009056 VkViewport viewports[2] = {}; // don't care about data
9057 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07009058 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06009059 Draw(1, 0, 0, 0);
9060
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009061 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009062
Chia-I Wuf7458c52015-10-26 21:10:41 +08009063 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9064 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9065 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9066 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009067 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009068}
9069
Mark Young7394fdd2016-03-31 14:56:43 -06009070TEST_F(VkLayerTest, PSOLineWidthInvalid) {
9071 VkResult err;
9072
9073 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06009074 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06009075
9076 ASSERT_NO_FATAL_FAILURE(InitState());
9077 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9078
9079 VkDescriptorPoolSize ds_type_count = {};
9080 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9081 ds_type_count.descriptorCount = 1;
9082
9083 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9084 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9085 ds_pool_ci.maxSets = 1;
9086 ds_pool_ci.poolSizeCount = 1;
9087 ds_pool_ci.pPoolSizes = &ds_type_count;
9088
9089 VkDescriptorPool ds_pool;
9090 err =
9091 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9092 ASSERT_VK_SUCCESS(err);
9093
9094 VkDescriptorSetLayoutBinding dsl_binding = {};
9095 dsl_binding.binding = 0;
9096 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9097 dsl_binding.descriptorCount = 1;
9098 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9099
9100 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9101 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9102 ds_layout_ci.bindingCount = 1;
9103 ds_layout_ci.pBindings = &dsl_binding;
9104
9105 VkDescriptorSetLayout ds_layout;
9106 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9107 &ds_layout);
9108 ASSERT_VK_SUCCESS(err);
9109
9110 VkDescriptorSet descriptorSet;
9111 VkDescriptorSetAllocateInfo alloc_info = {};
9112 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9113 alloc_info.descriptorSetCount = 1;
9114 alloc_info.descriptorPool = ds_pool;
9115 alloc_info.pSetLayouts = &ds_layout;
9116 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9117 &descriptorSet);
9118 ASSERT_VK_SUCCESS(err);
9119
9120 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
9121 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9122 pipeline_layout_ci.setLayoutCount = 1;
9123 pipeline_layout_ci.pSetLayouts = &ds_layout;
9124
9125 VkPipelineLayout pipeline_layout;
9126 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9127 &pipeline_layout);
9128 ASSERT_VK_SUCCESS(err);
9129
9130 VkPipelineViewportStateCreateInfo vp_state_ci = {};
9131 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9132 vp_state_ci.scissorCount = 1;
9133 vp_state_ci.pScissors = NULL;
9134 vp_state_ci.viewportCount = 1;
9135 vp_state_ci.pViewports = NULL;
9136
9137 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
9138 VK_DYNAMIC_STATE_SCISSOR,
9139 VK_DYNAMIC_STATE_LINE_WIDTH};
9140 // Set scissor as dynamic to avoid that error
9141 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
9142 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9143 dyn_state_ci.dynamicStateCount = 2;
9144 dyn_state_ci.pDynamicStates = dynamic_states;
9145
9146 VkPipelineShaderStageCreateInfo shaderStages[2];
9147 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
9148
9149 VkShaderObj vs(m_device, bindStateVertShaderText,
9150 VK_SHADER_STAGE_VERTEX_BIT, this);
9151 VkShaderObj fs(m_device, bindStateFragShaderText,
9152 VK_SHADER_STAGE_FRAGMENT_BIT,
9153 this); // TODO - We shouldn't need a fragment shader
9154 // but add it to be able to run on more devices
9155 shaderStages[0] = vs.GetStageCreateInfo();
9156 shaderStages[1] = fs.GetStageCreateInfo();
9157
9158 VkPipelineVertexInputStateCreateInfo vi_ci = {};
9159 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9160 vi_ci.pNext = nullptr;
9161 vi_ci.vertexBindingDescriptionCount = 0;
9162 vi_ci.pVertexBindingDescriptions = nullptr;
9163 vi_ci.vertexAttributeDescriptionCount = 0;
9164 vi_ci.pVertexAttributeDescriptions = nullptr;
9165
9166 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
9167 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9168 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9169
9170 VkPipelineRasterizationStateCreateInfo rs_ci = {};
9171 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9172 rs_ci.pNext = nullptr;
9173
Mark Young47107952016-05-02 15:59:55 -06009174 // Check too low (line width of -1.0f).
9175 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06009176
9177 VkPipelineColorBlendAttachmentState att = {};
9178 att.blendEnable = VK_FALSE;
9179 att.colorWriteMask = 0xf;
9180
9181 VkPipelineColorBlendStateCreateInfo cb_ci = {};
9182 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
9183 cb_ci.pNext = nullptr;
9184 cb_ci.attachmentCount = 1;
9185 cb_ci.pAttachments = &att;
9186
9187 VkGraphicsPipelineCreateInfo gp_ci = {};
9188 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9189 gp_ci.stageCount = 2;
9190 gp_ci.pStages = shaderStages;
9191 gp_ci.pVertexInputState = &vi_ci;
9192 gp_ci.pInputAssemblyState = &ia_ci;
9193 gp_ci.pViewportState = &vp_state_ci;
9194 gp_ci.pRasterizationState = &rs_ci;
9195 gp_ci.pColorBlendState = &cb_ci;
9196 gp_ci.pDynamicState = &dyn_state_ci;
9197 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9198 gp_ci.layout = pipeline_layout;
9199 gp_ci.renderPass = renderPass();
9200
9201 VkPipelineCacheCreateInfo pc_ci = {};
9202 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9203
9204 VkPipeline pipeline;
9205 VkPipelineCache pipelineCache;
9206
9207 err =
9208 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9209 ASSERT_VK_SUCCESS(err);
9210 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9211 &gp_ci, NULL, &pipeline);
9212
9213 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009214 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009215
9216 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9217 "Attempt to set lineWidth to 65536");
9218
9219 // Check too high (line width of 65536.0f).
9220 rs_ci.lineWidth = 65536.0f;
9221
9222 err =
9223 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9224 ASSERT_VK_SUCCESS(err);
9225 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9226 &gp_ci, NULL, &pipeline);
9227
9228 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009229 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009230
9231 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06009232 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06009233
9234 dyn_state_ci.dynamicStateCount = 3;
9235
9236 rs_ci.lineWidth = 1.0f;
9237
9238 err =
9239 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9240 ASSERT_VK_SUCCESS(err);
9241 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9242 &gp_ci, NULL, &pipeline);
9243 BeginCommandBuffer();
9244 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9245 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
9246
9247 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06009248 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06009249 m_errorMonitor->VerifyFound();
9250
9251 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9252 "Attempt to set lineWidth to 65536");
9253
9254 // Check too high with dynamic setting.
9255 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
9256 m_errorMonitor->VerifyFound();
9257 EndCommandBuffer();
9258
9259 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9260 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9261 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9262 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009263 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009264}
9265
Karl Schultz6addd812016-02-02 17:17:23 -07009266TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009267 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009268 m_errorMonitor->SetDesiredFailureMsg(
9269 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009270 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009271
9272 ASSERT_NO_FATAL_FAILURE(InitState());
9273 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009274
Tony Barbourfe3351b2015-07-28 10:17:20 -06009275 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009276 // Don't care about RenderPass handle b/c error should be flagged before
9277 // that
9278 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
9279 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009280
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009281 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009282}
9283
Karl Schultz6addd812016-02-02 17:17:23 -07009284TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009285 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009286 m_errorMonitor->SetDesiredFailureMsg(
9287 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009288 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009289
9290 ASSERT_NO_FATAL_FAILURE(InitState());
9291 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009292
Tony Barbourfe3351b2015-07-28 10:17:20 -06009293 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009294 // Just create a dummy Renderpass that's non-NULL so we can get to the
9295 // proper error
Chris Forbes38ae7c42016-06-21 20:51:44 +12009296 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
Karl Schultz6addd812016-02-02 17:17:23 -07009297 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009298
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009299 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009300}
9301
Chris Forbes2eeabe32016-06-21 20:52:34 +12009302TEST_F(VkLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
9303 m_errorMonitor->ExpectSuccess();
9304
9305 ASSERT_NO_FATAL_FAILURE(InitState());
9306 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9307
9308 BeginCommandBuffer(); // framework implicitly begins the renderpass.
9309 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // end implicit.
9310
9311 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
9312 VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9313 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9314 m_errorMonitor->VerifyNotFound();
9315 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
9316 VK_SUBPASS_CONTENTS_INLINE);
9317 m_errorMonitor->VerifyNotFound();
9318 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9319 m_errorMonitor->VerifyNotFound();
9320
9321 m_commandBuffer->EndCommandBuffer();
9322 m_errorMonitor->VerifyNotFound();
9323}
9324
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009325TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
9326 TEST_DESCRIPTION("Begin a renderPass where clearValueCount is less than"
9327 "the number of renderPass attachments that use loadOp"
9328 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
9329
9330 ASSERT_NO_FATAL_FAILURE(InitState());
9331 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9332
9333 // Create a renderPass with a single attachment that uses loadOp CLEAR
9334 VkAttachmentReference attach = {};
9335 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
9336 VkSubpassDescription subpass = {};
9337 subpass.inputAttachmentCount = 1;
9338 subpass.pInputAttachments = &attach;
9339 VkRenderPassCreateInfo rpci = {};
9340 rpci.subpassCount = 1;
9341 rpci.pSubpasses = &subpass;
9342 rpci.attachmentCount = 1;
9343 VkAttachmentDescription attach_desc = {};
9344 attach_desc.format = VK_FORMAT_UNDEFINED;
9345 // Set loadOp to CLEAR
9346 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
9347 rpci.pAttachments = &attach_desc;
9348 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9349 VkRenderPass rp;
9350 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
9351
9352 VkCommandBufferInheritanceInfo hinfo = {};
9353 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
9354 hinfo.renderPass = VK_NULL_HANDLE;
9355 hinfo.subpass = 0;
9356 hinfo.framebuffer = VK_NULL_HANDLE;
9357 hinfo.occlusionQueryEnable = VK_FALSE;
9358 hinfo.queryFlags = 0;
9359 hinfo.pipelineStatistics = 0;
9360 VkCommandBufferBeginInfo info = {};
9361 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
9362 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9363 info.pInheritanceInfo = &hinfo;
9364
9365 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
9366 VkRenderPassBeginInfo rp_begin = {};
9367 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
9368 rp_begin.pNext = NULL;
9369 rp_begin.renderPass = renderPass();
9370 rp_begin.framebuffer = framebuffer();
9371 rp_begin.clearValueCount = 0; // Should be 1
9372
9373 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis7f0416c2016-07-15 16:01:13 -06009374 " has a clearValueCount of 0 but "
9375 "there must be at least 1 entries in "
9376 "pClearValues array to account for ");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009377
9378 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
9379 VK_SUBPASS_CONTENTS_INLINE);
9380
9381 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06009382
9383 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009384}
9385
Cody Northrop3bb4d962016-05-09 16:15:57 -06009386TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
9387
9388 TEST_DESCRIPTION("End a command buffer with an active render pass");
9389
9390 m_errorMonitor->SetDesiredFailureMsg(
9391 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9392 "It is invalid to issue this call inside an active render pass");
9393
9394 ASSERT_NO_FATAL_FAILURE(InitState());
9395 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9396
9397 // The framework's BeginCommandBuffer calls CreateRenderPass
9398 BeginCommandBuffer();
9399
9400 // Call directly into vkEndCommandBuffer instead of the
9401 // the framework's EndCommandBuffer, which inserts a
9402 // vkEndRenderPass
9403 vkEndCommandBuffer(m_commandBuffer->GetBufferHandle());
9404
9405 m_errorMonitor->VerifyFound();
9406
9407 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
9408 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
9409}
9410
Karl Schultz6addd812016-02-02 17:17:23 -07009411TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009412 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07009413 m_errorMonitor->SetDesiredFailureMsg(
9414 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009415 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009416
9417 ASSERT_NO_FATAL_FAILURE(InitState());
9418 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009419
9420 // Renderpass is started here
9421 BeginCommandBuffer();
9422
9423 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009424 vk_testing::Buffer dstBuffer;
9425 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009426
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009427 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009428
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009429 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009430}
9431
Karl Schultz6addd812016-02-02 17:17:23 -07009432TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009433 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07009434 m_errorMonitor->SetDesiredFailureMsg(
9435 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009436 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009437
9438 ASSERT_NO_FATAL_FAILURE(InitState());
9439 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009440
9441 // Renderpass is started here
9442 BeginCommandBuffer();
9443
9444 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009445 vk_testing::Buffer dstBuffer;
9446 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009447
Karl Schultz6addd812016-02-02 17:17:23 -07009448 VkDeviceSize dstOffset = 0;
9449 VkDeviceSize dataSize = 1024;
Karl Schultzee344492016-07-11 15:09:57 -06009450 const void *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009451
Karl Schultz6addd812016-02-02 17:17:23 -07009452 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
9453 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009454
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009455 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009456}
9457
Karl Schultz6addd812016-02-02 17:17:23 -07009458TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009459 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009460 m_errorMonitor->SetDesiredFailureMsg(
9461 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009462 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009463
9464 ASSERT_NO_FATAL_FAILURE(InitState());
9465 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009466
9467 // Renderpass is started here
9468 BeginCommandBuffer();
9469
Michael Lentine0a369f62016-02-03 16:51:46 -06009470 VkClearColorValue clear_color;
9471 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07009472 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9473 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9474 const int32_t tex_width = 32;
9475 const int32_t tex_height = 32;
9476 VkImageCreateInfo image_create_info = {};
9477 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9478 image_create_info.pNext = NULL;
9479 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9480 image_create_info.format = tex_format;
9481 image_create_info.extent.width = tex_width;
9482 image_create_info.extent.height = tex_height;
9483 image_create_info.extent.depth = 1;
9484 image_create_info.mipLevels = 1;
9485 image_create_info.arrayLayers = 1;
9486 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9487 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9488 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009489
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009490 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07009491 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
9492 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009493
Karl Schultz6addd812016-02-02 17:17:23 -07009494 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
9495 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009496
Karl Schultz6addd812016-02-02 17:17:23 -07009497 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
9498 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009499
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009500 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009501}
9502
Karl Schultz6addd812016-02-02 17:17:23 -07009503TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009504 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009505 m_errorMonitor->SetDesiredFailureMsg(
9506 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009507 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009508
9509 ASSERT_NO_FATAL_FAILURE(InitState());
9510 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009511
9512 // Renderpass is started here
9513 BeginCommandBuffer();
9514
9515 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07009516 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009517 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
9518 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9519 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
9520 image_create_info.extent.width = 64;
9521 image_create_info.extent.height = 64;
9522 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9523 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009524
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009525 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07009526 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
9527 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009528
Karl Schultz6addd812016-02-02 17:17:23 -07009529 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
9530 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009531
Karl Schultz6addd812016-02-02 17:17:23 -07009532 vkCmdClearDepthStencilImage(
9533 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
9534 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
9535 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009536
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009537 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009538}
9539
Karl Schultz6addd812016-02-02 17:17:23 -07009540TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009541 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009542 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009543
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009544 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -06009545 "vkCmdClearAttachments(): This call "
Karl Schultz6addd812016-02-02 17:17:23 -07009546 "must be issued inside an active "
9547 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009548
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009549 ASSERT_NO_FATAL_FAILURE(InitState());
9550 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009551
9552 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009553 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009554 ASSERT_VK_SUCCESS(err);
9555
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009556 VkClearAttachment color_attachment;
9557 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9558 color_attachment.clearValue.color.float32[0] = 0;
9559 color_attachment.clearValue.color.float32[1] = 0;
9560 color_attachment.clearValue.color.float32[2] = 0;
9561 color_attachment.clearValue.color.float32[3] = 0;
9562 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009563 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
9564 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
9565 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009566
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009567 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009568}
9569
Karl Schultz9e66a292016-04-21 15:57:51 -06009570TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
9571 // Try to add a buffer memory barrier with no buffer.
9572 m_errorMonitor->SetDesiredFailureMsg(
9573 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9574 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
9575
9576 ASSERT_NO_FATAL_FAILURE(InitState());
9577 BeginCommandBuffer();
9578
9579 VkBufferMemoryBarrier buf_barrier = {};
9580 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9581 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9582 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9583 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9584 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9585 buf_barrier.buffer = VK_NULL_HANDLE;
9586 buf_barrier.offset = 0;
9587 buf_barrier.size = VK_WHOLE_SIZE;
9588 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9589 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
9590 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
9591
9592 m_errorMonitor->VerifyFound();
9593}
9594
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009595TEST_F(VkLayerTest, InvalidBarriers) {
9596 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
9597
9598 m_errorMonitor->SetDesiredFailureMsg(
9599 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
9600
9601 ASSERT_NO_FATAL_FAILURE(InitState());
9602 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9603
9604 VkMemoryBarrier mem_barrier = {};
9605 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
9606 mem_barrier.pNext = NULL;
9607 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9608 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9609 BeginCommandBuffer();
9610 // BeginCommandBuffer() starts a render pass
9611 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9612 VK_PIPELINE_STAGE_HOST_BIT,
9613 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
9614 &mem_barrier, 0, nullptr, 0, nullptr);
9615 m_errorMonitor->VerifyFound();
9616
9617 m_errorMonitor->SetDesiredFailureMsg(
9618 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9619 "Image Layout cannot be transitioned to UNDEFINED");
9620 VkImageObj image(m_device);
9621 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
9622 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9623 ASSERT_TRUE(image.initialized());
9624 VkImageMemoryBarrier img_barrier = {};
9625 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9626 img_barrier.pNext = NULL;
9627 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9628 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9629 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9630 // New layout can't be UNDEFINED
9631 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9632 img_barrier.image = image.handle();
9633 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9634 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9635 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9636 img_barrier.subresourceRange.baseArrayLayer = 0;
9637 img_barrier.subresourceRange.baseMipLevel = 0;
9638 img_barrier.subresourceRange.layerCount = 1;
9639 img_barrier.subresourceRange.levelCount = 1;
9640 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9641 VK_PIPELINE_STAGE_HOST_BIT,
9642 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9643 nullptr, 1, &img_barrier);
9644 m_errorMonitor->VerifyFound();
9645 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9646
9647 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9648 "Subresource must have the sum of the "
9649 "baseArrayLayer");
9650 // baseArrayLayer + layerCount must be <= image's arrayLayers
9651 img_barrier.subresourceRange.baseArrayLayer = 1;
9652 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9653 VK_PIPELINE_STAGE_HOST_BIT,
9654 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9655 nullptr, 1, &img_barrier);
9656 m_errorMonitor->VerifyFound();
9657 img_barrier.subresourceRange.baseArrayLayer = 0;
9658
9659 m_errorMonitor->SetDesiredFailureMsg(
9660 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9661 "Subresource must have the sum of the baseMipLevel");
9662 // baseMipLevel + levelCount must be <= image's mipLevels
9663 img_barrier.subresourceRange.baseMipLevel = 1;
9664 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9665 VK_PIPELINE_STAGE_HOST_BIT,
9666 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9667 nullptr, 1, &img_barrier);
9668 m_errorMonitor->VerifyFound();
9669 img_barrier.subresourceRange.baseMipLevel = 0;
9670
9671 m_errorMonitor->SetDesiredFailureMsg(
9672 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9673 "Buffer Barriers cannot be used during a render pass");
9674 vk_testing::Buffer buffer;
9675 buffer.init(*m_device, 256);
9676 VkBufferMemoryBarrier buf_barrier = {};
9677 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9678 buf_barrier.pNext = NULL;
9679 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9680 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9681 buf_barrier.buffer = buffer.handle();
9682 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9683 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9684 buf_barrier.offset = 0;
9685 buf_barrier.size = VK_WHOLE_SIZE;
9686 // Can't send buffer barrier during a render pass
9687 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9688 VK_PIPELINE_STAGE_HOST_BIT,
9689 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9690 &buf_barrier, 0, nullptr);
9691 m_errorMonitor->VerifyFound();
9692 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9693
9694 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9695 "which is not less than total size");
9696 buf_barrier.offset = 257;
9697 // Offset greater than total size
9698 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9699 VK_PIPELINE_STAGE_HOST_BIT,
9700 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9701 &buf_barrier, 0, nullptr);
9702 m_errorMonitor->VerifyFound();
9703 buf_barrier.offset = 0;
9704
9705 m_errorMonitor->SetDesiredFailureMsg(
9706 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
9707 buf_barrier.size = 257;
9708 // Size greater than total size
9709 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9710 VK_PIPELINE_STAGE_HOST_BIT,
9711 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9712 &buf_barrier, 0, nullptr);
9713 m_errorMonitor->VerifyFound();
9714 buf_barrier.size = VK_WHOLE_SIZE;
9715
9716 m_errorMonitor->SetDesiredFailureMsg(
9717 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9718 "Image is a depth and stencil format and thus must "
9719 "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
9720 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
9721 VkDepthStencilObj ds_image(m_device);
9722 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
9723 ASSERT_TRUE(ds_image.initialized());
9724 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9725 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9726 img_barrier.image = ds_image.handle();
9727 // Leave aspectMask at COLOR on purpose
9728 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9729 VK_PIPELINE_STAGE_HOST_BIT,
9730 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9731 nullptr, 1, &img_barrier);
9732 m_errorMonitor->VerifyFound();
9733}
9734
Karl Schultz6addd812016-02-02 17:17:23 -07009735TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009736 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009737 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009738
Karl Schultz6addd812016-02-02 17:17:23 -07009739 m_errorMonitor->SetDesiredFailureMsg(
9740 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009741 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
9742
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009743 ASSERT_NO_FATAL_FAILURE(InitState());
9744 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009745 uint32_t qfi = 0;
9746 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009747 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9748 buffCI.size = 1024;
9749 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9750 buffCI.queueFamilyIndexCount = 1;
9751 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009752
9753 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009754 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009755 ASSERT_VK_SUCCESS(err);
9756
9757 BeginCommandBuffer();
9758 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009759 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9760 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009761 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07009762 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
9763 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009764
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009765 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009766
Chia-I Wuf7458c52015-10-26 21:10:41 +08009767 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009768}
9769
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009770TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9771 // Create an out-of-range queueFamilyIndex
9772 m_errorMonitor->SetDesiredFailureMsg(
9773 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesde628532016-04-21 16:30:17 -06009774 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
9775 "of the indices specified when the device was created, via the "
9776 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009777
9778 ASSERT_NO_FATAL_FAILURE(InitState());
9779 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9780 VkBufferCreateInfo buffCI = {};
9781 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9782 buffCI.size = 1024;
9783 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9784 buffCI.queueFamilyIndexCount = 1;
9785 // Introduce failure by specifying invalid queue_family_index
9786 uint32_t qfi = 777;
9787 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06009788 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009789
9790 VkBuffer ib;
9791 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
9792
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009793 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009794 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009795}
9796
Karl Schultz6addd812016-02-02 17:17:23 -07009797TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
9798 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
9799 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009800
Karl Schultz6addd812016-02-02 17:17:23 -07009801 m_errorMonitor->SetDesiredFailureMsg(
9802 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009803 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009804
9805 ASSERT_NO_FATAL_FAILURE(InitState());
9806 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009807
9808 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009809 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009810 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
9811 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009812
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009813 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009814}
9815
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009816TEST_F(VkLayerTest, DSUsageBitsErrors) {
9817 TEST_DESCRIPTION("Attempt to update descriptor sets for images and buffers "
9818 "that do not have correct usage bits sets.");
9819 VkResult err;
9820
9821 ASSERT_NO_FATAL_FAILURE(InitState());
9822 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9823 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9824 ds_type_count[i].type = VkDescriptorType(i);
9825 ds_type_count[i].descriptorCount = 1;
9826 }
9827 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9828 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9829 ds_pool_ci.pNext = NULL;
9830 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9831 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9832 ds_pool_ci.pPoolSizes = ds_type_count;
9833
9834 VkDescriptorPool ds_pool;
9835 err =
9836 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9837 ASSERT_VK_SUCCESS(err);
9838
9839 // Create 10 layouts where each has a single descriptor of different type
9840 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] =
9841 {};
9842 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9843 dsl_binding[i].binding = 0;
9844 dsl_binding[i].descriptorType = VkDescriptorType(i);
9845 dsl_binding[i].descriptorCount = 1;
9846 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9847 dsl_binding[i].pImmutableSamplers = NULL;
9848 }
9849
9850 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9851 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9852 ds_layout_ci.pNext = NULL;
9853 ds_layout_ci.bindingCount = 1;
9854 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9855 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9856 ds_layout_ci.pBindings = dsl_binding + i;
9857 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
9858 NULL, ds_layouts + i);
9859 ASSERT_VK_SUCCESS(err);
9860 }
9861 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9862 VkDescriptorSetAllocateInfo alloc_info = {};
9863 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9864 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9865 alloc_info.descriptorPool = ds_pool;
9866 alloc_info.pSetLayouts = ds_layouts;
9867 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9868 descriptor_sets);
9869 ASSERT_VK_SUCCESS(err);
9870
9871 // Create a buffer & bufferView to be used for invalid updates
9872 VkBufferCreateInfo buff_ci = {};
9873 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9874 // This usage is not valid for any descriptor type
9875 buff_ci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
9876 buff_ci.size = 256;
9877 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9878 VkBuffer buffer;
9879 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9880 ASSERT_VK_SUCCESS(err);
9881
9882 VkBufferViewCreateInfo buff_view_ci = {};
9883 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9884 buff_view_ci.buffer = buffer;
9885 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9886 buff_view_ci.range = VK_WHOLE_SIZE;
9887 VkBufferView buff_view;
9888 err =
9889 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
9890 ASSERT_VK_SUCCESS(err);
9891
9892 // Create an image to be used for invalid updates
9893 VkImageCreateInfo image_ci = {};
9894 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9895 image_ci.imageType = VK_IMAGE_TYPE_2D;
9896 image_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
9897 image_ci.extent.width = 64;
9898 image_ci.extent.height = 64;
9899 image_ci.extent.depth = 1;
9900 image_ci.mipLevels = 1;
9901 image_ci.arrayLayers = 1;
9902 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
9903 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9904 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
9905 // This usage is not valid for any descriptor type
9906 image_ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9907 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9908 VkImage image;
9909 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9910 ASSERT_VK_SUCCESS(err);
9911 // Bind memory to image
9912 VkMemoryRequirements mem_reqs;
9913 VkDeviceMemory image_mem;
9914 bool pass;
9915 VkMemoryAllocateInfo mem_alloc = {};
9916 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9917 mem_alloc.pNext = NULL;
9918 mem_alloc.allocationSize = 0;
9919 mem_alloc.memoryTypeIndex = 0;
9920 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9921 mem_alloc.allocationSize = mem_reqs.size;
9922 pass =
9923 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
9924 ASSERT_TRUE(pass);
9925 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9926 ASSERT_VK_SUCCESS(err);
9927 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9928 ASSERT_VK_SUCCESS(err);
9929 // Now create view for image
9930 VkImageViewCreateInfo image_view_ci = {};
9931 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9932 image_view_ci.image = image;
9933 image_view_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
9934 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9935 image_view_ci.subresourceRange.layerCount = 1;
9936 image_view_ci.subresourceRange.baseArrayLayer = 0;
9937 image_view_ci.subresourceRange.levelCount = 1;
9938 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9939 VkImageView image_view;
9940 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
9941 &image_view);
9942 ASSERT_VK_SUCCESS(err);
9943
9944 VkDescriptorBufferInfo buff_info = {};
9945 buff_info.buffer = buffer;
9946 VkDescriptorImageInfo img_info = {};
9947 img_info.imageView = image_view;
9948 VkWriteDescriptorSet descriptor_write = {};
9949 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9950 descriptor_write.dstBinding = 0;
9951 descriptor_write.descriptorCount = 1;
9952 descriptor_write.pTexelBufferView = &buff_view;
9953 descriptor_write.pBufferInfo = &buff_info;
9954 descriptor_write.pImageInfo = &img_info;
9955
9956 // These error messages align with VkDescriptorType struct
9957 const char *error_msgs[] = {
9958 "", // placeholder, no error for SAMPLER descriptor
9959 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
9960 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
9961 " does not have VK_IMAGE_USAGE_STORAGE_BIT set.",
9962 " does not have VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT set.",
9963 " does not have VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set.",
9964 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
9965 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
9966 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
9967 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
9968 " does not have VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set."};
9969 // Start loop at 1 as SAMPLER desc type has no usage bit error
9970 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9971 descriptor_write.descriptorType = VkDescriptorType(i);
9972 descriptor_write.dstSet = descriptor_sets[i];
9973 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9974 error_msgs[i]);
9975
9976 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
9977 NULL);
9978
9979 m_errorMonitor->VerifyFound();
9980 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
9981 }
9982 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9983 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009984 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009985 vkDestroyImageView(m_device->device(), image_view, NULL);
9986 vkDestroyBuffer(m_device->device(), buffer, NULL);
9987 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9988 vkFreeDescriptorSets(m_device->device(), ds_pool,
9989 VK_DESCRIPTOR_TYPE_RANGE_SIZE, descriptor_sets);
9990 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9991}
9992
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009993TEST_F(VkLayerTest, DSBufferInfoErrors) {
9994 TEST_DESCRIPTION(
9995 "Attempt to update buffer descriptor set that has incorrect "
9996 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
9997 "1. offset value greater than buffer size\n"
9998 "2. range value of 0\n"
9999 "3. range value greater than buffer (size - offset)");
10000 VkResult err;
10001
10002 ASSERT_NO_FATAL_FAILURE(InitState());
10003 VkDescriptorPoolSize ds_type_count = {};
10004 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10005 ds_type_count.descriptorCount = 1;
10006
10007 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10008 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10009 ds_pool_ci.pNext = NULL;
10010 ds_pool_ci.maxSets = 1;
10011 ds_pool_ci.poolSizeCount = 1;
10012 ds_pool_ci.pPoolSizes = &ds_type_count;
10013
10014 VkDescriptorPool ds_pool;
10015 err =
10016 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10017 ASSERT_VK_SUCCESS(err);
10018
10019 // Create layout with single uniform buffer descriptor
10020 VkDescriptorSetLayoutBinding dsl_binding = {};
10021 dsl_binding.binding = 0;
10022 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10023 dsl_binding.descriptorCount = 1;
10024 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10025 dsl_binding.pImmutableSamplers = NULL;
10026
10027 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10028 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10029 ds_layout_ci.pNext = NULL;
10030 ds_layout_ci.bindingCount = 1;
10031 ds_layout_ci.pBindings = &dsl_binding;
10032 VkDescriptorSetLayout ds_layout;
10033 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10034 &ds_layout);
10035 ASSERT_VK_SUCCESS(err);
10036
10037 VkDescriptorSet descriptor_set = {};
10038 VkDescriptorSetAllocateInfo alloc_info = {};
10039 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10040 alloc_info.descriptorSetCount = 1;
10041 alloc_info.descriptorPool = ds_pool;
10042 alloc_info.pSetLayouts = &ds_layout;
10043 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10044 &descriptor_set);
10045 ASSERT_VK_SUCCESS(err);
10046
10047 // Create a buffer to be used for invalid updates
10048 VkBufferCreateInfo buff_ci = {};
10049 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10050 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
10051 buff_ci.size = 256;
10052 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10053 VkBuffer buffer;
10054 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10055 ASSERT_VK_SUCCESS(err);
10056 // Have to bind memory to buffer before descriptor update
10057 VkMemoryAllocateInfo mem_alloc = {};
10058 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10059 mem_alloc.pNext = NULL;
10060 mem_alloc.allocationSize = 256;
10061 mem_alloc.memoryTypeIndex = 0;
10062
10063 VkMemoryRequirements mem_reqs;
10064 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
10065 bool pass =
10066 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10067 if (!pass) {
10068 vkDestroyBuffer(m_device->device(), buffer, NULL);
10069 return;
10070 }
10071
10072 VkDeviceMemory mem;
10073 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
10074 ASSERT_VK_SUCCESS(err);
10075 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
10076 ASSERT_VK_SUCCESS(err);
10077
10078 VkDescriptorBufferInfo buff_info = {};
10079 buff_info.buffer = buffer;
10080 // First make offset 1 larger than buffer size
10081 buff_info.offset = 257;
10082 buff_info.range = VK_WHOLE_SIZE;
10083 VkWriteDescriptorSet descriptor_write = {};
10084 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10085 descriptor_write.dstBinding = 0;
10086 descriptor_write.descriptorCount = 1;
10087 descriptor_write.pTexelBufferView = nullptr;
10088 descriptor_write.pBufferInfo = &buff_info;
10089 descriptor_write.pImageInfo = nullptr;
10090
10091 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10092 descriptor_write.dstSet = descriptor_set;
10093 m_errorMonitor->SetDesiredFailureMsg(
10094 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10095 " offset of 257 is greater than buffer ");
10096
10097 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10098
10099 m_errorMonitor->VerifyFound();
10100 // Now cause error due to range of 0
10101 buff_info.offset = 0;
10102 buff_info.range = 0;
10103 m_errorMonitor->SetDesiredFailureMsg(
10104 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10105 " range is not VK_WHOLE_SIZE and is zero, which is not allowed.");
10106
10107 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10108
10109 m_errorMonitor->VerifyFound();
10110 // Now cause error due to range exceeding buffer size - offset
10111 buff_info.offset = 128;
10112 buff_info.range = 200;
10113 m_errorMonitor->SetDesiredFailureMsg(
10114 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10115 " range is 200 which is greater than buffer size ");
10116
10117 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10118
10119 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -060010120 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010121 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10122 vkDestroyBuffer(m_device->device(), buffer, NULL);
10123 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10124 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10125}
10126
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010127TEST_F(VkLayerTest, DSAspectBitsErrors) {
10128 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
10129 // are set, but could expand this test to hit more cases.
10130 TEST_DESCRIPTION("Attempt to update descriptor sets for images "
10131 "that do not have correct aspect bits sets.");
10132 VkResult err;
10133
10134 ASSERT_NO_FATAL_FAILURE(InitState());
10135 VkDescriptorPoolSize ds_type_count = {};
10136 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10137 ds_type_count.descriptorCount = 1;
10138
10139 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10140 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10141 ds_pool_ci.pNext = NULL;
10142 ds_pool_ci.maxSets = 5;
10143 ds_pool_ci.poolSizeCount = 1;
10144 ds_pool_ci.pPoolSizes = &ds_type_count;
10145
10146 VkDescriptorPool ds_pool;
10147 err =
10148 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10149 ASSERT_VK_SUCCESS(err);
10150
10151 VkDescriptorSetLayoutBinding dsl_binding = {};
10152 dsl_binding.binding = 0;
10153 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10154 dsl_binding.descriptorCount = 1;
10155 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10156 dsl_binding.pImmutableSamplers = NULL;
10157
10158 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10159 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10160 ds_layout_ci.pNext = NULL;
10161 ds_layout_ci.bindingCount = 1;
10162 ds_layout_ci.pBindings = &dsl_binding;
10163 VkDescriptorSetLayout ds_layout;
10164 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10165 &ds_layout);
10166 ASSERT_VK_SUCCESS(err);
10167
10168 VkDescriptorSet descriptor_set = {};
10169 VkDescriptorSetAllocateInfo alloc_info = {};
10170 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10171 alloc_info.descriptorSetCount = 1;
10172 alloc_info.descriptorPool = ds_pool;
10173 alloc_info.pSetLayouts = &ds_layout;
10174 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10175 &descriptor_set);
10176 ASSERT_VK_SUCCESS(err);
10177
10178 // Create an image to be used for invalid updates
10179 VkImageCreateInfo image_ci = {};
10180 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10181 image_ci.imageType = VK_IMAGE_TYPE_2D;
10182 image_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
10183 image_ci.extent.width = 64;
10184 image_ci.extent.height = 64;
10185 image_ci.extent.depth = 1;
10186 image_ci.mipLevels = 1;
10187 image_ci.arrayLayers = 1;
10188 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
10189 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
10190 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10191 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10192 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10193 VkImage image;
10194 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10195 ASSERT_VK_SUCCESS(err);
10196 // Bind memory to image
10197 VkMemoryRequirements mem_reqs;
10198 VkDeviceMemory image_mem;
10199 bool pass;
10200 VkMemoryAllocateInfo mem_alloc = {};
10201 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10202 mem_alloc.pNext = NULL;
10203 mem_alloc.allocationSize = 0;
10204 mem_alloc.memoryTypeIndex = 0;
10205 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10206 mem_alloc.allocationSize = mem_reqs.size;
10207 pass =
10208 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10209 ASSERT_TRUE(pass);
10210 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10211 ASSERT_VK_SUCCESS(err);
10212 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10213 ASSERT_VK_SUCCESS(err);
10214 // Now create view for image
10215 VkImageViewCreateInfo image_view_ci = {};
10216 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10217 image_view_ci.image = image;
10218 image_view_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
10219 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10220 image_view_ci.subresourceRange.layerCount = 1;
10221 image_view_ci.subresourceRange.baseArrayLayer = 0;
10222 image_view_ci.subresourceRange.levelCount = 1;
10223 // Setting both depth & stencil aspect bits is illegal for descriptor
10224 image_view_ci.subresourceRange.aspectMask =
10225 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
10226
10227 VkImageView image_view;
10228 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
10229 &image_view);
10230 ASSERT_VK_SUCCESS(err);
10231
10232 VkDescriptorImageInfo img_info = {};
10233 img_info.imageView = image_view;
10234 VkWriteDescriptorSet descriptor_write = {};
10235 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10236 descriptor_write.dstBinding = 0;
10237 descriptor_write.descriptorCount = 1;
10238 descriptor_write.pTexelBufferView = NULL;
10239 descriptor_write.pBufferInfo = NULL;
10240 descriptor_write.pImageInfo = &img_info;
10241 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10242 descriptor_write.dstSet = descriptor_set;
10243 const char *error_msg = " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10244 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
10245 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10246 error_msg);
10247
10248 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10249
10250 m_errorMonitor->VerifyFound();
10251 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10252 vkDestroyImage(m_device->device(), image, NULL);
10253 vkFreeMemory(m_device->device(), image_mem, NULL);
10254 vkDestroyImageView(m_device->device(), image_view, NULL);
10255 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10256 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10257}
10258
Karl Schultz6addd812016-02-02 17:17:23 -070010259TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010260 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010261 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010262
Karl Schultz6addd812016-02-02 17:17:23 -070010263 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010264 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10265 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10266 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010267
Tobin Ehlis3b780662015-05-28 12:11:26 -060010268 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010269 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010270 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010271 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10272 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010273
10274 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010275 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10276 ds_pool_ci.pNext = NULL;
10277 ds_pool_ci.maxSets = 1;
10278 ds_pool_ci.poolSizeCount = 1;
10279 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010280
Tobin Ehlis3b780662015-05-28 12:11:26 -060010281 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010282 err =
10283 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010284 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010285 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010286 dsl_binding.binding = 0;
10287 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10288 dsl_binding.descriptorCount = 1;
10289 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10290 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010291
Tony Barboureb254902015-07-15 12:50:33 -060010292 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010293 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10294 ds_layout_ci.pNext = NULL;
10295 ds_layout_ci.bindingCount = 1;
10296 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010297
Tobin Ehlis3b780662015-05-28 12:11:26 -060010298 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010299 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10300 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010301 ASSERT_VK_SUCCESS(err);
10302
10303 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010304 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010305 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010306 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010307 alloc_info.descriptorPool = ds_pool;
10308 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010309 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10310 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010311 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010312
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010313 VkSamplerCreateInfo sampler_ci = {};
10314 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10315 sampler_ci.pNext = NULL;
10316 sampler_ci.magFilter = VK_FILTER_NEAREST;
10317 sampler_ci.minFilter = VK_FILTER_NEAREST;
10318 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10319 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10320 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10321 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10322 sampler_ci.mipLodBias = 1.0;
10323 sampler_ci.anisotropyEnable = VK_FALSE;
10324 sampler_ci.maxAnisotropy = 1;
10325 sampler_ci.compareEnable = VK_FALSE;
10326 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10327 sampler_ci.minLod = 1.0;
10328 sampler_ci.maxLod = 1.0;
10329 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10330 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10331 VkSampler sampler;
10332 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10333 ASSERT_VK_SUCCESS(err);
10334
10335 VkDescriptorImageInfo info = {};
10336 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010337
10338 VkWriteDescriptorSet descriptor_write;
10339 memset(&descriptor_write, 0, sizeof(descriptor_write));
10340 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010341 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010342 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010343 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010344 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010345 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010346
10347 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10348
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010349 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010350
Chia-I Wuf7458c52015-10-26 21:10:41 +080010351 vkDestroySampler(m_device->device(), sampler, NULL);
10352 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10353 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010354}
10355
Karl Schultz6addd812016-02-02 17:17:23 -070010356TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010357 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010358 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010359
Karl Schultz6addd812016-02-02 17:17:23 -070010360 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010361 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10362 " binding #0 with 1 total descriptors but update of 1 descriptors "
10363 "starting at binding offset of 0 combined with update array element "
10364 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010365
Tobin Ehlis3b780662015-05-28 12:11:26 -060010366 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010367 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010368 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010369 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10370 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010371
10372 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010373 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10374 ds_pool_ci.pNext = NULL;
10375 ds_pool_ci.maxSets = 1;
10376 ds_pool_ci.poolSizeCount = 1;
10377 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010378
Tobin Ehlis3b780662015-05-28 12:11:26 -060010379 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010380 err =
10381 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010382 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010383
Tony Barboureb254902015-07-15 12:50:33 -060010384 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010385 dsl_binding.binding = 0;
10386 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10387 dsl_binding.descriptorCount = 1;
10388 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10389 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010390
10391 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010392 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10393 ds_layout_ci.pNext = NULL;
10394 ds_layout_ci.bindingCount = 1;
10395 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010396
Tobin Ehlis3b780662015-05-28 12:11:26 -060010397 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010398 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10399 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010400 ASSERT_VK_SUCCESS(err);
10401
10402 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010403 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010404 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010405 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010406 alloc_info.descriptorPool = ds_pool;
10407 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010408 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10409 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010410 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010411
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010412 // Correctly update descriptor to avoid "NOT_UPDATED" error
10413 VkDescriptorBufferInfo buff_info = {};
10414 buff_info.buffer =
10415 VkBuffer(0); // Don't care about buffer handle for this test
10416 buff_info.offset = 0;
10417 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010418
10419 VkWriteDescriptorSet descriptor_write;
10420 memset(&descriptor_write, 0, sizeof(descriptor_write));
10421 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010422 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070010423 descriptor_write.dstArrayElement =
10424 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010425 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010426 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10427 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010428
10429 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10430
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010431 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010432
Chia-I Wuf7458c52015-10-26 21:10:41 +080010433 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10434 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010435}
10436
Karl Schultz6addd812016-02-02 17:17:23 -070010437TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
10438 // Create layout w/ count of 1 and attempt update to that layout w/ binding
10439 // index 2
10440 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010441
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010442 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10443 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010444
Tobin Ehlis3b780662015-05-28 12:11:26 -060010445 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010446 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010447 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010448 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10449 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010450
10451 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010452 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10453 ds_pool_ci.pNext = NULL;
10454 ds_pool_ci.maxSets = 1;
10455 ds_pool_ci.poolSizeCount = 1;
10456 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010457
Tobin Ehlis3b780662015-05-28 12:11:26 -060010458 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010459 err =
10460 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010461 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010462
Tony Barboureb254902015-07-15 12:50:33 -060010463 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010464 dsl_binding.binding = 0;
10465 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10466 dsl_binding.descriptorCount = 1;
10467 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10468 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010469
10470 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010471 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10472 ds_layout_ci.pNext = NULL;
10473 ds_layout_ci.bindingCount = 1;
10474 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010475 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010476 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10477 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010478 ASSERT_VK_SUCCESS(err);
10479
10480 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010481 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010482 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010483 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010484 alloc_info.descriptorPool = ds_pool;
10485 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010486 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10487 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010488 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010489
Tony Barboureb254902015-07-15 12:50:33 -060010490 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010491 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10492 sampler_ci.pNext = NULL;
10493 sampler_ci.magFilter = VK_FILTER_NEAREST;
10494 sampler_ci.minFilter = VK_FILTER_NEAREST;
10495 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10496 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10497 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10498 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10499 sampler_ci.mipLodBias = 1.0;
10500 sampler_ci.anisotropyEnable = VK_FALSE;
10501 sampler_ci.maxAnisotropy = 1;
10502 sampler_ci.compareEnable = VK_FALSE;
10503 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10504 sampler_ci.minLod = 1.0;
10505 sampler_ci.maxLod = 1.0;
10506 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10507 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010508
Tobin Ehlis3b780662015-05-28 12:11:26 -060010509 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010510 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010511 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010512
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010513 VkDescriptorImageInfo info = {};
10514 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010515
10516 VkWriteDescriptorSet descriptor_write;
10517 memset(&descriptor_write, 0, sizeof(descriptor_write));
10518 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010519 descriptor_write.dstSet = descriptorSet;
10520 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010521 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010522 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010523 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010524 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010525
10526 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10527
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010528 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010529
Chia-I Wuf7458c52015-10-26 21:10:41 +080010530 vkDestroySampler(m_device->device(), sampler, NULL);
10531 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10532 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010533}
10534
Karl Schultz6addd812016-02-02 17:17:23 -070010535TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10536 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10537 // types
10538 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010539
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070010540 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis660bcdc2016-05-17 10:39:46 -060010541 ".sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010542
Tobin Ehlis3b780662015-05-28 12:11:26 -060010543 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010544
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010545 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010546 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10547 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010548
10549 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010550 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10551 ds_pool_ci.pNext = NULL;
10552 ds_pool_ci.maxSets = 1;
10553 ds_pool_ci.poolSizeCount = 1;
10554 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010555
Tobin Ehlis3b780662015-05-28 12:11:26 -060010556 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010557 err =
10558 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010559 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010560 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010561 dsl_binding.binding = 0;
10562 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10563 dsl_binding.descriptorCount = 1;
10564 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10565 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010566
Tony Barboureb254902015-07-15 12:50:33 -060010567 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010568 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10569 ds_layout_ci.pNext = NULL;
10570 ds_layout_ci.bindingCount = 1;
10571 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010572
Tobin Ehlis3b780662015-05-28 12:11:26 -060010573 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010574 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10575 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010576 ASSERT_VK_SUCCESS(err);
10577
10578 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010579 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010580 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010581 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010582 alloc_info.descriptorPool = ds_pool;
10583 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010584 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10585 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010586 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010587
Tony Barboureb254902015-07-15 12:50:33 -060010588 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010589 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10590 sampler_ci.pNext = NULL;
10591 sampler_ci.magFilter = VK_FILTER_NEAREST;
10592 sampler_ci.minFilter = VK_FILTER_NEAREST;
10593 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10594 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10595 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10596 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10597 sampler_ci.mipLodBias = 1.0;
10598 sampler_ci.anisotropyEnable = VK_FALSE;
10599 sampler_ci.maxAnisotropy = 1;
10600 sampler_ci.compareEnable = VK_FALSE;
10601 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10602 sampler_ci.minLod = 1.0;
10603 sampler_ci.maxLod = 1.0;
10604 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10605 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010606 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010607 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010608 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010609
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010610 VkDescriptorImageInfo info = {};
10611 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010612
10613 VkWriteDescriptorSet descriptor_write;
10614 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -070010615 descriptor_write.sType =
10616 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010617 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010618 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010619 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010620 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010621 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010622
10623 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10624
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010625 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010626
Chia-I Wuf7458c52015-10-26 21:10:41 +080010627 vkDestroySampler(m_device->device(), sampler, NULL);
10628 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10629 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010630}
10631
Karl Schultz6addd812016-02-02 17:17:23 -070010632TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010633 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010634 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010635
Karl Schultz6addd812016-02-02 17:17:23 -070010636 m_errorMonitor->SetDesiredFailureMsg(
10637 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010638 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010639
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010640 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010641 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10642 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010643 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010644 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10645 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010646
10647 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010648 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10649 ds_pool_ci.pNext = NULL;
10650 ds_pool_ci.maxSets = 1;
10651 ds_pool_ci.poolSizeCount = 1;
10652 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010653
10654 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010655 err =
10656 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010657 ASSERT_VK_SUCCESS(err);
10658
10659 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010660 dsl_binding.binding = 0;
10661 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10662 dsl_binding.descriptorCount = 1;
10663 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10664 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010665
10666 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010667 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10668 ds_layout_ci.pNext = NULL;
10669 ds_layout_ci.bindingCount = 1;
10670 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010671 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010672 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10673 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010674 ASSERT_VK_SUCCESS(err);
10675
10676 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010677 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010678 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010679 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010680 alloc_info.descriptorPool = ds_pool;
10681 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010682 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10683 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010684 ASSERT_VK_SUCCESS(err);
10685
Karl Schultz6addd812016-02-02 17:17:23 -070010686 VkSampler sampler =
10687 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010688
10689 VkDescriptorImageInfo descriptor_info;
10690 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10691 descriptor_info.sampler = sampler;
10692
10693 VkWriteDescriptorSet descriptor_write;
10694 memset(&descriptor_write, 0, sizeof(descriptor_write));
10695 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010696 descriptor_write.dstSet = descriptorSet;
10697 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010698 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010699 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10700 descriptor_write.pImageInfo = &descriptor_info;
10701
10702 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10703
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010704 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010705
Chia-I Wuf7458c52015-10-26 21:10:41 +080010706 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10707 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010708}
10709
Karl Schultz6addd812016-02-02 17:17:23 -070010710TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10711 // Create a single combined Image/Sampler descriptor and send it an invalid
10712 // imageView
10713 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010714
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010715 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10716 "Attempted write update to combined "
10717 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -060010718 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010719
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010720 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010721 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010722 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10723 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010724
10725 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010726 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10727 ds_pool_ci.pNext = NULL;
10728 ds_pool_ci.maxSets = 1;
10729 ds_pool_ci.poolSizeCount = 1;
10730 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010731
10732 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010733 err =
10734 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010735 ASSERT_VK_SUCCESS(err);
10736
10737 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010738 dsl_binding.binding = 0;
10739 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10740 dsl_binding.descriptorCount = 1;
10741 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10742 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010743
10744 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010745 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10746 ds_layout_ci.pNext = NULL;
10747 ds_layout_ci.bindingCount = 1;
10748 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010749 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010750 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10751 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010752 ASSERT_VK_SUCCESS(err);
10753
10754 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010755 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010756 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010757 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010758 alloc_info.descriptorPool = ds_pool;
10759 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010760 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10761 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010762 ASSERT_VK_SUCCESS(err);
10763
10764 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010765 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10766 sampler_ci.pNext = NULL;
10767 sampler_ci.magFilter = VK_FILTER_NEAREST;
10768 sampler_ci.minFilter = VK_FILTER_NEAREST;
10769 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10770 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10771 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10772 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10773 sampler_ci.mipLodBias = 1.0;
10774 sampler_ci.anisotropyEnable = VK_FALSE;
10775 sampler_ci.maxAnisotropy = 1;
10776 sampler_ci.compareEnable = VK_FALSE;
10777 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10778 sampler_ci.minLod = 1.0;
10779 sampler_ci.maxLod = 1.0;
10780 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10781 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010782
10783 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010784 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010785 ASSERT_VK_SUCCESS(err);
10786
Karl Schultz6addd812016-02-02 17:17:23 -070010787 VkImageView view =
10788 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010789
10790 VkDescriptorImageInfo descriptor_info;
10791 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10792 descriptor_info.sampler = sampler;
10793 descriptor_info.imageView = view;
10794
10795 VkWriteDescriptorSet descriptor_write;
10796 memset(&descriptor_write, 0, sizeof(descriptor_write));
10797 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010798 descriptor_write.dstSet = descriptorSet;
10799 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010800 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010801 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10802 descriptor_write.pImageInfo = &descriptor_info;
10803
10804 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10805
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010806 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010807
Chia-I Wuf7458c52015-10-26 21:10:41 +080010808 vkDestroySampler(m_device->device(), sampler, NULL);
10809 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10810 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010811}
10812
Karl Schultz6addd812016-02-02 17:17:23 -070010813TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10814 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10815 // into the other
10816 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010817
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010818 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10819 " binding #1 with type "
10820 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10821 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010822
Tobin Ehlis04356f92015-10-27 16:35:27 -060010823 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010824 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010825 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010826 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10827 ds_type_count[0].descriptorCount = 1;
10828 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10829 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010830
10831 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010832 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10833 ds_pool_ci.pNext = NULL;
10834 ds_pool_ci.maxSets = 1;
10835 ds_pool_ci.poolSizeCount = 2;
10836 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010837
10838 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010839 err =
10840 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010841 ASSERT_VK_SUCCESS(err);
10842 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010843 dsl_binding[0].binding = 0;
10844 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10845 dsl_binding[0].descriptorCount = 1;
10846 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10847 dsl_binding[0].pImmutableSamplers = NULL;
10848 dsl_binding[1].binding = 1;
10849 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10850 dsl_binding[1].descriptorCount = 1;
10851 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10852 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010853
10854 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010855 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10856 ds_layout_ci.pNext = NULL;
10857 ds_layout_ci.bindingCount = 2;
10858 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010859
10860 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010861 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10862 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010863 ASSERT_VK_SUCCESS(err);
10864
10865 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010866 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010867 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010868 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010869 alloc_info.descriptorPool = ds_pool;
10870 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010871 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10872 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010873 ASSERT_VK_SUCCESS(err);
10874
10875 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010876 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10877 sampler_ci.pNext = NULL;
10878 sampler_ci.magFilter = VK_FILTER_NEAREST;
10879 sampler_ci.minFilter = VK_FILTER_NEAREST;
10880 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10881 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10882 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10883 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10884 sampler_ci.mipLodBias = 1.0;
10885 sampler_ci.anisotropyEnable = VK_FALSE;
10886 sampler_ci.maxAnisotropy = 1;
10887 sampler_ci.compareEnable = VK_FALSE;
10888 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10889 sampler_ci.minLod = 1.0;
10890 sampler_ci.maxLod = 1.0;
10891 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10892 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010893
10894 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010895 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010896 ASSERT_VK_SUCCESS(err);
10897
10898 VkDescriptorImageInfo info = {};
10899 info.sampler = sampler;
10900
10901 VkWriteDescriptorSet descriptor_write;
10902 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
10903 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010904 descriptor_write.dstSet = descriptorSet;
10905 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080010906 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010907 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10908 descriptor_write.pImageInfo = &info;
10909 // This write update should succeed
10910 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10911 // Now perform a copy update that fails due to type mismatch
10912 VkCopyDescriptorSet copy_ds_update;
10913 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10914 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10915 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -060010916 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010917 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070010918 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +080010919 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010920 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10921
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010922 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010923 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070010924 m_errorMonitor->SetDesiredFailureMsg(
10925 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010926 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -060010927 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10928 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10929 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070010930 copy_ds_update.srcBinding =
10931 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010932 copy_ds_update.dstSet = descriptorSet;
10933 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -060010934 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010935 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10936
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010937 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010938
Tobin Ehlis04356f92015-10-27 16:35:27 -060010939 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070010940 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010941 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
10942 "update array offset of 0 and update of "
10943 "5 descriptors oversteps total number "
10944 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010945
Tobin Ehlis04356f92015-10-27 16:35:27 -060010946 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10947 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10948 copy_ds_update.srcSet = descriptorSet;
10949 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010950 copy_ds_update.dstSet = descriptorSet;
10951 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070010952 copy_ds_update.descriptorCount =
10953 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060010954 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10955
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010956 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010957
Chia-I Wuf7458c52015-10-26 21:10:41 +080010958 vkDestroySampler(m_device->device(), sampler, NULL);
10959 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10960 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010961}
10962
Karl Schultz6addd812016-02-02 17:17:23 -070010963TEST_F(VkLayerTest, NumSamplesMismatch) {
10964 // Create CommandBuffer where MSAA samples doesn't match RenderPass
10965 // sampleCount
10966 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010967
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070010968 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070010969 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010970
Tobin Ehlis3b780662015-05-28 12:11:26 -060010971 ASSERT_NO_FATAL_FAILURE(InitState());
10972 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010973 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060010974 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010975 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010976
10977 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010978 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10979 ds_pool_ci.pNext = NULL;
10980 ds_pool_ci.maxSets = 1;
10981 ds_pool_ci.poolSizeCount = 1;
10982 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010983
Tobin Ehlis3b780662015-05-28 12:11:26 -060010984 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010985 err =
10986 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010987 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010988
Tony Barboureb254902015-07-15 12:50:33 -060010989 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080010990 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060010991 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080010992 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010993 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10994 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010995
Tony Barboureb254902015-07-15 12:50:33 -060010996 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10997 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10998 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010999 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070011000 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011001
Tobin Ehlis3b780662015-05-28 12:11:26 -060011002 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011003 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11004 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011005 ASSERT_VK_SUCCESS(err);
11006
11007 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011008 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011009 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011010 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011011 alloc_info.descriptorPool = ds_pool;
11012 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011013 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11014 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011015 ASSERT_VK_SUCCESS(err);
11016
Tony Barboureb254902015-07-15 12:50:33 -060011017 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011018 pipe_ms_state_ci.sType =
11019 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11020 pipe_ms_state_ci.pNext = NULL;
11021 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11022 pipe_ms_state_ci.sampleShadingEnable = 0;
11023 pipe_ms_state_ci.minSampleShading = 1.0;
11024 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011025
Tony Barboureb254902015-07-15 12:50:33 -060011026 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011027 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11028 pipeline_layout_ci.pNext = NULL;
11029 pipeline_layout_ci.setLayoutCount = 1;
11030 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011031
11032 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011033 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11034 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011035 ASSERT_VK_SUCCESS(err);
11036
Karl Schultz6addd812016-02-02 17:17:23 -070011037 VkShaderObj vs(m_device, bindStateVertShaderText,
11038 VK_SHADER_STAGE_VERTEX_BIT, this);
11039 VkShaderObj fs(m_device, bindStateFragShaderText,
11040 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011041 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070011042 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011043 VkPipelineObj pipe(m_device);
11044 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011045 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011046 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011047 pipe.SetMSAA(&pipe_ms_state_ci);
11048 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011049
Tony Barbourfe3351b2015-07-28 10:17:20 -060011050 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070011051 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11052 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011053
Mark Young29927482016-05-04 14:38:51 -060011054 // Render triangle (the error should trigger on the attempt to draw).
11055 Draw(3, 1, 0, 0);
11056
11057 // Finalize recording of the command buffer
11058 EndCommandBuffer();
11059
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011060 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011061
Chia-I Wuf7458c52015-10-26 21:10:41 +080011062 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11063 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11064 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011065}
Mark Young29927482016-05-04 14:38:51 -060011066
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011067TEST_F(VkLayerTest, RenderPassIncompatible) {
11068 TEST_DESCRIPTION("Hit RenderPass incompatible cases. "
11069 "Initial case is drawing with an active renderpass that's "
11070 "not compatible with the bound PSO's creation renderpass");
11071 VkResult err;
11072
11073 ASSERT_NO_FATAL_FAILURE(InitState());
11074 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11075
11076 VkDescriptorSetLayoutBinding dsl_binding = {};
11077 dsl_binding.binding = 0;
11078 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11079 dsl_binding.descriptorCount = 1;
11080 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11081 dsl_binding.pImmutableSamplers = NULL;
11082
11083 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11084 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11085 ds_layout_ci.pNext = NULL;
11086 ds_layout_ci.bindingCount = 1;
11087 ds_layout_ci.pBindings = &dsl_binding;
11088
11089 VkDescriptorSetLayout ds_layout;
11090 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11091 &ds_layout);
11092 ASSERT_VK_SUCCESS(err);
11093
11094 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11095 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11096 pipeline_layout_ci.pNext = NULL;
11097 pipeline_layout_ci.setLayoutCount = 1;
11098 pipeline_layout_ci.pSetLayouts = &ds_layout;
11099
11100 VkPipelineLayout pipeline_layout;
11101 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11102 &pipeline_layout);
11103 ASSERT_VK_SUCCESS(err);
11104
11105 VkShaderObj vs(m_device, bindStateVertShaderText,
11106 VK_SHADER_STAGE_VERTEX_BIT, this);
11107 VkShaderObj fs(m_device, bindStateFragShaderText,
11108 VK_SHADER_STAGE_FRAGMENT_BIT,
11109 this); // We shouldn't need a fragment shader
11110 // but add it to be able to run on more devices
11111 // Create a renderpass that will be incompatible with default renderpass
11112 VkAttachmentReference attach = {};
11113 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11114 VkAttachmentReference color_att = {};
11115 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11116 VkSubpassDescription subpass = {};
11117 subpass.inputAttachmentCount = 1;
11118 subpass.pInputAttachments = &attach;
11119 subpass.colorAttachmentCount = 1;
11120 subpass.pColorAttachments = &color_att;
11121 VkRenderPassCreateInfo rpci = {};
11122 rpci.subpassCount = 1;
11123 rpci.pSubpasses = &subpass;
11124 rpci.attachmentCount = 1;
11125 VkAttachmentDescription attach_desc = {};
11126 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011127 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11128 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011129 rpci.pAttachments = &attach_desc;
11130 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11131 VkRenderPass rp;
11132 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11133 VkPipelineObj pipe(m_device);
11134 pipe.AddShader(&vs);
11135 pipe.AddShader(&fs);
11136 pipe.AddColorAttachment();
11137 VkViewport view_port = {};
11138 m_viewports.push_back(view_port);
11139 pipe.SetViewport(m_viewports);
11140 VkRect2D rect = {};
11141 m_scissors.push_back(rect);
11142 pipe.SetScissor(m_scissors);
11143 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11144
11145 VkCommandBufferInheritanceInfo cbii = {};
11146 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11147 cbii.renderPass = rp;
11148 cbii.subpass = 0;
11149 VkCommandBufferBeginInfo cbbi = {};
11150 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11151 cbbi.pInheritanceInfo = &cbii;
11152 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11153 VkRenderPassBeginInfo rpbi = {};
11154 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11155 rpbi.framebuffer = m_framebuffer;
11156 rpbi.renderPass = rp;
11157 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi,
11158 VK_SUBPASS_CONTENTS_INLINE);
11159 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11160 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11161
11162 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11163 " is incompatible w/ gfx pipeline ");
11164 // Render triangle (the error should trigger on the attempt to draw).
11165 Draw(3, 1, 0, 0);
11166
11167 // Finalize recording of the command buffer
11168 EndCommandBuffer();
11169
11170 m_errorMonitor->VerifyFound();
11171
11172 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11173 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11174 vkDestroyRenderPass(m_device->device(), rp, NULL);
11175}
11176
Mark Youngc89c6312016-03-31 16:03:20 -060011177TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11178 // Create Pipeline where the number of blend attachments doesn't match the
11179 // number of color attachments. In this case, we don't add any color
11180 // blend attachments even though we have a color attachment.
11181 VkResult err;
11182
11183 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -060011184 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -060011185
11186 ASSERT_NO_FATAL_FAILURE(InitState());
11187 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11188 VkDescriptorPoolSize ds_type_count = {};
11189 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11190 ds_type_count.descriptorCount = 1;
11191
11192 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11193 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11194 ds_pool_ci.pNext = NULL;
11195 ds_pool_ci.maxSets = 1;
11196 ds_pool_ci.poolSizeCount = 1;
11197 ds_pool_ci.pPoolSizes = &ds_type_count;
11198
11199 VkDescriptorPool ds_pool;
11200 err =
11201 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11202 ASSERT_VK_SUCCESS(err);
11203
11204 VkDescriptorSetLayoutBinding dsl_binding = {};
11205 dsl_binding.binding = 0;
11206 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11207 dsl_binding.descriptorCount = 1;
11208 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11209 dsl_binding.pImmutableSamplers = NULL;
11210
11211 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11212 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11213 ds_layout_ci.pNext = NULL;
11214 ds_layout_ci.bindingCount = 1;
11215 ds_layout_ci.pBindings = &dsl_binding;
11216
11217 VkDescriptorSetLayout ds_layout;
11218 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11219 &ds_layout);
11220 ASSERT_VK_SUCCESS(err);
11221
11222 VkDescriptorSet descriptorSet;
11223 VkDescriptorSetAllocateInfo alloc_info = {};
11224 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11225 alloc_info.descriptorSetCount = 1;
11226 alloc_info.descriptorPool = ds_pool;
11227 alloc_info.pSetLayouts = &ds_layout;
11228 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11229 &descriptorSet);
11230 ASSERT_VK_SUCCESS(err);
11231
11232 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
11233 pipe_ms_state_ci.sType =
11234 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11235 pipe_ms_state_ci.pNext = NULL;
11236 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11237 pipe_ms_state_ci.sampleShadingEnable = 0;
11238 pipe_ms_state_ci.minSampleShading = 1.0;
11239 pipe_ms_state_ci.pSampleMask = NULL;
11240
11241 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11242 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11243 pipeline_layout_ci.pNext = NULL;
11244 pipeline_layout_ci.setLayoutCount = 1;
11245 pipeline_layout_ci.pSetLayouts = &ds_layout;
11246
11247 VkPipelineLayout pipeline_layout;
11248 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11249 &pipeline_layout);
11250 ASSERT_VK_SUCCESS(err);
11251
11252 VkShaderObj vs(m_device, bindStateVertShaderText,
11253 VK_SHADER_STAGE_VERTEX_BIT, this);
11254 VkShaderObj fs(m_device, bindStateFragShaderText,
11255 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011256 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -060011257 // but add it to be able to run on more devices
11258 VkPipelineObj pipe(m_device);
11259 pipe.AddShader(&vs);
11260 pipe.AddShader(&fs);
11261 pipe.SetMSAA(&pipe_ms_state_ci);
11262 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11263
11264 BeginCommandBuffer();
11265 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11266 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11267
Mark Young29927482016-05-04 14:38:51 -060011268 // Render triangle (the error should trigger on the attempt to draw).
11269 Draw(3, 1, 0, 0);
11270
11271 // Finalize recording of the command buffer
11272 EndCommandBuffer();
11273
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011274 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011275
11276 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11277 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11278 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11279}
Mark Young29927482016-05-04 14:38:51 -060011280
Mark Muellerd4914412016-06-13 17:52:06 -060011281TEST_F(VkLayerTest, MissingClearAttachment) {
11282 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment "
11283 "structure passed to vkCmdClearAttachments");
11284 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11285 "vkCmdClearAttachments() attachment index 1 not found in attachment "
11286 "reference array of active subpass 0");
11287
11288 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11289 m_errorMonitor->VerifyFound();
11290}
11291
Karl Schultz6addd812016-02-02 17:17:23 -070011292TEST_F(VkLayerTest, ClearCmdNoDraw) {
11293 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
11294 // to issuing a Draw
11295 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011296
Karl Schultz6addd812016-02-02 17:17:23 -070011297 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -070011298 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011299 "vkCmdClearAttachments() issued on CB object ");
11300
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011301 ASSERT_NO_FATAL_FAILURE(InitState());
11302 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011303
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011304 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011305 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11306 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011307
11308 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011309 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11310 ds_pool_ci.pNext = NULL;
11311 ds_pool_ci.maxSets = 1;
11312 ds_pool_ci.poolSizeCount = 1;
11313 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011314
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011315 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011316 err =
11317 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011318 ASSERT_VK_SUCCESS(err);
11319
Tony Barboureb254902015-07-15 12:50:33 -060011320 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011321 dsl_binding.binding = 0;
11322 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11323 dsl_binding.descriptorCount = 1;
11324 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11325 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011326
Tony Barboureb254902015-07-15 12:50:33 -060011327 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011328 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11329 ds_layout_ci.pNext = NULL;
11330 ds_layout_ci.bindingCount = 1;
11331 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011332
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011333 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011334 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11335 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011336 ASSERT_VK_SUCCESS(err);
11337
11338 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011339 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011340 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011341 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011342 alloc_info.descriptorPool = ds_pool;
11343 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011344 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11345 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011346 ASSERT_VK_SUCCESS(err);
11347
Tony Barboureb254902015-07-15 12:50:33 -060011348 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011349 pipe_ms_state_ci.sType =
11350 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11351 pipe_ms_state_ci.pNext = NULL;
11352 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11353 pipe_ms_state_ci.sampleShadingEnable = 0;
11354 pipe_ms_state_ci.minSampleShading = 1.0;
11355 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011356
Tony Barboureb254902015-07-15 12:50:33 -060011357 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011358 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11359 pipeline_layout_ci.pNext = NULL;
11360 pipeline_layout_ci.setLayoutCount = 1;
11361 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011362
11363 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011364 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11365 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011366 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011367
Karl Schultz6addd812016-02-02 17:17:23 -070011368 VkShaderObj vs(m_device, bindStateVertShaderText,
11369 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011370 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011371 // on more devices
11372 VkShaderObj fs(m_device, bindStateFragShaderText,
11373 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011374
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011375 VkPipelineObj pipe(m_device);
11376 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011377 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011378 pipe.SetMSAA(&pipe_ms_state_ci);
11379 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011380
11381 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011382
Karl Schultz6addd812016-02-02 17:17:23 -070011383 // Main thing we care about for this test is that the VkImage obj we're
11384 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011385 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011386 VkClearAttachment color_attachment;
11387 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11388 color_attachment.clearValue.color.float32[0] = 1.0;
11389 color_attachment.clearValue.color.float32[1] = 1.0;
11390 color_attachment.clearValue.color.float32[2] = 1.0;
11391 color_attachment.clearValue.color.float32[3] = 1.0;
11392 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070011393 VkClearRect clear_rect = {
11394 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011395
Karl Schultz6addd812016-02-02 17:17:23 -070011396 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
11397 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011398
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011399 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011400
Chia-I Wuf7458c52015-10-26 21:10:41 +080011401 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11402 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11403 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011404}
11405
Karl Schultz6addd812016-02-02 17:17:23 -070011406TEST_F(VkLayerTest, VtxBufferBadIndex) {
11407 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011408
Karl Schultz6addd812016-02-02 17:17:23 -070011409 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070011410 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -070011411 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011412
Tobin Ehlis502480b2015-06-24 15:53:07 -060011413 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011414 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011415 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011416
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011417 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011418 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11419 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011420
11421 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011422 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11423 ds_pool_ci.pNext = NULL;
11424 ds_pool_ci.maxSets = 1;
11425 ds_pool_ci.poolSizeCount = 1;
11426 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011427
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011428 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011429 err =
11430 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011431 ASSERT_VK_SUCCESS(err);
11432
Tony Barboureb254902015-07-15 12:50:33 -060011433 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011434 dsl_binding.binding = 0;
11435 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11436 dsl_binding.descriptorCount = 1;
11437 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11438 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011439
Tony Barboureb254902015-07-15 12:50:33 -060011440 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011441 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11442 ds_layout_ci.pNext = NULL;
11443 ds_layout_ci.bindingCount = 1;
11444 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011445
Tobin Ehlis502480b2015-06-24 15:53:07 -060011446 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011447 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11448 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011449 ASSERT_VK_SUCCESS(err);
11450
11451 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011452 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011453 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011454 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011455 alloc_info.descriptorPool = ds_pool;
11456 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011457 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11458 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011459 ASSERT_VK_SUCCESS(err);
11460
Tony Barboureb254902015-07-15 12:50:33 -060011461 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011462 pipe_ms_state_ci.sType =
11463 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11464 pipe_ms_state_ci.pNext = NULL;
11465 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11466 pipe_ms_state_ci.sampleShadingEnable = 0;
11467 pipe_ms_state_ci.minSampleShading = 1.0;
11468 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011469
Tony Barboureb254902015-07-15 12:50:33 -060011470 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011471 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11472 pipeline_layout_ci.pNext = NULL;
11473 pipeline_layout_ci.setLayoutCount = 1;
11474 pipeline_layout_ci.pSetLayouts = &ds_layout;
11475 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011476
Karl Schultz6addd812016-02-02 17:17:23 -070011477 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11478 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011479 ASSERT_VK_SUCCESS(err);
11480
Karl Schultz6addd812016-02-02 17:17:23 -070011481 VkShaderObj vs(m_device, bindStateVertShaderText,
11482 VK_SHADER_STAGE_VERTEX_BIT, this);
11483 VkShaderObj fs(m_device, bindStateFragShaderText,
11484 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011485 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070011486 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011487 VkPipelineObj pipe(m_device);
11488 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011489 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011490 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011491 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011492 pipe.SetViewport(m_viewports);
11493 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011494 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011495
11496 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070011497 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11498 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011499 // Don't care about actual data, just need to get to draw to flag error
11500 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -070011501 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
11502 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011503 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011504 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011505
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011506 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011507
Chia-I Wuf7458c52015-10-26 21:10:41 +080011508 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11509 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11510 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011511}
Mark Muellerdfe37552016-07-07 14:47:42 -060011512
11513TEST_F(VkLayerTest, VertexBufferInvalid) {
11514 TEST_DESCRIPTION("Submit a command buffer using deleted vertex buffer, "
11515 "delete a buffer twice, use an invalid offset for each "
11516 "buffer type, and attempt to bind a null buffer");
11517
11518 const char *deleted_buffer_in_command_buffer = "Cannot submit cmd buffer "
11519 "using deleted buffer ";
11520 const char *double_destroy_message = "Cannot free buffer 0x";
11521 const char *invalid_offset_message = "vkBindBufferMemory(): "
11522 "memoryOffset is 0x";
11523 const char *invalid_storage_buffer_offset_message = "vkBindBufferMemory(): "
11524 "storage memoryOffset "
11525 "is 0x";
11526 const char *invalid_texel_buffer_offset_message = "vkBindBufferMemory(): "
11527 "texel memoryOffset "
11528 "is 0x";
11529 const char *invalid_uniform_buffer_offset_message = "vkBindBufferMemory(): "
11530 "uniform memoryOffset "
11531 "is 0x";
11532 const char *bind_null_buffer_message = "In vkBindBufferMemory, attempting"
11533 " to Bind Obj(0x";
11534 const char *free_invalid_buffer_message = "Request to delete memory "
11535 "object 0x";
11536
11537 ASSERT_NO_FATAL_FAILURE(InitState());
11538 ASSERT_NO_FATAL_FAILURE(InitViewport());
11539 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11540
11541 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
11542 pipe_ms_state_ci.sType =
11543 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11544 pipe_ms_state_ci.pNext = NULL;
11545 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11546 pipe_ms_state_ci.sampleShadingEnable = 0;
11547 pipe_ms_state_ci.minSampleShading = 1.0;
11548 pipe_ms_state_ci.pSampleMask = nullptr;
11549
11550 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11551 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11552 VkPipelineLayout pipeline_layout;
11553
11554 VkResult err = vkCreatePipelineLayout(m_device->device(),
11555 &pipeline_layout_ci, nullptr,
11556 &pipeline_layout);
11557 ASSERT_VK_SUCCESS(err);
11558
11559 VkShaderObj vs(m_device, bindStateVertShaderText,
11560 VK_SHADER_STAGE_VERTEX_BIT, this);
11561 VkShaderObj fs(m_device, bindStateFragShaderText,
11562 VK_SHADER_STAGE_FRAGMENT_BIT,
11563 this);
11564 VkPipelineObj pipe(m_device);
11565 pipe.AddShader(&vs);
11566 pipe.AddShader(&fs);
11567 pipe.AddColorAttachment();
11568 pipe.SetMSAA(&pipe_ms_state_ci);
11569 pipe.SetViewport(m_viewports);
11570 pipe.SetScissor(m_scissors);
11571 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11572
11573 BeginCommandBuffer();
11574 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11575 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11576
11577 {
11578 // Create and bind a vertex buffer in a reduced scope, which will cause
11579 // it to be deleted upon leaving this scope
11580 const float vbo_data[3] = {1.f, 0.f, 1.f};
11581 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data),
11582 3, vbo_data);
11583 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11584 draw_verticies.AddVertexInputToPipe(pipe);
11585 }
11586
11587 Draw(1, 0, 0, 0);
11588
11589 EndCommandBuffer();
11590
11591 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11592 deleted_buffer_in_command_buffer);
11593 QueueCommandBuffer(false);
11594 m_errorMonitor->VerifyFound();
11595
11596 {
11597 // Create and bind a vertex buffer in a reduced scope, and delete it
11598 // twice, the second through the destructor
11599 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11600 VkBufferTest::eDoubleDelete);
11601 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11602 double_destroy_message);
11603 buffer_test.TestDoubleDestroy();
11604 }
11605 m_errorMonitor->VerifyFound();
11606
11607 if (VkBufferTest::
11608 GetTestConditionValid(m_device,
11609 VkBufferTest::eInvalidMemoryOffset)) {
11610 // Create and bind a memory buffer with an invalid offset.
11611 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11612 invalid_offset_message);
11613 VkBufferTest buffer_test(m_device,
11614 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
11615 VkBufferTest::eInvalidMemoryOffset);
11616 (void) buffer_test;
11617 m_errorMonitor->VerifyFound();
11618 }
11619
11620 if (VkBufferTest::
11621 GetTestConditionValid(m_device,
11622 VkBufferTest::eInvalidDeviceOffset,
11623 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
11624 // Create and bind a memory buffer with an invalid offset again,
11625 // but look for a texel buffer message.
11626 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11627 invalid_texel_buffer_offset_message);
11628 VkBufferTest buffer_test(m_device,
11629 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
11630 VkBufferTest::eInvalidDeviceOffset);
11631 (void) buffer_test;
11632 m_errorMonitor->VerifyFound();
11633 }
11634
11635 if (VkBufferTest::
11636 GetTestConditionValid(m_device,
11637 VkBufferTest::eInvalidDeviceOffset,
11638 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
11639 // Create and bind a memory buffer with an invalid offset again, but
11640 // look for a uniform buffer message.
11641 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11642 invalid_uniform_buffer_offset_message);
11643 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
11644 VkBufferTest::eInvalidDeviceOffset);
11645 (void) buffer_test;
11646 m_errorMonitor->VerifyFound();
11647 }
11648
11649 if (VkBufferTest::
11650 GetTestConditionValid(m_device,
11651 VkBufferTest::eInvalidDeviceOffset,
11652 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
11653 // Create and bind a memory buffer with an invalid offset again, but
11654 // look for a storage buffer message.
11655 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11656 invalid_storage_buffer_offset_message);
11657 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11658 VkBufferTest::eInvalidDeviceOffset);
11659 (void) buffer_test;
11660 m_errorMonitor->VerifyFound();
11661 }
11662
11663 {
11664 // Attempt to bind a null buffer.
11665 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11666 bind_null_buffer_message);
11667 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11668 VkBufferTest::eBindNullBuffer);
11669 (void) buffer_test;
11670 m_errorMonitor->VerifyFound();
11671 }
11672
11673 {
11674 // Attempt to use an invalid handle to delete a buffer.
11675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11676 free_invalid_buffer_message);
11677 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11678 VkBufferTest::eFreeInvalidHandle);
11679 (void) buffer_test;
11680 }
11681 m_errorMonitor->VerifyFound();
11682
11683 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11684}
11685
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011686// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11687TEST_F(VkLayerTest, InvalidImageLayout) {
11688 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
11689 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11690 "images in the wrong layout when they're copied or transitioned.");
11691 // 3 in ValidateCmdBufImageLayouts
11692 // * -1 Attempt to submit cmd buf w/ deleted image
11693 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11694 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
11695 m_errorMonitor->SetDesiredFailureMsg(
11696 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11697 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11698
11699 ASSERT_NO_FATAL_FAILURE(InitState());
11700 // Create src & dst images to use for copy operations
11701 VkImage src_image;
11702 VkImage dst_image;
11703
11704 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11705 const int32_t tex_width = 32;
11706 const int32_t tex_height = 32;
11707
11708 VkImageCreateInfo image_create_info = {};
11709 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11710 image_create_info.pNext = NULL;
11711 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11712 image_create_info.format = tex_format;
11713 image_create_info.extent.width = tex_width;
11714 image_create_info.extent.height = tex_height;
11715 image_create_info.extent.depth = 1;
11716 image_create_info.mipLevels = 1;
11717 image_create_info.arrayLayers = 4;
11718 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11719 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11720 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
11721 image_create_info.flags = 0;
11722
11723 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11724 ASSERT_VK_SUCCESS(err);
11725 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11726 ASSERT_VK_SUCCESS(err);
11727
11728 BeginCommandBuffer();
11729 VkImageCopy copyRegion;
11730 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11731 copyRegion.srcSubresource.mipLevel = 0;
11732 copyRegion.srcSubresource.baseArrayLayer = 0;
11733 copyRegion.srcSubresource.layerCount = 1;
11734 copyRegion.srcOffset.x = 0;
11735 copyRegion.srcOffset.y = 0;
11736 copyRegion.srcOffset.z = 0;
11737 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11738 copyRegion.dstSubresource.mipLevel = 0;
11739 copyRegion.dstSubresource.baseArrayLayer = 0;
11740 copyRegion.dstSubresource.layerCount = 1;
11741 copyRegion.dstOffset.x = 0;
11742 copyRegion.dstOffset.y = 0;
11743 copyRegion.dstOffset.z = 0;
11744 copyRegion.extent.width = 1;
11745 copyRegion.extent.height = 1;
11746 copyRegion.extent.depth = 1;
11747 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11748 m_errorMonitor->VerifyFound();
11749 // Now cause error due to src image layout changing
11750 m_errorMonitor->SetDesiredFailureMsg(
11751 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11752 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
11753 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11754 m_errorMonitor->VerifyFound();
11755 // Final src error is due to bad layout type
11756 m_errorMonitor->SetDesiredFailureMsg(
11757 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11758 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
11759 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11760 m_errorMonitor->VerifyFound();
11761 // Now verify same checks for dst
11762 m_errorMonitor->SetDesiredFailureMsg(
11763 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11764 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
11765 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11766 m_errorMonitor->VerifyFound();
11767 // Now cause error due to src image layout changing
11768 m_errorMonitor->SetDesiredFailureMsg(
11769 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11770 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
11771 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
11772 m_errorMonitor->VerifyFound();
11773 m_errorMonitor->SetDesiredFailureMsg(
11774 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11775 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
11776 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
11777 m_errorMonitor->VerifyFound();
11778 // Now cause error due to bad image layout transition in PipelineBarrier
11779 VkImageMemoryBarrier image_barrier[1] = {};
11780 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11781 image_barrier[0].image = src_image;
11782 image_barrier[0].subresourceRange.layerCount = 2;
11783 image_barrier[0].subresourceRange.levelCount = 2;
11784 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11785 m_errorMonitor->SetDesiredFailureMsg(
11786 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11787 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
11788 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
11789 m_errorMonitor->VerifyFound();
11790
11791 // Finally some layout errors at RenderPass create time
11792 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
11793 VkAttachmentReference attach = {};
11794 // perf warning for GENERAL layout w/ non-DS input attachment
11795 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11796 VkSubpassDescription subpass = {};
11797 subpass.inputAttachmentCount = 1;
11798 subpass.pInputAttachments = &attach;
11799 VkRenderPassCreateInfo rpci = {};
11800 rpci.subpassCount = 1;
11801 rpci.pSubpasses = &subpass;
11802 rpci.attachmentCount = 1;
11803 VkAttachmentDescription attach_desc = {};
11804 attach_desc.format = VK_FORMAT_UNDEFINED;
11805 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011806 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011807 VkRenderPass rp;
11808 m_errorMonitor->SetDesiredFailureMsg(
11809 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11810 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
11811 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11812 m_errorMonitor->VerifyFound();
11813 // error w/ non-general layout
11814 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11815
11816 m_errorMonitor->SetDesiredFailureMsg(
11817 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11818 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
11819 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11820 m_errorMonitor->VerifyFound();
11821 subpass.inputAttachmentCount = 0;
11822 subpass.colorAttachmentCount = 1;
11823 subpass.pColorAttachments = &attach;
11824 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11825 // perf warning for GENERAL layout on color attachment
11826 m_errorMonitor->SetDesiredFailureMsg(
11827 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11828 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
11829 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11830 m_errorMonitor->VerifyFound();
11831 // error w/ non-color opt or GENERAL layout for color attachment
11832 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11833 m_errorMonitor->SetDesiredFailureMsg(
11834 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11835 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
11836 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11837 m_errorMonitor->VerifyFound();
11838 subpass.colorAttachmentCount = 0;
11839 subpass.pDepthStencilAttachment = &attach;
11840 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11841 // perf warning for GENERAL layout on DS attachment
11842 m_errorMonitor->SetDesiredFailureMsg(
11843 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11844 "Layout for depth attachment is GENERAL but should be DEPTH_STENCIL_ATTACHMENT_OPTIMAL.");
11845 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11846 m_errorMonitor->VerifyFound();
11847 // error w/ non-ds opt or GENERAL layout for color attachment
11848 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11849 m_errorMonitor->SetDesiredFailureMsg(
11850 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11851 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be DEPTH_STENCIL_ATTACHMENT_OPTIMAL or GENERAL.");
11852 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11853 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060011854 // For this error we need a valid renderpass so create default one
11855 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11856 attach.attachment = 0;
11857 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
11858 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
11859 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
11860 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
11861 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
11862 // Can't do a CLEAR load on READ_ONLY initialLayout
11863 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
11864 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11865 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11866 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11867 " with invalid first layout "
11868 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
11869 "ONLY_OPTIMAL");
11870 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11871 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011872
11873 vkDestroyImage(m_device->device(), src_image, NULL);
11874 vkDestroyImage(m_device->device(), dst_image, NULL);
11875}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060011876
11877TEST_F(VkLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
11878 TEST_DESCRIPTION("Positive test where we create a renderpass with an "
11879 "attachment that uses LOAD_OP_CLEAR, the first subpass "
11880 "has a valid layout, and a second subpass then uses a "
11881 "valid *READ_ONLY* layout.");
11882 m_errorMonitor->ExpectSuccess();
11883 ASSERT_NO_FATAL_FAILURE(InitState());
11884
11885 VkAttachmentReference attach[2] = {};
11886 attach[0].attachment = 0;
11887 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
11888 attach[1].attachment = 0;
11889 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11890 VkSubpassDescription subpasses[2] = {};
11891 // First subpass clears DS attach on load
11892 subpasses[0].pDepthStencilAttachment = &attach[0];
11893 // 2nd subpass reads in DS as input attachment
11894 subpasses[1].inputAttachmentCount = 1;
11895 subpasses[1].pInputAttachments = &attach[1];
11896 VkAttachmentDescription attach_desc = {};
11897 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
11898 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
11899 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
11900 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
11901 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
11902 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
11903 attach_desc.initialLayout =
11904 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
11905 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11906 VkRenderPassCreateInfo rpci = {};
11907 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11908 rpci.attachmentCount = 1;
11909 rpci.pAttachments = &attach_desc;
11910 rpci.subpassCount = 2;
11911 rpci.pSubpasses = subpasses;
11912
11913 // Now create RenderPass and verify no errors
11914 VkRenderPass rp;
11915 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11916 m_errorMonitor->VerifyNotFound();
11917
11918 vkDestroyRenderPass(m_device->device(), rp, NULL);
11919}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011920#endif // DRAW_STATE_TESTS
11921
Tobin Ehlis0788f522015-05-26 16:11:58 -060011922#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -060011923#if GTEST_IS_THREADSAFE
11924struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011925 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011926 VkEvent event;
11927 bool bailout;
11928};
11929
Karl Schultz6addd812016-02-02 17:17:23 -070011930extern "C" void *AddToCommandBuffer(void *arg) {
11931 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011932
Mike Stroyana6d14942016-07-13 15:10:05 -060011933 for (int i = 0; i < 80000; i++) {
Karl Schultz6addd812016-02-02 17:17:23 -070011934 vkCmdSetEvent(data->commandBuffer, data->event,
11935 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011936 if (data->bailout) {
11937 break;
11938 }
11939 }
11940 return NULL;
11941}
11942
Karl Schultz6addd812016-02-02 17:17:23 -070011943TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060011944 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011945
Karl Schultz6addd812016-02-02 17:17:23 -070011946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11947 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011948
Mike Stroyanaccf7692015-05-12 16:00:45 -060011949 ASSERT_NO_FATAL_FAILURE(InitState());
11950 ASSERT_NO_FATAL_FAILURE(InitViewport());
11951 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11952
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011953 // Calls AllocateCommandBuffers
11954 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060011955
11956 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011957 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060011958
11959 VkEventCreateInfo event_info;
11960 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011961 VkResult err;
11962
11963 memset(&event_info, 0, sizeof(event_info));
11964 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11965
Chia-I Wuf7458c52015-10-26 21:10:41 +080011966 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011967 ASSERT_VK_SUCCESS(err);
11968
Mike Stroyanaccf7692015-05-12 16:00:45 -060011969 err = vkResetEvent(device(), event);
11970 ASSERT_VK_SUCCESS(err);
11971
11972 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011973 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060011974 data.event = event;
11975 data.bailout = false;
11976 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060011977
11978 // First do some correct operations using multiple threads.
11979 // Add many entries to command buffer from another thread.
11980 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
11981 // Make non-conflicting calls from this thread at the same time.
11982 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060011983 uint32_t count;
11984 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060011985 }
11986 test_platform_thread_join(thread, NULL);
11987
11988 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060011989 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060011990 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011991 // Add many entries to command buffer from this thread at the same time.
11992 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060011993
Mike Stroyan4268d1f2015-07-13 14:45:35 -060011994 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011995 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060011996
Mike Stroyan10b8cb72016-01-22 15:22:03 -070011997 m_errorMonitor->SetBailout(NULL);
11998
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011999 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012000
Chia-I Wuf7458c52015-10-26 21:10:41 +080012001 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012002}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012003#endif // GTEST_IS_THREADSAFE
12004#endif // THREADING_TESTS
12005
Chris Forbes9f7ff632015-05-25 11:13:08 +120012006#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070012007TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012008 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
12009 "with an impossible code size");
12010
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012012 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012013
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012014 ASSERT_NO_FATAL_FAILURE(InitState());
12015 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12016
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012017 VkShaderModule module;
12018 VkShaderModuleCreateInfo moduleCreateInfo;
12019 struct icd_spv_header spv;
12020
12021 spv.magic = ICD_SPV_MAGIC;
12022 spv.version = ICD_SPV_VERSION;
12023 spv.gen_magic = 0;
12024
12025 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12026 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070012027 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012028 moduleCreateInfo.codeSize = 4;
12029 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012030 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012031
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012032 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012033}
12034
Karl Schultz6addd812016-02-02 17:17:23 -070012035TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012036 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
12037 "with a bad magic number");
12038
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012039 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012040 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012041
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012042 ASSERT_NO_FATAL_FAILURE(InitState());
12043 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12044
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012045 VkShaderModule module;
12046 VkShaderModuleCreateInfo moduleCreateInfo;
12047 struct icd_spv_header spv;
12048
12049 spv.magic = ~ICD_SPV_MAGIC;
12050 spv.version = ICD_SPV_VERSION;
12051 spv.gen_magic = 0;
12052
12053 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12054 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070012055 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012056 moduleCreateInfo.codeSize = sizeof(spv) + 10;
12057 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012058 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012059
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012060 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012061}
12062
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012063#if 0
12064// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070012065TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012066 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012067 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012068
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012069 ASSERT_NO_FATAL_FAILURE(InitState());
12070 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12071
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012072 VkShaderModule module;
12073 VkShaderModuleCreateInfo moduleCreateInfo;
12074 struct icd_spv_header spv;
12075
12076 spv.magic = ICD_SPV_MAGIC;
12077 spv.version = ~ICD_SPV_VERSION;
12078 spv.gen_magic = 0;
12079
12080 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12081 moduleCreateInfo.pNext = NULL;
12082
Karl Schultz6addd812016-02-02 17:17:23 -070012083 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012084 moduleCreateInfo.codeSize = sizeof(spv) + 10;
12085 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012086 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012087
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012088 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012089}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012090#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012091
Karl Schultz6addd812016-02-02 17:17:23 -070012092TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012093 TEST_DESCRIPTION("Test that a warning is produced for a vertex output that "
12094 "is not consumed by the fragment stage");
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012095 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012096 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012097
Chris Forbes9f7ff632015-05-25 11:13:08 +120012098 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012099 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120012100
12101 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012102 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120012103 "\n"
12104 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070012105 "out gl_PerVertex {\n"
12106 " vec4 gl_Position;\n"
12107 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120012108 "void main(){\n"
12109 " gl_Position = vec4(1);\n"
12110 " x = 0;\n"
12111 "}\n";
12112 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012113 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120012114 "\n"
12115 "layout(location=0) out vec4 color;\n"
12116 "void main(){\n"
12117 " color = vec4(1);\n"
12118 "}\n";
12119
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012120 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12121 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120012122
12123 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012124 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120012125 pipe.AddShader(&vs);
12126 pipe.AddShader(&fs);
12127
Chris Forbes9f7ff632015-05-25 11:13:08 +120012128 VkDescriptorSetObj descriptorSet(m_device);
12129 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012130 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120012131
Tony Barbour5781e8f2015-08-04 16:23:11 -060012132 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120012133
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012134 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120012135}
Chris Forbes9f7ff632015-05-25 11:13:08 +120012136
Karl Schultz6addd812016-02-02 17:17:23 -070012137TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012138 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
12139 "which is not present in the outputs of the previous stage");
12140
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012141 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012142 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012143
Chris Forbes59cb88d2015-05-25 11:13:13 +120012144 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012145 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120012146
12147 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012148 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120012149 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070012150 "out gl_PerVertex {\n"
12151 " vec4 gl_Position;\n"
12152 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120012153 "void main(){\n"
12154 " gl_Position = vec4(1);\n"
12155 "}\n";
12156 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012157 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120012158 "\n"
12159 "layout(location=0) in float x;\n"
12160 "layout(location=0) out vec4 color;\n"
12161 "void main(){\n"
12162 " color = vec4(x);\n"
12163 "}\n";
12164
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012165 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12166 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120012167
12168 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012169 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120012170 pipe.AddShader(&vs);
12171 pipe.AddShader(&fs);
12172
Chris Forbes59cb88d2015-05-25 11:13:13 +120012173 VkDescriptorSetObj descriptorSet(m_device);
12174 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012175 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120012176
Tony Barbour5781e8f2015-08-04 16:23:11 -060012177 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120012178
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012179 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120012180}
12181
Karl Schultz6addd812016-02-02 17:17:23 -070012182TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012183 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
12184 "within an interace block, which is not present in the outputs "
12185 "of the previous stage.");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012186 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012187 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012188
12189 ASSERT_NO_FATAL_FAILURE(InitState());
12190 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12191
12192 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012193 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130012194 "\n"
12195 "out gl_PerVertex {\n"
12196 " vec4 gl_Position;\n"
12197 "};\n"
12198 "void main(){\n"
12199 " gl_Position = vec4(1);\n"
12200 "}\n";
12201 char const *fsSource =
12202 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130012203 "\n"
12204 "in block { layout(location=0) float x; } ins;\n"
12205 "layout(location=0) out vec4 color;\n"
12206 "void main(){\n"
12207 " color = vec4(ins.x);\n"
12208 "}\n";
12209
12210 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12211 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12212
12213 VkPipelineObj pipe(m_device);
12214 pipe.AddColorAttachment();
12215 pipe.AddShader(&vs);
12216 pipe.AddShader(&fs);
12217
12218 VkDescriptorSetObj descriptorSet(m_device);
12219 descriptorSet.AppendDummy();
12220 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12221
12222 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12223
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012224 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130012225}
12226
Karl Schultz6addd812016-02-02 17:17:23 -070012227TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012228 TEST_DESCRIPTION("Test that an error is produced for mismatched array sizes "
12229 "across the VS->FS interface");
Chris Forbes0036fd12016-01-26 14:19:49 +130012230 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +130012231 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -070012232 "output arr[2] of float32' vs 'ptr to "
12233 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130012234
12235 ASSERT_NO_FATAL_FAILURE(InitState());
12236 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12237
12238 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012239 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130012240 "\n"
12241 "layout(location=0) out float x[2];\n"
12242 "out gl_PerVertex {\n"
12243 " vec4 gl_Position;\n"
12244 "};\n"
12245 "void main(){\n"
12246 " x[0] = 0; x[1] = 0;\n"
12247 " gl_Position = vec4(1);\n"
12248 "}\n";
12249 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012250 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130012251 "\n"
12252 "layout(location=0) in float x[3];\n"
12253 "layout(location=0) out vec4 color;\n"
12254 "void main(){\n"
12255 " color = vec4(x[0] + x[1] + x[2]);\n"
12256 "}\n";
12257
12258 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12259 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12260
12261 VkPipelineObj pipe(m_device);
12262 pipe.AddColorAttachment();
12263 pipe.AddShader(&vs);
12264 pipe.AddShader(&fs);
12265
12266 VkDescriptorSetObj descriptorSet(m_device);
12267 descriptorSet.AppendDummy();
12268 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12269
12270 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12271
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012272 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130012273}
12274
Karl Schultz6addd812016-02-02 17:17:23 -070012275TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012276 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
12277 "the VS->FS interface");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012278 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012279 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012280
Chris Forbesb56af562015-05-25 11:13:17 +120012281 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012282 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120012283
12284 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012285 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120012286 "\n"
12287 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070012288 "out gl_PerVertex {\n"
12289 " vec4 gl_Position;\n"
12290 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +120012291 "void main(){\n"
12292 " x = 0;\n"
12293 " gl_Position = vec4(1);\n"
12294 "}\n";
12295 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012296 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120012297 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012298 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +120012299 "layout(location=0) out vec4 color;\n"
12300 "void main(){\n"
12301 " color = vec4(x);\n"
12302 "}\n";
12303
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012304 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12305 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120012306
12307 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012308 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120012309 pipe.AddShader(&vs);
12310 pipe.AddShader(&fs);
12311
Chris Forbesb56af562015-05-25 11:13:17 +120012312 VkDescriptorSetObj descriptorSet(m_device);
12313 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012314 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120012315
Tony Barbour5781e8f2015-08-04 16:23:11 -060012316 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120012317
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012318 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120012319}
12320
Karl Schultz6addd812016-02-02 17:17:23 -070012321TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012322 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
12323 "the VS->FS interface, when the variable is contained within "
12324 "an interface block");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012325 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012326 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012327
12328 ASSERT_NO_FATAL_FAILURE(InitState());
12329 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12330
12331 char const *vsSource =
12332 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130012333 "\n"
12334 "out block { layout(location=0) int x; } outs;\n"
12335 "out gl_PerVertex {\n"
12336 " vec4 gl_Position;\n"
12337 "};\n"
12338 "void main(){\n"
12339 " outs.x = 0;\n"
12340 " gl_Position = vec4(1);\n"
12341 "}\n";
12342 char const *fsSource =
12343 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130012344 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012345 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +130012346 "layout(location=0) out vec4 color;\n"
12347 "void main(){\n"
12348 " color = vec4(ins.x);\n"
12349 "}\n";
12350
12351 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12352 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12353
12354 VkPipelineObj pipe(m_device);
12355 pipe.AddColorAttachment();
12356 pipe.AddShader(&vs);
12357 pipe.AddShader(&fs);
12358
12359 VkDescriptorSetObj descriptorSet(m_device);
12360 descriptorSet.AppendDummy();
12361 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12362
12363 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12364
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012365 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130012366}
12367
12368TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012369 TEST_DESCRIPTION("Test that an error is produced for location mismatches across "
12370 "the VS->FS interface; This should manifest as a not-written/not-consumed "
12371 "pair, but flushes out broken walking of the interfaces");
Chris Forbese9928822016-02-17 14:44:52 +130012372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12373 "location 0.0 which is not written by vertex shader");
12374
12375 ASSERT_NO_FATAL_FAILURE(InitState());
12376 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12377
12378 char const *vsSource =
12379 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130012380 "\n"
12381 "out block { layout(location=1) float x; } outs;\n"
12382 "out gl_PerVertex {\n"
12383 " vec4 gl_Position;\n"
12384 "};\n"
12385 "void main(){\n"
12386 " outs.x = 0;\n"
12387 " gl_Position = vec4(1);\n"
12388 "}\n";
12389 char const *fsSource =
12390 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130012391 "\n"
12392 "in block { layout(location=0) float x; } ins;\n"
12393 "layout(location=0) out vec4 color;\n"
12394 "void main(){\n"
12395 " color = vec4(ins.x);\n"
12396 "}\n";
12397
12398 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12399 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12400
12401 VkPipelineObj pipe(m_device);
12402 pipe.AddColorAttachment();
12403 pipe.AddShader(&vs);
12404 pipe.AddShader(&fs);
12405
12406 VkDescriptorSetObj descriptorSet(m_device);
12407 descriptorSet.AppendDummy();
12408 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12409
12410 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12411
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012412 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130012413}
12414
12415TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012416 TEST_DESCRIPTION("Test that an error is produced for component mismatches across the "
12417 "VS->FS interface. It's not enough to have the same set of locations in "
12418 "use; matching is defined in terms of spirv variables.");
Chris Forbese9928822016-02-17 14:44:52 +130012419 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12420 "location 0.1 which is not written by vertex shader");
12421
12422 ASSERT_NO_FATAL_FAILURE(InitState());
12423 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12424
12425 char const *vsSource =
12426 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130012427 "\n"
12428 "out block { layout(location=0, component=0) float x; } outs;\n"
12429 "out gl_PerVertex {\n"
12430 " vec4 gl_Position;\n"
12431 "};\n"
12432 "void main(){\n"
12433 " outs.x = 0;\n"
12434 " gl_Position = vec4(1);\n"
12435 "}\n";
12436 char const *fsSource =
12437 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130012438 "\n"
12439 "in block { layout(location=0, component=1) float x; } ins;\n"
12440 "layout(location=0) out vec4 color;\n"
12441 "void main(){\n"
12442 " color = vec4(ins.x);\n"
12443 "}\n";
12444
12445 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12446 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12447
12448 VkPipelineObj pipe(m_device);
12449 pipe.AddColorAttachment();
12450 pipe.AddShader(&vs);
12451 pipe.AddShader(&fs);
12452
12453 VkDescriptorSetObj descriptorSet(m_device);
12454 descriptorSet.AppendDummy();
12455 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12456
12457 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12458
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012459 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130012460}
12461
Karl Schultz6addd812016-02-02 17:17:23 -070012462TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012463 TEST_DESCRIPTION("Test that a warning is produced for a vertex attribute which is "
12464 "not consumed by the vertex shader");
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012465 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012466 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012467
Chris Forbesde136e02015-05-25 11:13:28 +120012468 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012469 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120012470
12471 VkVertexInputBindingDescription input_binding;
12472 memset(&input_binding, 0, sizeof(input_binding));
12473
12474 VkVertexInputAttributeDescription input_attrib;
12475 memset(&input_attrib, 0, sizeof(input_attrib));
12476 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12477
12478 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012479 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120012480 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070012481 "out gl_PerVertex {\n"
12482 " vec4 gl_Position;\n"
12483 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +120012484 "void main(){\n"
12485 " gl_Position = vec4(1);\n"
12486 "}\n";
12487 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012488 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120012489 "\n"
12490 "layout(location=0) out vec4 color;\n"
12491 "void main(){\n"
12492 " color = vec4(1);\n"
12493 "}\n";
12494
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012495 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12496 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120012497
12498 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012499 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120012500 pipe.AddShader(&vs);
12501 pipe.AddShader(&fs);
12502
12503 pipe.AddVertexInputBindings(&input_binding, 1);
12504 pipe.AddVertexInputAttribs(&input_attrib, 1);
12505
Chris Forbesde136e02015-05-25 11:13:28 +120012506 VkDescriptorSetObj descriptorSet(m_device);
12507 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012508 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120012509
Tony Barbour5781e8f2015-08-04 16:23:11 -060012510 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120012511
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012512 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120012513}
12514
Karl Schultz6addd812016-02-02 17:17:23 -070012515TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012516 TEST_DESCRIPTION("Test that a warning is produced for a location mismatch on "
12517 "vertex attributes. This flushes out bad behavior in the interface walker");
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012518 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012519 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +130012520
12521 ASSERT_NO_FATAL_FAILURE(InitState());
12522 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12523
12524 VkVertexInputBindingDescription input_binding;
12525 memset(&input_binding, 0, sizeof(input_binding));
12526
12527 VkVertexInputAttributeDescription input_attrib;
12528 memset(&input_attrib, 0, sizeof(input_attrib));
12529 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12530
12531 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012532 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130012533 "\n"
12534 "layout(location=1) in float x;\n"
12535 "out gl_PerVertex {\n"
12536 " vec4 gl_Position;\n"
12537 "};\n"
12538 "void main(){\n"
12539 " gl_Position = vec4(x);\n"
12540 "}\n";
12541 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012542 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130012543 "\n"
12544 "layout(location=0) out vec4 color;\n"
12545 "void main(){\n"
12546 " color = vec4(1);\n"
12547 "}\n";
12548
12549 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12550 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12551
12552 VkPipelineObj pipe(m_device);
12553 pipe.AddColorAttachment();
12554 pipe.AddShader(&vs);
12555 pipe.AddShader(&fs);
12556
12557 pipe.AddVertexInputBindings(&input_binding, 1);
12558 pipe.AddVertexInputAttribs(&input_attrib, 1);
12559
12560 VkDescriptorSetObj descriptorSet(m_device);
12561 descriptorSet.AppendDummy();
12562 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12563
12564 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12565
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012566 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130012567}
12568
Karl Schultz6addd812016-02-02 17:17:23 -070012569TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012570 TEST_DESCRIPTION("Test that an error is produced for a VS input which is not "
12571 "provided by a vertex attribute");
Karl Schultz6addd812016-02-02 17:17:23 -070012572 m_errorMonitor->SetDesiredFailureMsg(
12573 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012574 "VS consumes input at location 0 but not provided");
12575
Chris Forbes62e8e502015-05-25 11:13:29 +120012576 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012577 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120012578
12579 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012580 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120012581 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012582 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -070012583 "out gl_PerVertex {\n"
12584 " vec4 gl_Position;\n"
12585 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120012586 "void main(){\n"
12587 " gl_Position = x;\n"
12588 "}\n";
12589 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012590 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120012591 "\n"
12592 "layout(location=0) out vec4 color;\n"
12593 "void main(){\n"
12594 " color = vec4(1);\n"
12595 "}\n";
12596
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012597 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12598 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120012599
12600 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012601 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120012602 pipe.AddShader(&vs);
12603 pipe.AddShader(&fs);
12604
Chris Forbes62e8e502015-05-25 11:13:29 +120012605 VkDescriptorSetObj descriptorSet(m_device);
12606 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012607 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120012608
Tony Barbour5781e8f2015-08-04 16:23:11 -060012609 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120012610
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012611 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120012612}
12613
Karl Schultz6addd812016-02-02 17:17:23 -070012614TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012615 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the "
12616 "fundamental type (float/int/uint) of an attribute and the "
12617 "VS input that consumes it");
Karl Schultz6addd812016-02-02 17:17:23 -070012618 m_errorMonitor->SetDesiredFailureMsg(
12619 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012620 "location 0 does not match VS input type");
12621
Chris Forbesc97d98e2015-05-25 11:13:31 +120012622 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012623 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120012624
12625 VkVertexInputBindingDescription input_binding;
12626 memset(&input_binding, 0, sizeof(input_binding));
12627
12628 VkVertexInputAttributeDescription input_attrib;
12629 memset(&input_attrib, 0, sizeof(input_attrib));
12630 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12631
12632 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012633 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120012634 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012635 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070012636 "out gl_PerVertex {\n"
12637 " vec4 gl_Position;\n"
12638 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120012639 "void main(){\n"
12640 " gl_Position = vec4(x);\n"
12641 "}\n";
12642 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012643 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120012644 "\n"
12645 "layout(location=0) out vec4 color;\n"
12646 "void main(){\n"
12647 " color = vec4(1);\n"
12648 "}\n";
12649
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012650 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12651 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120012652
12653 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012654 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120012655 pipe.AddShader(&vs);
12656 pipe.AddShader(&fs);
12657
12658 pipe.AddVertexInputBindings(&input_binding, 1);
12659 pipe.AddVertexInputAttribs(&input_attrib, 1);
12660
Chris Forbesc97d98e2015-05-25 11:13:31 +120012661 VkDescriptorSetObj descriptorSet(m_device);
12662 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012663 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120012664
Tony Barbour5781e8f2015-08-04 16:23:11 -060012665 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120012666
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012667 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120012668}
12669
Chris Forbesc68b43c2016-04-06 11:18:47 +120012670TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012671 TEST_DESCRIPTION("Test that an error is produced for a pipeline containing multiple "
12672 "shaders for the same stage");
Chris Forbesc68b43c2016-04-06 11:18:47 +120012673 m_errorMonitor->SetDesiredFailureMsg(
12674 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12675 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
12676
12677 ASSERT_NO_FATAL_FAILURE(InitState());
12678 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12679
12680 char const *vsSource =
12681 "#version 450\n"
12682 "\n"
12683 "out gl_PerVertex {\n"
12684 " vec4 gl_Position;\n"
12685 "};\n"
12686 "void main(){\n"
12687 " gl_Position = vec4(1);\n"
12688 "}\n";
12689 char const *fsSource =
12690 "#version 450\n"
12691 "\n"
12692 "layout(location=0) out vec4 color;\n"
12693 "void main(){\n"
12694 " color = vec4(1);\n"
12695 "}\n";
12696
12697 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12698 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12699
12700 VkPipelineObj pipe(m_device);
12701 pipe.AddColorAttachment();
12702 pipe.AddShader(&vs);
12703 pipe.AddShader(&vs);
12704 pipe.AddShader(&fs);
12705
12706 VkDescriptorSetObj descriptorSet(m_device);
12707 descriptorSet.AppendDummy();
12708 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12709
12710 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12711
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012712 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120012713}
12714
Karl Schultz6addd812016-02-02 17:17:23 -070012715TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012716 TEST_DESCRIPTION("Test that pipeline validation accepts matrices passed "
12717 "as vertex attributes");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012718 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130012719
12720 ASSERT_NO_FATAL_FAILURE(InitState());
12721 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12722
12723 VkVertexInputBindingDescription input_binding;
12724 memset(&input_binding, 0, sizeof(input_binding));
12725
12726 VkVertexInputAttributeDescription input_attribs[2];
12727 memset(input_attribs, 0, sizeof(input_attribs));
12728
12729 for (int i = 0; i < 2; i++) {
12730 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
12731 input_attribs[i].location = i;
12732 }
12733
12734 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012735 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012736 "\n"
12737 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070012738 "out gl_PerVertex {\n"
12739 " vec4 gl_Position;\n"
12740 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012741 "void main(){\n"
12742 " gl_Position = x[0] + x[1];\n"
12743 "}\n";
12744 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012745 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012746 "\n"
12747 "layout(location=0) out vec4 color;\n"
12748 "void main(){\n"
12749 " color = vec4(1);\n"
12750 "}\n";
12751
12752 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12753 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12754
12755 VkPipelineObj pipe(m_device);
12756 pipe.AddColorAttachment();
12757 pipe.AddShader(&vs);
12758 pipe.AddShader(&fs);
12759
12760 pipe.AddVertexInputBindings(&input_binding, 1);
12761 pipe.AddVertexInputAttribs(input_attribs, 2);
12762
12763 VkDescriptorSetObj descriptorSet(m_device);
12764 descriptorSet.AppendDummy();
12765 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12766
12767 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12768
12769 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012770 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130012771}
12772
Chris Forbes2682b242015-11-24 11:13:14 +130012773TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
12774{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012775 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130012776
12777 ASSERT_NO_FATAL_FAILURE(InitState());
12778 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12779
12780 VkVertexInputBindingDescription input_binding;
12781 memset(&input_binding, 0, sizeof(input_binding));
12782
12783 VkVertexInputAttributeDescription input_attribs[2];
12784 memset(input_attribs, 0, sizeof(input_attribs));
12785
12786 for (int i = 0; i < 2; i++) {
12787 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
12788 input_attribs[i].location = i;
12789 }
12790
12791 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012792 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012793 "\n"
12794 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -070012795 "out gl_PerVertex {\n"
12796 " vec4 gl_Position;\n"
12797 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012798 "void main(){\n"
12799 " gl_Position = x[0] + x[1];\n"
12800 "}\n";
12801 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012802 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012803 "\n"
12804 "layout(location=0) out vec4 color;\n"
12805 "void main(){\n"
12806 " color = vec4(1);\n"
12807 "}\n";
12808
12809 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12810 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12811
12812 VkPipelineObj pipe(m_device);
12813 pipe.AddColorAttachment();
12814 pipe.AddShader(&vs);
12815 pipe.AddShader(&fs);
12816
12817 pipe.AddVertexInputBindings(&input_binding, 1);
12818 pipe.AddVertexInputAttribs(input_attribs, 2);
12819
12820 VkDescriptorSetObj descriptorSet(m_device);
12821 descriptorSet.AppendDummy();
12822 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12823
12824 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12825
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012826 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130012827}
Chris Forbes2682b242015-11-24 11:13:14 +130012828
Chris Forbesbc290ce2016-07-06 12:01:49 +120012829TEST_F(VkLayerTest, CreatePipelineAttribComponents)
12830{
Chris Forbes1cc79542016-07-20 11:13:44 +120012831 TEST_DESCRIPTION("Test that pipeline validation accepts consuming a vertex attribute "
12832 "through multiple VS inputs, each consuming a different subset of the "
12833 "components.");
Chris Forbesbc290ce2016-07-06 12:01:49 +120012834 m_errorMonitor->ExpectSuccess();
12835
12836 ASSERT_NO_FATAL_FAILURE(InitState());
12837 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12838
12839 VkVertexInputBindingDescription input_binding;
12840 memset(&input_binding, 0, sizeof(input_binding));
12841
12842 VkVertexInputAttributeDescription input_attribs[3];
12843 memset(input_attribs, 0, sizeof(input_attribs));
12844
12845 for (int i = 0; i < 3; i++) {
12846 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
12847 input_attribs[i].location = i;
12848 }
12849
12850 char const *vsSource =
12851 "#version 450\n"
12852 "\n"
12853 "layout(location=0) in vec4 x;\n"
12854 "layout(location=1) in vec3 y1;\n"
12855 "layout(location=1, component=3) in float y2;\n"
12856 "layout(location=2) in vec4 z;\n"
12857 "out gl_PerVertex {\n"
12858 " vec4 gl_Position;\n"
12859 "};\n"
12860 "void main(){\n"
12861 " gl_Position = x + vec4(y1, y2) + z;\n"
12862 "}\n";
12863 char const *fsSource =
12864 "#version 450\n"
12865 "\n"
12866 "layout(location=0) out vec4 color;\n"
12867 "void main(){\n"
12868 " color = vec4(1);\n"
12869 "}\n";
12870
12871 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12872 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12873
12874 VkPipelineObj pipe(m_device);
12875 pipe.AddColorAttachment();
12876 pipe.AddShader(&vs);
12877 pipe.AddShader(&fs);
12878
12879 pipe.AddVertexInputBindings(&input_binding, 1);
12880 pipe.AddVertexInputAttribs(input_attribs, 3);
12881
12882 VkDescriptorSetObj descriptorSet(m_device);
12883 descriptorSet.AppendDummy();
12884 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12885
12886 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12887
12888 m_errorMonitor->VerifyNotFound();
12889}
12890
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012891TEST_F(VkLayerTest, CreatePipelineSimplePositive)
12892{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012893 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012894
12895 ASSERT_NO_FATAL_FAILURE(InitState());
12896 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12897
12898 char const *vsSource =
12899 "#version 450\n"
12900 "out gl_PerVertex {\n"
12901 " vec4 gl_Position;\n"
12902 "};\n"
12903 "void main(){\n"
12904 " gl_Position = vec4(0);\n"
12905 "}\n";
12906 char const *fsSource =
12907 "#version 450\n"
12908 "\n"
12909 "layout(location=0) out vec4 color;\n"
12910 "void main(){\n"
12911 " color = vec4(1);\n"
12912 "}\n";
12913
12914 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12915 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12916
12917 VkPipelineObj pipe(m_device);
12918 pipe.AddColorAttachment();
12919 pipe.AddShader(&vs);
12920 pipe.AddShader(&fs);
12921
12922 VkDescriptorSetObj descriptorSet(m_device);
12923 descriptorSet.AppendDummy();
12924 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12925
12926 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12927
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012928 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012929}
12930
Chris Forbes912c9192016-04-05 17:50:35 +120012931TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
12932{
Chris Forbes1cc79542016-07-20 11:13:44 +120012933 TEST_DESCRIPTION("Test that pipeline validation accepts the relaxed type matching rules "
12934 "set out in 14.1.3: fundamental type must match, and producer side must "
12935 "have at least as many components");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012936 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +120012937
12938 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
12939
12940 ASSERT_NO_FATAL_FAILURE(InitState());
12941 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12942
12943 char const *vsSource =
12944 "#version 450\n"
12945 "out gl_PerVertex {\n"
12946 " vec4 gl_Position;\n"
12947 "};\n"
12948 "layout(location=0) out vec3 x;\n"
12949 "layout(location=1) out ivec3 y;\n"
12950 "layout(location=2) out vec3 z;\n"
12951 "void main(){\n"
12952 " gl_Position = vec4(0);\n"
12953 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
12954 "}\n";
12955 char const *fsSource =
12956 "#version 450\n"
12957 "\n"
12958 "layout(location=0) out vec4 color;\n"
12959 "layout(location=0) in float x;\n"
12960 "layout(location=1) flat in int y;\n"
12961 "layout(location=2) in vec2 z;\n"
12962 "void main(){\n"
12963 " color = vec4(1 + x + y + z.x);\n"
12964 "}\n";
12965
12966 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12967 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12968
12969 VkPipelineObj pipe(m_device);
12970 pipe.AddColorAttachment();
12971 pipe.AddShader(&vs);
12972 pipe.AddShader(&fs);
12973
12974 VkDescriptorSetObj descriptorSet(m_device);
12975 descriptorSet.AppendDummy();
12976 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12977
Mike Stroyan255e9582016-06-24 09:49:32 -060012978 VkResult err = VK_SUCCESS;
12979 err =
12980 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12981 ASSERT_VK_SUCCESS(err);
12982
Chris Forbes912c9192016-04-05 17:50:35 +120012983
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012984 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +120012985}
12986
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012987TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
12988{
Chris Forbes1cc79542016-07-20 11:13:44 +120012989 TEST_DESCRIPTION("Test that pipeline validation accepts per-vertex variables "
12990 "passed between the TCS and TES stages");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012991 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012992
12993 ASSERT_NO_FATAL_FAILURE(InitState());
12994 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12995
Chris Forbesc1e852d2016-04-04 19:26:42 +120012996 if (!m_device->phy().features().tessellationShader) {
12997 printf("Device does not support tessellation shaders; skipped.\n");
12998 return;
12999 }
13000
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013001 char const *vsSource =
13002 "#version 450\n"
13003 "void main(){}\n";
13004 char const *tcsSource =
13005 "#version 450\n"
13006 "layout(location=0) out int x[];\n"
13007 "layout(vertices=3) out;\n"
13008 "void main(){\n"
13009 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
13010 " gl_TessLevelInner[0] = 1;\n"
13011 " x[gl_InvocationID] = gl_InvocationID;\n"
13012 "}\n";
13013 char const *tesSource =
13014 "#version 450\n"
13015 "layout(triangles, equal_spacing, cw) in;\n"
13016 "layout(location=0) in int x[];\n"
13017 "out gl_PerVertex { vec4 gl_Position; };\n"
13018 "void main(){\n"
13019 " gl_Position.xyz = gl_TessCoord;\n"
13020 " gl_Position.w = x[0] + x[1] + x[2];\n"
13021 "}\n";
13022 char const *fsSource =
13023 "#version 450\n"
13024 "layout(location=0) out vec4 color;\n"
13025 "void main(){\n"
13026 " color = vec4(1);\n"
13027 "}\n";
13028
13029 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13030 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
13031 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
13032 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13033
13034 VkPipelineInputAssemblyStateCreateInfo iasci{
13035 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
13036 nullptr,
13037 0,
13038 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
13039 VK_FALSE};
13040
Chris Forbesb4cacb62016-04-04 19:15:00 +120013041 VkPipelineTessellationStateCreateInfo tsci{
13042 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
13043 nullptr,
13044 0,
13045 3};
13046
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013047 VkPipelineObj pipe(m_device);
13048 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +120013049 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013050 pipe.AddColorAttachment();
13051 pipe.AddShader(&vs);
13052 pipe.AddShader(&tcs);
13053 pipe.AddShader(&tes);
13054 pipe.AddShader(&fs);
13055
13056 VkDescriptorSetObj descriptorSet(m_device);
13057 descriptorSet.AppendDummy();
13058 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13059
13060 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13061
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013062 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013063}
13064
Chris Forbesa0ab8152016-04-20 13:34:27 +120013065TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
13066{
Chris Forbes1cc79542016-07-20 11:13:44 +120013067 TEST_DESCRIPTION("Test that pipeline validation accepts a user-defined "
13068 "interface block passed into the geometry shader. This "
13069 "is interesting because the 'extra' array level is not "
13070 "present on the member type, but on the block instance.");
Chris Forbesa0ab8152016-04-20 13:34:27 +120013071 m_errorMonitor->ExpectSuccess();
13072
13073 ASSERT_NO_FATAL_FAILURE(InitState());
13074 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13075
13076 if (!m_device->phy().features().geometryShader) {
13077 printf("Device does not support geometry shaders; skipped.\n");
13078 return;
13079 }
13080
13081 char const *vsSource =
13082 "#version 450\n"
13083 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
13084 "void main(){\n"
13085 " vs_out.x = vec4(1);\n"
13086 "}\n";
13087 char const *gsSource =
13088 "#version 450\n"
13089 "layout(triangles) in;\n"
13090 "layout(triangle_strip, max_vertices=3) out;\n"
13091 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
13092 "out gl_PerVertex { vec4 gl_Position; };\n"
13093 "void main() {\n"
13094 " gl_Position = gs_in[0].x;\n"
13095 " EmitVertex();\n"
13096 "}\n";
13097 char const *fsSource =
13098 "#version 450\n"
13099 "layout(location=0) out vec4 color;\n"
13100 "void main(){\n"
13101 " color = vec4(1);\n"
13102 "}\n";
13103
13104 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13105 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
13106 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13107
13108 VkPipelineObj pipe(m_device);
13109 pipe.AddColorAttachment();
13110 pipe.AddShader(&vs);
13111 pipe.AddShader(&gs);
13112 pipe.AddShader(&fs);
13113
13114 VkDescriptorSetObj descriptorSet(m_device);
13115 descriptorSet.AppendDummy();
13116 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13117
13118 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13119
13120 m_errorMonitor->VerifyNotFound();
13121}
13122
Chris Forbesa0193bc2016-04-04 19:19:47 +120013123TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
13124{
Chris Forbes1cc79542016-07-20 11:13:44 +120013125 TEST_DESCRIPTION("Test that an error is produced for a variable output from "
13126 "the TCS without the patch decoration, but consumed in the TES "
13127 "with the decoration.");
Chris Forbesa0193bc2016-04-04 19:19:47 +120013128 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13129 "is per-vertex in tessellation control shader stage "
13130 "but per-patch in tessellation evaluation shader stage");
13131
13132 ASSERT_NO_FATAL_FAILURE(InitState());
13133 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13134
Chris Forbesc1e852d2016-04-04 19:26:42 +120013135 if (!m_device->phy().features().tessellationShader) {
13136 printf("Device does not support tessellation shaders; skipped.\n");
13137 return;
13138 }
13139
Chris Forbesa0193bc2016-04-04 19:19:47 +120013140 char const *vsSource =
13141 "#version 450\n"
13142 "void main(){}\n";
13143 char const *tcsSource =
13144 "#version 450\n"
13145 "layout(location=0) out int x[];\n"
13146 "layout(vertices=3) out;\n"
13147 "void main(){\n"
13148 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
13149 " gl_TessLevelInner[0] = 1;\n"
13150 " x[gl_InvocationID] = gl_InvocationID;\n"
13151 "}\n";
13152 char const *tesSource =
13153 "#version 450\n"
13154 "layout(triangles, equal_spacing, cw) in;\n"
13155 "layout(location=0) patch in int x;\n"
13156 "out gl_PerVertex { vec4 gl_Position; };\n"
13157 "void main(){\n"
13158 " gl_Position.xyz = gl_TessCoord;\n"
13159 " gl_Position.w = x;\n"
13160 "}\n";
13161 char const *fsSource =
13162 "#version 450\n"
13163 "layout(location=0) out vec4 color;\n"
13164 "void main(){\n"
13165 " color = vec4(1);\n"
13166 "}\n";
13167
13168 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13169 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
13170 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
13171 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13172
13173 VkPipelineInputAssemblyStateCreateInfo iasci{
13174 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
13175 nullptr,
13176 0,
13177 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
13178 VK_FALSE};
13179
13180 VkPipelineTessellationStateCreateInfo tsci{
13181 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
13182 nullptr,
13183 0,
13184 3};
13185
13186 VkPipelineObj pipe(m_device);
13187 pipe.SetInputAssembly(&iasci);
13188 pipe.SetTessellation(&tsci);
13189 pipe.AddColorAttachment();
13190 pipe.AddShader(&vs);
13191 pipe.AddShader(&tcs);
13192 pipe.AddShader(&tes);
13193 pipe.AddShader(&fs);
13194
13195 VkDescriptorSetObj descriptorSet(m_device);
13196 descriptorSet.AppendDummy();
13197 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13198
13199 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13200
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013201 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120013202}
13203
Karl Schultz6addd812016-02-02 17:17:23 -070013204TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013205 TEST_DESCRIPTION("Test that an error is produced for a vertex attribute setup where multiple "
13206 "bindings provide the same location");
Karl Schultz6addd812016-02-02 17:17:23 -070013207 m_errorMonitor->SetDesiredFailureMsg(
13208 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013209 "Duplicate vertex input binding descriptions for binding 0");
13210
Chris Forbes280ba2c2015-06-12 11:16:41 +120013211 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013212 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120013213
13214 /* Two binding descriptions for binding 0 */
13215 VkVertexInputBindingDescription input_bindings[2];
13216 memset(input_bindings, 0, sizeof(input_bindings));
13217
13218 VkVertexInputAttributeDescription input_attrib;
13219 memset(&input_attrib, 0, sizeof(input_attrib));
13220 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13221
13222 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013223 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120013224 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013225 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070013226 "out gl_PerVertex {\n"
13227 " vec4 gl_Position;\n"
13228 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120013229 "void main(){\n"
13230 " gl_Position = vec4(x);\n"
13231 "}\n";
13232 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013233 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120013234 "\n"
13235 "layout(location=0) out vec4 color;\n"
13236 "void main(){\n"
13237 " color = vec4(1);\n"
13238 "}\n";
13239
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013240 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13241 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120013242
13243 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013244 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120013245 pipe.AddShader(&vs);
13246 pipe.AddShader(&fs);
13247
13248 pipe.AddVertexInputBindings(input_bindings, 2);
13249 pipe.AddVertexInputAttribs(&input_attrib, 1);
13250
Chris Forbes280ba2c2015-06-12 11:16:41 +120013251 VkDescriptorSetObj descriptorSet(m_device);
13252 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013253 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120013254
Tony Barbour5781e8f2015-08-04 16:23:11 -060013255 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120013256
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013257 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120013258}
Chris Forbes8f68b562015-05-25 11:13:32 +120013259
Chris Forbes35efec72016-04-21 14:32:08 +120013260TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013261 TEST_DESCRIPTION("Test that pipeline validation accepts basic use of 64bit vertex "
13262 "attributes. This is interesting because they consume multiple "
13263 "locations.");
Chris Forbes35efec72016-04-21 14:32:08 +120013264 m_errorMonitor->ExpectSuccess();
13265
13266 ASSERT_NO_FATAL_FAILURE(InitState());
13267 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13268
Chris Forbes91cf3a82016-06-28 17:51:35 +120013269 if (!m_device->phy().features().shaderFloat64) {
Chris Forbes35efec72016-04-21 14:32:08 +120013270 printf("Device does not support 64bit vertex attributes; skipped.\n");
13271 return;
13272 }
13273
13274 VkVertexInputBindingDescription input_bindings[1];
13275 memset(input_bindings, 0, sizeof(input_bindings));
13276
13277 VkVertexInputAttributeDescription input_attribs[4];
13278 memset(input_attribs, 0, sizeof(input_attribs));
13279 input_attribs[0].location = 0;
13280 input_attribs[0].offset = 0;
13281 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
13282 input_attribs[1].location = 2;
13283 input_attribs[1].offset = 32;
13284 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
13285 input_attribs[2].location = 4;
13286 input_attribs[2].offset = 64;
13287 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
13288 input_attribs[3].location = 6;
13289 input_attribs[3].offset = 96;
13290 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
13291
13292 char const *vsSource =
13293 "#version 450\n"
13294 "\n"
13295 "layout(location=0) in dmat4 x;\n"
13296 "out gl_PerVertex {\n"
13297 " vec4 gl_Position;\n"
13298 "};\n"
13299 "void main(){\n"
13300 " gl_Position = vec4(x[0][0]);\n"
13301 "}\n";
13302 char const *fsSource =
13303 "#version 450\n"
13304 "\n"
13305 "layout(location=0) out vec4 color;\n"
13306 "void main(){\n"
13307 " color = vec4(1);\n"
13308 "}\n";
13309
13310 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13311 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13312
13313 VkPipelineObj pipe(m_device);
13314 pipe.AddColorAttachment();
13315 pipe.AddShader(&vs);
13316 pipe.AddShader(&fs);
13317
13318 pipe.AddVertexInputBindings(input_bindings, 1);
13319 pipe.AddVertexInputAttribs(input_attribs, 4);
13320
13321 VkDescriptorSetObj descriptorSet(m_device);
13322 descriptorSet.AppendDummy();
13323 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13324
13325 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13326
13327 m_errorMonitor->VerifyNotFound();
13328}
13329
Karl Schultz6addd812016-02-02 17:17:23 -070013330TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013331 TEST_DESCRIPTION("Test that an error is produced for a FS which does not "
13332 "provide an output for one of the pipeline's color attachments");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013333 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013334 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013335
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013336 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013337
13338 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013339 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013340 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013341 "out gl_PerVertex {\n"
13342 " vec4 gl_Position;\n"
13343 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013344 "void main(){\n"
13345 " gl_Position = vec4(1);\n"
13346 "}\n";
13347 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013348 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013349 "\n"
13350 "void main(){\n"
13351 "}\n";
13352
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013353 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13354 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013355
13356 VkPipelineObj pipe(m_device);
13357 pipe.AddShader(&vs);
13358 pipe.AddShader(&fs);
13359
Chia-I Wu08accc62015-07-07 11:50:03 +080013360 /* set up CB 0, not written */
13361 pipe.AddColorAttachment();
13362 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013363
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013364 VkDescriptorSetObj descriptorSet(m_device);
13365 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013366 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013367
Tony Barbour5781e8f2015-08-04 16:23:11 -060013368 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013369
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013370 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013371}
13372
Karl Schultz6addd812016-02-02 17:17:23 -070013373TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013374 TEST_DESCRIPTION("Test that a warning is produced for a FS which provides a spurious "
13375 "output with no matching attachment");
Karl Schultz6addd812016-02-02 17:17:23 -070013376 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070013377 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013378 "FS writes to output location 1 with no matching attachment");
13379
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013380 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013381
13382 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013383 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013384 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013385 "out gl_PerVertex {\n"
13386 " vec4 gl_Position;\n"
13387 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013388 "void main(){\n"
13389 " gl_Position = vec4(1);\n"
13390 "}\n";
13391 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013392 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013393 "\n"
13394 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013395 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013396 "void main(){\n"
13397 " x = vec4(1);\n"
13398 " y = vec4(1);\n"
13399 "}\n";
13400
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013401 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13402 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013403
13404 VkPipelineObj pipe(m_device);
13405 pipe.AddShader(&vs);
13406 pipe.AddShader(&fs);
13407
Chia-I Wu08accc62015-07-07 11:50:03 +080013408 /* set up CB 0, not written */
13409 pipe.AddColorAttachment();
13410 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013411 /* FS writes CB 1, but we don't configure it */
13412
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013413 VkDescriptorSetObj descriptorSet(m_device);
13414 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013415 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013416
Tony Barbour5781e8f2015-08-04 16:23:11 -060013417 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013418
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013419 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013420}
13421
Karl Schultz6addd812016-02-02 17:17:23 -070013422TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013423 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the fundamental "
13424 "type of an FS output variable, and the format of the corresponding attachment");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013425 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013426 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013427
Chris Forbesa36d69e2015-05-25 11:13:44 +120013428 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013429
13430 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013431 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120013432 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013433 "out gl_PerVertex {\n"
13434 " vec4 gl_Position;\n"
13435 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120013436 "void main(){\n"
13437 " gl_Position = vec4(1);\n"
13438 "}\n";
13439 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013440 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120013441 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013442 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +120013443 "void main(){\n"
13444 " x = ivec4(1);\n"
13445 "}\n";
13446
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013447 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13448 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120013449
13450 VkPipelineObj pipe(m_device);
13451 pipe.AddShader(&vs);
13452 pipe.AddShader(&fs);
13453
Chia-I Wu08accc62015-07-07 11:50:03 +080013454 /* set up CB 0; type is UNORM by default */
13455 pipe.AddColorAttachment();
13456 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013457
Chris Forbesa36d69e2015-05-25 11:13:44 +120013458 VkDescriptorSetObj descriptorSet(m_device);
13459 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013460 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120013461
Tony Barbour5781e8f2015-08-04 16:23:11 -060013462 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013463
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013464 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120013465}
Chris Forbes7b1b8932015-06-05 14:43:36 +120013466
Karl Schultz6addd812016-02-02 17:17:23 -070013467TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013468 TEST_DESCRIPTION("Test that an error is produced for a shader consuming a uniform "
13469 "block which has no corresponding binding in the pipeline layout");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013470 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013471 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013472
Chris Forbes556c76c2015-08-14 12:04:59 +120013473 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120013474
13475 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013476 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120013477 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013478 "out gl_PerVertex {\n"
13479 " vec4 gl_Position;\n"
13480 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120013481 "void main(){\n"
13482 " gl_Position = vec4(1);\n"
13483 "}\n";
13484 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013485 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120013486 "\n"
13487 "layout(location=0) out vec4 x;\n"
13488 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
13489 "void main(){\n"
13490 " x = vec4(bar.y);\n"
13491 "}\n";
13492
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013493 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13494 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120013495
Chris Forbes556c76c2015-08-14 12:04:59 +120013496 VkPipelineObj pipe(m_device);
13497 pipe.AddShader(&vs);
13498 pipe.AddShader(&fs);
13499
13500 /* set up CB 0; type is UNORM by default */
13501 pipe.AddColorAttachment();
13502 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13503
13504 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013505 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120013506
13507 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13508
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013509 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120013510}
13511
Chris Forbes5c59e902016-02-26 16:56:09 +130013512TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013513 TEST_DESCRIPTION("Test that an error is produced for a shader consuming push constants "
13514 "which are not provided in the pipeline layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130013515 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13516 "not declared in layout");
13517
13518 ASSERT_NO_FATAL_FAILURE(InitState());
13519
13520 char const *vsSource =
13521 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130013522 "\n"
13523 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13524 "out gl_PerVertex {\n"
13525 " vec4 gl_Position;\n"
13526 "};\n"
13527 "void main(){\n"
13528 " gl_Position = vec4(consts.x);\n"
13529 "}\n";
13530 char const *fsSource =
13531 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130013532 "\n"
13533 "layout(location=0) out vec4 x;\n"
13534 "void main(){\n"
13535 " x = vec4(1);\n"
13536 "}\n";
13537
13538 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13539 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13540
13541 VkPipelineObj pipe(m_device);
13542 pipe.AddShader(&vs);
13543 pipe.AddShader(&fs);
13544
13545 /* set up CB 0; type is UNORM by default */
13546 pipe.AddColorAttachment();
13547 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13548
13549 VkDescriptorSetObj descriptorSet(m_device);
13550 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13551
13552 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13553
13554 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013555 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130013556}
13557
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013558TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013559 TEST_DESCRIPTION("Test that an error is produced for a compute pipeline consuming a "
13560 "descriptor which is not provided in the pipeline layout");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013561 m_errorMonitor->SetDesiredFailureMsg(
13562 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13563 "Shader uses descriptor slot 0.0");
13564
13565 ASSERT_NO_FATAL_FAILURE(InitState());
13566
13567 char const *csSource =
13568 "#version 450\n"
13569 "\n"
13570 "layout(local_size_x=1) in;\n"
13571 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13572 "void main(){\n"
13573 " x = vec4(1);\n"
13574 "}\n";
13575
13576 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13577
13578 VkDescriptorSetObj descriptorSet(m_device);
13579 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13580
13581 VkComputePipelineCreateInfo cpci = {
13582 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
13583 nullptr, 0, {
13584 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
13585 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
13586 cs.handle(), "main", nullptr
13587 },
13588 descriptorSet.GetPipelineLayout(),
13589 VK_NULL_HANDLE, -1
13590 };
13591
13592 VkPipeline pipe;
13593 VkResult err = vkCreateComputePipelines(
13594 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
13595
13596 m_errorMonitor->VerifyFound();
13597
13598 if (err == VK_SUCCESS) {
13599 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13600 }
13601}
13602
13603TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013604 TEST_DESCRIPTION("Test that pipeline validation accepts a compute pipeline which declares a "
13605 "descriptor-backed resource which is not provided, but the shader does not "
13606 "statically use it. This is interesting because it requires compute pipelines "
13607 "to have a proper descriptor use walk, which they didn't for some time.");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013608 m_errorMonitor->ExpectSuccess();
13609
13610 ASSERT_NO_FATAL_FAILURE(InitState());
13611
13612 char const *csSource =
13613 "#version 450\n"
13614 "\n"
13615 "layout(local_size_x=1) in;\n"
13616 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13617 "void main(){\n"
13618 " // x is not used.\n"
13619 "}\n";
13620
13621 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13622
13623 VkDescriptorSetObj descriptorSet(m_device);
13624 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13625
13626 VkComputePipelineCreateInfo cpci = {
13627 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
13628 nullptr, 0, {
13629 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
13630 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
13631 cs.handle(), "main", nullptr
13632 },
13633 descriptorSet.GetPipelineLayout(),
13634 VK_NULL_HANDLE, -1
13635 };
13636
13637 VkPipeline pipe;
13638 VkResult err = vkCreateComputePipelines(
13639 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
13640
13641 m_errorMonitor->VerifyNotFound();
13642
13643 if (err == VK_SUCCESS) {
13644 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13645 }
13646}
13647
Chris Forbes22a9b092016-07-19 14:34:05 +120013648TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013649 TEST_DESCRIPTION("Test that an error is produced for a pipeline consuming a "
13650 "descriptor-backed resource of a mismatched type");
Chris Forbes22a9b092016-07-19 14:34:05 +120013651 m_errorMonitor->SetDesiredFailureMsg(
13652 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13653 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
13654
13655 ASSERT_NO_FATAL_FAILURE(InitState());
13656
13657 VkDescriptorSetLayoutBinding binding = {
13658 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
13659 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
13660 };
13661 VkDescriptorSetLayoutCreateInfo dslci = {
13662 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
13663 0, 1, &binding
13664 };
13665 VkDescriptorSetLayout dsl;
13666 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
13667 nullptr, &dsl);
13668 ASSERT_VK_SUCCESS(err);
13669
13670 VkPipelineLayoutCreateInfo plci = {
13671 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
13672 0, 1, &dsl, 0, nullptr
13673 };
13674 VkPipelineLayout pl;
13675 err = vkCreatePipelineLayout(m_device->device(), &plci,
13676 nullptr, &pl);
13677 ASSERT_VK_SUCCESS(err);
13678
13679 char const *csSource =
13680 "#version 450\n"
13681 "\n"
13682 "layout(local_size_x=1) in;\n"
13683 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13684 "void main() {\n"
13685 " x.x = 1.0f;\n"
13686 "}\n";
13687 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13688
13689 VkComputePipelineCreateInfo cpci = {
13690 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
13691 0, {
13692 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
13693 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
13694 cs.handle(), "main", nullptr
13695 },
13696 pl, VK_NULL_HANDLE, -1
13697 };
13698
13699 VkPipeline pipe;
13700 err = vkCreateComputePipelines(
13701 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
13702
13703 m_errorMonitor->VerifyFound();
13704
13705 if (err == VK_SUCCESS) {
13706 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13707 }
13708
13709 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
13710 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
13711}
13712
Chris Forbese10a51f2016-07-19 14:42:51 +120013713TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013714 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
13715 "sampler portion of a combined image + sampler");
Chris Forbese10a51f2016-07-19 14:42:51 +120013716 m_errorMonitor->ExpectSuccess();
13717
13718 ASSERT_NO_FATAL_FAILURE(InitState());
13719
13720 VkDescriptorSetLayoutBinding bindings[] = {
13721 {
13722 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
13723 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
13724 },
13725 {
13726 1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
13727 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
13728 },
13729 {
13730 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
13731 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
13732 },
13733 };
13734 VkDescriptorSetLayoutCreateInfo dslci = {
13735 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
13736 0, 3, bindings
13737 };
13738 VkDescriptorSetLayout dsl;
13739 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
13740 nullptr, &dsl);
13741 ASSERT_VK_SUCCESS(err);
13742
13743 VkPipelineLayoutCreateInfo plci = {
13744 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
13745 0, 1, &dsl, 0, nullptr
13746 };
13747 VkPipelineLayout pl;
13748 err = vkCreatePipelineLayout(m_device->device(), &plci,
13749 nullptr, &pl);
13750 ASSERT_VK_SUCCESS(err);
13751
13752 char const *csSource =
13753 "#version 450\n"
13754 "\n"
13755 "layout(local_size_x=1) in;\n"
13756 "layout(set=0, binding=0) uniform sampler s;\n"
13757 "layout(set=0, binding=1) uniform texture2D t;\n"
13758 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
13759 "void main() {\n"
13760 " x = texture(sampler2D(t, s), vec2(0));\n"
13761 "}\n";
13762 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13763
13764 VkComputePipelineCreateInfo cpci = {
13765 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
13766 0, {
13767 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
13768 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
13769 cs.handle(), "main", nullptr
13770 },
13771 pl, VK_NULL_HANDLE, -1
13772 };
13773
13774 VkPipeline pipe;
13775 err = vkCreateComputePipelines(
13776 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
13777
13778 m_errorMonitor->VerifyNotFound();
13779
13780 if (err == VK_SUCCESS) {
13781 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13782 }
13783
13784 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
13785 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
13786}
13787
Chris Forbes91c3b2a2016-07-19 14:46:38 +120013788TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013789 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
13790 "image portion of a combined image + sampler");
Chris Forbes91c3b2a2016-07-19 14:46:38 +120013791 m_errorMonitor->ExpectSuccess();
13792
13793 ASSERT_NO_FATAL_FAILURE(InitState());
13794
13795 VkDescriptorSetLayoutBinding bindings[] = {
13796 {
13797 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
13798 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
13799 },
13800 {
13801 1, VK_DESCRIPTOR_TYPE_SAMPLER,
13802 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
13803 },
13804 {
13805 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
13806 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
13807 },
13808 };
13809 VkDescriptorSetLayoutCreateInfo dslci = {
13810 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
13811 0, 3, bindings
13812 };
13813 VkDescriptorSetLayout dsl;
13814 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
13815 nullptr, &dsl);
13816 ASSERT_VK_SUCCESS(err);
13817
13818 VkPipelineLayoutCreateInfo plci = {
13819 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
13820 0, 1, &dsl, 0, nullptr
13821 };
13822 VkPipelineLayout pl;
13823 err = vkCreatePipelineLayout(m_device->device(), &plci,
13824 nullptr, &pl);
13825 ASSERT_VK_SUCCESS(err);
13826
13827 char const *csSource =
13828 "#version 450\n"
13829 "\n"
13830 "layout(local_size_x=1) in;\n"
13831 "layout(set=0, binding=0) uniform texture2D t;\n"
13832 "layout(set=0, binding=1) uniform sampler s;\n"
13833 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
13834 "void main() {\n"
13835 " x = texture(sampler2D(t, s), vec2(0));\n"
13836 "}\n";
13837 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13838
13839 VkComputePipelineCreateInfo cpci = {
13840 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
13841 0, {
13842 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
13843 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
13844 cs.handle(), "main", nullptr
13845 },
13846 pl, VK_NULL_HANDLE, -1
13847 };
13848
13849 VkPipeline pipe;
13850 err = vkCreateComputePipelines(
13851 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
13852
13853 m_errorMonitor->VerifyNotFound();
13854
13855 if (err == VK_SUCCESS) {
13856 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13857 }
13858
13859 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
13860 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
13861}
13862
Chris Forbes6a4991a2016-07-19 15:07:32 +120013863TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013864 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming "
13865 "both the sampler and the image of a combined image+sampler "
13866 "but via separate variables");
Chris Forbes6a4991a2016-07-19 15:07:32 +120013867 m_errorMonitor->ExpectSuccess();
13868
13869 ASSERT_NO_FATAL_FAILURE(InitState());
13870
13871 VkDescriptorSetLayoutBinding bindings[] = {
13872 {
13873 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
13874 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
13875 },
13876 {
13877 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
13878 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
13879 },
13880 };
13881 VkDescriptorSetLayoutCreateInfo dslci = {
13882 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
13883 0, 2, bindings
13884 };
13885 VkDescriptorSetLayout dsl;
13886 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
13887 nullptr, &dsl);
13888 ASSERT_VK_SUCCESS(err);
13889
13890 VkPipelineLayoutCreateInfo plci = {
13891 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
13892 0, 1, &dsl, 0, nullptr
13893 };
13894 VkPipelineLayout pl;
13895 err = vkCreatePipelineLayout(m_device->device(), &plci,
13896 nullptr, &pl);
13897 ASSERT_VK_SUCCESS(err);
13898
13899 char const *csSource =
13900 "#version 450\n"
13901 "\n"
13902 "layout(local_size_x=1) in;\n"
13903 "layout(set=0, binding=0) uniform texture2D t;\n"
13904 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
13905 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
13906 "void main() {\n"
13907 " x = texture(sampler2D(t, s), vec2(0));\n"
13908 "}\n";
13909 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13910
13911 VkComputePipelineCreateInfo cpci = {
13912 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
13913 0, {
13914 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
13915 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
13916 cs.handle(), "main", nullptr
13917 },
13918 pl, VK_NULL_HANDLE, -1
13919 };
13920
13921 VkPipeline pipe;
13922 err = vkCreateComputePipelines(
13923 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
13924
13925 m_errorMonitor->VerifyNotFound();
13926
13927 if (err == VK_SUCCESS) {
13928 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13929 }
13930
13931 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
13932 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
13933}
13934
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013935#endif // SHADER_CHECKER_TESTS
13936
13937#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -060013938TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -070013939 m_errorMonitor->SetDesiredFailureMsg(
13940 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013941 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013942
13943 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013944
13945 // Create an image
13946 VkImage image;
13947
Karl Schultz6addd812016-02-02 17:17:23 -070013948 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
13949 const int32_t tex_width = 32;
13950 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013951
13952 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013953 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13954 image_create_info.pNext = NULL;
13955 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13956 image_create_info.format = tex_format;
13957 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013958 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070013959 image_create_info.extent.depth = 1;
13960 image_create_info.mipLevels = 1;
13961 image_create_info.arrayLayers = 1;
13962 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13963 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13964 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
13965 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013966
13967 // Introduce error by sending down a bogus width extent
13968 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013969 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013970
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013971 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013972}
13973
Mark Youngc48c4c12016-04-11 14:26:49 -060013974TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
13975 m_errorMonitor->SetDesiredFailureMsg(
13976 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13977 "CreateImage extents is 0 for at least one required dimension");
13978
13979 ASSERT_NO_FATAL_FAILURE(InitState());
13980
13981 // Create an image
13982 VkImage image;
13983
13984 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
13985 const int32_t tex_width = 32;
13986 const int32_t tex_height = 32;
13987
13988 VkImageCreateInfo image_create_info = {};
13989 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13990 image_create_info.pNext = NULL;
13991 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13992 image_create_info.format = tex_format;
13993 image_create_info.extent.width = tex_width;
13994 image_create_info.extent.height = tex_height;
13995 image_create_info.extent.depth = 1;
13996 image_create_info.mipLevels = 1;
13997 image_create_info.arrayLayers = 1;
13998 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13999 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14000 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14001 image_create_info.flags = 0;
14002
14003 // Introduce error by sending down a bogus width extent
14004 image_create_info.extent.width = 0;
14005 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
14006
14007 m_errorMonitor->VerifyFound();
14008}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014009#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +120014010
Tobin Ehliscde08892015-09-22 10:11:37 -060014011#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070014012TEST_F(VkLayerTest, InvalidImageView) {
14013 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060014014
Karl Schultz6addd812016-02-02 17:17:23 -070014015 m_errorMonitor->SetDesiredFailureMsg(
14016 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014017 "vkCreateImageView called with baseMipLevel 10 ");
14018
Tobin Ehliscde08892015-09-22 10:11:37 -060014019 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060014020
Mike Stroyana3082432015-09-25 13:39:21 -060014021 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070014022 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060014023
Karl Schultz6addd812016-02-02 17:17:23 -070014024 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14025 const int32_t tex_width = 32;
14026 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060014027
14028 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014029 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14030 image_create_info.pNext = NULL;
14031 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14032 image_create_info.format = tex_format;
14033 image_create_info.extent.width = tex_width;
14034 image_create_info.extent.height = tex_height;
14035 image_create_info.extent.depth = 1;
14036 image_create_info.mipLevels = 1;
14037 image_create_info.arrayLayers = 1;
14038 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14039 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14040 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14041 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060014042
Chia-I Wuf7458c52015-10-26 21:10:41 +080014043 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060014044 ASSERT_VK_SUCCESS(err);
14045
14046 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014047 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14048 image_view_create_info.image = image;
14049 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14050 image_view_create_info.format = tex_format;
14051 image_view_create_info.subresourceRange.layerCount = 1;
14052 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
14053 image_view_create_info.subresourceRange.levelCount = 1;
14054 image_view_create_info.subresourceRange.aspectMask =
14055 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060014056
14057 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070014058 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
14059 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060014060
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014061 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060014062 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060014063}
Mike Stroyana3082432015-09-25 13:39:21 -060014064
Mark Youngd339ba32016-05-30 13:28:35 -060014065TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
14066 VkResult err;
14067
14068 m_errorMonitor->SetDesiredFailureMsg(
14069 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -060014070 "used without first calling vkBindImageMemory");
Mark Youngd339ba32016-05-30 13:28:35 -060014071
14072 ASSERT_NO_FATAL_FAILURE(InitState());
14073
14074 // Create an image and try to create a view with no memory backing the image
14075 VkImage image;
14076
14077 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14078 const int32_t tex_width = 32;
14079 const int32_t tex_height = 32;
14080
14081 VkImageCreateInfo image_create_info = {};
14082 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14083 image_create_info.pNext = NULL;
14084 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14085 image_create_info.format = tex_format;
14086 image_create_info.extent.width = tex_width;
14087 image_create_info.extent.height = tex_height;
14088 image_create_info.extent.depth = 1;
14089 image_create_info.mipLevels = 1;
14090 image_create_info.arrayLayers = 1;
14091 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14092 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14093 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14094 image_create_info.flags = 0;
14095
14096 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
14097 ASSERT_VK_SUCCESS(err);
14098
14099 VkImageViewCreateInfo image_view_create_info = {};
14100 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14101 image_view_create_info.image = image;
14102 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14103 image_view_create_info.format = tex_format;
14104 image_view_create_info.subresourceRange.layerCount = 1;
14105 image_view_create_info.subresourceRange.baseMipLevel = 0;
14106 image_view_create_info.subresourceRange.levelCount = 1;
14107 image_view_create_info.subresourceRange.aspectMask =
14108 VK_IMAGE_ASPECT_COLOR_BIT;
14109
14110 VkImageView view;
14111 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
14112 &view);
14113
14114 m_errorMonitor->VerifyFound();
14115 vkDestroyImage(m_device->device(), image, NULL);
14116 // If last error is success, it still created the view, so delete it.
14117 if (err == VK_SUCCESS) {
14118 vkDestroyImageView(m_device->device(), view, NULL);
14119 }
14120
14121}
14122
Karl Schultz6addd812016-02-02 17:17:23 -070014123TEST_F(VkLayerTest, InvalidImageViewAspect) {
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014124 TEST_DESCRIPTION(
14125 "Create an image and try to create a view with an invalid aspectMask");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014126 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070014127 "vkCreateImageView: Color image "
14128 "formats must have ONLY the "
14129 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014130
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014131 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014132
Karl Schultz6addd812016-02-02 17:17:23 -070014133 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014134 VkImageObj image(m_device);
14135 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT,
14136 VK_IMAGE_TILING_LINEAR, 0);
14137 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014138
14139 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014140 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014141 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070014142 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14143 image_view_create_info.format = tex_format;
14144 image_view_create_info.subresourceRange.baseMipLevel = 0;
14145 image_view_create_info.subresourceRange.levelCount = 1;
14146 // Cause an error by setting an invalid image aspect
14147 image_view_create_info.subresourceRange.aspectMask =
14148 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014149
14150 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014151 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014152
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014153 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014154}
14155
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014156TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070014157 VkResult err;
14158 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014159
Karl Schultz6addd812016-02-02 17:17:23 -070014160 m_errorMonitor->SetDesiredFailureMsg(
14161 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014162 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014163
Mike Stroyana3082432015-09-25 13:39:21 -060014164 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014165
14166 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014167 VkImage srcImage;
14168 VkImage dstImage;
14169 VkDeviceMemory srcMem;
14170 VkDeviceMemory destMem;
14171 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014172
14173 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014174 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14175 image_create_info.pNext = NULL;
14176 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14177 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14178 image_create_info.extent.width = 32;
14179 image_create_info.extent.height = 32;
14180 image_create_info.extent.depth = 1;
14181 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014182 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070014183 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14184 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14185 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14186 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014187
Karl Schultz6addd812016-02-02 17:17:23 -070014188 err =
14189 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014190 ASSERT_VK_SUCCESS(err);
14191
Karl Schultz6addd812016-02-02 17:17:23 -070014192 err =
14193 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014194 ASSERT_VK_SUCCESS(err);
14195
14196 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014197 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014198 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14199 memAlloc.pNext = NULL;
14200 memAlloc.allocationSize = 0;
14201 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014202
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014203 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014204 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014205 pass =
14206 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014207 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014208 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014209 ASSERT_VK_SUCCESS(err);
14210
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014211 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014212 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014213 pass =
14214 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014215 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014216 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014217 ASSERT_VK_SUCCESS(err);
14218
14219 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14220 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014221 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014222 ASSERT_VK_SUCCESS(err);
14223
14224 BeginCommandBuffer();
14225 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014226 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014227 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014228 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014229 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060014230 copyRegion.srcOffset.x = 0;
14231 copyRegion.srcOffset.y = 0;
14232 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014233 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014234 copyRegion.dstSubresource.mipLevel = 0;
14235 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014236 // Introduce failure by forcing the dst layerCount to differ from src
14237 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014238 copyRegion.dstOffset.x = 0;
14239 copyRegion.dstOffset.y = 0;
14240 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014241 copyRegion.extent.width = 1;
14242 copyRegion.extent.height = 1;
14243 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014244 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14245 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014246 EndCommandBuffer();
14247
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014248 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014249
Chia-I Wuf7458c52015-10-26 21:10:41 +080014250 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014251 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014252 vkFreeMemory(m_device->device(), srcMem, NULL);
14253 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014254}
14255
Tony Barbourd6673642016-05-05 14:46:39 -060014256TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
14257
14258 TEST_DESCRIPTION("Creating images with unsuported formats ");
14259
14260 ASSERT_NO_FATAL_FAILURE(InitState());
14261 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14262 VkImageObj image(m_device);
14263 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
14264 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
14265 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
14266 VK_IMAGE_TILING_OPTIMAL, 0);
14267 ASSERT_TRUE(image.initialized());
14268
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014269 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
14270 VkImageCreateInfo image_create_info;
14271 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14272 image_create_info.pNext = NULL;
14273 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14274 image_create_info.format = VK_FORMAT_UNDEFINED;
14275 image_create_info.extent.width = 32;
14276 image_create_info.extent.height = 32;
14277 image_create_info.extent.depth = 1;
14278 image_create_info.mipLevels = 1;
14279 image_create_info.arrayLayers = 1;
14280 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14281 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14282 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14283 image_create_info.flags = 0;
14284
14285 m_errorMonitor->SetDesiredFailureMsg(
14286 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14287 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
14288
14289 VkImage localImage;
14290 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
14291 m_errorMonitor->VerifyFound();
14292
Tony Barbourd6673642016-05-05 14:46:39 -060014293 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014294 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060014295 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
14296 VkFormat format = static_cast<VkFormat>(f);
14297 VkFormatProperties fProps = m_device->format_properties(format);
14298 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
14299 fProps.optimalTilingFeatures == 0) {
14300 unsupported = format;
14301 break;
14302 }
14303 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014304
Tony Barbourd6673642016-05-05 14:46:39 -060014305 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060014306 image_create_info.format = unsupported;
Tony Barbourd6673642016-05-05 14:46:39 -060014307 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014308 "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060014309
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014310 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060014311 m_errorMonitor->VerifyFound();
14312 }
14313}
14314
14315TEST_F(VkLayerTest, ImageLayerViewTests) {
14316 VkResult ret;
14317 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
14318
14319 ASSERT_NO_FATAL_FAILURE(InitState());
14320
14321 VkImageObj image(m_device);
14322 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
14323 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
14324 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
14325 VK_IMAGE_TILING_OPTIMAL, 0);
14326 ASSERT_TRUE(image.initialized());
14327
14328 VkImageView imgView;
14329 VkImageViewCreateInfo imgViewInfo = {};
14330 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
14331 imgViewInfo.image = image.handle();
14332 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
14333 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
14334 imgViewInfo.subresourceRange.layerCount = 1;
14335 imgViewInfo.subresourceRange.baseMipLevel = 0;
14336 imgViewInfo.subresourceRange.levelCount = 1;
14337 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14338
14339 m_errorMonitor->SetDesiredFailureMsg(
14340 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14341 "vkCreateImageView called with baseMipLevel");
14342 // View can't have baseMipLevel >= image's mipLevels - Expect
14343 // VIEW_CREATE_ERROR
14344 imgViewInfo.subresourceRange.baseMipLevel = 1;
14345 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14346 m_errorMonitor->VerifyFound();
14347 imgViewInfo.subresourceRange.baseMipLevel = 0;
14348
14349 m_errorMonitor->SetDesiredFailureMsg(
14350 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14351 "vkCreateImageView called with baseArrayLayer");
14352 // View can't have baseArrayLayer >= image's arraySize - Expect
14353 // VIEW_CREATE_ERROR
14354 imgViewInfo.subresourceRange.baseArrayLayer = 1;
14355 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14356 m_errorMonitor->VerifyFound();
14357 imgViewInfo.subresourceRange.baseArrayLayer = 0;
14358
14359 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14360 "vkCreateImageView called with 0 in "
14361 "pCreateInfo->subresourceRange."
14362 "levelCount");
14363 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
14364 imgViewInfo.subresourceRange.levelCount = 0;
14365 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14366 m_errorMonitor->VerifyFound();
14367 imgViewInfo.subresourceRange.levelCount = 1;
14368
14369 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14370 "vkCreateImageView called with 0 in "
14371 "pCreateInfo->subresourceRange."
14372 "layerCount");
14373 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
14374 imgViewInfo.subresourceRange.layerCount = 0;
14375 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14376 m_errorMonitor->VerifyFound();
14377 imgViewInfo.subresourceRange.layerCount = 1;
14378
14379 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14380 "but both must be color formats");
14381 // Can't use depth format for view into color image - Expect INVALID_FORMAT
14382 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
14383 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14384 m_errorMonitor->VerifyFound();
14385 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
14386
14387 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14388 "Formats MUST be IDENTICAL unless "
14389 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
14390 "was set on image creation.");
14391 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
14392 // VIEW_CREATE_ERROR
14393 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
14394 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14395 m_errorMonitor->VerifyFound();
14396 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
14397
14398 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14399 "can support ImageViews with "
14400 "differing formats but they must be "
14401 "in the same compatibility class.");
14402 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
14403 // VIEW_CREATE_ERROR
14404 VkImageCreateInfo mutImgInfo = image.create_info();
14405 VkImage mutImage;
14406 mutImgInfo.format = VK_FORMAT_R8_UINT;
14407 assert(
14408 m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures &
14409 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
14410 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
14411 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14412 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
14413 ASSERT_VK_SUCCESS(ret);
14414 imgViewInfo.image = mutImage;
14415 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14416 m_errorMonitor->VerifyFound();
14417 imgViewInfo.image = image.handle();
14418 vkDestroyImage(m_device->handle(), mutImage, NULL);
14419}
14420
14421TEST_F(VkLayerTest, MiscImageLayerTests) {
14422
14423 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
14424
14425 ASSERT_NO_FATAL_FAILURE(InitState());
14426
14427 VkImageObj image(m_device);
14428 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
14429 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
14430 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
14431 VK_IMAGE_TILING_OPTIMAL, 0);
14432 ASSERT_TRUE(image.initialized());
14433
14434 m_errorMonitor->SetDesiredFailureMsg(
14435 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14436 "number of layers in image subresource is zero");
14437 vk_testing::Buffer buffer;
14438 VkMemoryPropertyFlags reqs = 0;
14439 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
14440 VkBufferImageCopy region = {};
14441 region.bufferRowLength = 128;
14442 region.bufferImageHeight = 128;
14443 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14444 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
14445 region.imageSubresource.layerCount = 0;
14446 region.imageExtent.height = 4;
14447 region.imageExtent.width = 4;
14448 region.imageExtent.depth = 1;
14449 m_commandBuffer->BeginCommandBuffer();
14450 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
14451 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
14452 1, &region);
14453 m_errorMonitor->VerifyFound();
14454 region.imageSubresource.layerCount = 1;
14455
14456 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14457 "aspectMasks for each region must "
14458 "specify only COLOR or DEPTH or "
14459 "STENCIL");
14460 // Expect MISMATCHED_IMAGE_ASPECT
14461 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
14462 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
14463 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
14464 1, &region);
14465 m_errorMonitor->VerifyFound();
14466 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14467
14468 m_errorMonitor->SetDesiredFailureMsg(
14469 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14470 "If the format of srcImage is a depth, stencil, depth stencil or "
14471 "integer-based format then filter must be VK_FILTER_NEAREST");
14472 // Expect INVALID_FILTER
14473 VkImageObj intImage1(m_device);
14474 intImage1.init(128, 128, VK_FORMAT_R8_UINT,
14475 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
14476 0);
14477 VkImageObj intImage2(m_device);
14478 intImage2.init(128, 128, VK_FORMAT_R8_UINT,
14479 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
14480 0);
14481 VkImageBlit blitRegion = {};
14482 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14483 blitRegion.srcSubresource.baseArrayLayer = 0;
14484 blitRegion.srcSubresource.layerCount = 1;
14485 blitRegion.srcSubresource.mipLevel = 0;
14486 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14487 blitRegion.dstSubresource.baseArrayLayer = 0;
14488 blitRegion.dstSubresource.layerCount = 1;
14489 blitRegion.dstSubresource.mipLevel = 0;
14490
14491 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
14492 intImage1.layout(), intImage2.handle(), intImage2.layout(),
14493 16, &blitRegion, VK_FILTER_LINEAR);
14494 m_errorMonitor->VerifyFound();
14495
14496 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14497 "called with 0 in ppMemoryBarriers");
14498 VkImageMemoryBarrier img_barrier;
14499 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
14500 img_barrier.pNext = NULL;
14501 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
14502 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
14503 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14504 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14505 img_barrier.image = image.handle();
14506 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
14507 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
14508 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14509 img_barrier.subresourceRange.baseArrayLayer = 0;
14510 img_barrier.subresourceRange.baseMipLevel = 0;
14511 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
14512 img_barrier.subresourceRange.layerCount = 0;
14513 img_barrier.subresourceRange.levelCount = 1;
14514 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
14515 VK_PIPELINE_STAGE_HOST_BIT,
14516 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
14517 nullptr, 1, &img_barrier);
14518 m_errorMonitor->VerifyFound();
14519 img_barrier.subresourceRange.layerCount = 1;
14520}
14521
14522TEST_F(VkLayerTest, ImageFormatLimits) {
14523
14524 TEST_DESCRIPTION("Exceed the limits of image format ");
14525
14526 m_errorMonitor->SetDesiredFailureMsg(
14527 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14528 "CreateImage extents exceed allowable limits for format");
14529 VkImageCreateInfo image_create_info = {};
14530 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14531 image_create_info.pNext = NULL;
14532 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14533 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14534 image_create_info.extent.width = 32;
14535 image_create_info.extent.height = 32;
14536 image_create_info.extent.depth = 1;
14537 image_create_info.mipLevels = 1;
14538 image_create_info.arrayLayers = 1;
14539 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14540 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14541 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14542 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
14543 image_create_info.flags = 0;
14544
14545 VkImage nullImg;
14546 VkImageFormatProperties imgFmtProps;
14547 vkGetPhysicalDeviceImageFormatProperties(
14548 gpu(), image_create_info.format, image_create_info.imageType,
14549 image_create_info.tiling, image_create_info.usage,
14550 image_create_info.flags, &imgFmtProps);
14551 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
14552 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14553 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14554 m_errorMonitor->VerifyFound();
14555 image_create_info.extent.depth = 1;
14556
14557 m_errorMonitor->SetDesiredFailureMsg(
14558 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14559 "exceeds allowable maximum supported by format of");
14560 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
14561 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14562 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14563 m_errorMonitor->VerifyFound();
14564 image_create_info.mipLevels = 1;
14565
14566 m_errorMonitor->SetDesiredFailureMsg(
14567 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14568 "exceeds allowable maximum supported by format of");
14569 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
14570 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14571 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14572 m_errorMonitor->VerifyFound();
14573 image_create_info.arrayLayers = 1;
14574
14575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14576 "is not supported by format");
14577 int samples = imgFmtProps.sampleCounts >> 1;
14578 image_create_info.samples = (VkSampleCountFlagBits)samples;
14579 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14580 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14581 m_errorMonitor->VerifyFound();
14582 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14583
14584 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14585 "pCreateInfo->initialLayout, must be "
14586 "VK_IMAGE_LAYOUT_UNDEFINED or "
14587 "VK_IMAGE_LAYOUT_PREINITIALIZED");
14588 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14589 // Expect INVALID_LAYOUT
14590 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14591 m_errorMonitor->VerifyFound();
14592 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
14593}
14594
Karl Schultz6addd812016-02-02 17:17:23 -070014595TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060014596 VkResult err;
14597 bool pass;
14598
14599 // Create color images with different format sizes and try to copy between them
14600 m_errorMonitor->SetDesiredFailureMsg(
14601 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14602 "vkCmdCopyImage called with unmatched source and dest image format sizes");
14603
14604 ASSERT_NO_FATAL_FAILURE(InitState());
14605
14606 // Create two images of different types and try to copy between them
14607 VkImage srcImage;
14608 VkImage dstImage;
14609 VkDeviceMemory srcMem;
14610 VkDeviceMemory destMem;
14611 VkMemoryRequirements memReqs;
14612
14613 VkImageCreateInfo image_create_info = {};
14614 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14615 image_create_info.pNext = NULL;
14616 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14617 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14618 image_create_info.extent.width = 32;
14619 image_create_info.extent.height = 32;
14620 image_create_info.extent.depth = 1;
14621 image_create_info.mipLevels = 1;
14622 image_create_info.arrayLayers = 1;
14623 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14624 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14625 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14626 image_create_info.flags = 0;
14627
14628 err =
14629 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
14630 ASSERT_VK_SUCCESS(err);
14631
14632 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
14633 // Introduce failure by creating second image with a different-sized format.
14634 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
14635
14636 err =
14637 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
14638 ASSERT_VK_SUCCESS(err);
14639
14640 // Allocate memory
14641 VkMemoryAllocateInfo memAlloc = {};
14642 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14643 memAlloc.pNext = NULL;
14644 memAlloc.allocationSize = 0;
14645 memAlloc.memoryTypeIndex = 0;
14646
14647 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
14648 memAlloc.allocationSize = memReqs.size;
14649 pass =
14650 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
14651 ASSERT_TRUE(pass);
14652 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
14653 ASSERT_VK_SUCCESS(err);
14654
14655 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
14656 memAlloc.allocationSize = memReqs.size;
14657 pass =
14658 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
14659 ASSERT_TRUE(pass);
14660 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
14661 ASSERT_VK_SUCCESS(err);
14662
14663 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14664 ASSERT_VK_SUCCESS(err);
14665 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
14666 ASSERT_VK_SUCCESS(err);
14667
14668 BeginCommandBuffer();
14669 VkImageCopy copyRegion;
14670 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14671 copyRegion.srcSubresource.mipLevel = 0;
14672 copyRegion.srcSubresource.baseArrayLayer = 0;
14673 copyRegion.srcSubresource.layerCount = 0;
14674 copyRegion.srcOffset.x = 0;
14675 copyRegion.srcOffset.y = 0;
14676 copyRegion.srcOffset.z = 0;
14677 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14678 copyRegion.dstSubresource.mipLevel = 0;
14679 copyRegion.dstSubresource.baseArrayLayer = 0;
14680 copyRegion.dstSubresource.layerCount = 0;
14681 copyRegion.dstOffset.x = 0;
14682 copyRegion.dstOffset.y = 0;
14683 copyRegion.dstOffset.z = 0;
14684 copyRegion.extent.width = 1;
14685 copyRegion.extent.height = 1;
14686 copyRegion.extent.depth = 1;
14687 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14688 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
14689 EndCommandBuffer();
14690
14691 m_errorMonitor->VerifyFound();
14692
14693 vkDestroyImage(m_device->device(), srcImage, NULL);
14694 vkDestroyImage(m_device->device(), dstImage, NULL);
14695 vkFreeMemory(m_device->device(), srcMem, NULL);
14696 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014697}
14698
Karl Schultz6addd812016-02-02 17:17:23 -070014699TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
14700 VkResult err;
14701 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014702
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014703 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014704 m_errorMonitor->SetDesiredFailureMsg(
14705 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014706 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014707
Mike Stroyana3082432015-09-25 13:39:21 -060014708 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014709
14710 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014711 VkImage srcImage;
14712 VkImage dstImage;
14713 VkDeviceMemory srcMem;
14714 VkDeviceMemory destMem;
14715 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014716
14717 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014718 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14719 image_create_info.pNext = NULL;
14720 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14721 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14722 image_create_info.extent.width = 32;
14723 image_create_info.extent.height = 32;
14724 image_create_info.extent.depth = 1;
14725 image_create_info.mipLevels = 1;
14726 image_create_info.arrayLayers = 1;
14727 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14728 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14729 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14730 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014731
Karl Schultz6addd812016-02-02 17:17:23 -070014732 err =
14733 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014734 ASSERT_VK_SUCCESS(err);
14735
Karl Schultzbdb75952016-04-19 11:36:49 -060014736 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
14737
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014738 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070014739 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014740 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
14741 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014742
Karl Schultz6addd812016-02-02 17:17:23 -070014743 err =
14744 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014745 ASSERT_VK_SUCCESS(err);
14746
14747 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014748 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014749 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14750 memAlloc.pNext = NULL;
14751 memAlloc.allocationSize = 0;
14752 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014753
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014754 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014755 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014756 pass =
14757 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014758 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014759 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014760 ASSERT_VK_SUCCESS(err);
14761
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014762 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014763 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014764 pass =
14765 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014766 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014767 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014768 ASSERT_VK_SUCCESS(err);
14769
14770 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14771 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014772 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014773 ASSERT_VK_SUCCESS(err);
14774
14775 BeginCommandBuffer();
14776 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014777 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014778 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014779 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014780 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014781 copyRegion.srcOffset.x = 0;
14782 copyRegion.srcOffset.y = 0;
14783 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014784 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014785 copyRegion.dstSubresource.mipLevel = 0;
14786 copyRegion.dstSubresource.baseArrayLayer = 0;
14787 copyRegion.dstSubresource.layerCount = 0;
14788 copyRegion.dstOffset.x = 0;
14789 copyRegion.dstOffset.y = 0;
14790 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014791 copyRegion.extent.width = 1;
14792 copyRegion.extent.height = 1;
14793 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014794 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14795 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014796 EndCommandBuffer();
14797
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014798 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014799
Chia-I Wuf7458c52015-10-26 21:10:41 +080014800 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014801 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014802 vkFreeMemory(m_device->device(), srcMem, NULL);
14803 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014804}
14805
Karl Schultz6addd812016-02-02 17:17:23 -070014806TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
14807 VkResult err;
14808 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014809
Karl Schultz6addd812016-02-02 17:17:23 -070014810 m_errorMonitor->SetDesiredFailureMsg(
14811 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014812 "vkCmdResolveImage called with source sample count less than 2.");
14813
Mike Stroyana3082432015-09-25 13:39:21 -060014814 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014815
14816 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070014817 VkImage srcImage;
14818 VkImage dstImage;
14819 VkDeviceMemory srcMem;
14820 VkDeviceMemory destMem;
14821 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014822
14823 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014824 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14825 image_create_info.pNext = NULL;
14826 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14827 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14828 image_create_info.extent.width = 32;
14829 image_create_info.extent.height = 1;
14830 image_create_info.extent.depth = 1;
14831 image_create_info.mipLevels = 1;
14832 image_create_info.arrayLayers = 1;
14833 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14834 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14835 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14836 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014837
Karl Schultz6addd812016-02-02 17:17:23 -070014838 err =
14839 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014840 ASSERT_VK_SUCCESS(err);
14841
Karl Schultz6addd812016-02-02 17:17:23 -070014842 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014843
Karl Schultz6addd812016-02-02 17:17:23 -070014844 err =
14845 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014846 ASSERT_VK_SUCCESS(err);
14847
14848 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014849 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014850 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14851 memAlloc.pNext = NULL;
14852 memAlloc.allocationSize = 0;
14853 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014854
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014855 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014856 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014857 pass =
14858 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014859 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014860 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014861 ASSERT_VK_SUCCESS(err);
14862
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014863 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014864 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014865 pass =
14866 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014867 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014868 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014869 ASSERT_VK_SUCCESS(err);
14870
14871 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14872 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014873 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014874 ASSERT_VK_SUCCESS(err);
14875
14876 BeginCommandBuffer();
14877 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070014878 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
14879 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060014880 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014881 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014882 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014883 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014884 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014885 resolveRegion.srcOffset.x = 0;
14886 resolveRegion.srcOffset.y = 0;
14887 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014888 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014889 resolveRegion.dstSubresource.mipLevel = 0;
14890 resolveRegion.dstSubresource.baseArrayLayer = 0;
14891 resolveRegion.dstSubresource.layerCount = 0;
14892 resolveRegion.dstOffset.x = 0;
14893 resolveRegion.dstOffset.y = 0;
14894 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014895 resolveRegion.extent.width = 1;
14896 resolveRegion.extent.height = 1;
14897 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014898 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14899 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014900 EndCommandBuffer();
14901
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014902 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014903
Chia-I Wuf7458c52015-10-26 21:10:41 +080014904 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014905 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014906 vkFreeMemory(m_device->device(), srcMem, NULL);
14907 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014908}
14909
Karl Schultz6addd812016-02-02 17:17:23 -070014910TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
14911 VkResult err;
14912 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014913
Karl Schultz6addd812016-02-02 17:17:23 -070014914 m_errorMonitor->SetDesiredFailureMsg(
14915 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014916 "vkCmdResolveImage called with dest sample count greater than 1.");
14917
Mike Stroyana3082432015-09-25 13:39:21 -060014918 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014919
Chris Forbesa7530692016-05-08 12:35:39 +120014920 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070014921 VkImage srcImage;
14922 VkImage dstImage;
14923 VkDeviceMemory srcMem;
14924 VkDeviceMemory destMem;
14925 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014926
14927 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014928 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14929 image_create_info.pNext = NULL;
14930 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14931 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14932 image_create_info.extent.width = 32;
14933 image_create_info.extent.height = 1;
14934 image_create_info.extent.depth = 1;
14935 image_create_info.mipLevels = 1;
14936 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120014937 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070014938 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14939 // Note: Some implementations expect color attachment usage for any
14940 // multisample surface
14941 image_create_info.usage =
14942 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14943 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014944
Karl Schultz6addd812016-02-02 17:17:23 -070014945 err =
14946 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014947 ASSERT_VK_SUCCESS(err);
14948
Karl Schultz6addd812016-02-02 17:17:23 -070014949 // Note: Some implementations expect color attachment usage for any
14950 // multisample surface
14951 image_create_info.usage =
14952 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014953
Karl Schultz6addd812016-02-02 17:17:23 -070014954 err =
14955 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014956 ASSERT_VK_SUCCESS(err);
14957
14958 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014959 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014960 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14961 memAlloc.pNext = NULL;
14962 memAlloc.allocationSize = 0;
14963 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014964
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014965 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014966 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014967 pass =
14968 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014969 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014970 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014971 ASSERT_VK_SUCCESS(err);
14972
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014973 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014974 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014975 pass =
14976 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014977 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014978 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014979 ASSERT_VK_SUCCESS(err);
14980
14981 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14982 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014983 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014984 ASSERT_VK_SUCCESS(err);
14985
14986 BeginCommandBuffer();
14987 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070014988 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
14989 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060014990 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014991 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014992 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014993 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014994 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014995 resolveRegion.srcOffset.x = 0;
14996 resolveRegion.srcOffset.y = 0;
14997 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014998 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014999 resolveRegion.dstSubresource.mipLevel = 0;
15000 resolveRegion.dstSubresource.baseArrayLayer = 0;
15001 resolveRegion.dstSubresource.layerCount = 0;
15002 resolveRegion.dstOffset.x = 0;
15003 resolveRegion.dstOffset.y = 0;
15004 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015005 resolveRegion.extent.width = 1;
15006 resolveRegion.extent.height = 1;
15007 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015008 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15009 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015010 EndCommandBuffer();
15011
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015012 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015013
Chia-I Wuf7458c52015-10-26 21:10:41 +080015014 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015015 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015016 vkFreeMemory(m_device->device(), srcMem, NULL);
15017 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015018}
15019
Karl Schultz6addd812016-02-02 17:17:23 -070015020TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
15021 VkResult err;
15022 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015023
Karl Schultz6addd812016-02-02 17:17:23 -070015024 m_errorMonitor->SetDesiredFailureMsg(
15025 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015026 "vkCmdResolveImage called with unmatched source and dest formats.");
15027
Mike Stroyana3082432015-09-25 13:39:21 -060015028 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015029
15030 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015031 VkImage srcImage;
15032 VkImage dstImage;
15033 VkDeviceMemory srcMem;
15034 VkDeviceMemory destMem;
15035 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015036
15037 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015038 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15039 image_create_info.pNext = NULL;
15040 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15041 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15042 image_create_info.extent.width = 32;
15043 image_create_info.extent.height = 1;
15044 image_create_info.extent.depth = 1;
15045 image_create_info.mipLevels = 1;
15046 image_create_info.arrayLayers = 1;
15047 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
15048 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15049 // Note: Some implementations expect color attachment usage for any
15050 // multisample surface
15051 image_create_info.usage =
15052 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15053 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015054
Karl Schultz6addd812016-02-02 17:17:23 -070015055 err =
15056 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015057 ASSERT_VK_SUCCESS(err);
15058
Karl Schultz6addd812016-02-02 17:17:23 -070015059 // Set format to something other than source image
15060 image_create_info.format = VK_FORMAT_R32_SFLOAT;
15061 // Note: Some implementations expect color attachment usage for any
15062 // multisample surface
15063 image_create_info.usage =
15064 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15065 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015066
Karl Schultz6addd812016-02-02 17:17:23 -070015067 err =
15068 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015069 ASSERT_VK_SUCCESS(err);
15070
15071 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015072 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015073 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15074 memAlloc.pNext = NULL;
15075 memAlloc.allocationSize = 0;
15076 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015077
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015078 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015079 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015080 pass =
15081 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015082 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015083 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015084 ASSERT_VK_SUCCESS(err);
15085
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015086 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015087 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015088 pass =
15089 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015090 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015091 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015092 ASSERT_VK_SUCCESS(err);
15093
15094 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15095 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015096 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015097 ASSERT_VK_SUCCESS(err);
15098
15099 BeginCommandBuffer();
15100 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015101 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15102 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015103 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015104 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015105 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015106 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015107 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015108 resolveRegion.srcOffset.x = 0;
15109 resolveRegion.srcOffset.y = 0;
15110 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015111 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015112 resolveRegion.dstSubresource.mipLevel = 0;
15113 resolveRegion.dstSubresource.baseArrayLayer = 0;
15114 resolveRegion.dstSubresource.layerCount = 0;
15115 resolveRegion.dstOffset.x = 0;
15116 resolveRegion.dstOffset.y = 0;
15117 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015118 resolveRegion.extent.width = 1;
15119 resolveRegion.extent.height = 1;
15120 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015121 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15122 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015123 EndCommandBuffer();
15124
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015125 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015126
Chia-I Wuf7458c52015-10-26 21:10:41 +080015127 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015128 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015129 vkFreeMemory(m_device->device(), srcMem, NULL);
15130 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015131}
15132
Karl Schultz6addd812016-02-02 17:17:23 -070015133TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
15134 VkResult err;
15135 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015136
Karl Schultz6addd812016-02-02 17:17:23 -070015137 m_errorMonitor->SetDesiredFailureMsg(
15138 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015139 "vkCmdResolveImage called with unmatched source and dest image types.");
15140
Mike Stroyana3082432015-09-25 13:39:21 -060015141 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015142
15143 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015144 VkImage srcImage;
15145 VkImage dstImage;
15146 VkDeviceMemory srcMem;
15147 VkDeviceMemory destMem;
15148 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015149
15150 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015151 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15152 image_create_info.pNext = NULL;
15153 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15154 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15155 image_create_info.extent.width = 32;
15156 image_create_info.extent.height = 1;
15157 image_create_info.extent.depth = 1;
15158 image_create_info.mipLevels = 1;
15159 image_create_info.arrayLayers = 1;
15160 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
15161 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15162 // Note: Some implementations expect color attachment usage for any
15163 // multisample surface
15164 image_create_info.usage =
15165 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15166 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015167
Karl Schultz6addd812016-02-02 17:17:23 -070015168 err =
15169 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015170 ASSERT_VK_SUCCESS(err);
15171
Karl Schultz6addd812016-02-02 17:17:23 -070015172 image_create_info.imageType = VK_IMAGE_TYPE_1D;
15173 // Note: Some implementations expect color attachment usage for any
15174 // multisample surface
15175 image_create_info.usage =
15176 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15177 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015178
Karl Schultz6addd812016-02-02 17:17:23 -070015179 err =
15180 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015181 ASSERT_VK_SUCCESS(err);
15182
15183 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015184 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015185 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15186 memAlloc.pNext = NULL;
15187 memAlloc.allocationSize = 0;
15188 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015189
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015190 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015191 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015192 pass =
15193 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015194 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015195 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015196 ASSERT_VK_SUCCESS(err);
15197
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015198 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015199 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015200 pass =
15201 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015202 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015203 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015204 ASSERT_VK_SUCCESS(err);
15205
15206 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15207 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015208 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015209 ASSERT_VK_SUCCESS(err);
15210
15211 BeginCommandBuffer();
15212 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015213 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15214 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015215 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015216 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015217 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015218 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015219 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015220 resolveRegion.srcOffset.x = 0;
15221 resolveRegion.srcOffset.y = 0;
15222 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015223 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015224 resolveRegion.dstSubresource.mipLevel = 0;
15225 resolveRegion.dstSubresource.baseArrayLayer = 0;
15226 resolveRegion.dstSubresource.layerCount = 0;
15227 resolveRegion.dstOffset.x = 0;
15228 resolveRegion.dstOffset.y = 0;
15229 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015230 resolveRegion.extent.width = 1;
15231 resolveRegion.extent.height = 1;
15232 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015233 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15234 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015235 EndCommandBuffer();
15236
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015237 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015238
Chia-I Wuf7458c52015-10-26 21:10:41 +080015239 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015240 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015241 vkFreeMemory(m_device->device(), srcMem, NULL);
15242 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015243}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015244
Karl Schultz6addd812016-02-02 17:17:23 -070015245TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015246 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070015247 // to using a DS format, then cause it to hit error due to COLOR_BIT not
15248 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015249 // The image format check comes 2nd in validation so we trigger it first,
15250 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070015251 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015252
Karl Schultz6addd812016-02-02 17:17:23 -070015253 m_errorMonitor->SetDesiredFailureMsg(
15254 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015255 "Combination depth/stencil image formats can have only the ");
15256
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015257 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015258
Chia-I Wu1b99bb22015-10-27 19:25:11 +080015259 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015260 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
15261 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015262
15263 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015264 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
15265 ds_pool_ci.pNext = NULL;
15266 ds_pool_ci.maxSets = 1;
15267 ds_pool_ci.poolSizeCount = 1;
15268 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015269
15270 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070015271 err =
15272 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015273 ASSERT_VK_SUCCESS(err);
15274
15275 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015276 dsl_binding.binding = 0;
15277 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
15278 dsl_binding.descriptorCount = 1;
15279 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
15280 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015281
15282 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015283 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
15284 ds_layout_ci.pNext = NULL;
15285 ds_layout_ci.bindingCount = 1;
15286 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015287 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070015288 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
15289 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015290 ASSERT_VK_SUCCESS(err);
15291
15292 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015293 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080015294 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070015295 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015296 alloc_info.descriptorPool = ds_pool;
15297 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070015298 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
15299 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015300 ASSERT_VK_SUCCESS(err);
15301
Karl Schultz6addd812016-02-02 17:17:23 -070015302 VkImage image_bad;
15303 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015304 // One bad format and one good format for Color attachment
Tobin Ehlis269f0322016-05-25 16:24:21 -060015305 const VkFormat tex_format_bad = VK_FORMAT_D24_UNORM_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015306 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070015307 const int32_t tex_width = 32;
15308 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015309
15310 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015311 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15312 image_create_info.pNext = NULL;
15313 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15314 image_create_info.format = tex_format_bad;
15315 image_create_info.extent.width = tex_width;
15316 image_create_info.extent.height = tex_height;
15317 image_create_info.extent.depth = 1;
15318 image_create_info.mipLevels = 1;
15319 image_create_info.arrayLayers = 1;
15320 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15321 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15322 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
15323 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
15324 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015325
Karl Schultz6addd812016-02-02 17:17:23 -070015326 err =
15327 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015328 ASSERT_VK_SUCCESS(err);
15329 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -070015330 image_create_info.usage =
15331 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15332 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
15333 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015334 ASSERT_VK_SUCCESS(err);
15335
15336 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015337 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15338 image_view_create_info.image = image_bad;
15339 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15340 image_view_create_info.format = tex_format_bad;
15341 image_view_create_info.subresourceRange.baseArrayLayer = 0;
15342 image_view_create_info.subresourceRange.baseMipLevel = 0;
15343 image_view_create_info.subresourceRange.layerCount = 1;
15344 image_view_create_info.subresourceRange.levelCount = 1;
15345 image_view_create_info.subresourceRange.aspectMask =
15346 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015347
15348 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070015349 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
15350 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015351
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015352 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015353
Chia-I Wuf7458c52015-10-26 21:10:41 +080015354 vkDestroyImage(m_device->device(), image_bad, NULL);
15355 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015356 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
15357 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015358}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015359
15360TEST_F(VkLayerTest, ClearImageErrors) {
15361 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and "
15362 "ClearDepthStencilImage with a color image.");
15363
15364 ASSERT_NO_FATAL_FAILURE(InitState());
15365 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15366
15367 // Renderpass is started here so end it as Clear cmds can't be in renderpass
15368 BeginCommandBuffer();
15369 m_commandBuffer->EndRenderPass();
15370
15371 // Color image
15372 VkClearColorValue clear_color;
15373 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
15374 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
15375 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
15376 const int32_t img_width = 32;
15377 const int32_t img_height = 32;
15378 VkImageCreateInfo image_create_info = {};
15379 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15380 image_create_info.pNext = NULL;
15381 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15382 image_create_info.format = color_format;
15383 image_create_info.extent.width = img_width;
15384 image_create_info.extent.height = img_height;
15385 image_create_info.extent.depth = 1;
15386 image_create_info.mipLevels = 1;
15387 image_create_info.arrayLayers = 1;
15388 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15389 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15390 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15391
15392 vk_testing::Image color_image;
15393 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info,
15394 reqs);
15395
15396 const VkImageSubresourceRange color_range =
15397 vk_testing::Image::subresource_range(image_create_info,
15398 VK_IMAGE_ASPECT_COLOR_BIT);
15399
15400 // Depth/Stencil image
15401 VkClearDepthStencilValue clear_value = {0};
15402 reqs = 0; // don't need HOST_VISIBLE DS image
15403 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
15404 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
15405 ds_image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
15406 ds_image_create_info.extent.width = 64;
15407 ds_image_create_info.extent.height = 64;
15408 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15409 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
15410
15411 vk_testing::Image ds_image;
15412 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info,
15413 reqs);
15414
15415 const VkImageSubresourceRange ds_range =
15416 vk_testing::Image::subresource_range(ds_image_create_info,
15417 VK_IMAGE_ASPECT_DEPTH_BIT);
15418
15419 m_errorMonitor->SetDesiredFailureMsg(
15420 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15421 "vkCmdClearColorImage called with depth/stencil image.");
15422
15423 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
15424 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
15425 &color_range);
15426
15427 m_errorMonitor->VerifyFound();
15428
Tony Barbour26434b92016-06-02 09:43:50 -060015429 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15430 "vkCmdClearColorImage called with "
15431 "image created without "
15432 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
15433
15434 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
15435 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
15436 &color_range);
15437
15438 m_errorMonitor->VerifyFound();
15439
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015440 // Call CmdClearDepthStencilImage with color image
15441 m_errorMonitor->SetDesiredFailureMsg(
15442 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15443 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
15444
15445 vkCmdClearDepthStencilImage(
15446 m_commandBuffer->GetBufferHandle(), color_image.handle(),
15447 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
15448 &ds_range);
15449
15450 m_errorMonitor->VerifyFound();
15451}
Tobin Ehliscde08892015-09-22 10:11:37 -060015452#endif // IMAGE_TESTS
15453
Tony Barbour300a6082015-04-07 13:44:53 -060015454int main(int argc, char **argv) {
15455 int result;
15456
Cody Northrop8e54a402016-03-08 22:25:52 -070015457#ifdef ANDROID
15458 int vulkanSupport = InitVulkan();
15459 if (vulkanSupport == 0)
15460 return 1;
15461#endif
15462
Tony Barbour300a6082015-04-07 13:44:53 -060015463 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060015464 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060015465
15466 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
15467
15468 result = RUN_ALL_TESTS();
15469
Tony Barbour6918cd52015-04-09 12:58:51 -060015470 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060015471 return result;
15472}