blob: edff0cfa59dc00b324bf4ec2a66b5c7320ddb0c7 [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(
975 VK_DEBUG_REPORT_ERROR_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(
992 VK_DEBUG_REPORT_ERROR_BIT_EXT,
993 " 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(
1007 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1008 " 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 Gravesc99cf5a2016-05-09 14:40:29 -06001117}
Dustin Graves5d33d532016-05-09 16:21:12 -06001118
1119TEST_F(VkLayerTest, UnrecognizedValue) {
1120 TEST_DESCRIPTION(
1121 "Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
1122
1123 ASSERT_NO_FATAL_FAILURE(InitState());
1124
1125 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1126 "does not fall within the begin..end "
1127 "range of the core VkFormat "
1128 "enumeration tokens");
1129 // Specify an invalid VkFormat value
1130 // Expected to trigger an error with
1131 // parameter_validation::validate_ranged_enum
1132 VkFormatProperties format_properties;
1133 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000),
1134 &format_properties);
1135 m_errorMonitor->VerifyFound();
1136
1137 m_errorMonitor->SetDesiredFailureMsg(
1138 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1139 "contains flag bits that are not recognized members of");
1140 // Specify an invalid VkFlags bitmask value
1141 // Expected to trigger an error with parameter_validation::validate_flags
1142 VkImageFormatProperties image_format_properties;
1143 vkGetPhysicalDeviceImageFormatProperties(
1144 gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D,
1145 VK_IMAGE_TILING_OPTIMAL, static_cast<VkImageUsageFlags>(1 << 25), 0,
1146 &image_format_properties);
1147 m_errorMonitor->VerifyFound();
1148
1149 m_errorMonitor->SetDesiredFailureMsg(
1150 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1151 "contains flag bits that are not recognized members of");
1152 // Specify an invalid VkFlags array entry
1153 // Expected to trigger an error with
1154 // parameter_validation::validate_flags_array
1155 VkSemaphore semaphore = VK_NULL_HANDLE;
1156 VkPipelineStageFlags stage_flags =
1157 static_cast<VkPipelineStageFlags>(1 << 25);
1158 VkSubmitInfo submit_info = {};
1159 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1160 submit_info.waitSemaphoreCount = 1;
1161 submit_info.pWaitSemaphores = &semaphore;
1162 submit_info.pWaitDstStageMask = &stage_flags;
1163 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1164 m_errorMonitor->VerifyFound();
1165
1166 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1167 "is neither VK_TRUE nor VK_FALSE");
1168 // Specify an invalid VkBool32 value
1169 // Expected to trigger a warning with
1170 // parameter_validation::validate_bool32
1171 VkSampler sampler = VK_NULL_HANDLE;
1172 VkSamplerCreateInfo sampler_info = {};
1173 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1174 sampler_info.pNext = NULL;
1175 sampler_info.magFilter = VK_FILTER_NEAREST;
1176 sampler_info.minFilter = VK_FILTER_NEAREST;
1177 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1178 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1179 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1180 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1181 sampler_info.mipLodBias = 1.0;
1182 sampler_info.maxAnisotropy = 1;
1183 sampler_info.compareEnable = VK_FALSE;
1184 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1185 sampler_info.minLod = 1.0;
1186 sampler_info.maxLod = 1.0;
1187 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1188 sampler_info.unnormalizedCoordinates = VK_FALSE;
1189 // Not VK_TRUE or VK_FALSE
1190 sampler_info.anisotropyEnable = 3;
1191 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1192 m_errorMonitor->VerifyFound();
1193}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001194
1195TEST_F(VkLayerTest, FailedReturnValue) {
1196 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1197
1198 ASSERT_NO_FATAL_FAILURE(InitState());
1199
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001200 // Find an unsupported image format
1201 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1202 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1203 VkFormat format = static_cast<VkFormat>(f);
1204 VkFormatProperties fProps = m_device->format_properties(format);
1205 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
1206 fProps.optimalTilingFeatures == 0) {
1207 unsupported = format;
1208 break;
1209 }
1210 }
1211
1212 if (unsupported != VK_FORMAT_UNDEFINED) {
1213 m_errorMonitor->SetDesiredFailureMsg(
1214 VK_DEBUG_REPORT_WARNING_BIT_EXT,
1215 "the requested format is not supported on this device");
1216 // Specify an unsupported VkFormat value to generate a
1217 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1218 // Expected to trigger a warning from
1219 // parameter_validation::validate_result
1220 VkImageFormatProperties image_format_properties;
1221 VkResult err = vkGetPhysicalDeviceImageFormatProperties(
1222 gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1223 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
1224 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1225 m_errorMonitor->VerifyFound();
1226 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001227}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001228
1229TEST_F(VkLayerTest, UpdateBufferAlignment) {
1230 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
1231 uint32_t updateData[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
1232
1233 ASSERT_NO_FATAL_FAILURE(InitState());
1234
1235 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1236 vk_testing::Buffer buffer;
1237 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1238
1239 BeginCommandBuffer();
1240 // Introduce failure by using dstOffset that is not multiple of 4
1241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1242 " is not a multiple of 4");
1243 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1244 m_errorMonitor->VerifyFound();
1245
1246 // Introduce failure by using dataSize that is not multiple of 4
1247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1248 " is not a multiple of 4");
1249 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1250 m_errorMonitor->VerifyFound();
1251
1252 // Introduce failure by using dataSize that is < 0
1253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1254 "must be greater than zero and less than or equal to 65536");
1255 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1256 m_errorMonitor->VerifyFound();
1257
1258 // Introduce failure by using dataSize that is > 65536
1259 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1260 "must be greater than zero and less than or equal to 65536");
1261 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1262 m_errorMonitor->VerifyFound();
1263
1264 EndCommandBuffer();
1265}
1266
1267TEST_F(VkLayerTest, FillBufferAlignment) {
1268 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1269
1270 ASSERT_NO_FATAL_FAILURE(InitState());
1271
1272 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1273 vk_testing::Buffer buffer;
1274 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1275
1276 BeginCommandBuffer();
1277
1278 // Introduce failure by using dstOffset that is not multiple of 4
1279 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1280 " is not a multiple of 4");
1281 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1282 m_errorMonitor->VerifyFound();
1283
1284 // Introduce failure by using size that is not multiple of 4
1285 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1286 " is not a multiple of 4");
1287 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1288 m_errorMonitor->VerifyFound();
1289
1290 // Introduce failure by using size that is zero
1291 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1292 "must be greater than zero");
1293 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1294 m_errorMonitor->VerifyFound();
1295
1296 EndCommandBuffer();
1297}
Dustin Graves40f35822016-06-23 11:12:53 -06001298
1299// This is a positive test. No failures are expected.
1300TEST_F(VkLayerTest, IgnoreUnrelatedDescriptor) {
1301 TEST_DESCRIPTION("Ensure that the vkUpdateDescriptorSet validation code "
1302 "is ignoring VkWriteDescriptorSet members that are not "
1303 "related to the descriptor type specified by "
1304 "VkWriteDescriptorSet::descriptorType. Correct "
1305 "validation behavior will result in the test running to "
1306 "completion without validation errors.");
1307
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001308 const uintptr_t invalid_ptr = 0xcdcdcdcd;
1309
Dustin Graves40f35822016-06-23 11:12:53 -06001310 ASSERT_NO_FATAL_FAILURE(InitState());
1311
1312 // Image Case
1313 {
1314 m_errorMonitor->ExpectSuccess();
1315
1316 VkImage image;
1317 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1318 const int32_t tex_width = 32;
1319 const int32_t tex_height = 32;
1320 VkImageCreateInfo image_create_info = {};
1321 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1322 image_create_info.pNext = NULL;
1323 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1324 image_create_info.format = tex_format;
1325 image_create_info.extent.width = tex_width;
1326 image_create_info.extent.height = tex_height;
1327 image_create_info.extent.depth = 1;
1328 image_create_info.mipLevels = 1;
1329 image_create_info.arrayLayers = 1;
1330 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis51cde412016-07-11 16:08:30 -06001331 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Dustin Graves40f35822016-06-23 11:12:53 -06001332 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1333 image_create_info.flags = 0;
1334 VkResult err =
1335 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1336 ASSERT_VK_SUCCESS(err);
1337
1338 VkMemoryRequirements memory_reqs;
1339 VkDeviceMemory image_memory;
1340 bool pass;
1341 VkMemoryAllocateInfo memory_info = {};
1342 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1343 memory_info.pNext = NULL;
1344 memory_info.allocationSize = 0;
1345 memory_info.memoryTypeIndex = 0;
1346 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
1347 memory_info.allocationSize = memory_reqs.size;
1348 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1349 &memory_info, 0);
1350 ASSERT_TRUE(pass);
1351 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1352 &image_memory);
1353 ASSERT_VK_SUCCESS(err);
1354 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
1355 ASSERT_VK_SUCCESS(err);
1356
1357 VkImageViewCreateInfo image_view_create_info = {};
1358 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
1359 image_view_create_info.image = image;
1360 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
1361 image_view_create_info.format = tex_format;
1362 image_view_create_info.subresourceRange.layerCount = 1;
1363 image_view_create_info.subresourceRange.baseMipLevel = 0;
1364 image_view_create_info.subresourceRange.levelCount = 1;
1365 image_view_create_info.subresourceRange.aspectMask =
1366 VK_IMAGE_ASPECT_COLOR_BIT;
1367
1368 VkImageView view;
1369 err = vkCreateImageView(m_device->device(), &image_view_create_info,
1370 NULL, &view);
1371 ASSERT_VK_SUCCESS(err);
1372
1373 VkDescriptorPoolSize ds_type_count = {};
1374 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1375 ds_type_count.descriptorCount = 1;
1376
1377 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1378 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1379 ds_pool_ci.pNext = NULL;
1380 ds_pool_ci.maxSets = 1;
1381 ds_pool_ci.poolSizeCount = 1;
1382 ds_pool_ci.pPoolSizes = &ds_type_count;
1383
1384 VkDescriptorPool ds_pool;
1385 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL,
1386 &ds_pool);
1387 ASSERT_VK_SUCCESS(err);
1388
1389 VkDescriptorSetLayoutBinding dsl_binding = {};
1390 dsl_binding.binding = 0;
1391 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1392 dsl_binding.descriptorCount = 1;
1393 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1394 dsl_binding.pImmutableSamplers = NULL;
1395
1396 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1397 ds_layout_ci.sType =
1398 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1399 ds_layout_ci.pNext = NULL;
1400 ds_layout_ci.bindingCount = 1;
1401 ds_layout_ci.pBindings = &dsl_binding;
1402 VkDescriptorSetLayout ds_layout;
1403 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
1404 NULL, &ds_layout);
1405 ASSERT_VK_SUCCESS(err);
1406
1407 VkDescriptorSet descriptor_set;
1408 VkDescriptorSetAllocateInfo alloc_info = {};
1409 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1410 alloc_info.descriptorSetCount = 1;
1411 alloc_info.descriptorPool = ds_pool;
1412 alloc_info.pSetLayouts = &ds_layout;
1413 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1414 &descriptor_set);
1415 ASSERT_VK_SUCCESS(err);
1416
1417 VkDescriptorImageInfo image_info = {};
1418 image_info.imageView = view;
1419 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
1420
1421 VkWriteDescriptorSet descriptor_write;
1422 memset(&descriptor_write, 0, sizeof(descriptor_write));
1423 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1424 descriptor_write.dstSet = descriptor_set;
1425 descriptor_write.dstBinding = 0;
1426 descriptor_write.descriptorCount = 1;
1427 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1428 descriptor_write.pImageInfo = &image_info;
1429
1430 // Set pBufferInfo and pTexelBufferView to invalid values, which should
1431 // be
1432 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
1433 // This will most likely produce a crash if the parameter_validation
1434 // layer
1435 // does not correctly ignore pBufferInfo.
1436 descriptor_write.pBufferInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001437 reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001438 descriptor_write.pTexelBufferView =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001439 reinterpret_cast<const VkBufferView *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001440
1441 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
1442 NULL);
1443
1444 m_errorMonitor->VerifyNotFound();
1445
1446 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
1447 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1448 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1449 vkDestroyImageView(m_device->device(), view, NULL);
1450 vkDestroyImage(m_device->device(), image, NULL);
1451 vkFreeMemory(m_device->device(), image_memory, NULL);
1452 }
1453
1454 // Buffer Case
1455 {
1456 m_errorMonitor->ExpectSuccess();
1457
1458 VkBuffer buffer;
1459 uint32_t queue_family_index = 0;
1460 VkBufferCreateInfo buffer_create_info = {};
1461 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1462 buffer_create_info.size = 1024;
1463 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1464 buffer_create_info.queueFamilyIndexCount = 1;
1465 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1466
1467 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info,
1468 NULL, &buffer);
1469 ASSERT_VK_SUCCESS(err);
1470
1471 VkMemoryRequirements memory_reqs;
1472 VkDeviceMemory buffer_memory;
1473 bool pass;
1474 VkMemoryAllocateInfo memory_info = {};
1475 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1476 memory_info.pNext = NULL;
1477 memory_info.allocationSize = 0;
1478 memory_info.memoryTypeIndex = 0;
1479
1480 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1481 memory_info.allocationSize = memory_reqs.size;
1482 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1483 &memory_info, 0);
1484 ASSERT_TRUE(pass);
1485
1486 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1487 &buffer_memory);
1488 ASSERT_VK_SUCCESS(err);
1489 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1490 ASSERT_VK_SUCCESS(err);
1491
1492 VkDescriptorPoolSize ds_type_count = {};
1493 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1494 ds_type_count.descriptorCount = 1;
1495
1496 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1497 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1498 ds_pool_ci.pNext = NULL;
1499 ds_pool_ci.maxSets = 1;
1500 ds_pool_ci.poolSizeCount = 1;
1501 ds_pool_ci.pPoolSizes = &ds_type_count;
1502
1503 VkDescriptorPool ds_pool;
1504 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL,
1505 &ds_pool);
1506 ASSERT_VK_SUCCESS(err);
1507
1508 VkDescriptorSetLayoutBinding dsl_binding = {};
1509 dsl_binding.binding = 0;
1510 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1511 dsl_binding.descriptorCount = 1;
1512 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1513 dsl_binding.pImmutableSamplers = NULL;
1514
1515 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1516 ds_layout_ci.sType =
1517 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1518 ds_layout_ci.pNext = NULL;
1519 ds_layout_ci.bindingCount = 1;
1520 ds_layout_ci.pBindings = &dsl_binding;
1521 VkDescriptorSetLayout ds_layout;
1522 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
1523 NULL, &ds_layout);
1524 ASSERT_VK_SUCCESS(err);
1525
1526 VkDescriptorSet descriptor_set;
1527 VkDescriptorSetAllocateInfo alloc_info = {};
1528 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1529 alloc_info.descriptorSetCount = 1;
1530 alloc_info.descriptorPool = ds_pool;
1531 alloc_info.pSetLayouts = &ds_layout;
1532 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1533 &descriptor_set);
1534 ASSERT_VK_SUCCESS(err);
1535
1536 VkDescriptorBufferInfo buffer_info = {};
1537 buffer_info.buffer = buffer;
1538 buffer_info.offset = 0;
1539 buffer_info.range = 1024;
1540
1541 VkWriteDescriptorSet descriptor_write;
1542 memset(&descriptor_write, 0, sizeof(descriptor_write));
1543 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1544 descriptor_write.dstSet = descriptor_set;
1545 descriptor_write.dstBinding = 0;
1546 descriptor_write.descriptorCount = 1;
1547 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1548 descriptor_write.pBufferInfo = &buffer_info;
1549
1550 // Set pImageInfo and pTexelBufferView to invalid values, which should
1551 // be
1552 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
1553 // This will most likely produce a crash if the parameter_validation
1554 // layer
1555 // does not correctly ignore pImageInfo.
1556 descriptor_write.pImageInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001557 reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001558 descriptor_write.pTexelBufferView =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001559 reinterpret_cast<const VkBufferView *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001560
1561 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
1562 NULL);
1563
1564 m_errorMonitor->VerifyNotFound();
1565
1566 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
1567 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1568 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1569 vkDestroyBuffer(m_device->device(), buffer, NULL);
1570 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1571 }
1572
1573 // Texel Buffer Case
1574 {
1575 m_errorMonitor->ExpectSuccess();
1576
1577 VkBuffer buffer;
1578 uint32_t queue_family_index = 0;
1579 VkBufferCreateInfo buffer_create_info = {};
1580 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1581 buffer_create_info.size = 1024;
1582 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
1583 buffer_create_info.queueFamilyIndexCount = 1;
1584 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1585
1586 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info,
1587 NULL, &buffer);
1588 ASSERT_VK_SUCCESS(err);
1589
1590 VkMemoryRequirements memory_reqs;
1591 VkDeviceMemory buffer_memory;
1592 bool pass;
1593 VkMemoryAllocateInfo memory_info = {};
1594 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1595 memory_info.pNext = NULL;
1596 memory_info.allocationSize = 0;
1597 memory_info.memoryTypeIndex = 0;
1598
1599 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1600 memory_info.allocationSize = memory_reqs.size;
1601 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1602 &memory_info, 0);
1603 ASSERT_TRUE(pass);
1604
1605 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1606 &buffer_memory);
1607 ASSERT_VK_SUCCESS(err);
1608 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1609 ASSERT_VK_SUCCESS(err);
1610
1611 VkBufferViewCreateInfo buff_view_ci = {};
1612 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
1613 buff_view_ci.buffer = buffer;
1614 buff_view_ci.format = VK_FORMAT_R8_UNORM;
1615 buff_view_ci.range = VK_WHOLE_SIZE;
1616 VkBufferView buffer_view;
1617 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL,
1618 &buffer_view);
1619
1620 VkDescriptorPoolSize ds_type_count = {};
1621 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1622 ds_type_count.descriptorCount = 1;
1623
1624 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1625 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1626 ds_pool_ci.pNext = NULL;
1627 ds_pool_ci.maxSets = 1;
1628 ds_pool_ci.poolSizeCount = 1;
1629 ds_pool_ci.pPoolSizes = &ds_type_count;
1630
1631 VkDescriptorPool ds_pool;
1632 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL,
1633 &ds_pool);
1634 ASSERT_VK_SUCCESS(err);
1635
1636 VkDescriptorSetLayoutBinding dsl_binding = {};
1637 dsl_binding.binding = 0;
1638 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1639 dsl_binding.descriptorCount = 1;
1640 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1641 dsl_binding.pImmutableSamplers = NULL;
1642
1643 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1644 ds_layout_ci.sType =
1645 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1646 ds_layout_ci.pNext = NULL;
1647 ds_layout_ci.bindingCount = 1;
1648 ds_layout_ci.pBindings = &dsl_binding;
1649 VkDescriptorSetLayout ds_layout;
1650 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
1651 NULL, &ds_layout);
1652 ASSERT_VK_SUCCESS(err);
1653
1654 VkDescriptorSet descriptor_set;
1655 VkDescriptorSetAllocateInfo alloc_info = {};
1656 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1657 alloc_info.descriptorSetCount = 1;
1658 alloc_info.descriptorPool = ds_pool;
1659 alloc_info.pSetLayouts = &ds_layout;
1660 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1661 &descriptor_set);
1662 ASSERT_VK_SUCCESS(err);
1663
1664 VkWriteDescriptorSet descriptor_write;
1665 memset(&descriptor_write, 0, sizeof(descriptor_write));
1666 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1667 descriptor_write.dstSet = descriptor_set;
1668 descriptor_write.dstBinding = 0;
1669 descriptor_write.descriptorCount = 1;
1670 descriptor_write.descriptorType =
1671 VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1672 descriptor_write.pTexelBufferView = &buffer_view;
1673
1674 // Set pImageInfo and pBufferInfo to invalid values, which should be
1675 // ignored for descriptorType ==
1676 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
1677 // This will most likely produce a crash if the parameter_validation
1678 // layer
1679 // does not correctly ignore pImageInfo and pBufferInfo.
1680 descriptor_write.pImageInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001681 reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001682 descriptor_write.pBufferInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001683 reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001684
1685 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
1686 NULL);
1687
1688 m_errorMonitor->VerifyNotFound();
1689
1690 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
1691 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1692 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1693 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
1694 vkDestroyBuffer(m_device->device(), buffer, NULL);
1695 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1696 }
1697}
Dustin Gravesffa90fa2016-05-06 11:20:38 -06001698#endif // PARAMETER_VALIDATION_TESTS
1699
Tobin Ehlis0788f522015-05-26 16:11:58 -06001700#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001701#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001702TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001703{
1704 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001705 VkFenceCreateInfo fenceInfo = {};
1706 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1707 fenceInfo.pNext = NULL;
1708 fenceInfo.flags = 0;
1709
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001710 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001711
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001712 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001713
1714 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1715 vk_testing::Buffer buffer;
1716 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001717
Tony Barbourfe3351b2015-07-28 10:17:20 -06001718 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001719 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001720 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001721
1722 testFence.init(*m_device, fenceInfo);
1723
1724 // Bypass framework since it does the waits automatically
1725 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001726 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001727 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1728 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001729 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001730 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001731 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001732 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001733 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001734 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001735 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001736
1737 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001738 ASSERT_VK_SUCCESS( err );
1739
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001740 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001741 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001742
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001743 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001744}
1745
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001746TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001747{
1748 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001749 VkFenceCreateInfo fenceInfo = {};
1750 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1751 fenceInfo.pNext = NULL;
1752 fenceInfo.flags = 0;
1753
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001754 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001755
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001756 ASSERT_NO_FATAL_FAILURE(InitState());
1757 ASSERT_NO_FATAL_FAILURE(InitViewport());
1758 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1759
Tony Barbourfe3351b2015-07-28 10:17:20 -06001760 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001761 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001762 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001763
1764 testFence.init(*m_device, fenceInfo);
1765
1766 // Bypass framework since it does the waits automatically
1767 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001768 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001769 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1770 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001771 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001772 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001773 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001774 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001775 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001776 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001777 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001778
1779 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001780 ASSERT_VK_SUCCESS( err );
1781
Jon Ashburnf19916e2016-01-11 13:12:43 -07001782 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001783 VkCommandBufferBeginInfo info = {};
1784 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1785 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001786 info.renderPass = VK_NULL_HANDLE;
1787 info.subpass = 0;
1788 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001789 info.occlusionQueryEnable = VK_FALSE;
1790 info.queryFlags = 0;
1791 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001792
1793 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001794 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001795
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001796 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001797}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001798#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001799
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001800// This is a positive test. No failures are expected.
1801TEST_F(VkLayerTest, TestAliasedMemoryTracking) {
1802 VkResult err;
1803 bool pass;
1804
1805 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
1806 "the buffer, create an image, and bind the same memory to "
1807 "it");
1808
1809 m_errorMonitor->ExpectSuccess();
1810
1811 ASSERT_NO_FATAL_FAILURE(InitState());
1812
1813 VkBuffer buffer;
1814 VkImage image;
1815 VkDeviceMemory mem;
1816 VkMemoryRequirements mem_reqs;
1817
1818 VkBufferCreateInfo buf_info = {};
1819 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1820 buf_info.pNext = NULL;
1821 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1822 buf_info.size = 256;
1823 buf_info.queueFamilyIndexCount = 0;
1824 buf_info.pQueueFamilyIndices = NULL;
1825 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1826 buf_info.flags = 0;
1827 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1828 ASSERT_VK_SUCCESS(err);
1829
1830 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1831
1832 VkMemoryAllocateInfo alloc_info = {};
1833 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1834 alloc_info.pNext = NULL;
1835 alloc_info.memoryTypeIndex = 0;
1836
1837 // Ensure memory is big enough for both bindings
1838 alloc_info.allocationSize = 0x10000;
1839
1840 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
1841 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1842 if (!pass) {
1843 vkDestroyBuffer(m_device->device(), buffer, NULL);
1844 return;
1845 }
1846
1847 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1848 ASSERT_VK_SUCCESS(err);
1849
1850 uint8_t *pData;
1851 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
1852 (void **)&pData);
1853 ASSERT_VK_SUCCESS(err);
1854
Mark Lobodzinski2abefa92016-05-05 11:45:57 -06001855 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001856
1857 vkUnmapMemory(m_device->device(), mem);
1858
1859 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1860 ASSERT_VK_SUCCESS(err);
1861
1862 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
1863 // memory. In fact, it was never used by the GPU.
1864 // Just be be sure, wait for idle.
1865 vkDestroyBuffer(m_device->device(), buffer, NULL);
1866 vkDeviceWaitIdle(m_device->device());
1867
1868 VkImageCreateInfo image_create_info = {};
1869 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1870 image_create_info.pNext = NULL;
1871 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1872 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1873 image_create_info.extent.width = 64;
1874 image_create_info.extent.height = 64;
1875 image_create_info.extent.depth = 1;
1876 image_create_info.mipLevels = 1;
1877 image_create_info.arrayLayers = 1;
1878 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1879 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1880 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1881 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1882 image_create_info.queueFamilyIndexCount = 0;
1883 image_create_info.pQueueFamilyIndices = NULL;
1884 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1885 image_create_info.flags = 0;
1886
1887 VkMemoryAllocateInfo mem_alloc = {};
1888 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1889 mem_alloc.pNext = NULL;
1890 mem_alloc.allocationSize = 0;
1891 mem_alloc.memoryTypeIndex = 0;
1892
1893 /* Create a mappable image. It will be the texture if linear images are ok
1894 * to be textures or it will be the staging image if they are not.
1895 */
1896 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1897 ASSERT_VK_SUCCESS(err);
1898
1899 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
1900
1901 mem_alloc.allocationSize = mem_reqs.size;
1902
1903 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
1904 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1905 if (!pass) {
1906 vkDestroyImage(m_device->device(), image, NULL);
1907 return;
1908 }
1909
Tobin Ehlis077ded32016-05-12 17:39:13 -06001910 // VALIDATION FAILURE:
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001911 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1912 ASSERT_VK_SUCCESS(err);
1913
1914 m_errorMonitor->VerifyNotFound();
1915
Tony Barbourdf4c0042016-06-01 15:55:43 -06001916 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001917 vkDestroyBuffer(m_device->device(), buffer, NULL);
1918 vkDestroyImage(m_device->device(), image, NULL);
1919}
1920
Tobin Ehlisf11be982016-05-11 13:52:53 -06001921TEST_F(VkLayerTest, InvalidMemoryAliasing) {
1922 TEST_DESCRIPTION("Create a buffer and image, allocate memory, and bind the "
1923 "buffer and image to memory such that they will alias.");
1924 VkResult err;
1925 bool pass;
1926 ASSERT_NO_FATAL_FAILURE(InitState());
1927
Tobin Ehlis077ded32016-05-12 17:39:13 -06001928 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001929 VkImage image;
1930 VkDeviceMemory mem; // buffer will be bound first
1931 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001932 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001933
1934 VkBufferCreateInfo buf_info = {};
1935 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1936 buf_info.pNext = NULL;
1937 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1938 buf_info.size = 256;
1939 buf_info.queueFamilyIndexCount = 0;
1940 buf_info.pQueueFamilyIndices = NULL;
1941 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1942 buf_info.flags = 0;
1943 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1944 ASSERT_VK_SUCCESS(err);
1945
Tobin Ehlis077ded32016-05-12 17:39:13 -06001946 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001947
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
Tobin Ehlisf11be982016-05-11 13:52:53 -06001967 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1968 ASSERT_VK_SUCCESS(err);
1969
Tobin Ehlis077ded32016-05-12 17:39:13 -06001970 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1971
1972 VkMemoryAllocateInfo alloc_info = {};
1973 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1974 alloc_info.pNext = NULL;
1975 alloc_info.memoryTypeIndex = 0;
1976 // Ensure memory is big enough for both bindings
1977 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
1978 pass = m_device->phy().set_memory_type(
1979 buff_mem_reqs.memoryTypeBits | img_mem_reqs.memoryTypeBits, &alloc_info,
1980 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001981 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001982 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001983 vkDestroyImage(m_device->device(), image, NULL);
1984 return;
1985 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001986 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1987 ASSERT_VK_SUCCESS(err);
1988 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1989 ASSERT_VK_SUCCESS(err);
1990
Tobin Ehlisf11be982016-05-11 13:52:53 -06001991 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1992 " is aliased with buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001993 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001994 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1995 m_errorMonitor->VerifyFound();
1996
1997 // Now correctly bind image to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001998 // aliasing buffer2
1999 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
2000 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002001 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
2002 ASSERT_VK_SUCCESS(err);
2003 err = vkBindImageMemory(m_device->device(), image, mem_img, 0);
2004 ASSERT_VK_SUCCESS(err);
2005 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2006 " is aliased with image 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06002007 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002008 m_errorMonitor->VerifyFound();
2009
2010 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06002011 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002012 vkDestroyImage(m_device->device(), image, NULL);
2013 vkFreeMemory(m_device->device(), mem, NULL);
2014 vkFreeMemory(m_device->device(), mem_img, NULL);
2015}
2016
Tobin Ehlis35372522016-05-12 08:32:31 -06002017TEST_F(VkLayerTest, InvalidMemoryMapping) {
2018 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
2019 VkResult err;
2020 bool pass;
2021 ASSERT_NO_FATAL_FAILURE(InitState());
2022
2023 VkBuffer buffer;
2024 VkDeviceMemory mem;
2025 VkMemoryRequirements mem_reqs;
2026
2027 VkBufferCreateInfo buf_info = {};
2028 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2029 buf_info.pNext = NULL;
2030 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2031 buf_info.size = 256;
2032 buf_info.queueFamilyIndexCount = 0;
2033 buf_info.pQueueFamilyIndices = NULL;
2034 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2035 buf_info.flags = 0;
2036 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
2037 ASSERT_VK_SUCCESS(err);
2038
2039 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
2040 VkMemoryAllocateInfo alloc_info = {};
2041 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2042 alloc_info.pNext = NULL;
2043 alloc_info.memoryTypeIndex = 0;
2044
2045 // Ensure memory is big enough for both bindings
2046 static const VkDeviceSize allocation_size = 0x10000;
2047 alloc_info.allocationSize = allocation_size;
2048 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
2049 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
2050 if (!pass) {
2051 vkDestroyBuffer(m_device->device(), buffer, NULL);
2052 return;
2053 }
2054 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
2055 ASSERT_VK_SUCCESS(err);
2056
2057 uint8_t *pData;
2058 // Attempt to map memory size 0 is invalid
2059 m_errorMonitor->SetDesiredFailureMsg(
2060 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2061 "VkMapMemory: Attempting to map memory range of size zero");
2062 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
2063 m_errorMonitor->VerifyFound();
2064 // Map memory twice
2065 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
2066 (void **)&pData);
2067 ASSERT_VK_SUCCESS(err);
2068 m_errorMonitor->SetDesiredFailureMsg(
2069 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2070 "VkMapMemory: Attempting to map memory on an already-mapped object ");
2071 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
2072 (void **)&pData);
2073 m_errorMonitor->VerifyFound();
2074
2075 // Unmap the memory to avoid re-map error
2076 vkUnmapMemory(m_device->device(), mem);
2077 // overstep allocation with VK_WHOLE_SIZE
2078 m_errorMonitor->SetDesiredFailureMsg(
2079 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2080 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
2081 err = vkMapMemory(m_device->device(), mem, allocation_size + 1,
2082 VK_WHOLE_SIZE, 0, (void **)&pData);
2083 m_errorMonitor->VerifyFound();
2084 // overstep allocation w/o VK_WHOLE_SIZE
2085 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2086 " oversteps total array size 0x");
2087 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0,
2088 (void **)&pData);
2089 m_errorMonitor->VerifyFound();
2090 // Now error due to unmapping memory that's not mapped
2091 m_errorMonitor->SetDesiredFailureMsg(
2092 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2093 "Unmapping Memory without memory being mapped: ");
2094 vkUnmapMemory(m_device->device(), mem);
2095 m_errorMonitor->VerifyFound();
2096 // Now map memory and cause errors due to flushing invalid ranges
2097 err = vkMapMemory(m_device->device(), mem, 16, VK_WHOLE_SIZE, 0,
2098 (void **)&pData);
2099 ASSERT_VK_SUCCESS(err);
2100 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12002101 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06002102 mmr.memory = mem;
2103 mmr.offset = 15; // Error b/c offset less than offset of mapped mem
2104 m_errorMonitor->SetDesiredFailureMsg(
2105 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2106 ") is less than Memory Object's offset (");
2107 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2108 m_errorMonitor->VerifyFound();
2109 // Now flush range that oversteps mapped range
2110 vkUnmapMemory(m_device->device(), mem);
2111 err = vkMapMemory(m_device->device(), mem, 0, 256, 0, (void **)&pData);
2112 ASSERT_VK_SUCCESS(err);
2113 mmr.offset = 16;
2114 mmr.size = 256; // flushing bounds (272) exceed mapped bounds (256)
2115 m_errorMonitor->SetDesiredFailureMsg(
2116 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2117 ") exceeds the Memory Object's upper-bound (");
2118 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2119 m_errorMonitor->VerifyFound();
2120
2121 pass =
2122 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
2123 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
2124 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
2125 if (!pass) {
2126 vkFreeMemory(m_device->device(), mem, NULL);
2127 vkDestroyBuffer(m_device->device(), buffer, NULL);
2128 return;
2129 }
2130 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
2131 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
2132
2133 vkDestroyBuffer(m_device->device(), buffer, NULL);
2134 vkFreeMemory(m_device->device(), mem, NULL);
2135}
2136
Ian Elliott1c32c772016-04-28 14:47:13 -06002137TEST_F(VkLayerTest, EnableWsiBeforeUse) {
2138 VkResult err;
2139 bool pass;
2140
Ian Elliott489eec02016-05-05 14:12:44 -06002141// FIXME: After we turn on this code for non-Linux platforms, uncomment the
2142// following declaration (which is temporarily being moved below):
2143// VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002144 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2145 VkSwapchainCreateInfoKHR swapchain_create_info = {};
2146 uint32_t swapchain_image_count = 0;
2147// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
2148 uint32_t image_index = 0;
2149// VkPresentInfoKHR present_info = {};
2150
2151 ASSERT_NO_FATAL_FAILURE(InitState());
2152
Ian Elliott3f06ce52016-04-29 14:46:21 -06002153#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
2154#if defined(VK_USE_PLATFORM_ANDROID_KHR)
2155 // Use the functions from the VK_KHR_android_surface extension without
2156 // enabling that extension:
2157
2158 // Create a surface:
2159 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002160 m_errorMonitor->SetDesiredFailureMsg(
2161 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2162 "extension was not enabled for this");
2163 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
2164 &surface);
2165 pass = (err != VK_SUCCESS);
2166 ASSERT_TRUE(pass);
2167 m_errorMonitor->VerifyFound();
2168#endif // VK_USE_PLATFORM_ANDROID_KHR
2169
2170
2171#if defined(VK_USE_PLATFORM_MIR_KHR)
2172 // Use the functions from the VK_KHR_mir_surface extension without enabling
2173 // that extension:
2174
2175 // Create a surface:
2176 VkMirSurfaceCreateInfoKHR mir_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002177 m_errorMonitor->SetDesiredFailureMsg(
2178 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2179 "extension was not enabled for this");
2180 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
2181 pass = (err != VK_SUCCESS);
2182 ASSERT_TRUE(pass);
2183 m_errorMonitor->VerifyFound();
2184
2185 // Tell whether an mir_connection supports presentation:
2186 MirConnection *mir_connection = NULL;
2187 m_errorMonitor->SetDesiredFailureMsg(
2188 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2189 "extension was not enabled for this");
2190 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
2191 visual_id);
2192 m_errorMonitor->VerifyFound();
2193#endif // VK_USE_PLATFORM_MIR_KHR
2194
2195
2196#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
2197 // Use the functions from the VK_KHR_wayland_surface extension without
2198 // enabling that extension:
2199
2200 // Create a surface:
2201 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002202 m_errorMonitor->SetDesiredFailureMsg(
2203 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2204 "extension was not enabled for this");
2205 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
2206 &surface);
2207 pass = (err != VK_SUCCESS);
2208 ASSERT_TRUE(pass);
2209 m_errorMonitor->VerifyFound();
2210
2211 // Tell whether an wayland_display supports presentation:
2212 struct wl_display wayland_display = {};
2213 m_errorMonitor->SetDesiredFailureMsg(
2214 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2215 "extension was not enabled for this");
2216 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
2217 &wayland_display);
2218 m_errorMonitor->VerifyFound();
2219#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -06002220#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06002221
2222
2223#if defined(VK_USE_PLATFORM_WIN32_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06002224// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2225// TO NON-LINUX PLATFORMS:
2226VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06002227 // Use the functions from the VK_KHR_win32_surface extension without
2228 // enabling that extension:
2229
2230 // Create a surface:
2231 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002232 m_errorMonitor->SetDesiredFailureMsg(
2233 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2234 "extension was not enabled for this");
2235 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
2236 &surface);
2237 pass = (err != VK_SUCCESS);
2238 ASSERT_TRUE(pass);
2239 m_errorMonitor->VerifyFound();
2240
2241 // Tell whether win32 supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06002242 m_errorMonitor->SetDesiredFailureMsg(
2243 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2244 "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06002245 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06002246 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002247// Set this (for now, until all platforms are supported and tested):
2248#define NEED_TO_TEST_THIS_ON_PLATFORM
2249#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06002250
2251
Ian Elliott1c32c772016-04-28 14:47:13 -06002252#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06002253// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2254// TO NON-LINUX PLATFORMS:
2255VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002256 // Use the functions from the VK_KHR_xcb_surface extension without enabling
2257 // that extension:
2258
2259 // Create a surface:
2260 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06002261 m_errorMonitor->SetDesiredFailureMsg(
2262 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2263 "extension was not enabled for this");
2264 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2265 pass = (err != VK_SUCCESS);
2266 ASSERT_TRUE(pass);
2267 m_errorMonitor->VerifyFound();
2268
2269 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06002270 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06002271 xcb_visualid_t visual_id = 0;
2272 m_errorMonitor->SetDesiredFailureMsg(
2273 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2274 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06002275 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -06002276 visual_id);
2277 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002278// Set this (for now, until all platforms are supported and tested):
2279#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002280#endif // VK_USE_PLATFORM_XCB_KHR
2281
2282
Ian Elliott12630812016-04-29 14:35:43 -06002283#if defined(VK_USE_PLATFORM_XLIB_KHR)
2284 // Use the functions from the VK_KHR_xlib_surface extension without enabling
2285 // that extension:
2286
2287 // Create a surface:
2288 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
Ian Elliott12630812016-04-29 14:35:43 -06002289 m_errorMonitor->SetDesiredFailureMsg(
2290 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2291 "extension was not enabled for this");
2292 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
2293 pass = (err != VK_SUCCESS);
2294 ASSERT_TRUE(pass);
2295 m_errorMonitor->VerifyFound();
2296
2297 // Tell whether an Xlib VisualID supports presentation:
2298 Display *dpy = NULL;
2299 VisualID visual = 0;
2300 m_errorMonitor->SetDesiredFailureMsg(
2301 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2302 "extension was not enabled for this");
2303 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
2304 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002305// Set this (for now, until all platforms are supported and tested):
2306#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06002307#endif // VK_USE_PLATFORM_XLIB_KHR
2308
2309
Ian Elliott1c32c772016-04-28 14:47:13 -06002310 // Use the functions from the VK_KHR_surface extension without enabling
2311 // that extension:
2312
Ian Elliott489eec02016-05-05 14:12:44 -06002313#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002314 // Destroy a surface:
2315 m_errorMonitor->SetDesiredFailureMsg(
2316 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2317 "extension was not enabled for this");
2318 vkDestroySurfaceKHR(instance(), surface, NULL);
2319 m_errorMonitor->VerifyFound();
2320
2321 // Check if surface supports presentation:
2322 VkBool32 supported = false;
2323 m_errorMonitor->SetDesiredFailureMsg(
2324 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2325 "extension was not enabled for this");
2326 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2327 pass = (err != VK_SUCCESS);
2328 ASSERT_TRUE(pass);
2329 m_errorMonitor->VerifyFound();
2330
2331 // Check surface capabilities:
2332 VkSurfaceCapabilitiesKHR capabilities = {};
2333 m_errorMonitor->SetDesiredFailureMsg(
2334 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2335 "extension was not enabled for this");
2336 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
2337 &capabilities);
2338 pass = (err != VK_SUCCESS);
2339 ASSERT_TRUE(pass);
2340 m_errorMonitor->VerifyFound();
2341
2342 // Check surface formats:
2343 uint32_t format_count = 0;
2344 VkSurfaceFormatKHR *formats = NULL;
2345 m_errorMonitor->SetDesiredFailureMsg(
2346 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2347 "extension was not enabled for this");
2348 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
2349 &format_count, formats);
2350 pass = (err != VK_SUCCESS);
2351 ASSERT_TRUE(pass);
2352 m_errorMonitor->VerifyFound();
2353
2354 // Check surface present modes:
2355 uint32_t present_mode_count = 0;
2356 VkSurfaceFormatKHR *present_modes = NULL;
2357 m_errorMonitor->SetDesiredFailureMsg(
2358 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2359 "extension was not enabled for this");
2360 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
2361 &present_mode_count, present_modes);
2362 pass = (err != VK_SUCCESS);
2363 ASSERT_TRUE(pass);
2364 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002365#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002366
2367
2368 // Use the functions from the VK_KHR_swapchain extension without enabling
2369 // that extension:
2370
2371 // Create a swapchain:
2372 m_errorMonitor->SetDesiredFailureMsg(
2373 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2374 "extension was not enabled for this");
2375 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2376 swapchain_create_info.pNext = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06002377 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
2378 NULL, &swapchain);
2379 pass = (err != VK_SUCCESS);
2380 ASSERT_TRUE(pass);
2381 m_errorMonitor->VerifyFound();
2382
2383 // Get the images from the swapchain:
2384 m_errorMonitor->SetDesiredFailureMsg(
2385 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2386 "extension was not enabled for this");
2387 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
2388 &swapchain_image_count, NULL);
2389 pass = (err != VK_SUCCESS);
2390 ASSERT_TRUE(pass);
2391 m_errorMonitor->VerifyFound();
2392
2393 // Try to acquire an image:
2394 m_errorMonitor->SetDesiredFailureMsg(
2395 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2396 "extension was not enabled for this");
2397 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
2398 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
2399 pass = (err != VK_SUCCESS);
2400 ASSERT_TRUE(pass);
2401 m_errorMonitor->VerifyFound();
2402
2403 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002404 //
2405 // NOTE: Currently can't test this because a real swapchain is needed (as
2406 // opposed to the fake one we created) in order for the layer to lookup the
2407 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06002408
2409 // Destroy the swapchain:
2410 m_errorMonitor->SetDesiredFailureMsg(
2411 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2412 "extension was not enabled for this");
2413 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
2414 m_errorMonitor->VerifyFound();
2415}
2416
Ian Elliott2c1daf52016-05-12 09:41:46 -06002417TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
Ian Elliott2c1daf52016-05-12 09:41:46 -06002418
Dustin Graves6c6d8982016-05-17 10:09:21 -06002419#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott2c1daf52016-05-12 09:41:46 -06002420 VkSurfaceKHR surface = VK_NULL_HANDLE;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002421
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002422 VkResult err;
2423 bool pass;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002424 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2425 VkSwapchainCreateInfoKHR swapchain_create_info = {};
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002426 // uint32_t swapchain_image_count = 0;
2427 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
2428 // uint32_t image_index = 0;
2429 // VkPresentInfoKHR present_info = {};
Ian Elliott2c1daf52016-05-12 09:41:46 -06002430
2431 ASSERT_NO_FATAL_FAILURE(InitState());
2432
2433 // Use the create function from one of the VK_KHR_*_surface extension in
2434 // order to create a surface, testing all known errors in the process,
2435 // before successfully creating a surface:
2436 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002437 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2438 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002439 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
2440 pass = (err != VK_SUCCESS);
2441 ASSERT_TRUE(pass);
2442 m_errorMonitor->VerifyFound();
2443
2444 // Next, try to create a surface with the wrong
2445 // VkXcbSurfaceCreateInfoKHR::sType:
2446 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
2447 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002448 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2449 "called with the wrong value for");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002450 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2451 pass = (err != VK_SUCCESS);
2452 ASSERT_TRUE(pass);
2453 m_errorMonitor->VerifyFound();
2454
Ian Elliott2c1daf52016-05-12 09:41:46 -06002455 // Create a native window, and then correctly create a surface:
2456 xcb_connection_t *connection;
2457 xcb_screen_t *screen;
2458 xcb_window_t xcb_window;
2459 xcb_intern_atom_reply_t *atom_wm_delete_window;
2460
2461 const xcb_setup_t *setup;
2462 xcb_screen_iterator_t iter;
2463 int scr;
2464 uint32_t value_mask, value_list[32];
2465 int width = 1;
2466 int height = 1;
2467
2468 connection = xcb_connect(NULL, &scr);
2469 ASSERT_TRUE(connection != NULL);
2470 setup = xcb_get_setup(connection);
2471 iter = xcb_setup_roots_iterator(setup);
2472 while (scr-- > 0)
2473 xcb_screen_next(&iter);
2474 screen = iter.data;
2475
2476 xcb_window = xcb_generate_id(connection);
2477
2478 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
2479 value_list[0] = screen->black_pixel;
2480 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE |
2481 XCB_EVENT_MASK_STRUCTURE_NOTIFY;
2482
2483 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window,
2484 screen->root, 0, 0, width, height, 0,
2485 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual,
2486 value_mask, value_list);
2487
2488 /* Magic code that will send notification when window is destroyed */
2489 xcb_intern_atom_cookie_t cookie =
2490 xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
2491 xcb_intern_atom_reply_t *reply =
2492 xcb_intern_atom_reply(connection, cookie, 0);
2493
2494 xcb_intern_atom_cookie_t cookie2 =
2495 xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002496 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002497 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window,
2498 (*reply).atom, 4, 32, 1,
2499 &(*atom_wm_delete_window).atom);
2500 free(reply);
2501
2502 xcb_map_window(connection, xcb_window);
2503
2504 // Force the x/y coordinates to 100,100 results are identical in consecutive
2505 // runs
2506 const uint32_t coords[] = {100, 100};
2507 xcb_configure_window(connection, xcb_window,
2508 XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
2509
Ian Elliott2c1daf52016-05-12 09:41:46 -06002510 // Finally, try to correctly create a surface:
2511 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
2512 xcb_create_info.pNext = NULL;
2513 xcb_create_info.flags = 0;
2514 xcb_create_info.connection = connection;
2515 xcb_create_info.window = xcb_window;
2516 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2517 pass = (err == VK_SUCCESS);
2518 ASSERT_TRUE(pass);
2519
Ian Elliott2c1daf52016-05-12 09:41:46 -06002520 // Check if surface supports presentation:
2521
2522 // 1st, do so without having queried the queue families:
2523 VkBool32 supported = false;
2524 // TODO: Get the following error to come out:
2525 m_errorMonitor->SetDesiredFailureMsg(
2526 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2527 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
2528 "function");
2529 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2530 pass = (err != VK_SUCCESS);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002531 // ASSERT_TRUE(pass);
2532 // m_errorMonitor->VerifyFound();
Ian Elliott2c1daf52016-05-12 09:41:46 -06002533
2534 // Next, query a queue family index that's too large:
2535 m_errorMonitor->SetDesiredFailureMsg(
2536 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2537 "called with a queueFamilyIndex that is too large");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002538 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface,
2539 &supported);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002540 pass = (err != VK_SUCCESS);
2541 ASSERT_TRUE(pass);
2542 m_errorMonitor->VerifyFound();
2543
2544 // Finally, do so correctly:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002545 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2546 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002547 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2548 pass = (err == VK_SUCCESS);
2549 ASSERT_TRUE(pass);
2550
Ian Elliott2c1daf52016-05-12 09:41:46 -06002551 // Before proceeding, try to create a swapchain without having called
2552 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
2553 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2554 swapchain_create_info.pNext = NULL;
2555 swapchain_create_info.flags = 0;
2556 m_errorMonitor->SetDesiredFailureMsg(
2557 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2558 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002559 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2560 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002561 pass = (err != VK_SUCCESS);
2562 ASSERT_TRUE(pass);
2563 m_errorMonitor->VerifyFound();
2564
Ian Elliott2c1daf52016-05-12 09:41:46 -06002565 // Get the surface capabilities:
2566 VkSurfaceCapabilitiesKHR surface_capabilities;
2567
2568 // Do so correctly (only error logged by this entrypoint is if the
2569 // extension isn't enabled):
2570 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
2571 &surface_capabilities);
2572 pass = (err == VK_SUCCESS);
2573 ASSERT_TRUE(pass);
2574
Ian Elliott2c1daf52016-05-12 09:41:46 -06002575 // Get the surface formats:
2576 uint32_t surface_format_count;
2577
2578 // First, try without a pointer to surface_format_count:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002579 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2580 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002581 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
2582 pass = (err == VK_SUCCESS);
2583 ASSERT_TRUE(pass);
2584 m_errorMonitor->VerifyFound();
2585
2586 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
2587 // correctly done a 1st try (to get the count):
2588 m_errorMonitor->SetDesiredFailureMsg(
2589 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2590 "but no prior positive value has been seen for");
2591 surface_format_count = 0;
2592 vkGetPhysicalDeviceSurfaceFormatsKHR(
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002593 gpu(), surface, &surface_format_count,
2594 (VkSurfaceFormatKHR *)&surface_format_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002595 pass = (err == VK_SUCCESS);
2596 ASSERT_TRUE(pass);
2597 m_errorMonitor->VerifyFound();
2598
2599 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002600 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
2601 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002602 pass = (err == VK_SUCCESS);
2603 ASSERT_TRUE(pass);
2604
2605 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002606 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(
2607 surface_format_count * sizeof(VkSurfaceFormatKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002608
2609 // Next, do a 2nd try with surface_format_count being set too high:
2610 surface_format_count += 5;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002611 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2612 "that is greater than the value");
2613 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002614 surface_formats);
2615 pass = (err == VK_SUCCESS);
2616 ASSERT_TRUE(pass);
2617 m_errorMonitor->VerifyFound();
2618
2619 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002620 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
2621 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002622 pass = (err == VK_SUCCESS);
2623 ASSERT_TRUE(pass);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002624 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002625 surface_formats);
2626 pass = (err == VK_SUCCESS);
2627 ASSERT_TRUE(pass);
2628
Ian Elliott2c1daf52016-05-12 09:41:46 -06002629 // Get the surface present modes:
2630 uint32_t surface_present_mode_count;
2631
2632 // First, try without a pointer to surface_format_count:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002633 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2634 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002635 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
2636 pass = (err == VK_SUCCESS);
2637 ASSERT_TRUE(pass);
2638 m_errorMonitor->VerifyFound();
2639
2640 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
2641 // correctly done a 1st try (to get the count):
2642 m_errorMonitor->SetDesiredFailureMsg(
2643 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2644 "but no prior positive value has been seen for");
2645 surface_present_mode_count = 0;
2646 vkGetPhysicalDeviceSurfacePresentModesKHR(
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002647 gpu(), surface, &surface_present_mode_count,
2648 (VkPresentModeKHR *)&surface_present_mode_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002649 pass = (err == VK_SUCCESS);
2650 ASSERT_TRUE(pass);
2651 m_errorMonitor->VerifyFound();
2652
2653 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002654 vkGetPhysicalDeviceSurfacePresentModesKHR(
2655 gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002656 pass = (err == VK_SUCCESS);
2657 ASSERT_TRUE(pass);
2658
2659 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002660 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(
2661 surface_present_mode_count * sizeof(VkPresentModeKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002662
2663 // Next, do a 2nd try with surface_format_count being set too high:
2664 surface_present_mode_count += 5;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002665 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2666 "that is greater than the value");
2667 vkGetPhysicalDeviceSurfacePresentModesKHR(
2668 gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002669 pass = (err == VK_SUCCESS);
2670 ASSERT_TRUE(pass);
2671 m_errorMonitor->VerifyFound();
2672
2673 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002674 vkGetPhysicalDeviceSurfacePresentModesKHR(
2675 gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002676 pass = (err == VK_SUCCESS);
2677 ASSERT_TRUE(pass);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002678 vkGetPhysicalDeviceSurfacePresentModesKHR(
2679 gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002680 pass = (err == VK_SUCCESS);
2681 ASSERT_TRUE(pass);
2682
Ian Elliott2c1daf52016-05-12 09:41:46 -06002683 // Create a swapchain:
2684
2685 // First, try without a pointer to swapchain_create_info:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002686 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2687 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002688 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
2689 pass = (err != VK_SUCCESS);
2690 ASSERT_TRUE(pass);
2691 m_errorMonitor->VerifyFound();
2692
2693 // Next, call with a non-NULL swapchain_create_info, that has the wrong
2694 // sType:
2695 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002696 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2697 "called with the wrong value for");
2698 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2699 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002700 pass = (err != VK_SUCCESS);
2701 ASSERT_TRUE(pass);
2702 m_errorMonitor->VerifyFound();
2703
2704 // Next, call with a NULL swapchain pointer:
2705 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2706 swapchain_create_info.pNext = NULL;
2707 swapchain_create_info.flags = 0;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002708 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2709 "called with NULL pointer");
2710 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2711 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002712 pass = (err != VK_SUCCESS);
2713 ASSERT_TRUE(pass);
2714 m_errorMonitor->VerifyFound();
2715
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002716 // TODO: Enhance swapchain layer so that
2717 // swapchain_create_info.queueFamilyIndexCount is checked against something?
Ian Elliott2c1daf52016-05-12 09:41:46 -06002718
2719 // Next, call with a queue family index that's too large:
2720 uint32_t queueFamilyIndex[2] = {100000, 0};
2721 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2722 swapchain_create_info.queueFamilyIndexCount = 2;
2723 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
2724 m_errorMonitor->SetDesiredFailureMsg(
2725 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2726 "called with a queueFamilyIndex that is too large");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002727 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2728 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002729 pass = (err != VK_SUCCESS);
2730 ASSERT_TRUE(pass);
2731 m_errorMonitor->VerifyFound();
2732
2733 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
2734 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2735 swapchain_create_info.queueFamilyIndexCount = 1;
2736 m_errorMonitor->SetDesiredFailureMsg(
2737 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2738 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
2739 "pCreateInfo->pQueueFamilyIndices).");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002740 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2741 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002742 pass = (err != VK_SUCCESS);
2743 ASSERT_TRUE(pass);
2744 m_errorMonitor->VerifyFound();
2745
2746 // Next, call with an invalid imageSharingMode:
2747 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
2748 swapchain_create_info.queueFamilyIndexCount = 1;
2749 m_errorMonitor->SetDesiredFailureMsg(
2750 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2751 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002752 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2753 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002754 pass = (err != VK_SUCCESS);
2755 ASSERT_TRUE(pass);
2756 m_errorMonitor->VerifyFound();
2757 // Fix for the future:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002758 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2759 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002760 swapchain_create_info.queueFamilyIndexCount = 0;
2761 queueFamilyIndex[0] = 0;
2762 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
2763
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002764 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
Ian Elliott2c1daf52016-05-12 09:41:46 -06002765 // Get the images from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002766 // Acquire an image from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002767 // Present an image to a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002768 // Destroy the swapchain:
2769
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002770 // TODOs:
2771 //
2772 // - Try destroying the device without first destroying the swapchain
2773 //
2774 // - Try destroying the device without first destroying the surface
2775 //
2776 // - Try destroying the surface without first destroying the swapchain
Ian Elliott2c1daf52016-05-12 09:41:46 -06002777
2778 // Destroy the surface:
2779 vkDestroySurfaceKHR(instance(), surface, NULL);
2780
Ian Elliott2c1daf52016-05-12 09:41:46 -06002781 // Tear down the window:
2782 xcb_destroy_window(connection, xcb_window);
2783 xcb_disconnect(connection);
2784
2785#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002786 return;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002787#endif // VK_USE_PLATFORM_XCB_KHR
2788}
2789
Karl Schultz6addd812016-02-02 17:17:23 -07002790TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
2791 VkResult err;
2792 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002793
Karl Schultz6addd812016-02-02 17:17:23 -07002794 m_errorMonitor->SetDesiredFailureMsg(
2795 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002796 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
2797
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002798 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002799
2800 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002801 VkImage image;
2802 VkDeviceMemory mem;
2803 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002804
Karl Schultz6addd812016-02-02 17:17:23 -07002805 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2806 const int32_t tex_width = 32;
2807 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002808
Tony Barboureb254902015-07-15 12:50:33 -06002809 VkImageCreateInfo image_create_info = {};
2810 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002811 image_create_info.pNext = NULL;
2812 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2813 image_create_info.format = tex_format;
2814 image_create_info.extent.width = tex_width;
2815 image_create_info.extent.height = tex_height;
2816 image_create_info.extent.depth = 1;
2817 image_create_info.mipLevels = 1;
2818 image_create_info.arrayLayers = 1;
2819 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2820 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2821 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2822 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002823
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002824 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002825 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002826 mem_alloc.pNext = NULL;
2827 mem_alloc.allocationSize = 0;
2828 // Introduce failure, do NOT set memProps to
2829 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
2830 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002831
Chia-I Wuf7458c52015-10-26 21:10:41 +08002832 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002833 ASSERT_VK_SUCCESS(err);
2834
Karl Schultz6addd812016-02-02 17:17:23 -07002835 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002836
Mark Lobodzinski23065352015-05-29 09:32:35 -05002837 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002838
Karl Schultz6addd812016-02-02 17:17:23 -07002839 pass =
2840 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
2841 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
2842 if (!pass) { // If we can't find any unmappable memory this test doesn't
2843 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002844 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002845 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002846 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002847
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002848 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002849 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002850 ASSERT_VK_SUCCESS(err);
2851
2852 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002853 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002854 ASSERT_VK_SUCCESS(err);
2855
2856 // Map memory as if to initialize the image
2857 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07002858 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
2859 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002860
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002861 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002862
Chia-I Wuf7458c52015-10-26 21:10:41 +08002863 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002864 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002865}
2866
Karl Schultz6addd812016-02-02 17:17:23 -07002867TEST_F(VkLayerTest, RebindMemory) {
2868 VkResult err;
2869 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002870
Karl Schultz6addd812016-02-02 17:17:23 -07002871 m_errorMonitor->SetDesiredFailureMsg(
2872 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002873 "which has already been bound to mem object");
2874
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002875 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002876
2877 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002878 VkImage image;
2879 VkDeviceMemory mem1;
2880 VkDeviceMemory mem2;
2881 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002882
Karl Schultz6addd812016-02-02 17:17:23 -07002883 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2884 const int32_t tex_width = 32;
2885 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002886
Tony Barboureb254902015-07-15 12:50:33 -06002887 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002888 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2889 image_create_info.pNext = NULL;
2890 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2891 image_create_info.format = tex_format;
2892 image_create_info.extent.width = tex_width;
2893 image_create_info.extent.height = tex_height;
2894 image_create_info.extent.depth = 1;
2895 image_create_info.mipLevels = 1;
2896 image_create_info.arrayLayers = 1;
2897 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2898 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2899 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2900 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002901
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002902 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002903 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2904 mem_alloc.pNext = NULL;
2905 mem_alloc.allocationSize = 0;
2906 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002907
Karl Schultz6addd812016-02-02 17:17:23 -07002908 // Introduce failure, do NOT set memProps to
2909 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002910 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002911 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002912 ASSERT_VK_SUCCESS(err);
2913
Karl Schultz6addd812016-02-02 17:17:23 -07002914 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002915
2916 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002917 pass =
2918 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002919 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002920
2921 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002922 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002923 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002924 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002925 ASSERT_VK_SUCCESS(err);
2926
2927 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002928 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002929 ASSERT_VK_SUCCESS(err);
2930
Karl Schultz6addd812016-02-02 17:17:23 -07002931 // Introduce validation failure, try to bind a different memory object to
2932 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002933 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002934
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002935 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002936
Chia-I Wuf7458c52015-10-26 21:10:41 +08002937 vkDestroyImage(m_device->device(), image, NULL);
2938 vkFreeMemory(m_device->device(), mem1, NULL);
2939 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002940}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002941
Karl Schultz6addd812016-02-02 17:17:23 -07002942TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002943 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002944
Karl Schultz6addd812016-02-02 17:17:23 -07002945 m_errorMonitor->SetDesiredFailureMsg(
2946 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
2947 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002948
2949 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002950 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2951 fenceInfo.pNext = NULL;
2952 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002953
Tony Barbour300a6082015-04-07 13:44:53 -06002954 ASSERT_NO_FATAL_FAILURE(InitState());
2955 ASSERT_NO_FATAL_FAILURE(InitViewport());
2956 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2957
Tony Barbourfe3351b2015-07-28 10:17:20 -06002958 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002959 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
2960 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06002961 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002962
2963 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002964
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002965 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002966 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2967 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002968 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002969 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002970 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002971 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002972 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002973 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002974 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002975
2976 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002977 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002978
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002979 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002980}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002981// This is a positive test. We used to expect error in this case but spec now
2982// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07002983TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002984 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002985 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002986 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002987 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2988 fenceInfo.pNext = NULL;
2989
Tony Barbour0b4d9562015-04-09 10:48:04 -06002990 ASSERT_NO_FATAL_FAILURE(InitState());
2991 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08002992 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002993 VkResult result = vkResetFences(m_device->device(), 1, fences);
2994 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06002995
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002996 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06002997}
Tobin Ehlis41376e12015-07-03 08:45:14 -06002998
Chris Forbese70b7d32016-06-15 15:49:12 +12002999#if 0
3000TEST_F(VkLayerTest, LongFenceChain)
3001{
3002 m_errorMonitor->ExpectSuccess();
3003
3004 ASSERT_NO_FATAL_FAILURE(InitState());
3005 VkResult err;
3006
3007 std::vector<VkFence> fences;
3008
3009 const int chainLength = 32768;
3010
3011 for (int i = 0; i < chainLength; i++) {
3012 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3013 VkFence fence;
3014 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
3015 ASSERT_VK_SUCCESS(err);
3016
3017 fences.push_back(fence);
3018
3019 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3020 0, nullptr, 0, nullptr };
3021 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
3022 ASSERT_VK_SUCCESS(err);
3023
3024 }
3025
3026 // BOOM, stack overflow.
3027 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
3028
3029 for (auto fence : fences)
3030 vkDestroyFence(m_device->device(), fence, nullptr);
3031
3032 m_errorMonitor->VerifyNotFound();
3033}
3034#endif
3035
Chris Forbes18127d12016-06-08 16:52:28 +12003036TEST_F(VkLayerTest, CommandBufferSimultaneousUseSync)
3037{
3038 m_errorMonitor->ExpectSuccess();
3039
3040 ASSERT_NO_FATAL_FAILURE(InitState());
3041 VkResult err;
3042
3043 // Record (empty!) command buffer that can be submitted multiple times
3044 // simultaneously.
3045 VkCommandBufferBeginInfo cbbi = {
3046 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
3047 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr
3048 };
3049 m_commandBuffer->BeginCommandBuffer(&cbbi);
3050 m_commandBuffer->EndCommandBuffer();
3051
3052 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3053 VkFence fence;
3054 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
3055 ASSERT_VK_SUCCESS(err);
3056
3057 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
3058 VkSemaphore s1, s2;
3059 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
3060 ASSERT_VK_SUCCESS(err);
3061 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
3062 ASSERT_VK_SUCCESS(err);
3063
3064 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
3065 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3066 1, &m_commandBuffer->handle(), 1, &s1 };
3067 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
3068 ASSERT_VK_SUCCESS(err);
3069
3070 // Submit CB again, signaling s2.
3071 si.pSignalSemaphores = &s2;
3072 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
3073 ASSERT_VK_SUCCESS(err);
3074
3075 // Wait for fence.
3076 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3077 ASSERT_VK_SUCCESS(err);
3078
3079 // CB is still in flight from second submission, but semaphore s1 is no
3080 // longer in flight. delete it.
3081 vkDestroySemaphore(m_device->device(), s1, nullptr);
3082
3083 m_errorMonitor->VerifyNotFound();
3084
3085 // Force device idle and clean up remaining objects
3086 vkDeviceWaitIdle(m_device->device());
3087 vkDestroySemaphore(m_device->device(), s2, nullptr);
3088 vkDestroyFence(m_device->device(), fence, nullptr);
3089}
3090
Chris Forbes4e44c912016-06-16 10:20:00 +12003091TEST_F(VkLayerTest, FenceCreateSignaledWaitHandling)
3092{
3093 m_errorMonitor->ExpectSuccess();
3094
3095 ASSERT_NO_FATAL_FAILURE(InitState());
3096 VkResult err;
3097
3098 // A fence created signaled
3099 VkFenceCreateInfo fci1 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT };
3100 VkFence f1;
3101 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
3102 ASSERT_VK_SUCCESS(err);
3103
3104 // A fence created not
3105 VkFenceCreateInfo fci2 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3106 VkFence f2;
3107 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
3108 ASSERT_VK_SUCCESS(err);
3109
3110 // Submit the unsignaled fence
3111 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3112 0, nullptr, 0, nullptr };
3113 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
3114
3115 // Wait on both fences, with signaled first.
3116 VkFence fences[] = { f1, f2 };
3117 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
3118
3119 // Should have both retired!
3120 vkDestroyFence(m_device->device(), f1, nullptr);
3121 vkDestroyFence(m_device->device(), f2, nullptr);
3122
3123 m_errorMonitor->VerifyNotFound();
3124}
3125
Tobin Ehlis41376e12015-07-03 08:45:14 -06003126TEST_F(VkLayerTest, InvalidUsageBits)
3127{
Tony Barbourf92621a2016-05-02 14:28:12 -06003128 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06003129 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06003130 "Initialize buffer with wrong usage then perform copy expecting errors "
3131 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003132 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003133 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06003134
3135 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06003136 VkImageObj image(m_device);
3137 // Initialize image with USAGE_INPUT_ATTACHMENT
Tobin Ehlis8b313c02016-05-25 15:01:52 -06003138 image.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06003139 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
3140 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06003141
Tony Barbourf92621a2016-05-02 14:28:12 -06003142 VkImageView dsv;
3143 VkImageViewCreateInfo dsvci = {};
3144 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3145 dsvci.image = image.handle();
3146 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3147 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
3148 dsvci.subresourceRange.layerCount = 1;
3149 dsvci.subresourceRange.baseMipLevel = 0;
3150 dsvci.subresourceRange.levelCount = 1;
3151 dsvci.subresourceRange.aspectMask =
3152 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06003153
Tony Barbourf92621a2016-05-02 14:28:12 -06003154 // Create a view with depth / stencil aspect for image with different usage
3155 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003156
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003157 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06003158
3159 // Initialize buffer with TRANSFER_DST usage
3160 vk_testing::Buffer buffer;
3161 VkMemoryPropertyFlags reqs = 0;
3162 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3163 VkBufferImageCopy region = {};
3164 region.bufferRowLength = 128;
3165 region.bufferImageHeight = 128;
3166 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3167 region.imageSubresource.layerCount = 1;
3168 region.imageExtent.height = 16;
3169 region.imageExtent.width = 16;
3170 region.imageExtent.depth = 1;
3171
3172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3173 "Invalid usage flag for buffer ");
3174 // Buffer usage not set to TRANSFER_SRC and image usage not set to
3175 // TRANSFER_DST
3176 BeginCommandBuffer();
3177 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
3178 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
3179 1, &region);
3180 m_errorMonitor->VerifyFound();
3181
3182 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3183 "Invalid usage flag for image ");
3184 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
3185 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
3186 1, &region);
3187 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06003188}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003189#endif // MEM_TRACKER_TESTS
3190
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06003191#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003192
3193TEST_F(VkLayerTest, LeakAnObject) {
3194 VkResult err;
3195
3196 TEST_DESCRIPTION(
3197 "Create a fence and destroy its device without first destroying the fence.");
3198
3199 // Note that we have to create a new device since destroying the
3200 // framework's device causes Teardown() to fail and just calling Teardown
3201 // will destroy the errorMonitor.
3202
3203 m_errorMonitor->SetDesiredFailureMsg(
3204 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3205 "OBJ ERROR : VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT object");
3206
3207 ASSERT_NO_FATAL_FAILURE(InitState());
3208
3209 const std::vector<VkQueueFamilyProperties> queue_props =
3210 m_device->queue_props;
3211 std::vector<VkDeviceQueueCreateInfo> queue_info;
3212 queue_info.reserve(queue_props.size());
3213 std::vector<std::vector<float>> queue_priorities;
3214 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
3215 VkDeviceQueueCreateInfo qi = {};
3216 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
3217 qi.pNext = NULL;
3218 qi.queueFamilyIndex = i;
3219 qi.queueCount = queue_props[i].queueCount;
3220 queue_priorities.emplace_back(qi.queueCount, 0.0f);
3221 qi.pQueuePriorities = queue_priorities[i].data();
3222 queue_info.push_back(qi);
3223 }
3224
3225 std::vector<const char *> device_layer_names;
3226 std::vector<const char *> device_extension_names;
3227 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
3228 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
3229 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
3230 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003231 device_layer_names.push_back("VK_LAYER_LUNARG_image");
3232 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
3233
3234 // The sacrificial device object
3235 VkDevice testDevice;
3236 VkDeviceCreateInfo device_create_info = {};
3237 auto features = m_device->phy().features();
3238 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
3239 device_create_info.pNext = NULL;
3240 device_create_info.queueCreateInfoCount = queue_info.size();
3241 device_create_info.pQueueCreateInfos = queue_info.data();
3242 device_create_info.enabledLayerCount = device_layer_names.size();
3243 device_create_info.ppEnabledLayerNames = device_layer_names.data();
3244 device_create_info.pEnabledFeatures = &features;
3245 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
3246 ASSERT_VK_SUCCESS(err);
3247
3248 VkFence fence;
3249 VkFenceCreateInfo fence_create_info = {};
3250 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3251 fence_create_info.pNext = NULL;
3252 fence_create_info.flags = 0;
3253 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
3254 ASSERT_VK_SUCCESS(err);
3255
3256 // Induce failure by not calling vkDestroyFence
3257 vkDestroyDevice(testDevice, NULL);
3258 m_errorMonitor->VerifyFound();
3259}
3260
3261TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
3262
3263 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
3264 "attempt to delete them from another.");
3265
3266 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3267 "FreeCommandBuffers is attempting to free Command Buffer");
3268
3269 VkCommandPool command_pool_one;
3270 VkCommandPool command_pool_two;
3271
3272 VkCommandPoolCreateInfo pool_create_info{};
3273 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3274 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3275 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3276
3277 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3278 &command_pool_one);
3279
3280 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3281 &command_pool_two);
3282
3283 VkCommandBuffer command_buffer[9];
3284 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3285 command_buffer_allocate_info.sType =
3286 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3287 command_buffer_allocate_info.commandPool = command_pool_one;
3288 command_buffer_allocate_info.commandBufferCount = 9;
3289 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3290 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3291 command_buffer);
3292
3293 vkFreeCommandBuffers(m_device->device(), command_pool_two, 4,
3294 &command_buffer[3]);
3295
3296 m_errorMonitor->VerifyFound();
3297
3298 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
3299 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
3300}
3301
3302TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
3303 VkResult err;
3304
3305 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
3306 "attempt to delete them from another.");
3307
3308 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3309 "FreeDescriptorSets is attempting to free descriptorSet");
3310
3311 ASSERT_NO_FATAL_FAILURE(InitState());
3312 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3313
3314 VkDescriptorPoolSize ds_type_count = {};
3315 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
3316 ds_type_count.descriptorCount = 1;
3317
3318 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3319 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3320 ds_pool_ci.pNext = NULL;
3321 ds_pool_ci.flags = 0;
3322 ds_pool_ci.maxSets = 1;
3323 ds_pool_ci.poolSizeCount = 1;
3324 ds_pool_ci.pPoolSizes = &ds_type_count;
3325
3326 VkDescriptorPool ds_pool_one;
3327 err =
3328 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
3329 ASSERT_VK_SUCCESS(err);
3330
3331 // Create a second descriptor pool
3332 VkDescriptorPool ds_pool_two;
3333 err =
3334 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
3335 ASSERT_VK_SUCCESS(err);
3336
3337 VkDescriptorSetLayoutBinding dsl_binding = {};
3338 dsl_binding.binding = 0;
3339 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3340 dsl_binding.descriptorCount = 1;
3341 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3342 dsl_binding.pImmutableSamplers = NULL;
3343
3344 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3345 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3346 ds_layout_ci.pNext = NULL;
3347 ds_layout_ci.bindingCount = 1;
3348 ds_layout_ci.pBindings = &dsl_binding;
3349
3350 VkDescriptorSetLayout ds_layout;
3351 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3352 &ds_layout);
3353 ASSERT_VK_SUCCESS(err);
3354
3355 VkDescriptorSet descriptorSet;
3356 VkDescriptorSetAllocateInfo alloc_info = {};
3357 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3358 alloc_info.descriptorSetCount = 1;
3359 alloc_info.descriptorPool = ds_pool_one;
3360 alloc_info.pSetLayouts = &ds_layout;
3361 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3362 &descriptorSet);
3363 ASSERT_VK_SUCCESS(err);
3364
3365 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
3366
3367 m_errorMonitor->VerifyFound();
3368
3369 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3370 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
3371 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
3372}
3373
3374TEST_F(VkLayerTest, CreateUnknownObject) {
3375 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3376 "Invalid VkImage Object ");
3377
3378 TEST_DESCRIPTION(
3379 "Pass an invalid image object handle into a Vulkan API call.");
3380
3381 ASSERT_NO_FATAL_FAILURE(InitState());
3382
3383 // Pass bogus handle into GetImageMemoryRequirements
3384 VkMemoryRequirements mem_reqs;
3385 uint64_t fakeImageHandle = 0xCADECADE;
3386 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
3387
3388 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
3389
3390 m_errorMonitor->VerifyFound();
3391}
3392
Karl Schultz6addd812016-02-02 17:17:23 -07003393TEST_F(VkLayerTest, PipelineNotBound) {
3394 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003395
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003396 TEST_DESCRIPTION(
3397 "Pass in an invalid pipeline object handle into a Vulkan API call.");
3398
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003399 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003400 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003401
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003402 ASSERT_NO_FATAL_FAILURE(InitState());
3403 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003404
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003405 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003406 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3407 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003408
3409 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003410 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3411 ds_pool_ci.pNext = NULL;
3412 ds_pool_ci.maxSets = 1;
3413 ds_pool_ci.poolSizeCount = 1;
3414 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003415
3416 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003417 err =
3418 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003419 ASSERT_VK_SUCCESS(err);
3420
3421 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003422 dsl_binding.binding = 0;
3423 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3424 dsl_binding.descriptorCount = 1;
3425 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3426 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003427
3428 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003429 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3430 ds_layout_ci.pNext = NULL;
3431 ds_layout_ci.bindingCount = 1;
3432 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003433
3434 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003435 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3436 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003437 ASSERT_VK_SUCCESS(err);
3438
3439 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003440 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003441 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003442 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003443 alloc_info.descriptorPool = ds_pool;
3444 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003445 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3446 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003447 ASSERT_VK_SUCCESS(err);
3448
3449 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003450 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3451 pipeline_layout_ci.pNext = NULL;
3452 pipeline_layout_ci.setLayoutCount = 1;
3453 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003454
3455 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003456 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3457 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003458 ASSERT_VK_SUCCESS(err);
3459
Mark Youngad779052016-01-06 14:26:04 -07003460 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003461
3462 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003463 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3464 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003465
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003466 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003467
Chia-I Wuf7458c52015-10-26 21:10:41 +08003468 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3469 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3470 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003471}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003472
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003473TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
3474 VkResult err;
3475
3476 TEST_DESCRIPTION("Test validation check for an invalid memory type index "
3477 "during bind[Buffer|Image]Memory time");
3478
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003479 ASSERT_NO_FATAL_FAILURE(InitState());
3480
3481 // Create an image, allocate memory, set a bad typeIndex and then try to
3482 // bind it
3483 VkImage image;
3484 VkDeviceMemory mem;
3485 VkMemoryRequirements mem_reqs;
3486 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3487 const int32_t tex_width = 32;
3488 const int32_t tex_height = 32;
3489
3490 VkImageCreateInfo image_create_info = {};
3491 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3492 image_create_info.pNext = NULL;
3493 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3494 image_create_info.format = tex_format;
3495 image_create_info.extent.width = tex_width;
3496 image_create_info.extent.height = tex_height;
3497 image_create_info.extent.depth = 1;
3498 image_create_info.mipLevels = 1;
3499 image_create_info.arrayLayers = 1;
3500 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3501 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3502 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3503 image_create_info.flags = 0;
3504
3505 VkMemoryAllocateInfo mem_alloc = {};
3506 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3507 mem_alloc.pNext = NULL;
3508 mem_alloc.allocationSize = 0;
3509 mem_alloc.memoryTypeIndex = 0;
3510
3511 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3512 ASSERT_VK_SUCCESS(err);
3513
3514 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
3515 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003516
3517 // Introduce Failure, select invalid TypeIndex
3518 VkPhysicalDeviceMemoryProperties memory_info;
3519
3520 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
3521 unsigned int i;
3522 for (i = 0; i < memory_info.memoryTypeCount; i++) {
3523 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
3524 mem_alloc.memoryTypeIndex = i;
3525 break;
3526 }
3527 }
3528 if (i >= memory_info.memoryTypeCount) {
3529 printf("No invalid memory type index could be found; skipped.\n");
3530 vkDestroyImage(m_device->device(), image, NULL);
3531 return;
3532 }
3533
3534 m_errorMonitor->SetDesiredFailureMsg(
3535 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3536 "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003537
3538 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
3539 ASSERT_VK_SUCCESS(err);
3540
3541 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3542 (void)err;
3543
3544 m_errorMonitor->VerifyFound();
3545
3546 vkDestroyImage(m_device->device(), image, NULL);
3547 vkFreeMemory(m_device->device(), mem, NULL);
3548}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003549
Karl Schultz6addd812016-02-02 17:17:23 -07003550TEST_F(VkLayerTest, BindInvalidMemory) {
3551 VkResult err;
3552 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003553
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003554 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003555 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003556
Tobin Ehlisec598302015-09-15 15:02:17 -06003557 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003558
3559 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07003560 VkImage image;
3561 VkDeviceMemory mem;
3562 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003563
Karl Schultz6addd812016-02-02 17:17:23 -07003564 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3565 const int32_t tex_width = 32;
3566 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003567
3568 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003569 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3570 image_create_info.pNext = NULL;
3571 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3572 image_create_info.format = tex_format;
3573 image_create_info.extent.width = tex_width;
3574 image_create_info.extent.height = tex_height;
3575 image_create_info.extent.depth = 1;
3576 image_create_info.mipLevels = 1;
3577 image_create_info.arrayLayers = 1;
3578 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3579 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3580 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3581 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003582
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003583 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003584 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3585 mem_alloc.pNext = NULL;
3586 mem_alloc.allocationSize = 0;
3587 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003588
Chia-I Wuf7458c52015-10-26 21:10:41 +08003589 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003590 ASSERT_VK_SUCCESS(err);
3591
Karl Schultz6addd812016-02-02 17:17:23 -07003592 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003593
3594 mem_alloc.allocationSize = mem_reqs.size;
3595
Karl Schultz6addd812016-02-02 17:17:23 -07003596 pass =
3597 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003598 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003599
3600 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003601 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003602 ASSERT_VK_SUCCESS(err);
3603
3604 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003605 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003606
3607 // Try to bind free memory that has been freed
3608 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3609 // This may very well return an error.
3610 (void)err;
3611
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003612 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003613
Chia-I Wuf7458c52015-10-26 21:10:41 +08003614 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003615}
3616
Karl Schultz6addd812016-02-02 17:17:23 -07003617TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
3618 VkResult err;
3619 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003620
Karl Schultz6addd812016-02-02 17:17:23 -07003621 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3622 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003623
Tobin Ehlisec598302015-09-15 15:02:17 -06003624 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003625
Karl Schultz6addd812016-02-02 17:17:23 -07003626 // Create an image object, allocate memory, destroy the object and then try
3627 // to bind it
3628 VkImage image;
3629 VkDeviceMemory mem;
3630 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003631
Karl Schultz6addd812016-02-02 17:17:23 -07003632 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3633 const int32_t tex_width = 32;
3634 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003635
3636 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003637 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3638 image_create_info.pNext = NULL;
3639 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3640 image_create_info.format = tex_format;
3641 image_create_info.extent.width = tex_width;
3642 image_create_info.extent.height = tex_height;
3643 image_create_info.extent.depth = 1;
3644 image_create_info.mipLevels = 1;
3645 image_create_info.arrayLayers = 1;
3646 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3647 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3648 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3649 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003650
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003651 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003652 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3653 mem_alloc.pNext = NULL;
3654 mem_alloc.allocationSize = 0;
3655 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003656
Chia-I Wuf7458c52015-10-26 21:10:41 +08003657 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003658 ASSERT_VK_SUCCESS(err);
3659
Karl Schultz6addd812016-02-02 17:17:23 -07003660 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003661
3662 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003663 pass =
3664 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003665 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003666
3667 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003668 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003669 ASSERT_VK_SUCCESS(err);
3670
3671 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003672 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003673 ASSERT_VK_SUCCESS(err);
3674
3675 // Now Try to bind memory to this destroyed object
3676 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3677 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07003678 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06003679
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003680 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003681
Chia-I Wuf7458c52015-10-26 21:10:41 +08003682 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003683}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003684
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003685#endif // OBJ_TRACKER_TESTS
3686
Tobin Ehlis0788f522015-05-26 16:11:58 -06003687#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06003688
Chris Forbes48a53902016-06-30 11:46:27 +12003689TEST_F(VkLayerTest, RenderPassInitialLayoutUndefined) {
3690 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass with an attachment's "
3691 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
3692 "the command buffer has prior knowledge of that "
3693 "attachment's layout.");
3694
3695 m_errorMonitor->ExpectSuccess();
3696
3697 ASSERT_NO_FATAL_FAILURE(InitState());
3698
3699 // A renderpass with one color attachment.
3700 VkAttachmentDescription attachment = {
3701 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3702 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3703 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3704 VK_IMAGE_LAYOUT_UNDEFINED,
3705 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3706 };
3707
3708 VkAttachmentReference att_ref = {
3709 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3710 };
3711
3712 VkSubpassDescription subpass = {
3713 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3714 1, &att_ref, nullptr, nullptr, 0, nullptr
3715 };
3716
3717 VkRenderPassCreateInfo rpci = {
3718 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3719 0, 1, &attachment, 1, &subpass, 0, nullptr
3720 };
3721
3722 VkRenderPass rp;
3723 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3724 ASSERT_VK_SUCCESS(err);
3725
3726 // A compatible framebuffer.
3727 VkImageObj image(m_device);
3728 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3729 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3730 VK_IMAGE_TILING_OPTIMAL, 0);
3731 ASSERT_TRUE(image.initialized());
3732
3733 VkImageViewCreateInfo ivci = {
3734 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3735 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3736 {
3737 VK_COMPONENT_SWIZZLE_IDENTITY,
3738 VK_COMPONENT_SWIZZLE_IDENTITY,
3739 VK_COMPONENT_SWIZZLE_IDENTITY,
3740 VK_COMPONENT_SWIZZLE_IDENTITY
3741 },
3742 {
3743 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3744 },
3745 };
3746 VkImageView view;
3747 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3748 ASSERT_VK_SUCCESS(err);
3749
3750 VkFramebufferCreateInfo fci = {
3751 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3752 0, rp, 1, &view,
3753 32, 32, 1
3754 };
3755 VkFramebuffer fb;
3756 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3757 ASSERT_VK_SUCCESS(err);
3758
3759 // Record a single command buffer which uses this renderpass twice. The
3760 // bug is triggered at the beginning of the second renderpass, when the
3761 // command buffer already has a layout recorded for the attachment.
3762 VkRenderPassBeginInfo rpbi = {
3763 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06003764 rp, fb, { { 0, 0 } , { 32, 32 } },
Chris Forbes48a53902016-06-30 11:46:27 +12003765 0, nullptr
3766 };
3767 BeginCommandBuffer();
3768 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3769 VK_SUBPASS_CONTENTS_INLINE);
3770 vkCmdEndRenderPass(m_commandBuffer->handle());
3771 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3772 VK_SUBPASS_CONTENTS_INLINE);
3773
3774 m_errorMonitor->VerifyNotFound();
3775
3776 vkCmdEndRenderPass(m_commandBuffer->handle());
3777 EndCommandBuffer();
3778
3779 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3780 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3781 vkDestroyImageView(m_device->device(), view, nullptr);
3782}
3783
Chris Forbes51bf7c92016-06-30 15:22:08 +12003784TEST_F(VkLayerTest, RenderPassSubpassZeroTransitionsApplied) {
3785 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass applies the layout "
3786 "transitions for the first subpass");
3787
3788 m_errorMonitor->ExpectSuccess();
3789
3790 ASSERT_NO_FATAL_FAILURE(InitState());
3791
3792 // A renderpass with one color attachment.
3793 VkAttachmentDescription attachment = {
3794 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3795 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3796 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3797 VK_IMAGE_LAYOUT_UNDEFINED,
3798 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3799 };
3800
3801 VkAttachmentReference att_ref = {
3802 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3803 };
3804
3805 VkSubpassDescription subpass = {
3806 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3807 1, &att_ref, nullptr, nullptr, 0, nullptr
3808 };
3809
3810 VkSubpassDependency dep = {
Chris Forbescb4c7ad2016-07-06 10:28:18 +12003811 0, 0, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3812 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Chris Forbes51bf7c92016-06-30 15:22:08 +12003813 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3814 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3815 VK_DEPENDENCY_BY_REGION_BIT
3816 };
3817
3818 VkRenderPassCreateInfo rpci = {
3819 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3820 0, 1, &attachment, 1, &subpass, 1, &dep
3821 };
3822
3823 VkResult err;
3824 VkRenderPass rp;
3825 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3826 ASSERT_VK_SUCCESS(err);
3827
3828 // A compatible framebuffer.
3829 VkImageObj image(m_device);
3830 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3831 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3832 VK_IMAGE_TILING_OPTIMAL, 0);
3833 ASSERT_TRUE(image.initialized());
3834
3835 VkImageViewCreateInfo ivci = {
3836 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3837 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3838 {
3839 VK_COMPONENT_SWIZZLE_IDENTITY,
3840 VK_COMPONENT_SWIZZLE_IDENTITY,
3841 VK_COMPONENT_SWIZZLE_IDENTITY,
3842 VK_COMPONENT_SWIZZLE_IDENTITY
3843 },
3844 {
3845 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3846 },
3847 };
3848 VkImageView view;
3849 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3850 ASSERT_VK_SUCCESS(err);
3851
3852 VkFramebufferCreateInfo fci = {
3853 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3854 0, rp, 1, &view,
3855 32, 32, 1
3856 };
3857 VkFramebuffer fb;
3858 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3859 ASSERT_VK_SUCCESS(err);
3860
3861 // Record a single command buffer which issues a pipeline barrier w/
3862 // image memory barrier for the attachment. This detects the previously
3863 // missing tracking of the subpass layout by throwing a validation error
3864 // if it doesn't occur.
3865 VkRenderPassBeginInfo rpbi = {
3866 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06003867 rp, fb, { { 0, 0 }, { 32, 32 } },
Chris Forbes51bf7c92016-06-30 15:22:08 +12003868 0, nullptr
3869 };
3870 BeginCommandBuffer();
3871 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3872 VK_SUBPASS_CONTENTS_INLINE);
3873
3874 VkImageMemoryBarrier imb = {
3875 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, nullptr,
3876 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3877 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3878 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3879 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3880 VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
3881 image.handle(),
3882 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
3883 };
3884 vkCmdPipelineBarrier(m_commandBuffer->handle(),
Chris Forbescb4c7ad2016-07-06 10:28:18 +12003885 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3886 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Chris Forbes51bf7c92016-06-30 15:22:08 +12003887 VK_DEPENDENCY_BY_REGION_BIT,
3888 0, nullptr, 0, nullptr, 1, &imb);
3889
3890 vkCmdEndRenderPass(m_commandBuffer->handle());
3891 m_errorMonitor->VerifyNotFound();
3892 EndCommandBuffer();
3893
3894 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3895 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3896 vkDestroyImageView(m_device->device(), view, nullptr);
3897}
3898
Chris Forbes6b3d3f42016-06-30 16:09:47 +12003899TEST_F(VkLayerTest, RenderPassTransitionsAttachmentUnused) {
3900 TEST_DESCRIPTION("Ensure that layout transitions work correctly without "
3901 "errors, when an attachment reference is "
3902 "VK_ATTACHMENT_UNUSED");
3903
3904 m_errorMonitor->ExpectSuccess();
3905
3906 ASSERT_NO_FATAL_FAILURE(InitState());
3907
3908 // A renderpass with no attachments
3909 VkAttachmentReference att_ref = {
3910 VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3911 };
3912
3913 VkSubpassDescription subpass = {
3914 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3915 1, &att_ref, nullptr, nullptr, 0, nullptr
3916 };
3917
3918 VkRenderPassCreateInfo rpci = {
3919 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3920 0, 0, nullptr, 1, &subpass, 0, nullptr
3921 };
3922
3923 VkRenderPass rp;
3924 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3925 ASSERT_VK_SUCCESS(err);
3926
3927 // A compatible framebuffer.
3928 VkFramebufferCreateInfo fci = {
3929 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3930 0, rp, 0, nullptr,
3931 32, 32, 1
3932 };
3933 VkFramebuffer fb;
3934 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3935 ASSERT_VK_SUCCESS(err);
3936
3937 // Record a command buffer which just begins and ends the renderpass. The
3938 // bug manifests in BeginRenderPass.
3939 VkRenderPassBeginInfo rpbi = {
3940 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06003941 rp, fb, { { 0, 0 }, { 32, 32 } },
Chris Forbes6b3d3f42016-06-30 16:09:47 +12003942 0, nullptr
3943 };
3944 BeginCommandBuffer();
3945 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3946 VK_SUBPASS_CONTENTS_INLINE);
3947 vkCmdEndRenderPass(m_commandBuffer->handle());
3948 m_errorMonitor->VerifyNotFound();
3949 EndCommandBuffer();
3950
3951 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3952 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3953}
3954
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06003955// This is a positive test. No errors are expected.
3956TEST_F(VkLayerTest, StencilLoadOp) {
3957 TEST_DESCRIPTION("Create a stencil-only attachment with a LOAD_OP set to "
3958 "CLEAR. stencil[Load|Store]Op used to be ignored.");
3959 VkResult result = VK_SUCCESS;
3960 VkImageFormatProperties formatProps;
3961 vkGetPhysicalDeviceImageFormatProperties(
3962 gpu(), VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_TYPE_2D,
3963 VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
3964 VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
3965 0, &formatProps);
3966 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
3967 return;
3968 }
3969
3970 ASSERT_NO_FATAL_FAILURE(InitState());
3971 VkFormat depth_stencil_fmt = VK_FORMAT_D24_UNORM_S8_UINT;
3972 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
3973 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
3974 VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
3975 VkAttachmentDescription att = {};
3976 VkAttachmentReference ref = {};
3977 att.format = depth_stencil_fmt;
3978 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
3979 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
3980 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
3981 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
3982 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3983 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3984
3985 VkClearValue clear;
3986 clear.depthStencil.depth = 1.0;
3987 clear.depthStencil.stencil = 0;
3988 ref.attachment = 0;
3989 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3990
3991 VkSubpassDescription subpass = {};
3992 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
3993 subpass.flags = 0;
3994 subpass.inputAttachmentCount = 0;
3995 subpass.pInputAttachments = NULL;
3996 subpass.colorAttachmentCount = 0;
3997 subpass.pColorAttachments = NULL;
3998 subpass.pResolveAttachments = NULL;
3999 subpass.pDepthStencilAttachment = &ref;
4000 subpass.preserveAttachmentCount = 0;
4001 subpass.pPreserveAttachments = NULL;
4002
4003 VkRenderPass rp;
4004 VkRenderPassCreateInfo rp_info = {};
4005 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4006 rp_info.attachmentCount = 1;
4007 rp_info.pAttachments = &att;
4008 rp_info.subpassCount = 1;
4009 rp_info.pSubpasses = &subpass;
4010 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
4011 ASSERT_VK_SUCCESS(result);
4012
4013 VkImageView *depthView = m_depthStencil->BindInfo();
4014 VkFramebufferCreateInfo fb_info = {};
4015 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4016 fb_info.pNext = NULL;
4017 fb_info.renderPass = rp;
4018 fb_info.attachmentCount = 1;
4019 fb_info.pAttachments = depthView;
4020 fb_info.width = 100;
4021 fb_info.height = 100;
4022 fb_info.layers = 1;
4023 VkFramebuffer fb;
4024 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4025 ASSERT_VK_SUCCESS(result);
4026
4027
4028 VkRenderPassBeginInfo rpbinfo = {};
4029 rpbinfo.clearValueCount = 1;
4030 rpbinfo.pClearValues = &clear;
4031 rpbinfo.pNext = NULL;
4032 rpbinfo.renderPass = rp;
4033 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4034 rpbinfo.renderArea.extent.width = 100;
4035 rpbinfo.renderArea.extent.height = 100;
4036 rpbinfo.renderArea.offset.x = 0;
4037 rpbinfo.renderArea.offset.y = 0;
4038 rpbinfo.framebuffer = fb;
4039
4040 VkFence fence = {};
4041 VkFenceCreateInfo fence_ci = {};
4042 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4043 fence_ci.pNext = nullptr;
4044 fence_ci.flags = 0;
4045 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
4046 ASSERT_VK_SUCCESS(result);
4047
4048
4049 m_commandBuffer->BeginCommandBuffer();
4050 m_commandBuffer->BeginRenderPass(rpbinfo);
4051 m_commandBuffer->EndRenderPass();
4052 m_commandBuffer->EndCommandBuffer();
4053 m_commandBuffer->QueueCommandBuffer(fence);
4054
4055 VkImageObj destImage(m_device);
4056 destImage.init(100, 100, depth_stencil_fmt,
4057 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4058 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4059 VK_IMAGE_TILING_OPTIMAL, 0);
4060 VkImageMemoryBarrier barrier = {};
4061 VkImageSubresourceRange range;
4062 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
4063 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
4064 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4065 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT |
4066 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
4067 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4068 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
4069 barrier.image = m_depthStencil->handle();
4070 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4071 range.baseMipLevel = 0;
4072 range.levelCount = 1;
4073 range.baseArrayLayer = 0;
4074 range.layerCount = 1;
4075 barrier.subresourceRange = range;
4076 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
4077 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
4078 cmdbuf.BeginCommandBuffer();
4079 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4080 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
4081 nullptr, 1, &barrier);
4082 barrier.srcAccessMask = 0;
4083 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4084 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
4085 barrier.image = destImage.handle();
4086 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
4087 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4088 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4089 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
4090 nullptr, 1, &barrier);
4091 VkImageCopy cregion;
4092 cregion.srcSubresource.aspectMask =
4093 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4094 cregion.srcSubresource.mipLevel = 0;
4095 cregion.srcSubresource.baseArrayLayer = 0;
4096 cregion.srcSubresource.layerCount = 1;
4097 cregion.srcOffset.x = 0;
4098 cregion.srcOffset.y = 0;
4099 cregion.srcOffset.z = 0;
4100 cregion.dstSubresource.aspectMask =
4101 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4102 cregion.dstSubresource.mipLevel = 0;
4103 cregion.dstSubresource.baseArrayLayer = 0;
4104 cregion.dstSubresource.layerCount = 1;
4105 cregion.dstOffset.x = 0;
4106 cregion.dstOffset.y = 0;
4107 cregion.dstOffset.z = 0;
4108 cregion.extent.width = 100;
4109 cregion.extent.height = 100;
4110 cregion.extent.depth = 1;
4111 cmdbuf.CopyImage(m_depthStencil->handle(),
4112 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
4113 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
4114 cmdbuf.EndCommandBuffer();
4115
4116 VkSubmitInfo submit_info;
4117 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4118 submit_info.pNext = NULL;
4119 submit_info.waitSemaphoreCount = 0;
4120 submit_info.pWaitSemaphores = NULL;
4121 submit_info.pWaitDstStageMask = NULL;
4122 submit_info.commandBufferCount = 1;
4123 submit_info.pCommandBuffers = &cmdbuf.handle();
4124 submit_info.signalSemaphoreCount = 0;
4125 submit_info.pSignalSemaphores = NULL;
4126
4127 m_errorMonitor->ExpectSuccess();
4128 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4129 m_errorMonitor->VerifyNotFound();
4130
Mark Lobodzinskid0440da2016-06-17 15:10:03 -06004131 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004132 vkDestroyFence(m_device->device(), fence, nullptr);
4133 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4134 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4135}
4136
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004137TEST_F(VkLayerTest, UnusedPreserveAttachment) {
4138 TEST_DESCRIPTION("Create a framebuffer where a subpass has a preserve "
4139 "attachment reference of VK_ATTACHMENT_UNUSED");
4140
4141 ASSERT_NO_FATAL_FAILURE(InitState());
4142 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4143
4144 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4145 "must not be VK_ATTACHMENT_UNUSED");
4146
4147 VkAttachmentReference color_attach = {};
4148 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4149 color_attach.attachment = 0;
4150 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
4151 VkSubpassDescription subpass = {};
4152 subpass.colorAttachmentCount = 1;
4153 subpass.pColorAttachments = &color_attach;
4154 subpass.preserveAttachmentCount = 1;
4155 subpass.pPreserveAttachments = &preserve_attachment;
4156
4157 VkRenderPassCreateInfo rpci = {};
4158 rpci.subpassCount = 1;
4159 rpci.pSubpasses = &subpass;
4160 rpci.attachmentCount = 1;
4161 VkAttachmentDescription attach_desc = {};
4162 attach_desc.format = VK_FORMAT_UNDEFINED;
4163 rpci.pAttachments = &attach_desc;
4164 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4165 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004166 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004167
4168 m_errorMonitor->VerifyFound();
4169
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004170 if (result == VK_SUCCESS) {
4171 vkDestroyRenderPass(m_device->device(), rp, NULL);
4172 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004173}
4174
Chris Forbesc5389742016-06-29 11:49:23 +12004175TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004176 TEST_DESCRIPTION("Ensure that CreateRenderPass produces a validation error "
4177 "when the source of a subpass multisample resolve "
4178 "does not have multiple samples.");
4179
Chris Forbesc5389742016-06-29 11:49:23 +12004180 ASSERT_NO_FATAL_FAILURE(InitState());
4181
4182 m_errorMonitor->SetDesiredFailureMsg(
4183 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbes6655bb32016-07-01 18:27:30 +12004184 "Subpass 0 requests multisample resolve from attachment 0 which has "
4185 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12004186
4187 VkAttachmentDescription attachments[] = {
4188 {
4189 0, VK_FORMAT_R8G8B8A8_UNORM,
4190 VK_SAMPLE_COUNT_1_BIT,
4191 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4192 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4193 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4194 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4195 },
4196 {
4197 0, VK_FORMAT_R8G8B8A8_UNORM,
4198 VK_SAMPLE_COUNT_1_BIT,
4199 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4200 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4201 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4202 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4203 },
4204 };
4205
4206 VkAttachmentReference color = {
4207 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4208 };
4209
4210 VkAttachmentReference resolve = {
4211 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4212 };
4213
4214 VkSubpassDescription subpass = {
4215 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4216 0, nullptr,
4217 1, &color,
4218 &resolve,
4219 nullptr,
4220 0, nullptr
4221 };
4222
4223 VkRenderPassCreateInfo rpci = {
4224 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4225 0, 2, attachments, 1, &subpass, 0, nullptr
4226 };
4227
4228 VkRenderPass rp;
4229 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4230
4231 m_errorMonitor->VerifyFound();
4232
4233 if (err == VK_SUCCESS)
4234 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4235}
4236
4237TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004238 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4239 "when a subpass multisample resolve operation is "
4240 "requested, and the destination of that resolve has "
4241 "multiple samples.");
4242
Chris Forbesc5389742016-06-29 11:49:23 +12004243 ASSERT_NO_FATAL_FAILURE(InitState());
4244
4245 m_errorMonitor->SetDesiredFailureMsg(
4246 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4247 "Subpass 0 requests multisample resolve into attachment 1, which "
4248 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
4249
4250 VkAttachmentDescription attachments[] = {
4251 {
4252 0, VK_FORMAT_R8G8B8A8_UNORM,
4253 VK_SAMPLE_COUNT_4_BIT,
4254 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4255 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4256 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4257 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4258 },
4259 {
4260 0, VK_FORMAT_R8G8B8A8_UNORM,
4261 VK_SAMPLE_COUNT_4_BIT,
4262 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4263 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4264 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4265 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4266 },
4267 };
4268
4269 VkAttachmentReference color = {
4270 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4271 };
4272
4273 VkAttachmentReference resolve = {
4274 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4275 };
4276
4277 VkSubpassDescription subpass = {
4278 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4279 0, nullptr,
4280 1, &color,
4281 &resolve,
4282 nullptr,
4283 0, nullptr
4284 };
4285
4286 VkRenderPassCreateInfo rpci = {
4287 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4288 0, 2, attachments, 1, &subpass, 0, nullptr
4289 };
4290
4291 VkRenderPass rp;
4292 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4293
4294 m_errorMonitor->VerifyFound();
4295
4296 if (err == VK_SUCCESS)
4297 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4298}
4299
Chris Forbes3f128ef2016-06-29 14:58:53 +12004300TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004301 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4302 "when the color and depth attachments used by a subpass "
4303 "have inconsistent sample counts");
4304
Chris Forbes3f128ef2016-06-29 14:58:53 +12004305 ASSERT_NO_FATAL_FAILURE(InitState());
4306
4307 m_errorMonitor->SetDesiredFailureMsg(
4308 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4309 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
4310
4311 VkAttachmentDescription attachments[] = {
4312 {
4313 0, VK_FORMAT_R8G8B8A8_UNORM,
4314 VK_SAMPLE_COUNT_1_BIT,
4315 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4316 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4317 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4318 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4319 },
4320 {
4321 0, VK_FORMAT_R8G8B8A8_UNORM,
4322 VK_SAMPLE_COUNT_4_BIT,
4323 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4324 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4325 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4326 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4327 },
4328 };
4329
4330 VkAttachmentReference color[] = {
4331 {
4332 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4333 },
4334 {
4335 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4336 },
4337 };
4338
4339 VkSubpassDescription subpass = {
4340 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4341 0, nullptr,
4342 2, color,
4343 nullptr,
4344 nullptr,
4345 0, nullptr
4346 };
4347
4348 VkRenderPassCreateInfo rpci = {
4349 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4350 0, 2, attachments, 1, &subpass, 0, nullptr
4351 };
4352
4353 VkRenderPass rp;
4354 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4355
4356 m_errorMonitor->VerifyFound();
4357
4358 if (err == VK_SUCCESS)
4359 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4360}
4361
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004362TEST_F(VkLayerTest, FramebufferCreateErrors) {
4363 TEST_DESCRIPTION("Hit errors when attempting to create a framebuffer :\n"
4364 " 1. Mismatch between fb & renderPass attachmentCount\n"
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004365 " 2. Use a color image as depthStencil attachment\n"
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004366 " 3. Mismatch fb & renderPass attachment formats\n"
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004367 " 4. Mismatch fb & renderPass attachment #samples\n"
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004368 " 5. FB attachment w/ non-1 mip-levels\n"
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004369 " 6. FB attachment where dimensions don't match\n"
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004370 " 7. FB attachment w/o identity swizzle\n"
4371 " 8. FB dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004372
4373 ASSERT_NO_FATAL_FAILURE(InitState());
4374 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4375
4376 m_errorMonitor->SetDesiredFailureMsg(
4377 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004378 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 "
4379 "does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004380
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004381 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004382 VkAttachmentReference attach = {};
4383 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4384 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004385 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004386 VkRenderPassCreateInfo rpci = {};
4387 rpci.subpassCount = 1;
4388 rpci.pSubpasses = &subpass;
4389 rpci.attachmentCount = 1;
4390 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004391 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004392 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004393 rpci.pAttachments = &attach_desc;
4394 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4395 VkRenderPass rp;
4396 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4397 ASSERT_VK_SUCCESS(err);
4398
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004399 VkImageView ivs[2];
4400 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
4401 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004402 VkFramebufferCreateInfo fb_info = {};
4403 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4404 fb_info.pNext = NULL;
4405 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004406 // Set mis-matching attachmentCount
4407 fb_info.attachmentCount = 2;
4408 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004409 fb_info.width = 100;
4410 fb_info.height = 100;
4411 fb_info.layers = 1;
4412
4413 VkFramebuffer fb;
4414 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4415
4416 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004417 if (err == VK_SUCCESS) {
4418 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4419 }
4420 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004421
4422 // Create a renderPass with a depth-stencil attachment created with
4423 // IMAGE_USAGE_COLOR_ATTACHMENT
4424 // Add our color attachment to pDepthStencilAttachment
4425 subpass.pDepthStencilAttachment = &attach;
4426 subpass.pColorAttachments = NULL;
4427 VkRenderPass rp_ds;
4428 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
4429 ASSERT_VK_SUCCESS(err);
4430 // Set correct attachment count, but attachment has COLOR usage bit set
4431 fb_info.attachmentCount = 1;
4432 fb_info.renderPass = rp_ds;
4433
4434 m_errorMonitor->SetDesiredFailureMsg(
4435 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4436 " conflicts with the image's IMAGE_USAGE flags ");
4437 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4438
4439 m_errorMonitor->VerifyFound();
4440 if (err == VK_SUCCESS) {
4441 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4442 }
4443 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004444
4445 // Create new renderpass with alternate attachment format from fb
4446 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
4447 subpass.pDepthStencilAttachment = NULL;
4448 subpass.pColorAttachments = &attach;
4449 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4450 ASSERT_VK_SUCCESS(err);
4451
4452 // Cause error due to mis-matched formats between rp & fb
4453 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
4454 fb_info.renderPass = rp;
4455 m_errorMonitor->SetDesiredFailureMsg(
4456 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4457 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
4458 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4459
4460 m_errorMonitor->VerifyFound();
4461 if (err == VK_SUCCESS) {
4462 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4463 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004464 vkDestroyRenderPass(m_device->device(), rp, NULL);
4465
4466 // Create new renderpass with alternate sample count from fb
4467 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
4468 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
4469 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4470 ASSERT_VK_SUCCESS(err);
4471
4472 // Cause error due to mis-matched sample count between rp & fb
4473 fb_info.renderPass = rp;
4474 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4475 " has VK_SAMPLE_COUNT_1_BIT samples "
4476 "that do not match the "
4477 "VK_SAMPLE_COUNT_4_BIT ");
4478 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4479
4480 m_errorMonitor->VerifyFound();
4481 if (err == VK_SUCCESS) {
4482 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4483 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004484
4485 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004486
4487 // Create a custom imageView with non-1 mip levels
4488 VkImageObj image(m_device);
4489 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
4490 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4491 ASSERT_TRUE(image.initialized());
4492
4493 VkImageView view;
4494 VkImageViewCreateInfo ivci = {};
4495 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4496 ivci.image = image.handle();
4497 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4498 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4499 ivci.subresourceRange.layerCount = 1;
4500 ivci.subresourceRange.baseMipLevel = 0;
4501 // Set level count 2 (only 1 is allowed for FB attachment)
4502 ivci.subresourceRange.levelCount = 2;
4503 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4504 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4505 ASSERT_VK_SUCCESS(err);
4506 // Re-create renderpass to have matching sample count
4507 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4508 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4509 ASSERT_VK_SUCCESS(err);
4510
4511 fb_info.renderPass = rp;
4512 fb_info.pAttachments = &view;
4513 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4514 " has mip levelCount of 2 but only ");
4515 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4516
4517 m_errorMonitor->VerifyFound();
4518 if (err == VK_SUCCESS) {
4519 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4520 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004521 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004522 // Update view to original color buffer and grow FB dimensions too big
4523 fb_info.pAttachments = ivs;
4524 fb_info.height = 1024;
4525 fb_info.width = 1024;
4526 fb_info.layers = 2;
4527 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4528 " Attachment dimensions must be at "
4529 "least as large. ");
4530 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4531
4532 m_errorMonitor->VerifyFound();
4533 if (err == VK_SUCCESS) {
4534 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4535 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004536 // Create view attachment with non-identity swizzle
4537 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4538 ivci.image = image.handle();
4539 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4540 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4541 ivci.subresourceRange.layerCount = 1;
4542 ivci.subresourceRange.baseMipLevel = 0;
4543 ivci.subresourceRange.levelCount = 1;
4544 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4545 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4546 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4547 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4548 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4549 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4550 ASSERT_VK_SUCCESS(err);
4551
4552 fb_info.pAttachments = &view;
4553 fb_info.height = 100;
4554 fb_info.width = 100;
4555 fb_info.layers = 1;
4556 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4557 " has non-identy swizzle. All "
4558 "framebuffer attachments must have "
4559 "been created with the identity "
4560 "swizzle. ");
4561 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4562
4563 m_errorMonitor->VerifyFound();
4564 if (err == VK_SUCCESS) {
4565 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4566 }
4567 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004568 // Request fb that exceeds max dimensions
4569 // reset attachment to color attachment
4570 fb_info.pAttachments = ivs;
4571 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
4572 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
4573 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
4574 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4575 " Requested VkFramebufferCreateInfo "
4576 "dimensions exceed physical device "
4577 "limits. ");
4578 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4579
4580 m_errorMonitor->VerifyFound();
4581 if (err == VK_SUCCESS) {
4582 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4583 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004584
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004585 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004586}
4587
Mark Lobodzinskic808d442016-04-14 10:57:23 -06004588// This is a positive test. No errors should be generated.
Michael Lentine860b0fe2016-05-20 10:14:00 -05004589TEST_F(VkLayerTest, WaitEventThenSet) {
4590 TEST_DESCRIPTION(
4591 "Wait on a event then set it after the wait has been submitted.");
4592
Michael Lentine860b0fe2016-05-20 10:14:00 -05004593 m_errorMonitor->ExpectSuccess();
4594
4595 VkEvent event;
4596 VkEventCreateInfo event_create_info{};
4597 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4598 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
4599
4600 VkCommandPool command_pool;
4601 VkCommandPoolCreateInfo pool_create_info{};
4602 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4603 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4604 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4605 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4606 &command_pool);
4607
4608 VkCommandBuffer command_buffer;
4609 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4610 command_buffer_allocate_info.sType =
4611 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4612 command_buffer_allocate_info.commandPool = command_pool;
4613 command_buffer_allocate_info.commandBufferCount = 1;
4614 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4615 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4616 &command_buffer);
4617
4618 VkQueue queue = VK_NULL_HANDLE;
4619 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06004620 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05004621
4622 {
4623 VkCommandBufferBeginInfo begin_info{};
4624 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4625 vkBeginCommandBuffer(command_buffer, &begin_info);
4626
4627 vkCmdWaitEvents(command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT,
4628 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
4629 nullptr, 0, nullptr);
4630 vkCmdResetEvent(command_buffer, event,
4631 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
4632 vkEndCommandBuffer(command_buffer);
4633 }
4634 {
4635 VkSubmitInfo submit_info{};
4636 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4637 submit_info.commandBufferCount = 1;
4638 submit_info.pCommandBuffers = &command_buffer;
4639 submit_info.signalSemaphoreCount = 0;
4640 submit_info.pSignalSemaphores = nullptr;
4641 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4642 }
4643 { vkSetEvent(m_device->device(), event); }
4644
4645 vkQueueWaitIdle(queue);
4646
4647 vkDestroyEvent(m_device->device(), event, nullptr);
4648 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
4649 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
4650
4651 m_errorMonitor->VerifyNotFound();
4652}
Michael Lentine5627e692016-05-20 17:45:02 -05004653// This is a positive test. No errors should be generated.
4654TEST_F(VkLayerTest, QueryAndCopyMultipleCommandBuffers) {
4655 TEST_DESCRIPTION(
4656 "Issue a query and copy from it on a second command buffer.");
4657
4658 if ((m_device->queue_props.empty()) ||
4659 (m_device->queue_props[0].queueCount < 2))
4660 return;
4661
4662 m_errorMonitor->ExpectSuccess();
4663
4664 VkQueryPool query_pool;
4665 VkQueryPoolCreateInfo query_pool_create_info{};
4666 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
4667 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
4668 query_pool_create_info.queryCount = 1;
4669 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr,
4670 &query_pool);
4671
4672 VkCommandPool command_pool;
4673 VkCommandPoolCreateInfo pool_create_info{};
4674 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4675 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4676 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4677 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4678 &command_pool);
4679
4680 VkCommandBuffer command_buffer[2];
4681 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4682 command_buffer_allocate_info.sType =
4683 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4684 command_buffer_allocate_info.commandPool = command_pool;
4685 command_buffer_allocate_info.commandBufferCount = 2;
4686 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4687 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4688 command_buffer);
4689
4690 VkQueue queue = VK_NULL_HANDLE;
4691 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
4692 1, &queue);
4693
4694 uint32_t qfi = 0;
4695 VkBufferCreateInfo buff_create_info = {};
4696 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4697 buff_create_info.size = 1024;
4698 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
4699 buff_create_info.queueFamilyIndexCount = 1;
4700 buff_create_info.pQueueFamilyIndices = &qfi;
4701
4702 VkResult err;
4703 VkBuffer buffer;
4704 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
4705 ASSERT_VK_SUCCESS(err);
4706 VkMemoryAllocateInfo mem_alloc = {};
4707 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4708 mem_alloc.pNext = NULL;
4709 mem_alloc.allocationSize = 1024;
4710 mem_alloc.memoryTypeIndex = 0;
4711
4712 VkMemoryRequirements memReqs;
4713 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
4714 bool pass =
4715 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
4716 if (!pass) {
4717 vkDestroyBuffer(m_device->device(), buffer, NULL);
4718 return;
4719 }
4720
4721 VkDeviceMemory mem;
4722 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
4723 ASSERT_VK_SUCCESS(err);
4724 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4725 ASSERT_VK_SUCCESS(err);
4726
4727 {
4728 VkCommandBufferBeginInfo begin_info{};
4729 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4730 vkBeginCommandBuffer(command_buffer[0], &begin_info);
4731
4732 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
4733 vkCmdWriteTimestamp(command_buffer[0],
4734 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
4735
4736 vkEndCommandBuffer(command_buffer[0]);
4737
4738 vkBeginCommandBuffer(command_buffer[1], &begin_info);
4739
4740 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer,
4741 0, 0, 0);
4742
4743 vkEndCommandBuffer(command_buffer[1]);
4744 }
4745 {
4746 VkSubmitInfo submit_info{};
4747 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4748 submit_info.commandBufferCount = 2;
4749 submit_info.pCommandBuffers = command_buffer;
4750 submit_info.signalSemaphoreCount = 0;
4751 submit_info.pSignalSemaphores = nullptr;
4752 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4753 }
4754
4755 vkQueueWaitIdle(queue);
4756
4757 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
4758 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
4759 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06004760 vkDestroyBuffer(m_device->device(), buffer, NULL);
4761 vkFreeMemory(m_device->device(), mem, NULL);
Michael Lentine5627e692016-05-20 17:45:02 -05004762
4763 m_errorMonitor->VerifyNotFound();
4764}
Michael Lentine860b0fe2016-05-20 10:14:00 -05004765
4766TEST_F(VkLayerTest, ResetEventThenSet) {
4767 TEST_DESCRIPTION(
4768 "Reset an event then set it after the reset has been submitted.");
4769
Michael Lentine860b0fe2016-05-20 10:14:00 -05004770 m_errorMonitor->ExpectSuccess();
4771
4772 VkEvent event;
4773 VkEventCreateInfo event_create_info{};
4774 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4775 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
4776
4777 VkCommandPool command_pool;
4778 VkCommandPoolCreateInfo pool_create_info{};
4779 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4780 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4781 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4782 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4783 &command_pool);
4784
4785 VkCommandBuffer command_buffer;
4786 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4787 command_buffer_allocate_info.sType =
4788 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4789 command_buffer_allocate_info.commandPool = command_pool;
4790 command_buffer_allocate_info.commandBufferCount = 1;
4791 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4792 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4793 &command_buffer);
4794
4795 VkQueue queue = VK_NULL_HANDLE;
4796 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06004797 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05004798
4799 {
4800 VkCommandBufferBeginInfo begin_info{};
4801 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4802 vkBeginCommandBuffer(command_buffer, &begin_info);
4803
4804 vkCmdResetEvent(command_buffer, event,
4805 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
4806 vkCmdWaitEvents(command_buffer, 1, &event,
4807 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4808 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
4809 nullptr, 0, nullptr);
4810 vkEndCommandBuffer(command_buffer);
4811 }
4812 {
4813 VkSubmitInfo submit_info{};
4814 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4815 submit_info.commandBufferCount = 1;
4816 submit_info.pCommandBuffers = &command_buffer;
4817 submit_info.signalSemaphoreCount = 0;
4818 submit_info.pSignalSemaphores = nullptr;
4819 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4820 }
4821 {
4822 m_errorMonitor->SetDesiredFailureMsg(
4823 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkSetEvent() on event "
4824 "0x1 that is already in use by a "
4825 "command buffer.");
4826 vkSetEvent(m_device->device(), event);
4827 m_errorMonitor->VerifyFound();
4828 }
4829
4830 vkQueueWaitIdle(queue);
4831
4832 vkDestroyEvent(m_device->device(), event, nullptr);
4833 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
4834 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
4835}
4836
4837// This is a positive test. No errors should be generated.
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004838TEST_F(VkLayerTest, TwoFencesThreeFrames) {
4839 TEST_DESCRIPTION("Two command buffers with two separate fences are each "
4840 "run through a Submit & WaitForFences cycle 3 times. This "
4841 "previously revealed a bug so running this positive test "
4842 "to prevent a regression.");
4843 m_errorMonitor->ExpectSuccess();
4844
4845 ASSERT_NO_FATAL_FAILURE(InitState());
4846 VkQueue queue = VK_NULL_HANDLE;
4847 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
4848 0, &queue);
4849
4850 static const uint32_t NUM_OBJECTS = 2;
4851 static const uint32_t NUM_FRAMES = 3;
4852 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
4853 VkFence fences[NUM_OBJECTS] = {};
4854
4855 VkCommandPool cmd_pool;
4856 VkCommandPoolCreateInfo cmd_pool_ci = {};
4857 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4858 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
4859 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4860 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci,
4861 nullptr, &cmd_pool);
4862 ASSERT_VK_SUCCESS(err);
4863
4864 VkCommandBufferAllocateInfo cmd_buf_info = {};
4865 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4866 cmd_buf_info.commandPool = cmd_pool;
4867 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4868 cmd_buf_info.commandBufferCount = 1;
4869
4870 VkFenceCreateInfo fence_ci = {};
4871 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4872 fence_ci.pNext = nullptr;
4873 fence_ci.flags = 0;
4874
4875 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
4876 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info,
4877 &cmd_buffers[i]);
4878 ASSERT_VK_SUCCESS(err);
4879 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
4880 ASSERT_VK_SUCCESS(err);
4881 }
4882
4883 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
Tobin Ehlisf9025162016-05-26 06:55:21 -06004884 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
4885 // Create empty cmd buffer
4886 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
4887 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004888
Tobin Ehlisf9025162016-05-26 06:55:21 -06004889 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
4890 ASSERT_VK_SUCCESS(err);
4891 err = vkEndCommandBuffer(cmd_buffers[obj]);
4892 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004893
Tobin Ehlisf9025162016-05-26 06:55:21 -06004894 VkSubmitInfo submit_info = {};
4895 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4896 submit_info.commandBufferCount = 1;
4897 submit_info.pCommandBuffers = &cmd_buffers[obj];
4898 // Submit cmd buffer and wait for fence
4899 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
4900 ASSERT_VK_SUCCESS(err);
4901 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE,
4902 UINT64_MAX);
4903 ASSERT_VK_SUCCESS(err);
4904 err = vkResetFences(m_device->device(), 1, &fences[obj]);
4905 ASSERT_VK_SUCCESS(err);
4906 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004907 }
4908 m_errorMonitor->VerifyNotFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06004909 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
4910 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
4911 vkDestroyFence(m_device->device(), fences[i], nullptr);
4912 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004913}
4914// This is a positive test. No errors should be generated.
Mark Lobodzinskic808d442016-04-14 10:57:23 -06004915TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
4916
4917 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
4918 "submitted on separate queues followed by a QueueWaitIdle.");
4919
Dustin Graves48458142016-04-29 16:11:55 -06004920 if ((m_device->queue_props.empty()) ||
4921 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06004922 return;
4923
Mark Lobodzinskic808d442016-04-14 10:57:23 -06004924 m_errorMonitor->ExpectSuccess();
4925
4926 VkSemaphore semaphore;
4927 VkSemaphoreCreateInfo semaphore_create_info{};
4928 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
4929 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
4930 &semaphore);
4931
4932 VkCommandPool command_pool;
4933 VkCommandPoolCreateInfo pool_create_info{};
4934 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4935 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4936 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4937 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4938 &command_pool);
4939
4940 VkCommandBuffer command_buffer[2];
4941 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4942 command_buffer_allocate_info.sType =
4943 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4944 command_buffer_allocate_info.commandPool = command_pool;
4945 command_buffer_allocate_info.commandBufferCount = 2;
4946 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4947 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4948 command_buffer);
4949
4950 VkQueue queue = VK_NULL_HANDLE;
4951 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
4952 1, &queue);
4953
4954 {
4955 VkCommandBufferBeginInfo begin_info{};
4956 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4957 vkBeginCommandBuffer(command_buffer[0], &begin_info);
4958
4959 vkCmdPipelineBarrier(command_buffer[0],
4960 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4961 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
4962 0, nullptr, 0, nullptr);
4963
4964 VkViewport viewport{};
4965 viewport.maxDepth = 1.0f;
4966 viewport.minDepth = 0.0f;
4967 viewport.width = 512;
4968 viewport.height = 512;
4969 viewport.x = 0;
4970 viewport.y = 0;
4971 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
4972 vkEndCommandBuffer(command_buffer[0]);
4973 }
4974 {
4975 VkCommandBufferBeginInfo begin_info{};
4976 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4977 vkBeginCommandBuffer(command_buffer[1], &begin_info);
4978
4979 VkViewport viewport{};
4980 viewport.maxDepth = 1.0f;
4981 viewport.minDepth = 0.0f;
4982 viewport.width = 512;
4983 viewport.height = 512;
4984 viewport.x = 0;
4985 viewport.y = 0;
4986 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
4987 vkEndCommandBuffer(command_buffer[1]);
4988 }
4989 {
4990 VkSubmitInfo submit_info{};
4991 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4992 submit_info.commandBufferCount = 1;
4993 submit_info.pCommandBuffers = &command_buffer[0];
4994 submit_info.signalSemaphoreCount = 1;
4995 submit_info.pSignalSemaphores = &semaphore;
4996 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4997 }
4998 {
4999 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5000 VkSubmitInfo submit_info{};
5001 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5002 submit_info.commandBufferCount = 1;
5003 submit_info.pCommandBuffers = &command_buffer[1];
5004 submit_info.waitSemaphoreCount = 1;
5005 submit_info.pWaitSemaphores = &semaphore;
5006 submit_info.pWaitDstStageMask = flags;
5007 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5008 }
5009
5010 vkQueueWaitIdle(m_device->m_queue);
5011
5012 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5013 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5014 &command_buffer[0]);
5015 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5016
5017 m_errorMonitor->VerifyNotFound();
5018}
5019
5020// This is a positive test. No errors should be generated.
5021TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
5022
5023 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5024 "submitted on separate queues, the second having a fence"
5025 "followed by a QueueWaitIdle.");
5026
Dustin Graves48458142016-04-29 16:11:55 -06005027 if ((m_device->queue_props.empty()) ||
5028 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005029 return;
5030
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005031 m_errorMonitor->ExpectSuccess();
5032
5033 VkFence fence;
5034 VkFenceCreateInfo fence_create_info{};
5035 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5036 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5037
5038 VkSemaphore semaphore;
5039 VkSemaphoreCreateInfo semaphore_create_info{};
5040 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5041 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5042 &semaphore);
5043
5044 VkCommandPool command_pool;
5045 VkCommandPoolCreateInfo pool_create_info{};
5046 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5047 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5048 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5049 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5050 &command_pool);
5051
5052 VkCommandBuffer command_buffer[2];
5053 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5054 command_buffer_allocate_info.sType =
5055 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5056 command_buffer_allocate_info.commandPool = command_pool;
5057 command_buffer_allocate_info.commandBufferCount = 2;
5058 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5059 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5060 command_buffer);
5061
5062 VkQueue queue = VK_NULL_HANDLE;
5063 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5064 1, &queue);
5065
5066 {
5067 VkCommandBufferBeginInfo begin_info{};
5068 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5069 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5070
5071 vkCmdPipelineBarrier(command_buffer[0],
5072 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5073 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5074 0, nullptr, 0, nullptr);
5075
5076 VkViewport viewport{};
5077 viewport.maxDepth = 1.0f;
5078 viewport.minDepth = 0.0f;
5079 viewport.width = 512;
5080 viewport.height = 512;
5081 viewport.x = 0;
5082 viewport.y = 0;
5083 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5084 vkEndCommandBuffer(command_buffer[0]);
5085 }
5086 {
5087 VkCommandBufferBeginInfo begin_info{};
5088 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5089 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5090
5091 VkViewport viewport{};
5092 viewport.maxDepth = 1.0f;
5093 viewport.minDepth = 0.0f;
5094 viewport.width = 512;
5095 viewport.height = 512;
5096 viewport.x = 0;
5097 viewport.y = 0;
5098 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5099 vkEndCommandBuffer(command_buffer[1]);
5100 }
5101 {
5102 VkSubmitInfo submit_info{};
5103 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5104 submit_info.commandBufferCount = 1;
5105 submit_info.pCommandBuffers = &command_buffer[0];
5106 submit_info.signalSemaphoreCount = 1;
5107 submit_info.pSignalSemaphores = &semaphore;
5108 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5109 }
5110 {
5111 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5112 VkSubmitInfo submit_info{};
5113 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5114 submit_info.commandBufferCount = 1;
5115 submit_info.pCommandBuffers = &command_buffer[1];
5116 submit_info.waitSemaphoreCount = 1;
5117 submit_info.pWaitSemaphores = &semaphore;
5118 submit_info.pWaitDstStageMask = flags;
5119 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5120 }
5121
5122 vkQueueWaitIdle(m_device->m_queue);
5123
5124 vkDestroyFence(m_device->device(), fence, nullptr);
5125 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5126 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5127 &command_buffer[0]);
5128 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5129
5130 m_errorMonitor->VerifyNotFound();
5131}
5132
5133// This is a positive test. No errors should be generated.
5134TEST_F(VkLayerTest,
5135 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
5136
5137 TEST_DESCRIPTION(
5138 "Two command buffers, each in a separate QueueSubmit call "
5139 "submitted on separate queues, the second having a fence"
5140 "followed by two consecutive WaitForFences calls on the same fence.");
5141
Dustin Graves48458142016-04-29 16:11:55 -06005142 if ((m_device->queue_props.empty()) ||
5143 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005144 return;
5145
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005146 m_errorMonitor->ExpectSuccess();
5147
5148 VkFence fence;
5149 VkFenceCreateInfo fence_create_info{};
5150 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5151 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5152
5153 VkSemaphore semaphore;
5154 VkSemaphoreCreateInfo semaphore_create_info{};
5155 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5156 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5157 &semaphore);
5158
5159 VkCommandPool command_pool;
5160 VkCommandPoolCreateInfo pool_create_info{};
5161 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5162 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5163 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5164 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5165 &command_pool);
5166
5167 VkCommandBuffer command_buffer[2];
5168 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5169 command_buffer_allocate_info.sType =
5170 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5171 command_buffer_allocate_info.commandPool = command_pool;
5172 command_buffer_allocate_info.commandBufferCount = 2;
5173 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5174 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5175 command_buffer);
5176
5177 VkQueue queue = VK_NULL_HANDLE;
5178 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5179 1, &queue);
5180
5181 {
5182 VkCommandBufferBeginInfo begin_info{};
5183 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5184 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5185
5186 vkCmdPipelineBarrier(command_buffer[0],
5187 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5188 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5189 0, nullptr, 0, nullptr);
5190
5191 VkViewport viewport{};
5192 viewport.maxDepth = 1.0f;
5193 viewport.minDepth = 0.0f;
5194 viewport.width = 512;
5195 viewport.height = 512;
5196 viewport.x = 0;
5197 viewport.y = 0;
5198 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5199 vkEndCommandBuffer(command_buffer[0]);
5200 }
5201 {
5202 VkCommandBufferBeginInfo begin_info{};
5203 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5204 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5205
5206 VkViewport viewport{};
5207 viewport.maxDepth = 1.0f;
5208 viewport.minDepth = 0.0f;
5209 viewport.width = 512;
5210 viewport.height = 512;
5211 viewport.x = 0;
5212 viewport.y = 0;
5213 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5214 vkEndCommandBuffer(command_buffer[1]);
5215 }
5216 {
5217 VkSubmitInfo submit_info{};
5218 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5219 submit_info.commandBufferCount = 1;
5220 submit_info.pCommandBuffers = &command_buffer[0];
5221 submit_info.signalSemaphoreCount = 1;
5222 submit_info.pSignalSemaphores = &semaphore;
5223 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5224 }
5225 {
5226 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5227 VkSubmitInfo submit_info{};
5228 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5229 submit_info.commandBufferCount = 1;
5230 submit_info.pCommandBuffers = &command_buffer[1];
5231 submit_info.waitSemaphoreCount = 1;
5232 submit_info.pWaitSemaphores = &semaphore;
5233 submit_info.pWaitDstStageMask = flags;
5234 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5235 }
5236
5237 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5238 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5239
5240 vkDestroyFence(m_device->device(), fence, nullptr);
5241 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5242 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5243 &command_buffer[0]);
5244 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5245
5246 m_errorMonitor->VerifyNotFound();
5247}
5248
Chris Forbes0f8126b2016-06-20 17:48:22 +12005249#if 0
5250TEST_F(VkLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
5251 if ((m_device->queue_props.empty()) ||
5252 (m_device->queue_props[0].queueCount < 2)) {
5253 printf("Test requires two queues, skipping\n");
5254 return;
5255 }
5256
5257 VkResult err;
5258
5259 m_errorMonitor->ExpectSuccess();
5260
5261 VkQueue q0 = m_device->m_queue;
5262 VkQueue q1 = nullptr;
5263 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
5264 ASSERT_NE(q1, nullptr);
5265
5266 // An (empty) command buffer. We must have work in the first submission --
5267 // the layer treats unfenced work differently from fenced work.
5268 VkCommandPoolCreateInfo cpci = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0 };
5269 VkCommandPool pool;
5270 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
5271 ASSERT_VK_SUCCESS(err);
5272 VkCommandBufferAllocateInfo cbai = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr,
5273 pool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1
5274 };
5275 VkCommandBuffer cb;
5276 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
5277 ASSERT_VK_SUCCESS(err);
5278 VkCommandBufferBeginInfo cbbi = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
5279 0, nullptr
5280 };
5281 err = vkBeginCommandBuffer(cb, &cbbi);
5282 ASSERT_VK_SUCCESS(err);
5283 err = vkEndCommandBuffer(cb);
5284 ASSERT_VK_SUCCESS(err);
5285
5286 // A semaphore
5287 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
5288 VkSemaphore s;
5289 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
5290 ASSERT_VK_SUCCESS(err);
5291
5292 // First submission, to q0
5293 VkSubmitInfo s0 = {
5294 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
5295 0, nullptr, nullptr,
5296 1, &cb,
5297 1, &s
5298 };
5299
5300 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
5301 ASSERT_VK_SUCCESS(err);
5302
5303 // Second submission, to q1, waiting on s
5304 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
5305 VkSubmitInfo s1 = {
5306 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
5307 1, &s, &waitmask,
5308 0, nullptr,
5309 0, nullptr
5310 };
5311
5312 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
5313 ASSERT_VK_SUCCESS(err);
5314
5315 // Wait for q0 idle
5316 err = vkQueueWaitIdle(q0);
5317 ASSERT_VK_SUCCESS(err);
5318
5319 // Command buffer should have been completed (it was on q0); reset the pool.
5320 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
5321
5322 m_errorMonitor->VerifyNotFound();
5323
5324 // Force device completely idle and clean up resources
5325 vkDeviceWaitIdle(m_device->device());
5326 vkDestroyCommandPool(m_device->device(), pool, nullptr);
5327 vkDestroySemaphore(m_device->device(), s, nullptr);
5328}
5329#endif
5330
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005331// This is a positive test. No errors should be generated.
5332TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
5333
5334 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5335 "submitted on separate queues, the second having a fence, "
5336 "followed by a WaitForFences call.");
5337
Dustin Graves48458142016-04-29 16:11:55 -06005338 if ((m_device->queue_props.empty()) ||
5339 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005340 return;
5341
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005342 m_errorMonitor->ExpectSuccess();
5343
5344 VkFence fence;
5345 VkFenceCreateInfo fence_create_info{};
5346 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5347 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5348
5349 VkSemaphore semaphore;
5350 VkSemaphoreCreateInfo semaphore_create_info{};
5351 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5352 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5353 &semaphore);
5354
5355 VkCommandPool command_pool;
5356 VkCommandPoolCreateInfo pool_create_info{};
5357 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5358 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5359 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5360 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5361 &command_pool);
5362
5363 VkCommandBuffer command_buffer[2];
5364 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5365 command_buffer_allocate_info.sType =
5366 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5367 command_buffer_allocate_info.commandPool = command_pool;
5368 command_buffer_allocate_info.commandBufferCount = 2;
5369 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5370 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5371 command_buffer);
5372
5373 VkQueue queue = VK_NULL_HANDLE;
5374 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5375 1, &queue);
5376
5377
5378 {
5379 VkCommandBufferBeginInfo begin_info{};
5380 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5381 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5382
5383 vkCmdPipelineBarrier(command_buffer[0],
5384 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5385 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5386 0, nullptr, 0, nullptr);
5387
5388 VkViewport viewport{};
5389 viewport.maxDepth = 1.0f;
5390 viewport.minDepth = 0.0f;
5391 viewport.width = 512;
5392 viewport.height = 512;
5393 viewport.x = 0;
5394 viewport.y = 0;
5395 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5396 vkEndCommandBuffer(command_buffer[0]);
5397 }
5398 {
5399 VkCommandBufferBeginInfo begin_info{};
5400 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5401 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5402
5403 VkViewport viewport{};
5404 viewport.maxDepth = 1.0f;
5405 viewport.minDepth = 0.0f;
5406 viewport.width = 512;
5407 viewport.height = 512;
5408 viewport.x = 0;
5409 viewport.y = 0;
5410 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5411 vkEndCommandBuffer(command_buffer[1]);
5412 }
5413 {
5414 VkSubmitInfo submit_info{};
5415 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5416 submit_info.commandBufferCount = 1;
5417 submit_info.pCommandBuffers = &command_buffer[0];
5418 submit_info.signalSemaphoreCount = 1;
5419 submit_info.pSignalSemaphores = &semaphore;
5420 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5421 }
5422 {
5423 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5424 VkSubmitInfo submit_info{};
5425 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5426 submit_info.commandBufferCount = 1;
5427 submit_info.pCommandBuffers = &command_buffer[1];
5428 submit_info.waitSemaphoreCount = 1;
5429 submit_info.pWaitSemaphores = &semaphore;
5430 submit_info.pWaitDstStageMask = flags;
5431 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5432 }
5433
5434 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5435
5436 vkDestroyFence(m_device->device(), fence, nullptr);
5437 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5438 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5439 &command_buffer[0]);
5440 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5441
5442 m_errorMonitor->VerifyNotFound();
5443}
5444
5445// This is a positive test. No errors should be generated.
5446TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
5447
5448 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5449 "on the same queue, sharing a signal/wait semaphore, the "
5450 "second having a fence, "
5451 "followed by a WaitForFences call.");
5452
5453 m_errorMonitor->ExpectSuccess();
5454
5455 VkFence fence;
5456 VkFenceCreateInfo fence_create_info{};
5457 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5458 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5459
5460 VkSemaphore semaphore;
5461 VkSemaphoreCreateInfo semaphore_create_info{};
5462 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5463 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5464 &semaphore);
5465
5466 VkCommandPool command_pool;
5467 VkCommandPoolCreateInfo pool_create_info{};
5468 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5469 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5470 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5471 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5472 &command_pool);
5473
5474 VkCommandBuffer command_buffer[2];
5475 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5476 command_buffer_allocate_info.sType =
5477 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5478 command_buffer_allocate_info.commandPool = command_pool;
5479 command_buffer_allocate_info.commandBufferCount = 2;
5480 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5481 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5482 command_buffer);
5483
5484 {
5485 VkCommandBufferBeginInfo begin_info{};
5486 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5487 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5488
5489 vkCmdPipelineBarrier(command_buffer[0],
5490 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5491 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5492 0, nullptr, 0, nullptr);
5493
5494 VkViewport viewport{};
5495 viewport.maxDepth = 1.0f;
5496 viewport.minDepth = 0.0f;
5497 viewport.width = 512;
5498 viewport.height = 512;
5499 viewport.x = 0;
5500 viewport.y = 0;
5501 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5502 vkEndCommandBuffer(command_buffer[0]);
5503 }
5504 {
5505 VkCommandBufferBeginInfo begin_info{};
5506 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5507 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5508
5509 VkViewport viewport{};
5510 viewport.maxDepth = 1.0f;
5511 viewport.minDepth = 0.0f;
5512 viewport.width = 512;
5513 viewport.height = 512;
5514 viewport.x = 0;
5515 viewport.y = 0;
5516 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5517 vkEndCommandBuffer(command_buffer[1]);
5518 }
5519 {
5520 VkSubmitInfo submit_info{};
5521 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5522 submit_info.commandBufferCount = 1;
5523 submit_info.pCommandBuffers = &command_buffer[0];
5524 submit_info.signalSemaphoreCount = 1;
5525 submit_info.pSignalSemaphores = &semaphore;
5526 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5527 }
5528 {
5529 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5530 VkSubmitInfo submit_info{};
5531 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5532 submit_info.commandBufferCount = 1;
5533 submit_info.pCommandBuffers = &command_buffer[1];
5534 submit_info.waitSemaphoreCount = 1;
5535 submit_info.pWaitSemaphores = &semaphore;
5536 submit_info.pWaitDstStageMask = flags;
5537 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5538 }
5539
5540 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5541
5542 vkDestroyFence(m_device->device(), fence, nullptr);
5543 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5544 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5545 &command_buffer[0]);
5546 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5547
5548 m_errorMonitor->VerifyNotFound();
5549}
5550
5551// This is a positive test. No errors should be generated.
5552TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
5553
5554 TEST_DESCRIPTION(
5555 "Two command buffers, each in a separate QueueSubmit call "
5556 "on the same queue, no fences, followed by a third QueueSubmit with NO "
5557 "SubmitInfos but with a fence, followed by a WaitForFences call.");
5558
5559 m_errorMonitor->ExpectSuccess();
5560
5561 VkFence fence;
5562 VkFenceCreateInfo fence_create_info{};
5563 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5564 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5565
5566 VkCommandPool command_pool;
5567 VkCommandPoolCreateInfo pool_create_info{};
5568 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5569 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5570 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5571 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5572 &command_pool);
5573
5574 VkCommandBuffer command_buffer[2];
5575 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5576 command_buffer_allocate_info.sType =
5577 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5578 command_buffer_allocate_info.commandPool = command_pool;
5579 command_buffer_allocate_info.commandBufferCount = 2;
5580 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5581 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5582 command_buffer);
5583
5584 {
5585 VkCommandBufferBeginInfo begin_info{};
5586 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5587 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5588
5589 vkCmdPipelineBarrier(command_buffer[0],
5590 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5591 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5592 0, nullptr, 0, nullptr);
5593
5594 VkViewport viewport{};
5595 viewport.maxDepth = 1.0f;
5596 viewport.minDepth = 0.0f;
5597 viewport.width = 512;
5598 viewport.height = 512;
5599 viewport.x = 0;
5600 viewport.y = 0;
5601 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5602 vkEndCommandBuffer(command_buffer[0]);
5603 }
5604 {
5605 VkCommandBufferBeginInfo begin_info{};
5606 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5607 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5608
5609 VkViewport viewport{};
5610 viewport.maxDepth = 1.0f;
5611 viewport.minDepth = 0.0f;
5612 viewport.width = 512;
5613 viewport.height = 512;
5614 viewport.x = 0;
5615 viewport.y = 0;
5616 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5617 vkEndCommandBuffer(command_buffer[1]);
5618 }
5619 {
5620 VkSubmitInfo submit_info{};
5621 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5622 submit_info.commandBufferCount = 1;
5623 submit_info.pCommandBuffers = &command_buffer[0];
5624 submit_info.signalSemaphoreCount = 0;
5625 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
5626 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5627 }
5628 {
5629 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5630 VkSubmitInfo submit_info{};
5631 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5632 submit_info.commandBufferCount = 1;
5633 submit_info.pCommandBuffers = &command_buffer[1];
5634 submit_info.waitSemaphoreCount = 0;
5635 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
5636 submit_info.pWaitDstStageMask = flags;
5637 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5638 }
5639
5640 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
5641
Mike Stroyancd1c3e52016-06-21 09:20:01 -06005642 VkResult err =
5643 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5644 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005645
5646 vkDestroyFence(m_device->device(), fence, nullptr);
5647 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5648 &command_buffer[0]);
5649 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5650
5651 m_errorMonitor->VerifyNotFound();
5652}
5653
5654// This is a positive test. No errors should be generated.
5655TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
5656
5657 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5658 "on the same queue, the second having a fence, followed "
5659 "by a WaitForFences call.");
5660
5661 m_errorMonitor->ExpectSuccess();
5662
5663 VkFence fence;
5664 VkFenceCreateInfo fence_create_info{};
5665 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5666 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5667
5668 VkCommandPool command_pool;
5669 VkCommandPoolCreateInfo pool_create_info{};
5670 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5671 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5672 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5673 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5674 &command_pool);
5675
5676 VkCommandBuffer command_buffer[2];
5677 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5678 command_buffer_allocate_info.sType =
5679 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5680 command_buffer_allocate_info.commandPool = command_pool;
5681 command_buffer_allocate_info.commandBufferCount = 2;
5682 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5683 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5684 command_buffer);
5685
5686 {
5687 VkCommandBufferBeginInfo begin_info{};
5688 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5689 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5690
5691 vkCmdPipelineBarrier(command_buffer[0],
5692 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5693 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5694 0, nullptr, 0, nullptr);
5695
5696 VkViewport viewport{};
5697 viewport.maxDepth = 1.0f;
5698 viewport.minDepth = 0.0f;
5699 viewport.width = 512;
5700 viewport.height = 512;
5701 viewport.x = 0;
5702 viewport.y = 0;
5703 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5704 vkEndCommandBuffer(command_buffer[0]);
5705 }
5706 {
5707 VkCommandBufferBeginInfo begin_info{};
5708 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5709 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5710
5711 VkViewport viewport{};
5712 viewport.maxDepth = 1.0f;
5713 viewport.minDepth = 0.0f;
5714 viewport.width = 512;
5715 viewport.height = 512;
5716 viewport.x = 0;
5717 viewport.y = 0;
5718 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5719 vkEndCommandBuffer(command_buffer[1]);
5720 }
5721 {
5722 VkSubmitInfo submit_info{};
5723 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5724 submit_info.commandBufferCount = 1;
5725 submit_info.pCommandBuffers = &command_buffer[0];
5726 submit_info.signalSemaphoreCount = 0;
5727 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
5728 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5729 }
5730 {
5731 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5732 VkSubmitInfo submit_info{};
5733 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5734 submit_info.commandBufferCount = 1;
5735 submit_info.pCommandBuffers = &command_buffer[1];
5736 submit_info.waitSemaphoreCount = 0;
5737 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
5738 submit_info.pWaitDstStageMask = flags;
5739 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5740 }
5741
5742 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5743
5744 vkDestroyFence(m_device->device(), fence, nullptr);
5745 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5746 &command_buffer[0]);
5747 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5748
5749 m_errorMonitor->VerifyNotFound();
5750}
5751
5752// This is a positive test. No errors should be generated.
5753TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
5754
5755 TEST_DESCRIPTION(
5756 "Two command buffers each in a separate SubmitInfo sent in a single "
5757 "QueueSubmit call followed by a WaitForFences call.");
5758
5759 m_errorMonitor->ExpectSuccess();
5760
5761 VkFence fence;
5762 VkFenceCreateInfo fence_create_info{};
5763 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5764 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5765
5766 VkSemaphore semaphore;
5767 VkSemaphoreCreateInfo semaphore_create_info{};
5768 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5769 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5770 &semaphore);
5771
5772 VkCommandPool command_pool;
5773 VkCommandPoolCreateInfo pool_create_info{};
5774 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5775 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5776 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5777 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5778 &command_pool);
5779
5780 VkCommandBuffer command_buffer[2];
5781 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5782 command_buffer_allocate_info.sType =
5783 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5784 command_buffer_allocate_info.commandPool = command_pool;
5785 command_buffer_allocate_info.commandBufferCount = 2;
5786 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5787 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5788 command_buffer);
5789
5790 {
5791 VkCommandBufferBeginInfo begin_info{};
5792 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5793 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5794
5795 vkCmdPipelineBarrier(command_buffer[0],
5796 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5797 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5798 0, nullptr, 0, nullptr);
5799
5800 VkViewport viewport{};
5801 viewport.maxDepth = 1.0f;
5802 viewport.minDepth = 0.0f;
5803 viewport.width = 512;
5804 viewport.height = 512;
5805 viewport.x = 0;
5806 viewport.y = 0;
5807 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5808 vkEndCommandBuffer(command_buffer[0]);
5809 }
5810 {
5811 VkCommandBufferBeginInfo begin_info{};
5812 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5813 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5814
5815 VkViewport viewport{};
5816 viewport.maxDepth = 1.0f;
5817 viewport.minDepth = 0.0f;
5818 viewport.width = 512;
5819 viewport.height = 512;
5820 viewport.x = 0;
5821 viewport.y = 0;
5822 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5823 vkEndCommandBuffer(command_buffer[1]);
5824 }
5825 {
5826 VkSubmitInfo submit_info[2];
5827 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5828
5829 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5830 submit_info[0].pNext = NULL;
5831 submit_info[0].commandBufferCount = 1;
5832 submit_info[0].pCommandBuffers = &command_buffer[0];
5833 submit_info[0].signalSemaphoreCount = 1;
5834 submit_info[0].pSignalSemaphores = &semaphore;
5835 submit_info[0].waitSemaphoreCount = 0;
5836 submit_info[0].pWaitSemaphores = NULL;
5837 submit_info[0].pWaitDstStageMask = 0;
5838
5839 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5840 submit_info[1].pNext = NULL;
5841 submit_info[1].commandBufferCount = 1;
5842 submit_info[1].pCommandBuffers = &command_buffer[1];
5843 submit_info[1].waitSemaphoreCount = 1;
5844 submit_info[1].pWaitSemaphores = &semaphore;
5845 submit_info[1].pWaitDstStageMask = flags;
5846 submit_info[1].signalSemaphoreCount = 0;
5847 submit_info[1].pSignalSemaphores = NULL;
5848 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
5849 }
5850
5851 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5852
5853 vkDestroyFence(m_device->device(), fence, nullptr);
5854 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5855 &command_buffer[0]);
5856 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06005857 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005858
5859 m_errorMonitor->VerifyNotFound();
5860}
5861
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005862TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005863 TEST_DESCRIPTION(
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005864 "Run a simple draw calls to validate failure when Depth Bias dynamic "
5865 "state is required but not correctly bound.");
5866
5867 // Dynamic depth bias
5868 m_errorMonitor->SetDesiredFailureMsg(
5869 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5870 "Dynamic depth bias state not set for this command buffer");
5871 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5872 BsoFailDepthBias);
5873 m_errorMonitor->VerifyFound();
5874}
5875
5876TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
5877 TEST_DESCRIPTION(
5878 "Run a simple draw calls to validate failure when Line Width dynamic "
5879 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005880
5881 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07005882 m_errorMonitor->SetDesiredFailureMsg(
5883 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005884 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005885 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5886 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005887 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005888}
5889
5890TEST_F(VkLayerTest, DynamicViewportNotBound) {
5891 TEST_DESCRIPTION(
5892 "Run a simple draw calls to validate failure when Viewport dynamic "
5893 "state is required but not correctly bound.");
5894
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005895 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07005896 m_errorMonitor->SetDesiredFailureMsg(
5897 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005898 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005899 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5900 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005901 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005902}
5903
5904TEST_F(VkLayerTest, DynamicScissorNotBound) {
5905 TEST_DESCRIPTION(
5906 "Run a simple draw calls to validate failure when Scissor dynamic "
5907 "state is required but not correctly bound.");
5908
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005909 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07005910 m_errorMonitor->SetDesiredFailureMsg(
5911 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005912 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005913 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5914 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005915 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005916}
5917
Tobin Ehlis21c88352016-05-26 06:15:45 -06005918TEST_F(VkLayerTest, DynamiBlendConstantsNotBound) {
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005919 TEST_DESCRIPTION(
Tobin Ehlis21c88352016-05-26 06:15:45 -06005920 "Run a simple draw calls to validate failure when Blend Constants "
5921 "dynamic state is required but not correctly bound.");
5922 // Dynamic blend constant state
5923 m_errorMonitor->SetDesiredFailureMsg(
5924 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5925 "Dynamic blend constants state not set for this command buffer");
5926 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5927 BsoFailBlend);
5928 m_errorMonitor->VerifyFound();
5929}
5930
5931TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
5932 TEST_DESCRIPTION(
5933 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005934 "state is required but not correctly bound.");
Tobin Ehlis21c88352016-05-26 06:15:45 -06005935 if (!m_device->phy().features().depthBounds) {
5936 printf("Device does not support depthBounds test; skipped.\n");
5937 return;
5938 }
5939 // Dynamic depth bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005940 m_errorMonitor->SetDesiredFailureMsg(
5941 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005942 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005943 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5944 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005945 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005946}
5947
5948TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
5949 TEST_DESCRIPTION(
5950 "Run a simple draw calls to validate failure when Stencil Read dynamic "
5951 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005952 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07005953 m_errorMonitor->SetDesiredFailureMsg(
5954 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005955 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005956 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5957 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005958 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005959}
5960
5961TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
5962 TEST_DESCRIPTION(
5963 "Run a simple draw calls to validate failure when Stencil Write dynamic"
5964 " state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005965 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07005966 m_errorMonitor->SetDesiredFailureMsg(
5967 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005968 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005969 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5970 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005971 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005972}
5973
5974TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
5975 TEST_DESCRIPTION(
5976 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
5977 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005978 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07005979 m_errorMonitor->SetDesiredFailureMsg(
5980 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005981 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005982 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5983 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005984 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06005985}
5986
Karl Schultz6addd812016-02-02 17:17:23 -07005987TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Karl Schultz6addd812016-02-02 17:17:23 -07005988 m_errorMonitor->SetDesiredFailureMsg(
5989 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5990 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
5991 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06005992
Tobin Ehlis59278bf2015-08-18 07:10:58 -06005993 ASSERT_NO_FATAL_FAILURE(InitState());
5994 ASSERT_NO_FATAL_FAILURE(InitViewport());
5995 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5996
Karl Schultz6addd812016-02-02 17:17:23 -07005997 // We luck out b/c by default the framework creates CB w/ the
5998 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06005999 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006000 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
6001 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006002 EndCommandBuffer();
6003
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006004 // Bypass framework since it does the waits automatically
6005 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006006 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08006007 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6008 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006009 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006010 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07006011 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006012 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006013 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08006014 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006015 submit_info.pSignalSemaphores = NULL;
6016
Chris Forbes40028e22016-06-13 09:59:34 +12006017 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07006018 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006019
Karl Schultz6addd812016-02-02 17:17:23 -07006020 // Cause validation error by re-submitting cmd buffer that should only be
6021 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12006022 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006023
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006024 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006025}
6026
Karl Schultz6addd812016-02-02 17:17:23 -07006027TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006028 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07006029 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006030
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006031 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006032 "Unable to allocate 1 descriptors of "
6033 "type "
6034 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006035
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006036 ASSERT_NO_FATAL_FAILURE(InitState());
6037 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006038
Karl Schultz6addd812016-02-02 17:17:23 -07006039 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
6040 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006041 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006042 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
6043 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006044
6045 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006046 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6047 ds_pool_ci.pNext = NULL;
6048 ds_pool_ci.flags = 0;
6049 ds_pool_ci.maxSets = 1;
6050 ds_pool_ci.poolSizeCount = 1;
6051 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006052
6053 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006054 err =
6055 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006056 ASSERT_VK_SUCCESS(err);
6057
6058 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006059 dsl_binding.binding = 0;
6060 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6061 dsl_binding.descriptorCount = 1;
6062 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6063 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006064
6065 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006066 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6067 ds_layout_ci.pNext = NULL;
6068 ds_layout_ci.bindingCount = 1;
6069 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006070
6071 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006072 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6073 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006074 ASSERT_VK_SUCCESS(err);
6075
6076 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006077 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006078 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006079 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006080 alloc_info.descriptorPool = ds_pool;
6081 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006082 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6083 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006084
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006085 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006086
Chia-I Wuf7458c52015-10-26 21:10:41 +08006087 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6088 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006089}
6090
Karl Schultz6addd812016-02-02 17:17:23 -07006091TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
6092 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06006093
Karl Schultz6addd812016-02-02 17:17:23 -07006094 m_errorMonitor->SetDesiredFailureMsg(
6095 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6096 "It is invalid to call vkFreeDescriptorSets() with a pool created "
6097 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006098
Tobin Ehlise735c692015-10-08 13:13:50 -06006099 ASSERT_NO_FATAL_FAILURE(InitState());
6100 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06006101
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006102 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006103 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6104 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06006105
6106 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006107 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6108 ds_pool_ci.pNext = NULL;
6109 ds_pool_ci.maxSets = 1;
6110 ds_pool_ci.poolSizeCount = 1;
6111 ds_pool_ci.flags = 0;
6112 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
6113 // app can only call vkResetDescriptorPool on this pool.;
6114 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06006115
6116 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006117 err =
6118 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06006119 ASSERT_VK_SUCCESS(err);
6120
6121 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006122 dsl_binding.binding = 0;
6123 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6124 dsl_binding.descriptorCount = 1;
6125 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6126 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06006127
6128 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006129 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6130 ds_layout_ci.pNext = NULL;
6131 ds_layout_ci.bindingCount = 1;
6132 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06006133
6134 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006135 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6136 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06006137 ASSERT_VK_SUCCESS(err);
6138
6139 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006140 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006141 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006142 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006143 alloc_info.descriptorPool = ds_pool;
6144 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006145 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6146 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06006147 ASSERT_VK_SUCCESS(err);
6148
6149 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006150 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06006151
Chia-I Wuf7458c52015-10-26 21:10:41 +08006152 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6153 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06006154}
6155
Karl Schultz6addd812016-02-02 17:17:23 -07006156TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006157 // Attempt to clear Descriptor Pool with bad object.
6158 // ObjectTracker should catch this.
6159 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6160 "Invalid VkDescriptorPool Object 0xbaad6001");
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006161 uint64_t fake_pool_handle = 0xbaad6001;
6162 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
6163 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06006164 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006165}
6166
Karl Schultz6addd812016-02-02 17:17:23 -07006167TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006168 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
6169 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006170 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06006171 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006172
6173 uint64_t fake_set_handle = 0xbaad6001;
6174 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006175 VkResult err;
6176 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6177 "Invalid VkDescriptorSet Object 0xbaad6001");
6178
6179 ASSERT_NO_FATAL_FAILURE(InitState());
6180
6181 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
6182 layout_bindings[0].binding = 0;
6183 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6184 layout_bindings[0].descriptorCount = 1;
6185 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
6186 layout_bindings[0].pImmutableSamplers = NULL;
6187
6188 VkDescriptorSetLayout descriptor_set_layout;
6189 VkDescriptorSetLayoutCreateInfo dslci = {};
6190 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6191 dslci.pNext = NULL;
6192 dslci.bindingCount = 1;
6193 dslci.pBindings = layout_bindings;
6194 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006195 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006196
6197 VkPipelineLayout pipeline_layout;
6198 VkPipelineLayoutCreateInfo plci = {};
6199 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6200 plci.pNext = NULL;
6201 plci.setLayoutCount = 1;
6202 plci.pSetLayouts = &descriptor_set_layout;
6203 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006204 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006205
6206 BeginCommandBuffer();
6207 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006208 pipeline_layout, 0, 1, &bad_set, 0, NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06006209 m_errorMonitor->VerifyFound();
6210 EndCommandBuffer();
6211 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
6212 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006213}
6214
Karl Schultz6addd812016-02-02 17:17:23 -07006215TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006216 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
6217 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006218 uint64_t fake_layout_handle = 0xbaad6001;
6219 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006220 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6221 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
6222
6223 VkPipelineLayout pipeline_layout;
6224 VkPipelineLayoutCreateInfo plci = {};
6225 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6226 plci.pNext = NULL;
6227 plci.setLayoutCount = 1;
6228 plci.pSetLayouts = &bad_layout;
6229 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
6230
6231 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006232}
6233
Mark Muellerd4914412016-06-13 17:52:06 -06006234TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
6235 TEST_DESCRIPTION("This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
6236 "1) A uniform buffer update must have a valid buffer index."
6237 "2) When using an array of descriptors in a single WriteDescriptor,"
6238 " the descriptor types and stageflags must all be the same."
6239 "3) Immutable Sampler state must match across descriptors");
6240
6241 const char *invalid_BufferInfo_ErrorMessage =
6242 "vkUpdateDescriptorSets: if pDescriptorWrites[0].descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, "
6243 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or "
6244 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pDescriptorWrites[0].pBufferInfo must not be NULL";
6245 const char *stateFlag_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06006246 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006247 const char *immutable_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06006248 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006249
Mark Muellerd4914412016-06-13 17:52:06 -06006250 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_BufferInfo_ErrorMessage);
6251
6252 ASSERT_NO_FATAL_FAILURE(InitState());
6253 VkDescriptorPoolSize ds_type_count[4] = {};
6254 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6255 ds_type_count[0].descriptorCount = 1;
6256 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6257 ds_type_count[1].descriptorCount = 1;
6258 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6259 ds_type_count[2].descriptorCount = 1;
6260 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
6261 ds_type_count[3].descriptorCount = 1;
6262
6263 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6264 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6265 ds_pool_ci.maxSets = 1;
6266 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
6267 ds_pool_ci.pPoolSizes = ds_type_count;
6268
6269 VkDescriptorPool ds_pool;
6270 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6271 ASSERT_VK_SUCCESS(err);
6272
Mark Muellerb9896722016-06-16 09:54:29 -06006273 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006274 layout_binding[0].binding = 0;
6275 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6276 layout_binding[0].descriptorCount = 1;
6277 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6278 layout_binding[0].pImmutableSamplers = NULL;
6279
6280 layout_binding[1].binding = 1;
6281 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6282 layout_binding[1].descriptorCount = 1;
6283 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6284 layout_binding[1].pImmutableSamplers = NULL;
6285
6286 VkSamplerCreateInfo sampler_ci = {};
6287 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6288 sampler_ci.pNext = NULL;
6289 sampler_ci.magFilter = VK_FILTER_NEAREST;
6290 sampler_ci.minFilter = VK_FILTER_NEAREST;
6291 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6292 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6293 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6294 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6295 sampler_ci.mipLodBias = 1.0;
6296 sampler_ci.anisotropyEnable = VK_FALSE;
6297 sampler_ci.maxAnisotropy = 1;
6298 sampler_ci.compareEnable = VK_FALSE;
6299 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6300 sampler_ci.minLod = 1.0;
6301 sampler_ci.maxLod = 1.0;
6302 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6303 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6304 VkSampler sampler;
6305
6306 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6307 ASSERT_VK_SUCCESS(err);
6308
6309 layout_binding[2].binding = 2;
6310 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6311 layout_binding[2].descriptorCount = 1;
6312 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6313 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
6314
Mark Muellerd4914412016-06-13 17:52:06 -06006315 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6316 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6317 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
6318 ds_layout_ci.pBindings = layout_binding;
6319 VkDescriptorSetLayout ds_layout;
6320 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6321 ASSERT_VK_SUCCESS(err);
6322
6323 VkDescriptorSetAllocateInfo alloc_info = {};
6324 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6325 alloc_info.descriptorSetCount = 1;
6326 alloc_info.descriptorPool = ds_pool;
6327 alloc_info.pSetLayouts = &ds_layout;
6328 VkDescriptorSet descriptorSet;
6329 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6330 ASSERT_VK_SUCCESS(err);
6331
6332 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6333 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6334 pipeline_layout_ci.pNext = NULL;
6335 pipeline_layout_ci.setLayoutCount = 1;
6336 pipeline_layout_ci.pSetLayouts = &ds_layout;
6337
6338 VkPipelineLayout pipeline_layout;
6339 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6340 ASSERT_VK_SUCCESS(err);
6341
Mark Mueller5c838ce2016-06-16 09:54:29 -06006342 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006343 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6344 descriptor_write.dstSet = descriptorSet;
6345 descriptor_write.dstBinding = 0;
6346 descriptor_write.descriptorCount = 1;
6347 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6348
Mark Mueller5c838ce2016-06-16 09:54:29 -06006349 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06006350 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6351 m_errorMonitor->VerifyFound();
6352
6353 // Create a buffer to update the descriptor with
6354 uint32_t qfi = 0;
6355 VkBufferCreateInfo buffCI = {};
6356 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6357 buffCI.size = 1024;
6358 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6359 buffCI.queueFamilyIndexCount = 1;
6360 buffCI.pQueueFamilyIndices = &qfi;
6361
6362 VkBuffer dyub;
6363 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6364 ASSERT_VK_SUCCESS(err);
6365 VkDescriptorBufferInfo buffInfo = {};
6366 buffInfo.buffer = dyub;
6367 buffInfo.offset = 0;
6368 buffInfo.range = 1024;
6369
6370 descriptor_write.pBufferInfo = &buffInfo;
6371 descriptor_write.descriptorCount = 2;
6372
Mark Mueller5c838ce2016-06-16 09:54:29 -06006373 // 2) The stateFlags don't match between the first and second descriptor
Mark Muellerd4914412016-06-13 17:52:06 -06006374 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, stateFlag_ErrorMessage);
6375 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6376 m_errorMonitor->VerifyFound();
6377
Mark Mueller5c838ce2016-06-16 09:54:29 -06006378 // 3) The second descriptor has a null_ptr pImmutableSamplers and
6379 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06006380 descriptor_write.dstBinding = 1;
6381 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06006382
6383
6384 // Make pImageInfo index non-null to avoid complaints of it missing
6385 VkDescriptorImageInfo imageInfo = {};
6386 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6387 descriptor_write.pImageInfo = &imageInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06006388 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, immutable_ErrorMessage);
6389 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6390 m_errorMonitor->VerifyFound();
6391
Mark Muellerd4914412016-06-13 17:52:06 -06006392 vkDestroyBuffer(m_device->device(), dyub, NULL);
6393 vkDestroySampler(m_device->device(), sampler, NULL);
6394 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6395 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6396 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6397}
6398
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06006399TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
6400 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6401 "due to a buffer dependency being destroyed.");
6402 ASSERT_NO_FATAL_FAILURE(InitState());
6403
6404 VkImageObj image(m_device);
6405 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
6406 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
6407 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
6408 VK_IMAGE_TILING_OPTIMAL, 0);
6409 ASSERT_TRUE(image.initialized());
6410
6411 VkBuffer buffer;
6412 VkDeviceMemory mem;
6413 VkMemoryRequirements mem_reqs;
6414
6415 VkBufferCreateInfo buf_info = {};
6416 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6417 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6418 buf_info.size = 256;
6419 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6420 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
6421 ASSERT_VK_SUCCESS(err);
6422
6423 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
6424
6425 VkMemoryAllocateInfo alloc_info = {};
6426 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6427 alloc_info.allocationSize = 256;
6428 bool pass = false;
6429 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
6430 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
6431 if (!pass) {
6432 vkDestroyBuffer(m_device->device(), buffer, NULL);
6433 return;
6434 }
6435 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
6436 ASSERT_VK_SUCCESS(err);
6437
6438 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
6439 ASSERT_VK_SUCCESS(err);
6440
6441 VkBufferImageCopy region = {};
6442 region.bufferRowLength = 128;
6443 region.bufferImageHeight = 128;
6444 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6445
6446 region.imageSubresource.layerCount = 1;
6447 region.imageExtent.height = 4;
6448 region.imageExtent.width = 4;
6449 region.imageExtent.depth = 1;
6450 m_commandBuffer->BeginCommandBuffer();
6451 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer,
6452 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
6453 1, &region);
6454 m_commandBuffer->EndCommandBuffer();
6455
6456 m_errorMonitor->SetDesiredFailureMsg(
6457 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6458 " that is invalid because bound buffer ");
6459 // Destroy buffer dependency prior to submit to cause ERROR
6460 vkDestroyBuffer(m_device->device(), buffer, NULL);
6461
6462 VkSubmitInfo submit_info = {};
6463 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6464 submit_info.commandBufferCount = 1;
6465 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6466 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6467
6468 m_errorMonitor->VerifyFound();
6469 vkFreeMemory(m_device->handle(), mem, NULL);
6470}
6471
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006472TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
6473 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6474 "due to an image dependency being destroyed.");
6475 ASSERT_NO_FATAL_FAILURE(InitState());
6476
6477 VkImage image;
6478 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6479 VkImageCreateInfo image_create_info = {};
6480 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6481 image_create_info.pNext = NULL;
6482 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6483 image_create_info.format = tex_format;
6484 image_create_info.extent.width = 32;
6485 image_create_info.extent.height = 32;
6486 image_create_info.extent.depth = 1;
6487 image_create_info.mipLevels = 1;
6488 image_create_info.arrayLayers = 1;
6489 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6490 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6491 image_create_info.usage =
6492 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
6493 image_create_info.flags = 0;
6494 VkResult err =
6495 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6496 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06006497 // Have to bind memory to image before recording cmd in cmd buffer using it
6498 VkMemoryRequirements mem_reqs;
6499 VkDeviceMemory image_mem;
6500 bool pass;
6501 VkMemoryAllocateInfo mem_alloc = {};
6502 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6503 mem_alloc.pNext = NULL;
6504 mem_alloc.memoryTypeIndex = 0;
6505 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
6506 mem_alloc.allocationSize = mem_reqs.size;
6507 pass =
6508 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
6509 ASSERT_TRUE(pass);
6510 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
6511 ASSERT_VK_SUCCESS(err);
6512 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
6513 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006514
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006515 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06006516 VkClearColorValue ccv;
6517 ccv.float32[0] = 1.0f;
6518 ccv.float32[1] = 1.0f;
6519 ccv.float32[2] = 1.0f;
6520 ccv.float32[3] = 1.0f;
6521 VkImageSubresourceRange isr = {};
6522 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06006523 isr.baseArrayLayer = 0;
6524 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06006525 isr.layerCount = 1;
6526 isr.levelCount = 1;
6527 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image,
6528 VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006529 m_commandBuffer->EndCommandBuffer();
6530
6531 m_errorMonitor->SetDesiredFailureMsg(
6532 VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
6533 // Destroy image dependency prior to submit to cause ERROR
6534 vkDestroyImage(m_device->device(), image, NULL);
6535
6536 VkSubmitInfo submit_info = {};
6537 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6538 submit_info.commandBufferCount = 1;
6539 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6540 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6541
6542 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06006543 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006544}
6545
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06006546TEST_F(VkLayerTest, ImageMemoryNotBound) {
6547 TEST_DESCRIPTION(
6548 "Attempt to draw with an image which has not had memory bound to it.");
6549 ASSERT_NO_FATAL_FAILURE(InitState());
6550
6551 VkImage image;
6552 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6553 VkImageCreateInfo image_create_info = {};
6554 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6555 image_create_info.pNext = NULL;
6556 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6557 image_create_info.format = tex_format;
6558 image_create_info.extent.width = 32;
6559 image_create_info.extent.height = 32;
6560 image_create_info.extent.depth = 1;
6561 image_create_info.mipLevels = 1;
6562 image_create_info.arrayLayers = 1;
6563 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6564 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6565 image_create_info.usage =
6566 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
6567 image_create_info.flags = 0;
6568 VkResult err =
6569 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6570 ASSERT_VK_SUCCESS(err);
6571 // Have to bind memory to image before recording cmd in cmd buffer using it
6572 VkMemoryRequirements mem_reqs;
6573 VkDeviceMemory image_mem;
6574 bool pass;
6575 VkMemoryAllocateInfo mem_alloc = {};
6576 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6577 mem_alloc.pNext = NULL;
6578 mem_alloc.memoryTypeIndex = 0;
6579 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
6580 mem_alloc.allocationSize = mem_reqs.size;
6581 pass =
6582 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
6583 ASSERT_TRUE(pass);
6584 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
6585 ASSERT_VK_SUCCESS(err);
6586
6587 // Introduce error, do not call vkBindImageMemory(m_device->device(), image,
6588 // image_mem, 0);
6589 m_errorMonitor->SetDesiredFailureMsg(
6590 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6591 "used without first calling vkBindImageMemory");
6592
6593 m_commandBuffer->BeginCommandBuffer();
6594 VkClearColorValue ccv;
6595 ccv.float32[0] = 1.0f;
6596 ccv.float32[1] = 1.0f;
6597 ccv.float32[2] = 1.0f;
6598 ccv.float32[3] = 1.0f;
6599 VkImageSubresourceRange isr = {};
6600 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6601 isr.baseArrayLayer = 0;
6602 isr.baseMipLevel = 0;
6603 isr.layerCount = 1;
6604 isr.levelCount = 1;
6605 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image,
6606 VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
6607 m_commandBuffer->EndCommandBuffer();
6608
6609 m_errorMonitor->VerifyFound();
6610 vkDestroyImage(m_device->device(), image, NULL);
6611 vkFreeMemory(m_device->device(), image_mem, nullptr);
6612}
6613
6614TEST_F(VkLayerTest, BufferMemoryNotBound) {
6615 TEST_DESCRIPTION(
6616 "Attempt to copy from a buffer which has not had memory bound to it.");
6617 ASSERT_NO_FATAL_FAILURE(InitState());
6618
6619 VkImageObj image(m_device);
6620 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
6621 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
6622 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
6623 VK_IMAGE_TILING_OPTIMAL, 0);
6624 ASSERT_TRUE(image.initialized());
6625
6626 VkBuffer buffer;
6627 VkDeviceMemory mem;
6628 VkMemoryRequirements mem_reqs;
6629
6630 VkBufferCreateInfo buf_info = {};
6631 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6632 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6633 buf_info.size = 256;
6634 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6635 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
6636 ASSERT_VK_SUCCESS(err);
6637
6638 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
6639
6640 VkMemoryAllocateInfo alloc_info = {};
6641 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6642 alloc_info.allocationSize = 256;
6643 bool pass = false;
6644 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
6645 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
6646 if (!pass) {
6647 vkDestroyBuffer(m_device->device(), buffer, NULL);
6648 return;
6649 }
6650 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
6651 ASSERT_VK_SUCCESS(err);
6652
6653 // Introduce failure by not calling vkBindBufferMemory(m_device->device(),
6654 // buffer, mem, 0);
6655 m_errorMonitor->SetDesiredFailureMsg(
6656 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6657 "used without first calling vkBindBufferMemory");
6658 VkBufferImageCopy region = {};
6659 region.bufferRowLength = 128;
6660 region.bufferImageHeight = 128;
6661 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6662
6663 region.imageSubresource.layerCount = 1;
6664 region.imageExtent.height = 4;
6665 region.imageExtent.width = 4;
6666 region.imageExtent.depth = 1;
6667 m_commandBuffer->BeginCommandBuffer();
6668 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer,
6669 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
6670 1, &region);
6671 m_commandBuffer->EndCommandBuffer();
6672
6673 m_errorMonitor->VerifyFound();
6674
6675 vkDestroyBuffer(m_device->device(), buffer, NULL);
6676 vkFreeMemory(m_device->handle(), mem, NULL);
6677}
6678
Tobin Ehlis85940f52016-07-07 16:57:21 -06006679TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
6680 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6681 "due to an event dependency being destroyed.");
6682 ASSERT_NO_FATAL_FAILURE(InitState());
6683
6684 VkEvent event;
6685 VkEventCreateInfo evci = {};
6686 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
6687 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
6688 ASSERT_VK_SUCCESS(result);
6689
6690 m_commandBuffer->BeginCommandBuffer();
6691 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event,
6692 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
6693 m_commandBuffer->EndCommandBuffer();
6694
6695 m_errorMonitor->SetDesiredFailureMsg(
6696 VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
6697 // Destroy event dependency prior to submit to cause ERROR
6698 vkDestroyEvent(m_device->device(), event, NULL);
6699
6700 VkSubmitInfo submit_info = {};
6701 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6702 submit_info.commandBufferCount = 1;
6703 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6704 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6705
6706 m_errorMonitor->VerifyFound();
6707}
6708
Tobin Ehlisdbea7552016-07-08 14:33:31 -06006709TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
6710 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6711 "due to a query pool dependency being destroyed.");
6712 ASSERT_NO_FATAL_FAILURE(InitState());
6713
6714 VkQueryPool query_pool;
6715 VkQueryPoolCreateInfo qpci{};
6716 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
6717 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
6718 qpci.queryCount = 1;
6719 VkResult result =
6720 vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
6721 ASSERT_VK_SUCCESS(result);
6722
6723 m_commandBuffer->BeginCommandBuffer();
6724 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
6725 m_commandBuffer->EndCommandBuffer();
6726
6727 m_errorMonitor->SetDesiredFailureMsg(
6728 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6729 " that is invalid because bound query pool ");
6730 // Destroy query pool dependency prior to submit to cause ERROR
6731 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
6732
6733 VkSubmitInfo submit_info = {};
6734 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6735 submit_info.commandBufferCount = 1;
6736 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6737 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6738
6739 m_errorMonitor->VerifyFound();
6740}
6741
Tobin Ehlis24130d92016-07-08 15:50:53 -06006742TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
6743 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6744 "due to a pipeline dependency being destroyed.");
6745 ASSERT_NO_FATAL_FAILURE(InitState());
6746 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6747
6748 VkResult err;
6749
6750 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6751 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6752
6753 VkPipelineLayout pipeline_layout;
6754 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6755 &pipeline_layout);
6756 ASSERT_VK_SUCCESS(err);
6757
6758 VkPipelineViewportStateCreateInfo vp_state_ci = {};
6759 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
6760 vp_state_ci.viewportCount = 1;
6761 VkViewport vp = {}; // Just need dummy vp to point to
6762 vp_state_ci.pViewports = &vp; // Null vp w/ count of 1 should cause error
6763 vp_state_ci.scissorCount = 1;
6764 VkRect2D scissors = {}; // Dummy scissors to point to
6765 vp_state_ci.pScissors = &scissors;
6766 // No dynamic state
6767 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
6768 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
6769
6770 VkPipelineShaderStageCreateInfo shaderStages[2];
6771 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
6772
6773 VkShaderObj vs(m_device, bindStateVertShaderText,
6774 VK_SHADER_STAGE_VERTEX_BIT, this);
6775 VkShaderObj fs(m_device, bindStateFragShaderText,
6776 VK_SHADER_STAGE_FRAGMENT_BIT,
6777 this); // We shouldn't need a fragment shader
6778 // but add it to be able to run on more devices
6779 shaderStages[0] = vs.GetStageCreateInfo();
6780 shaderStages[1] = fs.GetStageCreateInfo();
6781
6782 VkPipelineVertexInputStateCreateInfo vi_ci = {};
6783 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
6784
6785 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
6786 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
6787 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
6788
6789 VkPipelineRasterizationStateCreateInfo rs_ci = {};
6790 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
6791
6792 VkPipelineColorBlendAttachmentState att = {};
6793 att.blendEnable = VK_FALSE;
6794 att.colorWriteMask = 0xf;
6795
6796 VkPipelineColorBlendStateCreateInfo cb_ci = {};
6797 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
6798 cb_ci.attachmentCount = 1;
6799 cb_ci.pAttachments = &att;
6800
6801 VkGraphicsPipelineCreateInfo gp_ci = {};
6802 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
6803 gp_ci.stageCount = 2;
6804 gp_ci.pStages = shaderStages;
6805 gp_ci.pVertexInputState = &vi_ci;
6806 gp_ci.pInputAssemblyState = &ia_ci;
6807 gp_ci.pViewportState = &vp_state_ci;
6808 gp_ci.pRasterizationState = &rs_ci;
6809 gp_ci.pColorBlendState = &cb_ci;
6810 gp_ci.pDynamicState = &dyn_state_ci;
6811 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
6812 gp_ci.layout = pipeline_layout;
6813 gp_ci.renderPass = renderPass();
6814
6815 VkPipelineCacheCreateInfo pc_ci = {};
6816 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
6817
6818 VkPipeline pipeline;
6819 VkPipelineCache pipelineCache;
6820 err =
6821 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
6822 ASSERT_VK_SUCCESS(err);
6823
6824 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
6825 &gp_ci, NULL, &pipeline);
6826 ASSERT_VK_SUCCESS(err);
6827
6828 m_commandBuffer->BeginCommandBuffer();
6829 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6830 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
6831 m_commandBuffer->EndCommandBuffer();
6832 // Now destroy pipeline in order to cause error when submitting
6833 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
6834
6835 m_errorMonitor->SetDesiredFailureMsg(
6836 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6837 " that is invalid because bound pipeline ");
6838
6839 VkSubmitInfo submit_info = {};
6840 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6841 submit_info.commandBufferCount = 1;
6842 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6843 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6844
6845 m_errorMonitor->VerifyFound();
6846 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
6847 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6848}
6849
Karl Schultz6addd812016-02-02 17:17:23 -07006850TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006851 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6852 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006853 // Create a valid cmd buffer
6854 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006855 uint64_t fake_pipeline_handle = 0xbaad6001;
6856 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6858 "Invalid VkPipeline Object 0xbaad6001");
6859 ASSERT_NO_FATAL_FAILURE(InitState());
6860 BeginCommandBuffer();
6861 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6862 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
6863 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006864 // Now issue a draw call with no pipeline bound
6865 m_errorMonitor->SetDesiredFailureMsg(
6866 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6867 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tony Barbourdf4c0042016-06-01 15:55:43 -06006868
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006869 BeginCommandBuffer();
6870 Draw(1, 0, 0, 0);
6871 m_errorMonitor->VerifyFound();
6872 // Finally same check once more but with Dispatch/Compute
6873 m_errorMonitor->SetDesiredFailureMsg(
6874 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6875 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006876 BeginCommandBuffer();
6877 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6878 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006879}
6880
Karl Schultz6addd812016-02-02 17:17:23 -07006881TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
6882 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
6883 // CommandBuffer
6884 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006885
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006887 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006888
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006889 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006890 ASSERT_NO_FATAL_FAILURE(InitViewport());
6891 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006892 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006893 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6894 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006895
6896 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006897 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6898 ds_pool_ci.pNext = NULL;
6899 ds_pool_ci.maxSets = 1;
6900 ds_pool_ci.poolSizeCount = 1;
6901 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006902
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006903 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006904 err =
6905 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006906 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006907
Tony Barboureb254902015-07-15 12:50:33 -06006908 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006909 dsl_binding.binding = 0;
6910 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6911 dsl_binding.descriptorCount = 1;
6912 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6913 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006914
Tony Barboureb254902015-07-15 12:50:33 -06006915 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006916 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6917 ds_layout_ci.pNext = NULL;
6918 ds_layout_ci.bindingCount = 1;
6919 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006920 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006921 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6922 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006923 ASSERT_VK_SUCCESS(err);
6924
6925 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006926 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006927 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006928 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006929 alloc_info.descriptorPool = ds_pool;
6930 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006931 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6932 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006933 ASSERT_VK_SUCCESS(err);
6934
Tony Barboureb254902015-07-15 12:50:33 -06006935 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006936 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6937 pipeline_layout_ci.pNext = NULL;
6938 pipeline_layout_ci.setLayoutCount = 1;
6939 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006940
6941 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006942 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6943 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006944 ASSERT_VK_SUCCESS(err);
6945
Karl Schultz6addd812016-02-02 17:17:23 -07006946 VkShaderObj vs(m_device, bindStateVertShaderText,
6947 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006948 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006949 // on more devices
6950 VkShaderObj fs(m_device, bindStateFragShaderText,
6951 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006952
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006953 VkPipelineObj pipe(m_device);
6954 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006955 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006956 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006957 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006958
6959 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006960 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6961 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6962 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
6963 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
6964 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006965
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006966 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006967
Chia-I Wuf7458c52015-10-26 21:10:41 +08006968 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6969 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6970 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006971}
6972
Karl Schultz6addd812016-02-02 17:17:23 -07006973TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006974 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006975 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006976
Karl Schultz6addd812016-02-02 17:17:23 -07006977 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006978 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
6979 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006980
6981 ASSERT_NO_FATAL_FAILURE(InitState());
6982 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006983 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6984 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006985
6986 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006987 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6988 ds_pool_ci.pNext = NULL;
6989 ds_pool_ci.maxSets = 1;
6990 ds_pool_ci.poolSizeCount = 1;
6991 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006992
6993 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006994 err =
6995 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006996 ASSERT_VK_SUCCESS(err);
6997
6998 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006999 dsl_binding.binding = 0;
7000 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7001 dsl_binding.descriptorCount = 1;
7002 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7003 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007004
7005 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007006 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7007 ds_layout_ci.pNext = NULL;
7008 ds_layout_ci.bindingCount = 1;
7009 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007010 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007011 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7012 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007013 ASSERT_VK_SUCCESS(err);
7014
7015 VkDescriptorSet descriptorSet;
7016 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007017 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007018 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007019 alloc_info.descriptorPool = ds_pool;
7020 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007021 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7022 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007023 ASSERT_VK_SUCCESS(err);
7024
Karl Schultz6addd812016-02-02 17:17:23 -07007025 VkBufferView view =
7026 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007027 VkWriteDescriptorSet descriptor_write;
7028 memset(&descriptor_write, 0, sizeof(descriptor_write));
7029 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7030 descriptor_write.dstSet = descriptorSet;
7031 descriptor_write.dstBinding = 0;
7032 descriptor_write.descriptorCount = 1;
7033 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7034 descriptor_write.pTexelBufferView = &view;
7035
7036 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7037
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007038 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007039
7040 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7041 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7042}
7043
Mark Youngd339ba32016-05-30 13:28:35 -06007044TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
7045 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has"
7046 " no memory bound to it.");
7047
7048 VkResult err;
7049 m_errorMonitor->SetDesiredFailureMsg(
7050 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -06007051 "used without first calling vkBindBufferMemory");
Mark Youngd339ba32016-05-30 13:28:35 -06007052
7053 ASSERT_NO_FATAL_FAILURE(InitState());
7054
7055 // Create a buffer with no bound memory and then attempt to create
7056 // a buffer view.
7057 VkBufferCreateInfo buff_ci = {};
7058 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7059 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7060 buff_ci.size = 256;
7061 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7062 VkBuffer buffer;
7063 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
7064 ASSERT_VK_SUCCESS(err);
7065
7066 VkBufferViewCreateInfo buff_view_ci = {};
7067 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
7068 buff_view_ci.buffer = buffer;
7069 buff_view_ci.format = VK_FORMAT_R8_UNORM;
7070 buff_view_ci.range = VK_WHOLE_SIZE;
7071 VkBufferView buff_view;
7072 err =
7073 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
7074
7075 m_errorMonitor->VerifyFound();
7076 vkDestroyBuffer(m_device->device(), buffer, NULL);
7077 // If last error is success, it still created the view, so delete it.
7078 if (err == VK_SUCCESS) {
7079 vkDestroyBufferView(m_device->device(), buff_view, NULL);
7080 }
7081}
7082
Karl Schultz6addd812016-02-02 17:17:23 -07007083TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
7084 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
7085 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07007086 // 1. No dynamicOffset supplied
7087 // 2. Too many dynamicOffsets supplied
7088 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07007089 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007090 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007091 " requires 1 dynamicOffsets, but only "
7092 "0 dynamicOffsets are left in "
7093 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007094
7095 ASSERT_NO_FATAL_FAILURE(InitState());
7096 ASSERT_NO_FATAL_FAILURE(InitViewport());
7097 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7098
7099 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007100 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7101 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007102
7103 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007104 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7105 ds_pool_ci.pNext = NULL;
7106 ds_pool_ci.maxSets = 1;
7107 ds_pool_ci.poolSizeCount = 1;
7108 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007109
7110 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007111 err =
7112 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007113 ASSERT_VK_SUCCESS(err);
7114
7115 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007116 dsl_binding.binding = 0;
7117 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7118 dsl_binding.descriptorCount = 1;
7119 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7120 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007121
7122 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007123 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7124 ds_layout_ci.pNext = NULL;
7125 ds_layout_ci.bindingCount = 1;
7126 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007127 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007128 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7129 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007130 ASSERT_VK_SUCCESS(err);
7131
7132 VkDescriptorSet descriptorSet;
7133 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007134 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007135 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007136 alloc_info.descriptorPool = ds_pool;
7137 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007138 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7139 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007140 ASSERT_VK_SUCCESS(err);
7141
7142 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007143 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7144 pipeline_layout_ci.pNext = NULL;
7145 pipeline_layout_ci.setLayoutCount = 1;
7146 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007147
7148 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007149 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7150 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007151 ASSERT_VK_SUCCESS(err);
7152
7153 // Create a buffer to update the descriptor with
7154 uint32_t qfi = 0;
7155 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007156 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7157 buffCI.size = 1024;
7158 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7159 buffCI.queueFamilyIndexCount = 1;
7160 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007161
7162 VkBuffer dyub;
7163 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7164 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007165 // Allocate memory and bind to buffer so we can make it to the appropriate
7166 // error
7167 VkMemoryAllocateInfo mem_alloc = {};
7168 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7169 mem_alloc.pNext = NULL;
7170 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12007171 mem_alloc.memoryTypeIndex = 0;
7172
7173 VkMemoryRequirements memReqs;
7174 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
7175 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc,
7176 0);
7177 if (!pass) {
7178 vkDestroyBuffer(m_device->device(), dyub, NULL);
7179 return;
7180 }
7181
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007182 VkDeviceMemory mem;
7183 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
7184 ASSERT_VK_SUCCESS(err);
7185 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
7186 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007187 // Correctly update descriptor to avoid "NOT_UPDATED" error
7188 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007189 buffInfo.buffer = dyub;
7190 buffInfo.offset = 0;
7191 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007192
7193 VkWriteDescriptorSet descriptor_write;
7194 memset(&descriptor_write, 0, sizeof(descriptor_write));
7195 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7196 descriptor_write.dstSet = descriptorSet;
7197 descriptor_write.dstBinding = 0;
7198 descriptor_write.descriptorCount = 1;
7199 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7200 descriptor_write.pBufferInfo = &buffInfo;
7201
7202 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7203
7204 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007205 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7206 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7207 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007208 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07007209 uint32_t pDynOff[2] = {512, 756};
7210 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07007211 m_errorMonitor->SetDesiredFailureMsg(
7212 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07007213 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07007214 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7215 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7216 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12007217 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07007218 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7220 " dynamic offset 512 combined with "
7221 "offset 0 and range 1024 that "
7222 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07007223 // Create PSO to be used for draw-time errors below
7224 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007225 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007226 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007227 "out gl_PerVertex { \n"
7228 " vec4 gl_Position;\n"
7229 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007230 "void main(){\n"
7231 " gl_Position = vec4(1);\n"
7232 "}\n";
7233 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007234 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007235 "\n"
7236 "layout(location=0) out vec4 x;\n"
7237 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7238 "void main(){\n"
7239 " x = vec4(bar.y);\n"
7240 "}\n";
7241 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7242 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7243 VkPipelineObj pipe(m_device);
7244 pipe.AddShader(&vs);
7245 pipe.AddShader(&fs);
7246 pipe.AddColorAttachment();
7247 pipe.CreateVKPipeline(pipeline_layout, renderPass());
7248
Karl Schultz6addd812016-02-02 17:17:23 -07007249 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7250 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7251 // This update should succeed, but offset size of 512 will overstep buffer
7252 // /w range 1024 & size 1024
7253 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7254 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7255 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07007256 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007257 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007258
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007259 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06007260 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007261
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007262 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007263 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007264 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7265}
7266
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007267TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007268 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007269 ASSERT_NO_FATAL_FAILURE(InitState());
7270 ASSERT_NO_FATAL_FAILURE(InitViewport());
7271 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7272
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007273 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007274 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007275 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7276 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7277 pipeline_layout_ci.pushConstantRangeCount = 1;
7278 pipeline_layout_ci.pPushConstantRanges = &pc_range;
7279
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007280 //
7281 // Check for invalid push constant ranges in pipeline layouts.
7282 //
7283 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007284 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007285 char const *msg;
7286 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007287
Karl Schultzc81037d2016-05-12 08:11:23 -06007288 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
7289 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
7290 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7291 "vkCreatePipelineLayout() call has push constants index 0 with "
7292 "size 0."},
7293 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7294 "vkCreatePipelineLayout() call has push constants index 0 with "
7295 "size 1."},
7296 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
7297 "vkCreatePipelineLayout() call has push constants index 0 with "
7298 "size 1."},
7299 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
7300 "vkCreatePipelineLayout() call has push constants index 0 with "
7301 "size 0."},
7302 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7303 "vkCreatePipelineLayout() call has push constants index 0 with "
7304 "offset 1. Offset must"},
7305 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
7306 "vkCreatePipelineLayout() call has push constants index 0 "
7307 "with offset "},
7308 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
7309 "vkCreatePipelineLayout() call has push constants "
7310 "index 0 with offset "},
7311 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
7312 "vkCreatePipelineLayout() call has push constants index 0 "
7313 "with offset "},
7314 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
7315 "vkCreatePipelineLayout() call has push "
7316 "constants index 0 with offset "},
7317 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
7318 "vkCreatePipelineLayout() call has push "
7319 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007320 }};
7321
7322 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06007323 for (const auto &iter : range_tests) {
7324 pc_range = iter.range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007325 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7326 iter.msg);
7327 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7328 NULL, &pipeline_layout);
7329 m_errorMonitor->VerifyFound();
7330 if (VK_SUCCESS == err) {
7331 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7332 }
7333 }
7334
7335 // Check for invalid stage flag
7336 pc_range.offset = 0;
7337 pc_range.size = 16;
7338 pc_range.stageFlags = 0;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007339 m_errorMonitor->SetDesiredFailureMsg(
7340 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007341 "vkCreatePipelineLayout() call has no stageFlags set.");
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007342 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7343 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007344 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007345 if (VK_SUCCESS == err) {
7346 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7347 }
7348
7349 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06007350 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007351 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007352 VkPushConstantRange const ranges[ranges_per_test];
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007353 char const *msg;
7354 };
7355
Karl Schultzc81037d2016-05-12 08:11:23 -06007356 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007357 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7358 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7359 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7360 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7361 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7362 "vkCreatePipelineLayout() call has push constants with overlapping "
7363 "ranges: 0:[0, 4), 1:[0, 4)"},
7364 {
7365 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7366 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7367 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7368 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7369 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
7370 "vkCreatePipelineLayout() call has push constants with "
7371 "overlapping "
7372 "ranges: 3:[12, 20), 4:[16, 20)",
7373 },
7374 {
7375 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7376 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7377 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7378 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7379 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7380 "vkCreatePipelineLayout() call has push constants with "
7381 "overlapping "
7382 "ranges: 0:[16, 20), 1:[12, 20)",
7383 },
7384 {
7385 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7386 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7387 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7388 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7389 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7390 "vkCreatePipelineLayout() call has push constants with "
7391 "overlapping "
7392 "ranges: 0:[16, 20), 3:[12, 20)",
7393 },
7394 {
7395 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7396 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
7397 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
7398 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
7399 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
7400 "vkCreatePipelineLayout() call has push constants with "
7401 "overlapping "
7402 "ranges: 0:[16, 20), 2:[4, 100)",
7403 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007404
Karl Schultzc81037d2016-05-12 08:11:23 -06007405 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007406 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06007407 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
7408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007409 iter.msg);
7410 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7411 NULL, &pipeline_layout);
7412 m_errorMonitor->VerifyFound();
7413 if (VK_SUCCESS == err) {
7414 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7415 }
7416 }
7417
7418 // Run some positive tests to make sure overlap checking in the layer is OK
Karl Schultzc81037d2016-05-12 08:11:23 -06007419 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos =
7420 {{{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7421 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7422 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7423 {VK_SHADER_STAGE_VERTEX_BIT, 12, 4},
7424 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
7425 ""},
7426 {{{VK_SHADER_STAGE_VERTEX_BIT, 92, 24},
7427 {VK_SHADER_STAGE_VERTEX_BIT, 80, 4},
7428 {VK_SHADER_STAGE_VERTEX_BIT, 64, 8},
7429 {VK_SHADER_STAGE_VERTEX_BIT, 4, 16},
7430 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7431 ""}}};
7432 for (const auto &iter : overlapping_range_tests_pos) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007433 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
7434 m_errorMonitor->ExpectSuccess();
7435 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7436 NULL, &pipeline_layout);
7437 m_errorMonitor->VerifyNotFound();
7438 if (VK_SUCCESS == err) {
7439 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7440 }
7441 }
7442
7443 //
7444 // CmdPushConstants tests
7445 //
Karl Schultzc81037d2016-05-12 08:11:23 -06007446 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007447
7448 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzc81037d2016-05-12 08:11:23 -06007449 const std::array<PipelineLayoutTestCase, 16> cmd_range_tests = {{
7450 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7451 "vkCmdPushConstants() call has push constants with size 0. Size "
7452 "must be greater than zero and a multiple of 4."},
7453 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7454 "vkCmdPushConstants() call has push constants with size 1. Size "
7455 "must be greater than zero and a multiple of 4."},
7456 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
7457 "vkCmdPushConstants() call has push constants with size 1. Size "
7458 "must be greater than zero and a multiple of 4."},
7459 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
7460 "vkCmdPushConstants() call has push constants with offset 1. "
7461 "Offset must be a multiple of 4."},
7462 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7463 "vkCmdPushConstants() call has push constants with offset 1. "
7464 "Offset must be a multiple of 4."},
7465 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
7466 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
7467 "0x1 not within flag-matching ranges in pipeline layout"},
7468 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
7469 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
7470 "0x1 not within flag-matching ranges in pipeline layout"},
7471 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
7472 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
7473 "0x1 not within flag-matching ranges in pipeline layout"},
7474 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
7475 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
7476 "0x1 not within flag-matching ranges in pipeline layout"},
7477 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
7478 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
7479 "any of the ranges in pipeline layout"},
7480 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7481 0, 16},
7482 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
7483 "any of the ranges in pipeline layout"},
7484 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007485 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007486 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007487 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007488 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007489 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007490 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007491 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007492 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007493 "vkCmdPushConstants() call has push constants with offset "},
7494 }};
7495
7496 // Two ranges for testing robustness
Karl Schultzc81037d2016-05-12 08:11:23 -06007497 const VkPushConstantRange pc_range2[] = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007498 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06007499 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007500 };
Karl Schultzc81037d2016-05-12 08:11:23 -06007501 pipeline_layout_ci.pushConstantRangeCount =
7502 sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007503 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007504 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7505 &pipeline_layout);
7506 ASSERT_VK_SUCCESS(err);
7507 BeginCommandBuffer();
Karl Schultzc81037d2016-05-12 08:11:23 -06007508 for (const auto &iter : cmd_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007509 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7510 iter.msg);
7511 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
Karl Schultzc81037d2016-05-12 08:11:23 -06007512 iter.range.stageFlags, iter.range.offset,
7513 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007514 m_errorMonitor->VerifyFound();
7515 }
7516
7517 // Check for invalid stage flag
7518 m_errorMonitor->SetDesiredFailureMsg(
7519 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7520 "vkCmdPushConstants() call has no stageFlags set.");
7521 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0,
Karl Schultzc81037d2016-05-12 08:11:23 -06007522 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007523 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06007524 EndCommandBuffer();
7525 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
7526 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007527
Karl Schultzc81037d2016-05-12 08:11:23 -06007528 // overlapping range tests with cmd
7529 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
7530 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
7531 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
7532 "0x1 not within flag-matching ranges in pipeline layout"},
7533 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7534 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
7535 "0x1 not within flag-matching ranges in pipeline layout"},
7536 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
7537 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
7538 "0x1 not within flag-matching ranges in pipeline layout"},
7539 }};
7540 const VkPushConstantRange pc_range3[] = {
7541 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
7542 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7543 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7544 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
7545 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
7546 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
7547 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
7548 };
7549 pipeline_layout_ci.pushConstantRangeCount =
7550 sizeof(pc_range3) / sizeof(VkPushConstantRange);
7551 pipeline_layout_ci.pPushConstantRanges = pc_range3;
7552 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7553 &pipeline_layout);
7554 ASSERT_VK_SUCCESS(err);
7555 BeginCommandBuffer();
7556 for (const auto &iter : cmd_overlap_tests) {
7557 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7558 iter.msg);
7559 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
7560 iter.range.stageFlags, iter.range.offset,
7561 iter.range.size, dummy_values);
7562 m_errorMonitor->VerifyFound();
7563 }
7564 EndCommandBuffer();
7565 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
7566 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7567
7568 // positive overlapping range tests with cmd
7569 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = {{
7570 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, ""},
7571 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4}, ""},
7572 {{VK_SHADER_STAGE_VERTEX_BIT, 20, 12}, ""},
7573 {{VK_SHADER_STAGE_VERTEX_BIT, 56, 36}, ""},
7574 }};
7575 const VkPushConstantRange pc_range4[] = {
7576 {VK_SHADER_STAGE_VERTEX_BIT, 0, 64},
7577 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
7578 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7579 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7580 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
7581 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
7582 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
7583 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
7584 };
7585 pipeline_layout_ci.pushConstantRangeCount =
7586 sizeof(pc_range4) / sizeof(VkPushConstantRange);
7587 pipeline_layout_ci.pPushConstantRanges = pc_range4;
7588 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7589 &pipeline_layout);
7590 ASSERT_VK_SUCCESS(err);
7591 BeginCommandBuffer();
7592 for (const auto &iter : cmd_overlap_tests_pos) {
7593 m_errorMonitor->ExpectSuccess();
7594 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
7595 iter.range.stageFlags, iter.range.offset,
7596 iter.range.size, dummy_values);
7597 m_errorMonitor->VerifyNotFound();
7598 }
7599 EndCommandBuffer();
7600 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007601 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7602}
7603
Karl Schultz6addd812016-02-02 17:17:23 -07007604TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007605 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007606 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007607
7608 ASSERT_NO_FATAL_FAILURE(InitState());
7609 ASSERT_NO_FATAL_FAILURE(InitViewport());
7610 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7611
Mike Stroyanb8a61002016-06-20 16:00:28 -06007612 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
7613 VkImageTiling tiling;
7614 VkFormatProperties format_properties;
7615 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
7616 if (format_properties.linearTilingFeatures &
7617 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
7618 tiling = VK_IMAGE_TILING_LINEAR;
7619 } else if (format_properties.optimalTilingFeatures &
7620 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
7621 tiling = VK_IMAGE_TILING_OPTIMAL;
7622 } else {
7623 printf("Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
7624 "skipped.\n");
7625 return;
7626 }
7627
Tobin Ehlis559c6382015-11-05 09:52:49 -07007628 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7629 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007630 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7631 ds_type_count[0].descriptorCount = 10;
7632 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7633 ds_type_count[1].descriptorCount = 2;
7634 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7635 ds_type_count[2].descriptorCount = 2;
7636 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7637 ds_type_count[3].descriptorCount = 5;
7638 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7639 // type
7640 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7641 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7642 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007643
7644 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007645 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7646 ds_pool_ci.pNext = NULL;
7647 ds_pool_ci.maxSets = 5;
7648 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7649 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007650
7651 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007652 err =
7653 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007654 ASSERT_VK_SUCCESS(err);
7655
7656 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7657 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007658 dsl_binding[0].binding = 0;
7659 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7660 dsl_binding[0].descriptorCount = 5;
7661 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7662 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007663
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007664 // Create layout identical to set0 layout but w/ different stageFlags
7665 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007666 dsl_fs_stage_only.binding = 0;
7667 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7668 dsl_fs_stage_only.descriptorCount = 5;
7669 dsl_fs_stage_only.stageFlags =
7670 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7671 // bind time
7672 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007673 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007674 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7675 ds_layout_ci.pNext = NULL;
7676 ds_layout_ci.bindingCount = 1;
7677 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007678 static const uint32_t NUM_LAYOUTS = 4;
7679 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007680 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007681 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7682 // layout for error case
7683 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7684 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007685 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007686 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07007687 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7688 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007689 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007690 dsl_binding[0].binding = 0;
7691 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007692 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007693 dsl_binding[1].binding = 1;
7694 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7695 dsl_binding[1].descriptorCount = 2;
7696 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7697 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007698 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007699 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07007700 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7701 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007702 ASSERT_VK_SUCCESS(err);
7703 dsl_binding[0].binding = 0;
7704 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007705 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007706 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007707 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7708 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007709 ASSERT_VK_SUCCESS(err);
7710 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007711 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07007712 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7713 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007714 ASSERT_VK_SUCCESS(err);
7715
7716 static const uint32_t NUM_SETS = 4;
7717 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7718 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007719 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007720 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007721 alloc_info.descriptorPool = ds_pool;
7722 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007723 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7724 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007725 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007726 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007727 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007728 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07007729 err =
7730 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007731 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007732
7733 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007734 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7735 pipeline_layout_ci.pNext = NULL;
7736 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7737 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007738
7739 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007740 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7741 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007742 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007743 // Create pipelineLayout with only one setLayout
7744 pipeline_layout_ci.setLayoutCount = 1;
7745 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007746 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7747 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007748 ASSERT_VK_SUCCESS(err);
7749 // Create pipelineLayout with 2 descriptor setLayout at index 0
7750 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7751 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07007752 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7753 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007754 ASSERT_VK_SUCCESS(err);
7755 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7756 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7757 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07007758 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7759 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007760 ASSERT_VK_SUCCESS(err);
7761 // Create pipelineLayout with UB type, but stageFlags for FS only
7762 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7763 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07007764 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7765 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007766 ASSERT_VK_SUCCESS(err);
7767 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7768 VkDescriptorSetLayout pl_bad_s0[2] = {};
7769 pl_bad_s0[0] = ds_layout_fs_only;
7770 pl_bad_s0[1] = ds_layout[1];
7771 pipeline_layout_ci.setLayoutCount = 2;
7772 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7773 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07007774 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7775 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007776 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007777
7778 // Create a buffer to update the descriptor with
7779 uint32_t qfi = 0;
7780 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007781 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7782 buffCI.size = 1024;
7783 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7784 buffCI.queueFamilyIndexCount = 1;
7785 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007786
7787 VkBuffer dyub;
7788 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7789 ASSERT_VK_SUCCESS(err);
7790 // Correctly update descriptor to avoid "NOT_UPDATED" error
7791 static const uint32_t NUM_BUFFS = 5;
7792 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007793 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007794 buffInfo[i].buffer = dyub;
7795 buffInfo[i].offset = 0;
7796 buffInfo[i].range = 1024;
7797 }
Karl Schultz6addd812016-02-02 17:17:23 -07007798 VkImage image;
Karl Schultz6addd812016-02-02 17:17:23 -07007799 const int32_t tex_width = 32;
7800 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007801 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007802 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7803 image_create_info.pNext = NULL;
7804 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7805 image_create_info.format = tex_format;
7806 image_create_info.extent.width = tex_width;
7807 image_create_info.extent.height = tex_height;
7808 image_create_info.extent.depth = 1;
7809 image_create_info.mipLevels = 1;
7810 image_create_info.arrayLayers = 1;
7811 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyanb8a61002016-06-20 16:00:28 -06007812 image_create_info.tiling = tiling;
7813 image_create_info.usage =
7814 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07007815 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007816 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7817 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007818
Karl Schultz6addd812016-02-02 17:17:23 -07007819 VkMemoryRequirements memReqs;
7820 VkDeviceMemory imageMem;
7821 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007822 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007823 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7824 memAlloc.pNext = NULL;
7825 memAlloc.allocationSize = 0;
7826 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007827 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
7828 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007829 pass =
7830 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007831 ASSERT_TRUE(pass);
7832 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
7833 ASSERT_VK_SUCCESS(err);
7834 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
7835 ASSERT_VK_SUCCESS(err);
7836
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007837 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007838 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
7839 image_view_create_info.image = image;
7840 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7841 image_view_create_info.format = tex_format;
7842 image_view_create_info.subresourceRange.layerCount = 1;
7843 image_view_create_info.subresourceRange.baseMipLevel = 0;
7844 image_view_create_info.subresourceRange.levelCount = 1;
7845 image_view_create_info.subresourceRange.aspectMask =
7846 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007847
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007848 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007849 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7850 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007851 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007852 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007853 imageInfo[0].imageView = view;
7854 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
7855 imageInfo[1].imageView = view;
7856 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007857 imageInfo[2].imageView = view;
7858 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
7859 imageInfo[3].imageView = view;
7860 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007861
7862 static const uint32_t NUM_SET_UPDATES = 3;
7863 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
7864 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7865 descriptor_write[0].dstSet = descriptorSet[0];
7866 descriptor_write[0].dstBinding = 0;
7867 descriptor_write[0].descriptorCount = 5;
7868 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7869 descriptor_write[0].pBufferInfo = buffInfo;
7870 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7871 descriptor_write[1].dstSet = descriptorSet[1];
7872 descriptor_write[1].dstBinding = 0;
7873 descriptor_write[1].descriptorCount = 2;
7874 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7875 descriptor_write[1].pImageInfo = imageInfo;
7876 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7877 descriptor_write[2].dstSet = descriptorSet[1];
7878 descriptor_write[2].dstBinding = 1;
7879 descriptor_write[2].descriptorCount = 2;
7880 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007881 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007882
7883 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007884
Tobin Ehlis88452832015-12-03 09:40:56 -07007885 // Create PSO to be used for draw-time errors below
7886 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007887 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07007888 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007889 "out gl_PerVertex {\n"
7890 " vec4 gl_Position;\n"
7891 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07007892 "void main(){\n"
7893 " gl_Position = vec4(1);\n"
7894 "}\n";
7895 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007896 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07007897 "\n"
7898 "layout(location=0) out vec4 x;\n"
7899 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7900 "void main(){\n"
7901 " x = vec4(bar.y);\n"
7902 "}\n";
7903 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7904 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007905 VkPipelineObj pipe(m_device);
7906 pipe.AddShader(&vs);
7907 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007908 pipe.AddColorAttachment();
7909 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007910
7911 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07007912
Karl Schultz6addd812016-02-02 17:17:23 -07007913 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7914 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7915 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7916 // of PSO
7917 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7918 // cmd_pipeline.c
7919 // due to the fact that cmd_alloc_dset_data() has not been called in
7920 // cmd_bind_graphics_pipeline()
7921 // TODO : Want to cause various binding incompatibility issues here to test
7922 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007923 // First cause various verify_layout_compatibility() fails
7924 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007925 // verify_set_layout_compatibility fail cases:
7926 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07007927 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis10fad692016-07-07 12:00:36 -06007928 "Invalid VkPipelineLayout Object ");
Karl Schultz6addd812016-02-02 17:17:23 -07007929 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7930 VK_PIPELINE_BIND_POINT_GRAPHICS,
7931 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
7932 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007933 m_errorMonitor->VerifyFound();
7934
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007935 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07007936 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7937 " attempting to bind set to index 1");
7938 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7939 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
7940 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007941 m_errorMonitor->VerifyFound();
7942
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007943 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007944 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7945 // descriptors
7946 m_errorMonitor->SetDesiredFailureMsg(
7947 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06007948 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07007949 vkCmdBindDescriptorSets(
7950 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7951 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007952 m_errorMonitor->VerifyFound();
7953
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007954 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7955 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07007956 m_errorMonitor->SetDesiredFailureMsg(
7957 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06007958 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07007959 vkCmdBindDescriptorSets(
7960 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7961 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007962 m_errorMonitor->VerifyFound();
7963
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007964 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7965 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07007966 m_errorMonitor->SetDesiredFailureMsg(
7967 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06007968 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07007969 vkCmdBindDescriptorSets(
7970 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7971 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007972 m_errorMonitor->VerifyFound();
7973
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007974 // Cause INFO messages due to disturbing previously bound Sets
7975 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07007976 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7977 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7978 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007979 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07007980 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007981 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007982 " previously bound as set #0 was disturbed ");
7983 vkCmdBindDescriptorSets(
7984 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7985 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007986 m_errorMonitor->VerifyFound();
7987
Karl Schultz6addd812016-02-02 17:17:23 -07007988 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7989 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7990 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007991 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007992 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007993 " newly bound as set #0 so set #1 and "
7994 "any subsequent sets were disturbed ");
7995 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7996 VK_PIPELINE_BIND_POINT_GRAPHICS,
7997 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007998 m_errorMonitor->VerifyFound();
7999
Tobin Ehlis10fad692016-07-07 12:00:36 -06008000 // Now that we're done actively using the pipelineLayout that gfx pipeline
8001 // was created with, we should be able to delete it. Do that now to verify
8002 // that validation obeys pipelineLayout lifetime
8003 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
8004
Tobin Ehlis88452832015-12-03 09:40:56 -07008005 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07008006 // 1. Error due to not binding required set (we actually use same code as
8007 // above to disturb set0)
8008 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8009 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8010 2, &descriptorSet[0], 0, NULL);
8011 vkCmdBindDescriptorSets(
8012 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8013 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
8014 m_errorMonitor->SetDesiredFailureMsg(
8015 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8016 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07008017 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008018 m_errorMonitor->VerifyFound();
8019
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008020 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008021 // 2. Error due to bound set not being compatible with PSO's
8022 // VkPipelineLayout (diff stageFlags in this case)
8023 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8024 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8025 2, &descriptorSet[0], 0, NULL);
8026 m_errorMonitor->SetDesiredFailureMsg(
8027 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8028 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07008029 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008030 m_errorMonitor->VerifyFound();
8031
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008032 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07008033 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008034 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
8035 }
8036 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06008037 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
8038 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008039 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008040 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8041 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008042 vkFreeMemory(m_device->device(), imageMem, NULL);
8043 vkDestroyImage(m_device->device(), image, NULL);
8044 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008045}
Tobin Ehlis559c6382015-11-05 09:52:49 -07008046
Karl Schultz6addd812016-02-02 17:17:23 -07008047TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008048
Karl Schultz6addd812016-02-02 17:17:23 -07008049 m_errorMonitor->SetDesiredFailureMsg(
8050 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008051 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008052
8053 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008054 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008055 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008056 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008057
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008058 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008059}
8060
Karl Schultz6addd812016-02-02 17:17:23 -07008061TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
8062 VkResult err;
8063 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008064
Karl Schultz6addd812016-02-02 17:17:23 -07008065 m_errorMonitor->SetDesiredFailureMsg(
8066 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07008067 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008068
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008069 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008070
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008071 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008072 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06008073 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008074 cmd.commandPool = m_commandPool;
8075 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008076 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06008077
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008078 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06008079 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008080
8081 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008082 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07008083 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008084 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06008085 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008086 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
8087 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008088 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008089
8090 // The error should be caught by validation of the BeginCommandBuffer call
8091 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
8092
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008093 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008094 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008095}
8096
Karl Schultz6addd812016-02-02 17:17:23 -07008097TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008098 // Cause error due to Begin while recording CB
8099 // Then cause 2 errors for attempting to reset CB w/o having
8100 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
8101 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008102 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008103 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008104
8105 ASSERT_NO_FATAL_FAILURE(InitState());
8106
8107 // Calls AllocateCommandBuffers
8108 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
8109
Karl Schultz6addd812016-02-02 17:17:23 -07008110 // Force the failure by setting the Renderpass and Framebuffer fields with
8111 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008112 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07008113 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008114 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8115 cmd_buf_info.pNext = NULL;
8116 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008117 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008118
8119 // Begin CB to transition to recording state
8120 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
8121 // Can't re-begin. This should trigger error
8122 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008123 m_errorMonitor->VerifyFound();
8124
Karl Schultz6addd812016-02-02 17:17:23 -07008125 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8126 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008127 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
8128 // Reset attempt will trigger error due to incorrect CommandPool state
8129 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008130 m_errorMonitor->VerifyFound();
8131
Karl Schultz6addd812016-02-02 17:17:23 -07008132 m_errorMonitor->SetDesiredFailureMsg(
8133 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8134 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008135 // Transition CB to RECORDED state
8136 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
8137 // Now attempting to Begin will implicitly reset, which triggers error
8138 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008139 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008140}
8141
Karl Schultz6addd812016-02-02 17:17:23 -07008142TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008143 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07008144 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008145
Karl Schultz6addd812016-02-02 17:17:23 -07008146 m_errorMonitor->SetDesiredFailureMsg(
8147 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008148 "Invalid Pipeline CreateInfo State: Vtx Shader required");
8149
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008150 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008151 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008152
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008153 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008154 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8155 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06008156
8157 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008158 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8159 ds_pool_ci.pNext = NULL;
8160 ds_pool_ci.maxSets = 1;
8161 ds_pool_ci.poolSizeCount = 1;
8162 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008163
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008164 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008165 err =
8166 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008167 ASSERT_VK_SUCCESS(err);
8168
Tony Barboureb254902015-07-15 12:50:33 -06008169 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008170 dsl_binding.binding = 0;
8171 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8172 dsl_binding.descriptorCount = 1;
8173 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8174 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008175
Tony Barboureb254902015-07-15 12:50:33 -06008176 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008177 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8178 ds_layout_ci.pNext = NULL;
8179 ds_layout_ci.bindingCount = 1;
8180 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06008181
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008182 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008183 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8184 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008185 ASSERT_VK_SUCCESS(err);
8186
8187 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008188 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008189 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008190 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008191 alloc_info.descriptorPool = ds_pool;
8192 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008193 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8194 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008195 ASSERT_VK_SUCCESS(err);
8196
Tony Barboureb254902015-07-15 12:50:33 -06008197 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008198 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8199 pipeline_layout_ci.setLayoutCount = 1;
8200 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008201
8202 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008203 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8204 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008205 ASSERT_VK_SUCCESS(err);
8206
Tobin Ehlise68360f2015-10-01 11:15:13 -06008207 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008208 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06008209
8210 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008211 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8212 vp_state_ci.scissorCount = 1;
8213 vp_state_ci.pScissors = &sc;
8214 vp_state_ci.viewportCount = 1;
8215 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008216
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008217 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8218 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8219 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8220 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8221 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8222 rs_state_ci.depthClampEnable = VK_FALSE;
8223 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8224 rs_state_ci.depthBiasEnable = VK_FALSE;
8225
Tony Barboureb254902015-07-15 12:50:33 -06008226 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008227 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8228 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008229 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008230 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8231 gp_ci.layout = pipeline_layout;
8232 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06008233
8234 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008235 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8236 pc_ci.initialDataSize = 0;
8237 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008238
8239 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06008240 VkPipelineCache pipelineCache;
8241
Karl Schultz6addd812016-02-02 17:17:23 -07008242 err =
8243 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06008244 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008245 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8246 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008247
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008248 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008249
Chia-I Wuf7458c52015-10-26 21:10:41 +08008250 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8251 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8252 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8253 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008254}
Tobin Ehlis912df022015-09-17 08:46:18 -06008255/*// TODO : This test should be good, but needs Tess support in compiler to run
8256TEST_F(VkLayerTest, InvalidPatchControlPoints)
8257{
8258 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06008259 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008260
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008261 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008262 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
8263primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008264
Tobin Ehlis912df022015-09-17 08:46:18 -06008265 ASSERT_NO_FATAL_FAILURE(InitState());
8266 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06008267
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008268 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06008269 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008270 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008271
8272 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8273 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8274 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008275 ds_pool_ci.poolSizeCount = 1;
8276 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06008277
8278 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008279 err = vkCreateDescriptorPool(m_device->device(),
8280VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06008281 ASSERT_VK_SUCCESS(err);
8282
8283 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08008284 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06008285 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08008286 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008287 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8288 dsl_binding.pImmutableSamplers = NULL;
8289
8290 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008291 ds_layout_ci.sType =
8292VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06008293 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008294 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07008295 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06008296
8297 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008298 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8299&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06008300 ASSERT_VK_SUCCESS(err);
8301
8302 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07008303 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
8304VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06008305 ASSERT_VK_SUCCESS(err);
8306
8307 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008308 pipeline_layout_ci.sType =
8309VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06008310 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008311 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008312 pipeline_layout_ci.pSetLayouts = &ds_layout;
8313
8314 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008315 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8316&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06008317 ASSERT_VK_SUCCESS(err);
8318
8319 VkPipelineShaderStageCreateInfo shaderStages[3];
8320 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
8321
Karl Schultz6addd812016-02-02 17:17:23 -07008322 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
8323this);
Tobin Ehlis912df022015-09-17 08:46:18 -06008324 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07008325 VkShaderObj
8326tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
8327this);
8328 VkShaderObj
8329te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
8330this);
Tobin Ehlis912df022015-09-17 08:46:18 -06008331
Karl Schultz6addd812016-02-02 17:17:23 -07008332 shaderStages[0].sType =
8333VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008334 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008335 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07008336 shaderStages[1].sType =
8337VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008338 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008339 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07008340 shaderStages[2].sType =
8341VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008342 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008343 shaderStages[2].shader = te.handle();
8344
8345 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008346 iaCI.sType =
8347VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08008348 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06008349
8350 VkPipelineTessellationStateCreateInfo tsCI = {};
8351 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
8352 tsCI.patchControlPoints = 0; // This will cause an error
8353
8354 VkGraphicsPipelineCreateInfo gp_ci = {};
8355 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8356 gp_ci.pNext = NULL;
8357 gp_ci.stageCount = 3;
8358 gp_ci.pStages = shaderStages;
8359 gp_ci.pVertexInputState = NULL;
8360 gp_ci.pInputAssemblyState = &iaCI;
8361 gp_ci.pTessellationState = &tsCI;
8362 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008363 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06008364 gp_ci.pMultisampleState = NULL;
8365 gp_ci.pDepthStencilState = NULL;
8366 gp_ci.pColorBlendState = NULL;
8367 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8368 gp_ci.layout = pipeline_layout;
8369 gp_ci.renderPass = renderPass();
8370
8371 VkPipelineCacheCreateInfo pc_ci = {};
8372 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8373 pc_ci.pNext = NULL;
8374 pc_ci.initialSize = 0;
8375 pc_ci.initialData = 0;
8376 pc_ci.maxSize = 0;
8377
8378 VkPipeline pipeline;
8379 VkPipelineCache pipelineCache;
8380
Karl Schultz6addd812016-02-02 17:17:23 -07008381 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
8382&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06008383 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008384 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8385&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06008386
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008387 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008388
Chia-I Wuf7458c52015-10-26 21:10:41 +08008389 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8390 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8391 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8392 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06008393}
8394*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06008395// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07008396TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07008397 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008398
Karl Schultz6addd812016-02-02 17:17:23 -07008399 m_errorMonitor->SetDesiredFailureMsg(
8400 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008401 "Gfx Pipeline viewport count (1) must match scissor count (0).");
8402
Tobin Ehlise68360f2015-10-01 11:15:13 -06008403 ASSERT_NO_FATAL_FAILURE(InitState());
8404 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008405
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008406 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008407 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8408 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008409
8410 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008411 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8412 ds_pool_ci.maxSets = 1;
8413 ds_pool_ci.poolSizeCount = 1;
8414 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008415
8416 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008417 err =
8418 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008419 ASSERT_VK_SUCCESS(err);
8420
8421 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008422 dsl_binding.binding = 0;
8423 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8424 dsl_binding.descriptorCount = 1;
8425 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008426
8427 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008428 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8429 ds_layout_ci.bindingCount = 1;
8430 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008431
8432 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008433 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8434 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008435 ASSERT_VK_SUCCESS(err);
8436
8437 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008438 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008439 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008440 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008441 alloc_info.descriptorPool = ds_pool;
8442 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008443 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8444 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008445 ASSERT_VK_SUCCESS(err);
8446
8447 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008448 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8449 pipeline_layout_ci.setLayoutCount = 1;
8450 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008451
8452 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008453 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8454 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008455 ASSERT_VK_SUCCESS(err);
8456
8457 VkViewport vp = {}; // Just need dummy vp to point to
8458
8459 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008460 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8461 vp_state_ci.scissorCount = 0;
8462 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
8463 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008464
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008465 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8466 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8467 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8468 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8469 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8470 rs_state_ci.depthClampEnable = VK_FALSE;
8471 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8472 rs_state_ci.depthBiasEnable = VK_FALSE;
8473
Cody Northropeb3a6c12015-10-05 14:44:45 -06008474 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008475 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008476
Karl Schultz6addd812016-02-02 17:17:23 -07008477 VkShaderObj vs(m_device, bindStateVertShaderText,
8478 VK_SHADER_STAGE_VERTEX_BIT, this);
8479 VkShaderObj fs(m_device, bindStateFragShaderText,
8480 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008481 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008482 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008483 shaderStages[0] = vs.GetStageCreateInfo();
8484 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008485
8486 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008487 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8488 gp_ci.stageCount = 2;
8489 gp_ci.pStages = shaderStages;
8490 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008491 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008492 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8493 gp_ci.layout = pipeline_layout;
8494 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008495
8496 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008497 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008498
8499 VkPipeline pipeline;
8500 VkPipelineCache pipelineCache;
8501
Karl Schultz6addd812016-02-02 17:17:23 -07008502 err =
8503 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008504 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008505 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8506 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008507
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008508 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008509
Chia-I Wuf7458c52015-10-26 21:10:41 +08008510 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8511 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8512 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8513 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008514}
Karl Schultz6addd812016-02-02 17:17:23 -07008515// Don't set viewport state in PSO. This is an error b/c we always need this
8516// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06008517// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07008518TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06008519 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07008520 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008521
Karl Schultz6addd812016-02-02 17:17:23 -07008522 m_errorMonitor->SetDesiredFailureMsg(
8523 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008524 "Gfx Pipeline pViewportState is null. Even if ");
8525
Tobin Ehlise68360f2015-10-01 11:15:13 -06008526 ASSERT_NO_FATAL_FAILURE(InitState());
8527 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008528
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008529 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008530 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8531 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008532
8533 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008534 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8535 ds_pool_ci.maxSets = 1;
8536 ds_pool_ci.poolSizeCount = 1;
8537 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008538
8539 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008540 err =
8541 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008542 ASSERT_VK_SUCCESS(err);
8543
8544 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008545 dsl_binding.binding = 0;
8546 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8547 dsl_binding.descriptorCount = 1;
8548 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008549
8550 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008551 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8552 ds_layout_ci.bindingCount = 1;
8553 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008554
8555 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008556 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8557 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008558 ASSERT_VK_SUCCESS(err);
8559
8560 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008561 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008562 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008563 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008564 alloc_info.descriptorPool = ds_pool;
8565 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008566 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8567 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008568 ASSERT_VK_SUCCESS(err);
8569
8570 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008571 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8572 pipeline_layout_ci.setLayoutCount = 1;
8573 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008574
8575 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008576 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8577 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008578 ASSERT_VK_SUCCESS(err);
8579
8580 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8581 // Set scissor as dynamic to avoid second error
8582 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008583 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8584 dyn_state_ci.dynamicStateCount = 1;
8585 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008586
Cody Northropeb3a6c12015-10-05 14:44:45 -06008587 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008588 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008589
Karl Schultz6addd812016-02-02 17:17:23 -07008590 VkShaderObj vs(m_device, bindStateVertShaderText,
8591 VK_SHADER_STAGE_VERTEX_BIT, this);
8592 VkShaderObj fs(m_device, bindStateFragShaderText,
8593 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008594 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008595 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008596 shaderStages[0] = vs.GetStageCreateInfo();
8597 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008598
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008599
8600 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8601 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8602 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8603 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8604 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8605 rs_state_ci.depthClampEnable = VK_FALSE;
8606 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8607 rs_state_ci.depthBiasEnable = VK_FALSE;
8608
Tobin Ehlise68360f2015-10-01 11:15:13 -06008609 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008610 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8611 gp_ci.stageCount = 2;
8612 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008613 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008614 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
8615 // should cause validation error
8616 gp_ci.pDynamicState = &dyn_state_ci;
8617 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8618 gp_ci.layout = pipeline_layout;
8619 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008620
8621 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008622 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008623
8624 VkPipeline pipeline;
8625 VkPipelineCache pipelineCache;
8626
Karl Schultz6addd812016-02-02 17:17:23 -07008627 err =
8628 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008629 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008630 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8631 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008632
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008633 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008634
Chia-I Wuf7458c52015-10-26 21:10:41 +08008635 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8636 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8637 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8638 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008639}
8640// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07008641// Then run second test where dynamic scissor count doesn't match PSO scissor
8642// count
8643TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
8644 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008645
Karl Schultz6addd812016-02-02 17:17:23 -07008646 m_errorMonitor->SetDesiredFailureMsg(
8647 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008648 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
8649
Tobin Ehlise68360f2015-10-01 11:15:13 -06008650 ASSERT_NO_FATAL_FAILURE(InitState());
8651 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008652
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008653 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008654 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8655 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008656
8657 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008658 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8659 ds_pool_ci.maxSets = 1;
8660 ds_pool_ci.poolSizeCount = 1;
8661 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008662
8663 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008664 err =
8665 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008666 ASSERT_VK_SUCCESS(err);
8667
8668 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008669 dsl_binding.binding = 0;
8670 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8671 dsl_binding.descriptorCount = 1;
8672 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008673
8674 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008675 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8676 ds_layout_ci.bindingCount = 1;
8677 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008678
8679 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008680 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8681 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008682 ASSERT_VK_SUCCESS(err);
8683
8684 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008685 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008686 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008687 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008688 alloc_info.descriptorPool = ds_pool;
8689 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008690 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8691 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008692 ASSERT_VK_SUCCESS(err);
8693
8694 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008695 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8696 pipeline_layout_ci.setLayoutCount = 1;
8697 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008698
8699 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008700 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8701 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008702 ASSERT_VK_SUCCESS(err);
8703
8704 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008705 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8706 vp_state_ci.viewportCount = 1;
8707 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
8708 vp_state_ci.scissorCount = 1;
8709 vp_state_ci.pScissors =
8710 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008711
8712 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8713 // Set scissor as dynamic to avoid that error
8714 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008715 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8716 dyn_state_ci.dynamicStateCount = 1;
8717 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008718
Cody Northropeb3a6c12015-10-05 14:44:45 -06008719 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008720 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008721
Karl Schultz6addd812016-02-02 17:17:23 -07008722 VkShaderObj vs(m_device, bindStateVertShaderText,
8723 VK_SHADER_STAGE_VERTEX_BIT, this);
8724 VkShaderObj fs(m_device, bindStateFragShaderText,
8725 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008726 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008727 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008728 shaderStages[0] = vs.GetStageCreateInfo();
8729 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008730
Cody Northropf6622dc2015-10-06 10:33:21 -06008731 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8732 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8733 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008734 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008735 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008736 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008737 vi_ci.pVertexAttributeDescriptions = nullptr;
8738
8739 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8740 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8741 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8742
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008743 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008744 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06008745 rs_ci.pNext = nullptr;
8746
Mark Youngc89c6312016-03-31 16:03:20 -06008747 VkPipelineColorBlendAttachmentState att = {};
8748 att.blendEnable = VK_FALSE;
8749 att.colorWriteMask = 0xf;
8750
Cody Northropf6622dc2015-10-06 10:33:21 -06008751 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8752 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8753 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008754 cb_ci.attachmentCount = 1;
8755 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008756
Tobin Ehlise68360f2015-10-01 11:15:13 -06008757 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008758 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8759 gp_ci.stageCount = 2;
8760 gp_ci.pStages = shaderStages;
8761 gp_ci.pVertexInputState = &vi_ci;
8762 gp_ci.pInputAssemblyState = &ia_ci;
8763 gp_ci.pViewportState = &vp_state_ci;
8764 gp_ci.pRasterizationState = &rs_ci;
8765 gp_ci.pColorBlendState = &cb_ci;
8766 gp_ci.pDynamicState = &dyn_state_ci;
8767 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8768 gp_ci.layout = pipeline_layout;
8769 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008770
8771 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008772 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008773
8774 VkPipeline pipeline;
8775 VkPipelineCache pipelineCache;
8776
Karl Schultz6addd812016-02-02 17:17:23 -07008777 err =
8778 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008779 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008780 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8781 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008782
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008783 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008784
Tobin Ehlisd332f282015-10-02 11:00:56 -06008785 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008786 // First need to successfully create the PSO from above by setting
8787 // pViewports
8788 m_errorMonitor->SetDesiredFailureMsg(
8789 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8790 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
8791 "scissorCount is 1. These counts must match.");
8792
8793 VkViewport vp = {}; // Just need dummy vp to point to
8794 vp_state_ci.pViewports = &vp;
8795 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8796 &gp_ci, NULL, &pipeline);
8797 ASSERT_VK_SUCCESS(err);
8798 BeginCommandBuffer();
8799 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8800 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
8801 VkRect2D scissors[2] = {}; // don't care about data
8802 // Count of 2 doesn't match PSO count of 1
8803 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
8804 Draw(1, 0, 0, 0);
8805
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008806 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008807
8808 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8809 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8810 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8811 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008812 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008813}
8814// Create PSO w/o non-zero scissorCount but no scissor data
8815// Then run second test where dynamic viewportCount doesn't match PSO
8816// viewportCount
8817TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8818 VkResult err;
8819
8820 m_errorMonitor->SetDesiredFailureMsg(
8821 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8822 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
8823
8824 ASSERT_NO_FATAL_FAILURE(InitState());
8825 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8826
8827 VkDescriptorPoolSize ds_type_count = {};
8828 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8829 ds_type_count.descriptorCount = 1;
8830
8831 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8832 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8833 ds_pool_ci.maxSets = 1;
8834 ds_pool_ci.poolSizeCount = 1;
8835 ds_pool_ci.pPoolSizes = &ds_type_count;
8836
8837 VkDescriptorPool ds_pool;
8838 err =
8839 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
8840 ASSERT_VK_SUCCESS(err);
8841
8842 VkDescriptorSetLayoutBinding dsl_binding = {};
8843 dsl_binding.binding = 0;
8844 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8845 dsl_binding.descriptorCount = 1;
8846 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8847
8848 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8849 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8850 ds_layout_ci.bindingCount = 1;
8851 ds_layout_ci.pBindings = &dsl_binding;
8852
8853 VkDescriptorSetLayout ds_layout;
8854 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8855 &ds_layout);
8856 ASSERT_VK_SUCCESS(err);
8857
8858 VkDescriptorSet descriptorSet;
8859 VkDescriptorSetAllocateInfo alloc_info = {};
8860 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8861 alloc_info.descriptorSetCount = 1;
8862 alloc_info.descriptorPool = ds_pool;
8863 alloc_info.pSetLayouts = &ds_layout;
8864 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8865 &descriptorSet);
8866 ASSERT_VK_SUCCESS(err);
8867
8868 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8869 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8870 pipeline_layout_ci.setLayoutCount = 1;
8871 pipeline_layout_ci.pSetLayouts = &ds_layout;
8872
8873 VkPipelineLayout pipeline_layout;
8874 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8875 &pipeline_layout);
8876 ASSERT_VK_SUCCESS(err);
8877
8878 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8879 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8880 vp_state_ci.scissorCount = 1;
8881 vp_state_ci.pScissors =
8882 NULL; // Null scissor w/ count of 1 should cause error
8883 vp_state_ci.viewportCount = 1;
8884 vp_state_ci.pViewports =
8885 NULL; // vp is dynamic (below) so this won't cause error
8886
8887 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8888 // Set scissor as dynamic to avoid that error
8889 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8890 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8891 dyn_state_ci.dynamicStateCount = 1;
8892 dyn_state_ci.pDynamicStates = &vp_state;
8893
8894 VkPipelineShaderStageCreateInfo shaderStages[2];
8895 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8896
8897 VkShaderObj vs(m_device, bindStateVertShaderText,
8898 VK_SHADER_STAGE_VERTEX_BIT, this);
8899 VkShaderObj fs(m_device, bindStateFragShaderText,
8900 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008901 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008902 // but add it to be able to run on more devices
8903 shaderStages[0] = vs.GetStageCreateInfo();
8904 shaderStages[1] = fs.GetStageCreateInfo();
8905
8906 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8907 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8908 vi_ci.pNext = nullptr;
8909 vi_ci.vertexBindingDescriptionCount = 0;
8910 vi_ci.pVertexBindingDescriptions = nullptr;
8911 vi_ci.vertexAttributeDescriptionCount = 0;
8912 vi_ci.pVertexAttributeDescriptions = nullptr;
8913
8914 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8915 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8916 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8917
8918 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8919 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8920 rs_ci.pNext = nullptr;
8921
Mark Youngc89c6312016-03-31 16:03:20 -06008922 VkPipelineColorBlendAttachmentState att = {};
8923 att.blendEnable = VK_FALSE;
8924 att.colorWriteMask = 0xf;
8925
Karl Schultz6addd812016-02-02 17:17:23 -07008926 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8927 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8928 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008929 cb_ci.attachmentCount = 1;
8930 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008931
8932 VkGraphicsPipelineCreateInfo gp_ci = {};
8933 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8934 gp_ci.stageCount = 2;
8935 gp_ci.pStages = shaderStages;
8936 gp_ci.pVertexInputState = &vi_ci;
8937 gp_ci.pInputAssemblyState = &ia_ci;
8938 gp_ci.pViewportState = &vp_state_ci;
8939 gp_ci.pRasterizationState = &rs_ci;
8940 gp_ci.pColorBlendState = &cb_ci;
8941 gp_ci.pDynamicState = &dyn_state_ci;
8942 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8943 gp_ci.layout = pipeline_layout;
8944 gp_ci.renderPass = renderPass();
8945
8946 VkPipelineCacheCreateInfo pc_ci = {};
8947 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8948
8949 VkPipeline pipeline;
8950 VkPipelineCache pipelineCache;
8951
8952 err =
8953 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
8954 ASSERT_VK_SUCCESS(err);
8955 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8956 &gp_ci, NULL, &pipeline);
8957
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008958 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008959
8960 // Now hit second fail case where we set scissor w/ different count than PSO
8961 // First need to successfully create the PSO from above by setting
8962 // pViewports
8963 m_errorMonitor->SetDesiredFailureMsg(
8964 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8965 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
8966 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008967
Tobin Ehlisd332f282015-10-02 11:00:56 -06008968 VkRect2D sc = {}; // Just need dummy vp to point to
8969 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07008970 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8971 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008972 ASSERT_VK_SUCCESS(err);
8973 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008974 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8975 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008976 VkViewport viewports[2] = {}; // don't care about data
8977 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07008978 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008979 Draw(1, 0, 0, 0);
8980
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008981 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008982
Chia-I Wuf7458c52015-10-26 21:10:41 +08008983 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8984 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8985 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8986 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008987 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008988}
8989
Mark Young7394fdd2016-03-31 14:56:43 -06008990TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8991 VkResult err;
8992
8993 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06008994 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008995
8996 ASSERT_NO_FATAL_FAILURE(InitState());
8997 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8998
8999 VkDescriptorPoolSize ds_type_count = {};
9000 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9001 ds_type_count.descriptorCount = 1;
9002
9003 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9004 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9005 ds_pool_ci.maxSets = 1;
9006 ds_pool_ci.poolSizeCount = 1;
9007 ds_pool_ci.pPoolSizes = &ds_type_count;
9008
9009 VkDescriptorPool ds_pool;
9010 err =
9011 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9012 ASSERT_VK_SUCCESS(err);
9013
9014 VkDescriptorSetLayoutBinding dsl_binding = {};
9015 dsl_binding.binding = 0;
9016 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9017 dsl_binding.descriptorCount = 1;
9018 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9019
9020 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9021 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9022 ds_layout_ci.bindingCount = 1;
9023 ds_layout_ci.pBindings = &dsl_binding;
9024
9025 VkDescriptorSetLayout ds_layout;
9026 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9027 &ds_layout);
9028 ASSERT_VK_SUCCESS(err);
9029
9030 VkDescriptorSet descriptorSet;
9031 VkDescriptorSetAllocateInfo alloc_info = {};
9032 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9033 alloc_info.descriptorSetCount = 1;
9034 alloc_info.descriptorPool = ds_pool;
9035 alloc_info.pSetLayouts = &ds_layout;
9036 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9037 &descriptorSet);
9038 ASSERT_VK_SUCCESS(err);
9039
9040 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
9041 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9042 pipeline_layout_ci.setLayoutCount = 1;
9043 pipeline_layout_ci.pSetLayouts = &ds_layout;
9044
9045 VkPipelineLayout pipeline_layout;
9046 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9047 &pipeline_layout);
9048 ASSERT_VK_SUCCESS(err);
9049
9050 VkPipelineViewportStateCreateInfo vp_state_ci = {};
9051 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9052 vp_state_ci.scissorCount = 1;
9053 vp_state_ci.pScissors = NULL;
9054 vp_state_ci.viewportCount = 1;
9055 vp_state_ci.pViewports = NULL;
9056
9057 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
9058 VK_DYNAMIC_STATE_SCISSOR,
9059 VK_DYNAMIC_STATE_LINE_WIDTH};
9060 // Set scissor as dynamic to avoid that error
9061 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
9062 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9063 dyn_state_ci.dynamicStateCount = 2;
9064 dyn_state_ci.pDynamicStates = dynamic_states;
9065
9066 VkPipelineShaderStageCreateInfo shaderStages[2];
9067 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
9068
9069 VkShaderObj vs(m_device, bindStateVertShaderText,
9070 VK_SHADER_STAGE_VERTEX_BIT, this);
9071 VkShaderObj fs(m_device, bindStateFragShaderText,
9072 VK_SHADER_STAGE_FRAGMENT_BIT,
9073 this); // TODO - We shouldn't need a fragment shader
9074 // but add it to be able to run on more devices
9075 shaderStages[0] = vs.GetStageCreateInfo();
9076 shaderStages[1] = fs.GetStageCreateInfo();
9077
9078 VkPipelineVertexInputStateCreateInfo vi_ci = {};
9079 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9080 vi_ci.pNext = nullptr;
9081 vi_ci.vertexBindingDescriptionCount = 0;
9082 vi_ci.pVertexBindingDescriptions = nullptr;
9083 vi_ci.vertexAttributeDescriptionCount = 0;
9084 vi_ci.pVertexAttributeDescriptions = nullptr;
9085
9086 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
9087 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9088 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9089
9090 VkPipelineRasterizationStateCreateInfo rs_ci = {};
9091 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9092 rs_ci.pNext = nullptr;
9093
Mark Young47107952016-05-02 15:59:55 -06009094 // Check too low (line width of -1.0f).
9095 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06009096
9097 VkPipelineColorBlendAttachmentState att = {};
9098 att.blendEnable = VK_FALSE;
9099 att.colorWriteMask = 0xf;
9100
9101 VkPipelineColorBlendStateCreateInfo cb_ci = {};
9102 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
9103 cb_ci.pNext = nullptr;
9104 cb_ci.attachmentCount = 1;
9105 cb_ci.pAttachments = &att;
9106
9107 VkGraphicsPipelineCreateInfo gp_ci = {};
9108 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9109 gp_ci.stageCount = 2;
9110 gp_ci.pStages = shaderStages;
9111 gp_ci.pVertexInputState = &vi_ci;
9112 gp_ci.pInputAssemblyState = &ia_ci;
9113 gp_ci.pViewportState = &vp_state_ci;
9114 gp_ci.pRasterizationState = &rs_ci;
9115 gp_ci.pColorBlendState = &cb_ci;
9116 gp_ci.pDynamicState = &dyn_state_ci;
9117 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9118 gp_ci.layout = pipeline_layout;
9119 gp_ci.renderPass = renderPass();
9120
9121 VkPipelineCacheCreateInfo pc_ci = {};
9122 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9123
9124 VkPipeline pipeline;
9125 VkPipelineCache pipelineCache;
9126
9127 err =
9128 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9129 ASSERT_VK_SUCCESS(err);
9130 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9131 &gp_ci, NULL, &pipeline);
9132
9133 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009134 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009135
9136 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9137 "Attempt to set lineWidth to 65536");
9138
9139 // Check too high (line width of 65536.0f).
9140 rs_ci.lineWidth = 65536.0f;
9141
9142 err =
9143 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9144 ASSERT_VK_SUCCESS(err);
9145 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9146 &gp_ci, NULL, &pipeline);
9147
9148 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009149 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009150
9151 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06009152 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06009153
9154 dyn_state_ci.dynamicStateCount = 3;
9155
9156 rs_ci.lineWidth = 1.0f;
9157
9158 err =
9159 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9160 ASSERT_VK_SUCCESS(err);
9161 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9162 &gp_ci, NULL, &pipeline);
9163 BeginCommandBuffer();
9164 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9165 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
9166
9167 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06009168 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06009169 m_errorMonitor->VerifyFound();
9170
9171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9172 "Attempt to set lineWidth to 65536");
9173
9174 // Check too high with dynamic setting.
9175 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
9176 m_errorMonitor->VerifyFound();
9177 EndCommandBuffer();
9178
9179 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9180 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9181 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9182 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009183 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009184}
9185
Karl Schultz6addd812016-02-02 17:17:23 -07009186TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009187 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009188 m_errorMonitor->SetDesiredFailureMsg(
9189 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009190 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009191
9192 ASSERT_NO_FATAL_FAILURE(InitState());
9193 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009194
Tony Barbourfe3351b2015-07-28 10:17:20 -06009195 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009196 // Don't care about RenderPass handle b/c error should be flagged before
9197 // that
9198 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
9199 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009200
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009201 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009202}
9203
Karl Schultz6addd812016-02-02 17:17:23 -07009204TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009205 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009206 m_errorMonitor->SetDesiredFailureMsg(
9207 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009208 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009209
9210 ASSERT_NO_FATAL_FAILURE(InitState());
9211 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009212
Tony Barbourfe3351b2015-07-28 10:17:20 -06009213 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009214 // Just create a dummy Renderpass that's non-NULL so we can get to the
9215 // proper error
Chris Forbes38ae7c42016-06-21 20:51:44 +12009216 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
Karl Schultz6addd812016-02-02 17:17:23 -07009217 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009218
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009219 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009220}
9221
Chris Forbes2eeabe32016-06-21 20:52:34 +12009222TEST_F(VkLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
9223 m_errorMonitor->ExpectSuccess();
9224
9225 ASSERT_NO_FATAL_FAILURE(InitState());
9226 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9227
9228 BeginCommandBuffer(); // framework implicitly begins the renderpass.
9229 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // end implicit.
9230
9231 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
9232 VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9233 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9234 m_errorMonitor->VerifyNotFound();
9235 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
9236 VK_SUBPASS_CONTENTS_INLINE);
9237 m_errorMonitor->VerifyNotFound();
9238 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9239 m_errorMonitor->VerifyNotFound();
9240
9241 m_commandBuffer->EndCommandBuffer();
9242 m_errorMonitor->VerifyNotFound();
9243}
9244
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009245TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
9246 TEST_DESCRIPTION("Begin a renderPass where clearValueCount is less than"
9247 "the number of renderPass attachments that use loadOp"
9248 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
9249
9250 ASSERT_NO_FATAL_FAILURE(InitState());
9251 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9252
9253 // Create a renderPass with a single attachment that uses loadOp CLEAR
9254 VkAttachmentReference attach = {};
9255 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
9256 VkSubpassDescription subpass = {};
9257 subpass.inputAttachmentCount = 1;
9258 subpass.pInputAttachments = &attach;
9259 VkRenderPassCreateInfo rpci = {};
9260 rpci.subpassCount = 1;
9261 rpci.pSubpasses = &subpass;
9262 rpci.attachmentCount = 1;
9263 VkAttachmentDescription attach_desc = {};
9264 attach_desc.format = VK_FORMAT_UNDEFINED;
9265 // Set loadOp to CLEAR
9266 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
9267 rpci.pAttachments = &attach_desc;
9268 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9269 VkRenderPass rp;
9270 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
9271
9272 VkCommandBufferInheritanceInfo hinfo = {};
9273 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
9274 hinfo.renderPass = VK_NULL_HANDLE;
9275 hinfo.subpass = 0;
9276 hinfo.framebuffer = VK_NULL_HANDLE;
9277 hinfo.occlusionQueryEnable = VK_FALSE;
9278 hinfo.queryFlags = 0;
9279 hinfo.pipelineStatistics = 0;
9280 VkCommandBufferBeginInfo info = {};
9281 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
9282 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9283 info.pInheritanceInfo = &hinfo;
9284
9285 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
9286 VkRenderPassBeginInfo rp_begin = {};
9287 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
9288 rp_begin.pNext = NULL;
9289 rp_begin.renderPass = renderPass();
9290 rp_begin.framebuffer = framebuffer();
9291 rp_begin.clearValueCount = 0; // Should be 1
9292
9293 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis7f0416c2016-07-15 16:01:13 -06009294 " has a clearValueCount of 0 but "
9295 "there must be at least 1 entries in "
9296 "pClearValues array to account for ");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009297
9298 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
9299 VK_SUBPASS_CONTENTS_INLINE);
9300
9301 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06009302
9303 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009304}
9305
Cody Northrop3bb4d962016-05-09 16:15:57 -06009306TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
9307
9308 TEST_DESCRIPTION("End a command buffer with an active render pass");
9309
9310 m_errorMonitor->SetDesiredFailureMsg(
9311 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9312 "It is invalid to issue this call inside an active render pass");
9313
9314 ASSERT_NO_FATAL_FAILURE(InitState());
9315 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9316
9317 // The framework's BeginCommandBuffer calls CreateRenderPass
9318 BeginCommandBuffer();
9319
9320 // Call directly into vkEndCommandBuffer instead of the
9321 // the framework's EndCommandBuffer, which inserts a
9322 // vkEndRenderPass
9323 vkEndCommandBuffer(m_commandBuffer->GetBufferHandle());
9324
9325 m_errorMonitor->VerifyFound();
9326
9327 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
9328 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
9329}
9330
Karl Schultz6addd812016-02-02 17:17:23 -07009331TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009332 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07009333 m_errorMonitor->SetDesiredFailureMsg(
9334 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009335 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009336
9337 ASSERT_NO_FATAL_FAILURE(InitState());
9338 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009339
9340 // Renderpass is started here
9341 BeginCommandBuffer();
9342
9343 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009344 vk_testing::Buffer dstBuffer;
9345 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009346
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009347 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009348
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009349 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009350}
9351
Karl Schultz6addd812016-02-02 17:17:23 -07009352TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009353 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07009354 m_errorMonitor->SetDesiredFailureMsg(
9355 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009356 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009357
9358 ASSERT_NO_FATAL_FAILURE(InitState());
9359 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009360
9361 // Renderpass is started here
9362 BeginCommandBuffer();
9363
9364 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009365 vk_testing::Buffer dstBuffer;
9366 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009367
Karl Schultz6addd812016-02-02 17:17:23 -07009368 VkDeviceSize dstOffset = 0;
9369 VkDeviceSize dataSize = 1024;
Karl Schultzee344492016-07-11 15:09:57 -06009370 const void *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009371
Karl Schultz6addd812016-02-02 17:17:23 -07009372 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
9373 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009374
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009375 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009376}
9377
Karl Schultz6addd812016-02-02 17:17:23 -07009378TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009379 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009380 m_errorMonitor->SetDesiredFailureMsg(
9381 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009382 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009383
9384 ASSERT_NO_FATAL_FAILURE(InitState());
9385 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009386
9387 // Renderpass is started here
9388 BeginCommandBuffer();
9389
Michael Lentine0a369f62016-02-03 16:51:46 -06009390 VkClearColorValue clear_color;
9391 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07009392 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9393 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9394 const int32_t tex_width = 32;
9395 const int32_t tex_height = 32;
9396 VkImageCreateInfo image_create_info = {};
9397 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9398 image_create_info.pNext = NULL;
9399 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9400 image_create_info.format = tex_format;
9401 image_create_info.extent.width = tex_width;
9402 image_create_info.extent.height = tex_height;
9403 image_create_info.extent.depth = 1;
9404 image_create_info.mipLevels = 1;
9405 image_create_info.arrayLayers = 1;
9406 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9407 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9408 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009409
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009410 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07009411 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
9412 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009413
Karl Schultz6addd812016-02-02 17:17:23 -07009414 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
9415 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009416
Karl Schultz6addd812016-02-02 17:17:23 -07009417 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
9418 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009419
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009420 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009421}
9422
Karl Schultz6addd812016-02-02 17:17:23 -07009423TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009424 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009425 m_errorMonitor->SetDesiredFailureMsg(
9426 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009427 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009428
9429 ASSERT_NO_FATAL_FAILURE(InitState());
9430 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009431
9432 // Renderpass is started here
9433 BeginCommandBuffer();
9434
9435 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07009436 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009437 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
9438 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9439 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
9440 image_create_info.extent.width = 64;
9441 image_create_info.extent.height = 64;
9442 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9443 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009444
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009445 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07009446 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
9447 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009448
Karl Schultz6addd812016-02-02 17:17:23 -07009449 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
9450 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009451
Karl Schultz6addd812016-02-02 17:17:23 -07009452 vkCmdClearDepthStencilImage(
9453 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
9454 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
9455 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009456
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009457 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009458}
9459
Karl Schultz6addd812016-02-02 17:17:23 -07009460TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009461 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009462 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009463
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009464 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -06009465 "vkCmdClearAttachments(): This call "
Karl Schultz6addd812016-02-02 17:17:23 -07009466 "must be issued inside an active "
9467 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009468
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009469 ASSERT_NO_FATAL_FAILURE(InitState());
9470 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009471
9472 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009473 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009474 ASSERT_VK_SUCCESS(err);
9475
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009476 VkClearAttachment color_attachment;
9477 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9478 color_attachment.clearValue.color.float32[0] = 0;
9479 color_attachment.clearValue.color.float32[1] = 0;
9480 color_attachment.clearValue.color.float32[2] = 0;
9481 color_attachment.clearValue.color.float32[3] = 0;
9482 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009483 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
9484 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
9485 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009486
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009487 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009488}
9489
Karl Schultz9e66a292016-04-21 15:57:51 -06009490TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
9491 // Try to add a buffer memory barrier with no buffer.
9492 m_errorMonitor->SetDesiredFailureMsg(
9493 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9494 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
9495
9496 ASSERT_NO_FATAL_FAILURE(InitState());
9497 BeginCommandBuffer();
9498
9499 VkBufferMemoryBarrier buf_barrier = {};
9500 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9501 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9502 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9503 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9504 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9505 buf_barrier.buffer = VK_NULL_HANDLE;
9506 buf_barrier.offset = 0;
9507 buf_barrier.size = VK_WHOLE_SIZE;
9508 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9509 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
9510 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
9511
9512 m_errorMonitor->VerifyFound();
9513}
9514
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009515TEST_F(VkLayerTest, InvalidBarriers) {
9516 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
9517
9518 m_errorMonitor->SetDesiredFailureMsg(
9519 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
9520
9521 ASSERT_NO_FATAL_FAILURE(InitState());
9522 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9523
9524 VkMemoryBarrier mem_barrier = {};
9525 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
9526 mem_barrier.pNext = NULL;
9527 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9528 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9529 BeginCommandBuffer();
9530 // BeginCommandBuffer() starts a render pass
9531 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9532 VK_PIPELINE_STAGE_HOST_BIT,
9533 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
9534 &mem_barrier, 0, nullptr, 0, nullptr);
9535 m_errorMonitor->VerifyFound();
9536
9537 m_errorMonitor->SetDesiredFailureMsg(
9538 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9539 "Image Layout cannot be transitioned to UNDEFINED");
9540 VkImageObj image(m_device);
9541 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
9542 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9543 ASSERT_TRUE(image.initialized());
9544 VkImageMemoryBarrier img_barrier = {};
9545 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9546 img_barrier.pNext = NULL;
9547 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9548 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9549 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9550 // New layout can't be UNDEFINED
9551 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9552 img_barrier.image = image.handle();
9553 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9554 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9555 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9556 img_barrier.subresourceRange.baseArrayLayer = 0;
9557 img_barrier.subresourceRange.baseMipLevel = 0;
9558 img_barrier.subresourceRange.layerCount = 1;
9559 img_barrier.subresourceRange.levelCount = 1;
9560 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9561 VK_PIPELINE_STAGE_HOST_BIT,
9562 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9563 nullptr, 1, &img_barrier);
9564 m_errorMonitor->VerifyFound();
9565 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9566
9567 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9568 "Subresource must have the sum of the "
9569 "baseArrayLayer");
9570 // baseArrayLayer + layerCount must be <= image's arrayLayers
9571 img_barrier.subresourceRange.baseArrayLayer = 1;
9572 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9573 VK_PIPELINE_STAGE_HOST_BIT,
9574 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9575 nullptr, 1, &img_barrier);
9576 m_errorMonitor->VerifyFound();
9577 img_barrier.subresourceRange.baseArrayLayer = 0;
9578
9579 m_errorMonitor->SetDesiredFailureMsg(
9580 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9581 "Subresource must have the sum of the baseMipLevel");
9582 // baseMipLevel + levelCount must be <= image's mipLevels
9583 img_barrier.subresourceRange.baseMipLevel = 1;
9584 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9585 VK_PIPELINE_STAGE_HOST_BIT,
9586 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9587 nullptr, 1, &img_barrier);
9588 m_errorMonitor->VerifyFound();
9589 img_barrier.subresourceRange.baseMipLevel = 0;
9590
9591 m_errorMonitor->SetDesiredFailureMsg(
9592 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9593 "Buffer Barriers cannot be used during a render pass");
9594 vk_testing::Buffer buffer;
9595 buffer.init(*m_device, 256);
9596 VkBufferMemoryBarrier buf_barrier = {};
9597 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9598 buf_barrier.pNext = NULL;
9599 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9600 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9601 buf_barrier.buffer = buffer.handle();
9602 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9603 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9604 buf_barrier.offset = 0;
9605 buf_barrier.size = VK_WHOLE_SIZE;
9606 // Can't send buffer barrier during a render pass
9607 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9608 VK_PIPELINE_STAGE_HOST_BIT,
9609 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9610 &buf_barrier, 0, nullptr);
9611 m_errorMonitor->VerifyFound();
9612 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9613
9614 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9615 "which is not less than total size");
9616 buf_barrier.offset = 257;
9617 // Offset greater than total size
9618 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9619 VK_PIPELINE_STAGE_HOST_BIT,
9620 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9621 &buf_barrier, 0, nullptr);
9622 m_errorMonitor->VerifyFound();
9623 buf_barrier.offset = 0;
9624
9625 m_errorMonitor->SetDesiredFailureMsg(
9626 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
9627 buf_barrier.size = 257;
9628 // Size greater than total size
9629 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9630 VK_PIPELINE_STAGE_HOST_BIT,
9631 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9632 &buf_barrier, 0, nullptr);
9633 m_errorMonitor->VerifyFound();
9634 buf_barrier.size = VK_WHOLE_SIZE;
9635
9636 m_errorMonitor->SetDesiredFailureMsg(
9637 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9638 "Image is a depth and stencil format and thus must "
9639 "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
9640 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
9641 VkDepthStencilObj ds_image(m_device);
9642 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
9643 ASSERT_TRUE(ds_image.initialized());
9644 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9645 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9646 img_barrier.image = ds_image.handle();
9647 // Leave aspectMask at COLOR on purpose
9648 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9649 VK_PIPELINE_STAGE_HOST_BIT,
9650 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9651 nullptr, 1, &img_barrier);
9652 m_errorMonitor->VerifyFound();
9653}
9654
Karl Schultz6addd812016-02-02 17:17:23 -07009655TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009656 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009657 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009658
Karl Schultz6addd812016-02-02 17:17:23 -07009659 m_errorMonitor->SetDesiredFailureMsg(
9660 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009661 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
9662
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009663 ASSERT_NO_FATAL_FAILURE(InitState());
9664 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009665 uint32_t qfi = 0;
9666 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009667 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9668 buffCI.size = 1024;
9669 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9670 buffCI.queueFamilyIndexCount = 1;
9671 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009672
9673 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009674 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009675 ASSERT_VK_SUCCESS(err);
9676
9677 BeginCommandBuffer();
9678 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009679 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9680 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009681 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07009682 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
9683 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009684
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009685 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009686
Chia-I Wuf7458c52015-10-26 21:10:41 +08009687 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009688}
9689
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009690TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9691 // Create an out-of-range queueFamilyIndex
9692 m_errorMonitor->SetDesiredFailureMsg(
9693 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesde628532016-04-21 16:30:17 -06009694 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
9695 "of the indices specified when the device was created, via the "
9696 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009697
9698 ASSERT_NO_FATAL_FAILURE(InitState());
9699 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9700 VkBufferCreateInfo buffCI = {};
9701 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9702 buffCI.size = 1024;
9703 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9704 buffCI.queueFamilyIndexCount = 1;
9705 // Introduce failure by specifying invalid queue_family_index
9706 uint32_t qfi = 777;
9707 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06009708 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009709
9710 VkBuffer ib;
9711 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
9712
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009713 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009714 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009715}
9716
Karl Schultz6addd812016-02-02 17:17:23 -07009717TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
9718 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
9719 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009720
Karl Schultz6addd812016-02-02 17:17:23 -07009721 m_errorMonitor->SetDesiredFailureMsg(
9722 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009723 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009724
9725 ASSERT_NO_FATAL_FAILURE(InitState());
9726 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009727
9728 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009729 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009730 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
9731 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009732
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009733 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009734}
9735
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009736TEST_F(VkLayerTest, DSUsageBitsErrors) {
9737 TEST_DESCRIPTION("Attempt to update descriptor sets for images and buffers "
9738 "that do not have correct usage bits sets.");
9739 VkResult err;
9740
9741 ASSERT_NO_FATAL_FAILURE(InitState());
9742 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9743 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9744 ds_type_count[i].type = VkDescriptorType(i);
9745 ds_type_count[i].descriptorCount = 1;
9746 }
9747 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9748 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9749 ds_pool_ci.pNext = NULL;
9750 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9751 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9752 ds_pool_ci.pPoolSizes = ds_type_count;
9753
9754 VkDescriptorPool ds_pool;
9755 err =
9756 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9757 ASSERT_VK_SUCCESS(err);
9758
9759 // Create 10 layouts where each has a single descriptor of different type
9760 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] =
9761 {};
9762 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9763 dsl_binding[i].binding = 0;
9764 dsl_binding[i].descriptorType = VkDescriptorType(i);
9765 dsl_binding[i].descriptorCount = 1;
9766 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9767 dsl_binding[i].pImmutableSamplers = NULL;
9768 }
9769
9770 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9771 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9772 ds_layout_ci.pNext = NULL;
9773 ds_layout_ci.bindingCount = 1;
9774 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9775 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9776 ds_layout_ci.pBindings = dsl_binding + i;
9777 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
9778 NULL, ds_layouts + i);
9779 ASSERT_VK_SUCCESS(err);
9780 }
9781 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9782 VkDescriptorSetAllocateInfo alloc_info = {};
9783 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9784 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9785 alloc_info.descriptorPool = ds_pool;
9786 alloc_info.pSetLayouts = ds_layouts;
9787 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9788 descriptor_sets);
9789 ASSERT_VK_SUCCESS(err);
9790
9791 // Create a buffer & bufferView to be used for invalid updates
9792 VkBufferCreateInfo buff_ci = {};
9793 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9794 // This usage is not valid for any descriptor type
9795 buff_ci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
9796 buff_ci.size = 256;
9797 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9798 VkBuffer buffer;
9799 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9800 ASSERT_VK_SUCCESS(err);
9801
9802 VkBufferViewCreateInfo buff_view_ci = {};
9803 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9804 buff_view_ci.buffer = buffer;
9805 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9806 buff_view_ci.range = VK_WHOLE_SIZE;
9807 VkBufferView buff_view;
9808 err =
9809 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
9810 ASSERT_VK_SUCCESS(err);
9811
9812 // Create an image to be used for invalid updates
9813 VkImageCreateInfo image_ci = {};
9814 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9815 image_ci.imageType = VK_IMAGE_TYPE_2D;
9816 image_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
9817 image_ci.extent.width = 64;
9818 image_ci.extent.height = 64;
9819 image_ci.extent.depth = 1;
9820 image_ci.mipLevels = 1;
9821 image_ci.arrayLayers = 1;
9822 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
9823 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9824 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
9825 // This usage is not valid for any descriptor type
9826 image_ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9827 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9828 VkImage image;
9829 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9830 ASSERT_VK_SUCCESS(err);
9831 // Bind memory to image
9832 VkMemoryRequirements mem_reqs;
9833 VkDeviceMemory image_mem;
9834 bool pass;
9835 VkMemoryAllocateInfo mem_alloc = {};
9836 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9837 mem_alloc.pNext = NULL;
9838 mem_alloc.allocationSize = 0;
9839 mem_alloc.memoryTypeIndex = 0;
9840 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9841 mem_alloc.allocationSize = mem_reqs.size;
9842 pass =
9843 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
9844 ASSERT_TRUE(pass);
9845 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9846 ASSERT_VK_SUCCESS(err);
9847 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9848 ASSERT_VK_SUCCESS(err);
9849 // Now create view for image
9850 VkImageViewCreateInfo image_view_ci = {};
9851 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9852 image_view_ci.image = image;
9853 image_view_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
9854 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9855 image_view_ci.subresourceRange.layerCount = 1;
9856 image_view_ci.subresourceRange.baseArrayLayer = 0;
9857 image_view_ci.subresourceRange.levelCount = 1;
9858 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9859 VkImageView image_view;
9860 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
9861 &image_view);
9862 ASSERT_VK_SUCCESS(err);
9863
9864 VkDescriptorBufferInfo buff_info = {};
9865 buff_info.buffer = buffer;
9866 VkDescriptorImageInfo img_info = {};
9867 img_info.imageView = image_view;
9868 VkWriteDescriptorSet descriptor_write = {};
9869 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9870 descriptor_write.dstBinding = 0;
9871 descriptor_write.descriptorCount = 1;
9872 descriptor_write.pTexelBufferView = &buff_view;
9873 descriptor_write.pBufferInfo = &buff_info;
9874 descriptor_write.pImageInfo = &img_info;
9875
9876 // These error messages align with VkDescriptorType struct
9877 const char *error_msgs[] = {
9878 "", // placeholder, no error for SAMPLER descriptor
9879 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
9880 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
9881 " does not have VK_IMAGE_USAGE_STORAGE_BIT set.",
9882 " does not have VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT set.",
9883 " does not have VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set.",
9884 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
9885 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
9886 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
9887 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
9888 " does not have VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set."};
9889 // Start loop at 1 as SAMPLER desc type has no usage bit error
9890 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9891 descriptor_write.descriptorType = VkDescriptorType(i);
9892 descriptor_write.dstSet = descriptor_sets[i];
9893 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9894 error_msgs[i]);
9895
9896 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
9897 NULL);
9898
9899 m_errorMonitor->VerifyFound();
9900 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
9901 }
9902 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9903 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009904 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009905 vkDestroyImageView(m_device->device(), image_view, NULL);
9906 vkDestroyBuffer(m_device->device(), buffer, NULL);
9907 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9908 vkFreeDescriptorSets(m_device->device(), ds_pool,
9909 VK_DESCRIPTOR_TYPE_RANGE_SIZE, descriptor_sets);
9910 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9911}
9912
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009913TEST_F(VkLayerTest, DSBufferInfoErrors) {
9914 TEST_DESCRIPTION(
9915 "Attempt to update buffer descriptor set that has incorrect "
9916 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
9917 "1. offset value greater than buffer size\n"
9918 "2. range value of 0\n"
9919 "3. range value greater than buffer (size - offset)");
9920 VkResult err;
9921
9922 ASSERT_NO_FATAL_FAILURE(InitState());
9923 VkDescriptorPoolSize ds_type_count = {};
9924 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9925 ds_type_count.descriptorCount = 1;
9926
9927 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9928 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9929 ds_pool_ci.pNext = NULL;
9930 ds_pool_ci.maxSets = 1;
9931 ds_pool_ci.poolSizeCount = 1;
9932 ds_pool_ci.pPoolSizes = &ds_type_count;
9933
9934 VkDescriptorPool ds_pool;
9935 err =
9936 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9937 ASSERT_VK_SUCCESS(err);
9938
9939 // Create layout with single uniform buffer descriptor
9940 VkDescriptorSetLayoutBinding dsl_binding = {};
9941 dsl_binding.binding = 0;
9942 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9943 dsl_binding.descriptorCount = 1;
9944 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9945 dsl_binding.pImmutableSamplers = NULL;
9946
9947 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9948 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9949 ds_layout_ci.pNext = NULL;
9950 ds_layout_ci.bindingCount = 1;
9951 ds_layout_ci.pBindings = &dsl_binding;
9952 VkDescriptorSetLayout ds_layout;
9953 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9954 &ds_layout);
9955 ASSERT_VK_SUCCESS(err);
9956
9957 VkDescriptorSet descriptor_set = {};
9958 VkDescriptorSetAllocateInfo alloc_info = {};
9959 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9960 alloc_info.descriptorSetCount = 1;
9961 alloc_info.descriptorPool = ds_pool;
9962 alloc_info.pSetLayouts = &ds_layout;
9963 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9964 &descriptor_set);
9965 ASSERT_VK_SUCCESS(err);
9966
9967 // Create a buffer to be used for invalid updates
9968 VkBufferCreateInfo buff_ci = {};
9969 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9970 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9971 buff_ci.size = 256;
9972 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9973 VkBuffer buffer;
9974 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9975 ASSERT_VK_SUCCESS(err);
9976 // Have to bind memory to buffer before descriptor update
9977 VkMemoryAllocateInfo mem_alloc = {};
9978 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9979 mem_alloc.pNext = NULL;
9980 mem_alloc.allocationSize = 256;
9981 mem_alloc.memoryTypeIndex = 0;
9982
9983 VkMemoryRequirements mem_reqs;
9984 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
9985 bool pass =
9986 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
9987 if (!pass) {
9988 vkDestroyBuffer(m_device->device(), buffer, NULL);
9989 return;
9990 }
9991
9992 VkDeviceMemory mem;
9993 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
9994 ASSERT_VK_SUCCESS(err);
9995 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9996 ASSERT_VK_SUCCESS(err);
9997
9998 VkDescriptorBufferInfo buff_info = {};
9999 buff_info.buffer = buffer;
10000 // First make offset 1 larger than buffer size
10001 buff_info.offset = 257;
10002 buff_info.range = VK_WHOLE_SIZE;
10003 VkWriteDescriptorSet descriptor_write = {};
10004 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10005 descriptor_write.dstBinding = 0;
10006 descriptor_write.descriptorCount = 1;
10007 descriptor_write.pTexelBufferView = nullptr;
10008 descriptor_write.pBufferInfo = &buff_info;
10009 descriptor_write.pImageInfo = nullptr;
10010
10011 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10012 descriptor_write.dstSet = descriptor_set;
10013 m_errorMonitor->SetDesiredFailureMsg(
10014 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10015 " offset of 257 is greater than buffer ");
10016
10017 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10018
10019 m_errorMonitor->VerifyFound();
10020 // Now cause error due to range of 0
10021 buff_info.offset = 0;
10022 buff_info.range = 0;
10023 m_errorMonitor->SetDesiredFailureMsg(
10024 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10025 " range is not VK_WHOLE_SIZE and is zero, which is not allowed.");
10026
10027 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10028
10029 m_errorMonitor->VerifyFound();
10030 // Now cause error due to range exceeding buffer size - offset
10031 buff_info.offset = 128;
10032 buff_info.range = 200;
10033 m_errorMonitor->SetDesiredFailureMsg(
10034 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10035 " range is 200 which is greater than buffer size ");
10036
10037 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10038
10039 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -060010040 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010041 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10042 vkDestroyBuffer(m_device->device(), buffer, NULL);
10043 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10044 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10045}
10046
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010047TEST_F(VkLayerTest, DSAspectBitsErrors) {
10048 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
10049 // are set, but could expand this test to hit more cases.
10050 TEST_DESCRIPTION("Attempt to update descriptor sets for images "
10051 "that do not have correct aspect bits sets.");
10052 VkResult err;
10053
10054 ASSERT_NO_FATAL_FAILURE(InitState());
10055 VkDescriptorPoolSize ds_type_count = {};
10056 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10057 ds_type_count.descriptorCount = 1;
10058
10059 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10060 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10061 ds_pool_ci.pNext = NULL;
10062 ds_pool_ci.maxSets = 5;
10063 ds_pool_ci.poolSizeCount = 1;
10064 ds_pool_ci.pPoolSizes = &ds_type_count;
10065
10066 VkDescriptorPool ds_pool;
10067 err =
10068 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10069 ASSERT_VK_SUCCESS(err);
10070
10071 VkDescriptorSetLayoutBinding dsl_binding = {};
10072 dsl_binding.binding = 0;
10073 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10074 dsl_binding.descriptorCount = 1;
10075 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10076 dsl_binding.pImmutableSamplers = NULL;
10077
10078 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10079 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10080 ds_layout_ci.pNext = NULL;
10081 ds_layout_ci.bindingCount = 1;
10082 ds_layout_ci.pBindings = &dsl_binding;
10083 VkDescriptorSetLayout ds_layout;
10084 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10085 &ds_layout);
10086 ASSERT_VK_SUCCESS(err);
10087
10088 VkDescriptorSet descriptor_set = {};
10089 VkDescriptorSetAllocateInfo alloc_info = {};
10090 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10091 alloc_info.descriptorSetCount = 1;
10092 alloc_info.descriptorPool = ds_pool;
10093 alloc_info.pSetLayouts = &ds_layout;
10094 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10095 &descriptor_set);
10096 ASSERT_VK_SUCCESS(err);
10097
10098 // Create an image to be used for invalid updates
10099 VkImageCreateInfo image_ci = {};
10100 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10101 image_ci.imageType = VK_IMAGE_TYPE_2D;
10102 image_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
10103 image_ci.extent.width = 64;
10104 image_ci.extent.height = 64;
10105 image_ci.extent.depth = 1;
10106 image_ci.mipLevels = 1;
10107 image_ci.arrayLayers = 1;
10108 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
10109 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
10110 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10111 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10112 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10113 VkImage image;
10114 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10115 ASSERT_VK_SUCCESS(err);
10116 // Bind memory to image
10117 VkMemoryRequirements mem_reqs;
10118 VkDeviceMemory image_mem;
10119 bool pass;
10120 VkMemoryAllocateInfo mem_alloc = {};
10121 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10122 mem_alloc.pNext = NULL;
10123 mem_alloc.allocationSize = 0;
10124 mem_alloc.memoryTypeIndex = 0;
10125 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10126 mem_alloc.allocationSize = mem_reqs.size;
10127 pass =
10128 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10129 ASSERT_TRUE(pass);
10130 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10131 ASSERT_VK_SUCCESS(err);
10132 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10133 ASSERT_VK_SUCCESS(err);
10134 // Now create view for image
10135 VkImageViewCreateInfo image_view_ci = {};
10136 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10137 image_view_ci.image = image;
10138 image_view_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
10139 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10140 image_view_ci.subresourceRange.layerCount = 1;
10141 image_view_ci.subresourceRange.baseArrayLayer = 0;
10142 image_view_ci.subresourceRange.levelCount = 1;
10143 // Setting both depth & stencil aspect bits is illegal for descriptor
10144 image_view_ci.subresourceRange.aspectMask =
10145 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
10146
10147 VkImageView image_view;
10148 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
10149 &image_view);
10150 ASSERT_VK_SUCCESS(err);
10151
10152 VkDescriptorImageInfo img_info = {};
10153 img_info.imageView = image_view;
10154 VkWriteDescriptorSet descriptor_write = {};
10155 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10156 descriptor_write.dstBinding = 0;
10157 descriptor_write.descriptorCount = 1;
10158 descriptor_write.pTexelBufferView = NULL;
10159 descriptor_write.pBufferInfo = NULL;
10160 descriptor_write.pImageInfo = &img_info;
10161 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10162 descriptor_write.dstSet = descriptor_set;
10163 const char *error_msg = " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10164 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
10165 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10166 error_msg);
10167
10168 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10169
10170 m_errorMonitor->VerifyFound();
10171 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10172 vkDestroyImage(m_device->device(), image, NULL);
10173 vkFreeMemory(m_device->device(), image_mem, NULL);
10174 vkDestroyImageView(m_device->device(), image_view, NULL);
10175 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10176 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10177}
10178
Karl Schultz6addd812016-02-02 17:17:23 -070010179TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010180 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010181 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010182
Karl Schultz6addd812016-02-02 17:17:23 -070010183 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010184 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10185 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10186 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010187
Tobin Ehlis3b780662015-05-28 12:11:26 -060010188 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010189 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010190 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010191 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10192 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010193
10194 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010195 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10196 ds_pool_ci.pNext = NULL;
10197 ds_pool_ci.maxSets = 1;
10198 ds_pool_ci.poolSizeCount = 1;
10199 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010200
Tobin Ehlis3b780662015-05-28 12:11:26 -060010201 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010202 err =
10203 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010204 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010205 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010206 dsl_binding.binding = 0;
10207 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10208 dsl_binding.descriptorCount = 1;
10209 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10210 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010211
Tony Barboureb254902015-07-15 12:50:33 -060010212 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010213 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10214 ds_layout_ci.pNext = NULL;
10215 ds_layout_ci.bindingCount = 1;
10216 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010217
Tobin Ehlis3b780662015-05-28 12:11:26 -060010218 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010219 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10220 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010221 ASSERT_VK_SUCCESS(err);
10222
10223 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010224 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010225 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010226 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010227 alloc_info.descriptorPool = ds_pool;
10228 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010229 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10230 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010231 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010232
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010233 VkSamplerCreateInfo sampler_ci = {};
10234 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10235 sampler_ci.pNext = NULL;
10236 sampler_ci.magFilter = VK_FILTER_NEAREST;
10237 sampler_ci.minFilter = VK_FILTER_NEAREST;
10238 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10239 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10240 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10241 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10242 sampler_ci.mipLodBias = 1.0;
10243 sampler_ci.anisotropyEnable = VK_FALSE;
10244 sampler_ci.maxAnisotropy = 1;
10245 sampler_ci.compareEnable = VK_FALSE;
10246 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10247 sampler_ci.minLod = 1.0;
10248 sampler_ci.maxLod = 1.0;
10249 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10250 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10251 VkSampler sampler;
10252 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10253 ASSERT_VK_SUCCESS(err);
10254
10255 VkDescriptorImageInfo info = {};
10256 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010257
10258 VkWriteDescriptorSet descriptor_write;
10259 memset(&descriptor_write, 0, sizeof(descriptor_write));
10260 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010261 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010262 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010263 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010264 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010265 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010266
10267 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10268
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010269 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010270
Chia-I Wuf7458c52015-10-26 21:10:41 +080010271 vkDestroySampler(m_device->device(), sampler, NULL);
10272 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10273 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010274}
10275
Karl Schultz6addd812016-02-02 17:17:23 -070010276TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010277 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010278 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010279
Karl Schultz6addd812016-02-02 17:17:23 -070010280 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010281 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10282 " binding #0 with 1 total descriptors but update of 1 descriptors "
10283 "starting at binding offset of 0 combined with update array element "
10284 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010285
Tobin Ehlis3b780662015-05-28 12:11:26 -060010286 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010287 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010288 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010289 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10290 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010291
10292 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010293 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10294 ds_pool_ci.pNext = NULL;
10295 ds_pool_ci.maxSets = 1;
10296 ds_pool_ci.poolSizeCount = 1;
10297 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010298
Tobin Ehlis3b780662015-05-28 12:11:26 -060010299 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010300 err =
10301 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010302 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010303
Tony Barboureb254902015-07-15 12:50:33 -060010304 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010305 dsl_binding.binding = 0;
10306 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10307 dsl_binding.descriptorCount = 1;
10308 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10309 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010310
10311 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010312 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10313 ds_layout_ci.pNext = NULL;
10314 ds_layout_ci.bindingCount = 1;
10315 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010316
Tobin Ehlis3b780662015-05-28 12:11:26 -060010317 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010318 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10319 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010320 ASSERT_VK_SUCCESS(err);
10321
10322 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010323 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010324 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010325 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010326 alloc_info.descriptorPool = ds_pool;
10327 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010328 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10329 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010330 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010331
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010332 // Correctly update descriptor to avoid "NOT_UPDATED" error
10333 VkDescriptorBufferInfo buff_info = {};
10334 buff_info.buffer =
10335 VkBuffer(0); // Don't care about buffer handle for this test
10336 buff_info.offset = 0;
10337 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010338
10339 VkWriteDescriptorSet descriptor_write;
10340 memset(&descriptor_write, 0, sizeof(descriptor_write));
10341 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010342 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070010343 descriptor_write.dstArrayElement =
10344 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010345 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010346 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10347 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010348
10349 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10350
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010351 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010352
Chia-I Wuf7458c52015-10-26 21:10:41 +080010353 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10354 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010355}
10356
Karl Schultz6addd812016-02-02 17:17:23 -070010357TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
10358 // Create layout w/ count of 1 and attempt update to that layout w/ binding
10359 // index 2
10360 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010361
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010362 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10363 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010364
Tobin Ehlis3b780662015-05-28 12:11:26 -060010365 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010366 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010367 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010368 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10369 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010370
10371 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010372 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10373 ds_pool_ci.pNext = NULL;
10374 ds_pool_ci.maxSets = 1;
10375 ds_pool_ci.poolSizeCount = 1;
10376 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010377
Tobin Ehlis3b780662015-05-28 12:11:26 -060010378 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010379 err =
10380 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010381 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010382
Tony Barboureb254902015-07-15 12:50:33 -060010383 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010384 dsl_binding.binding = 0;
10385 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10386 dsl_binding.descriptorCount = 1;
10387 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10388 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010389
10390 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010391 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10392 ds_layout_ci.pNext = NULL;
10393 ds_layout_ci.bindingCount = 1;
10394 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010395 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010396 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10397 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010398 ASSERT_VK_SUCCESS(err);
10399
10400 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010401 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010402 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010403 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010404 alloc_info.descriptorPool = ds_pool;
10405 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010406 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10407 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010408 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010409
Tony Barboureb254902015-07-15 12:50:33 -060010410 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010411 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10412 sampler_ci.pNext = NULL;
10413 sampler_ci.magFilter = VK_FILTER_NEAREST;
10414 sampler_ci.minFilter = VK_FILTER_NEAREST;
10415 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10416 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10417 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10418 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10419 sampler_ci.mipLodBias = 1.0;
10420 sampler_ci.anisotropyEnable = VK_FALSE;
10421 sampler_ci.maxAnisotropy = 1;
10422 sampler_ci.compareEnable = VK_FALSE;
10423 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10424 sampler_ci.minLod = 1.0;
10425 sampler_ci.maxLod = 1.0;
10426 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10427 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010428
Tobin Ehlis3b780662015-05-28 12:11:26 -060010429 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010430 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010431 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010432
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010433 VkDescriptorImageInfo info = {};
10434 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010435
10436 VkWriteDescriptorSet descriptor_write;
10437 memset(&descriptor_write, 0, sizeof(descriptor_write));
10438 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010439 descriptor_write.dstSet = descriptorSet;
10440 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010441 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010442 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010443 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010444 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010445
10446 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10447
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010448 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010449
Chia-I Wuf7458c52015-10-26 21:10:41 +080010450 vkDestroySampler(m_device->device(), sampler, NULL);
10451 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10452 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010453}
10454
Karl Schultz6addd812016-02-02 17:17:23 -070010455TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10456 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10457 // types
10458 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010459
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070010460 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis660bcdc2016-05-17 10:39:46 -060010461 ".sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010462
Tobin Ehlis3b780662015-05-28 12:11:26 -060010463 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010464
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010465 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010466 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10467 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010468
10469 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010470 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10471 ds_pool_ci.pNext = NULL;
10472 ds_pool_ci.maxSets = 1;
10473 ds_pool_ci.poolSizeCount = 1;
10474 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010475
Tobin Ehlis3b780662015-05-28 12:11:26 -060010476 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010477 err =
10478 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010479 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010480 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010481 dsl_binding.binding = 0;
10482 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10483 dsl_binding.descriptorCount = 1;
10484 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10485 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010486
Tony Barboureb254902015-07-15 12:50:33 -060010487 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010488 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10489 ds_layout_ci.pNext = NULL;
10490 ds_layout_ci.bindingCount = 1;
10491 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010492
Tobin Ehlis3b780662015-05-28 12:11:26 -060010493 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010494 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10495 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010496 ASSERT_VK_SUCCESS(err);
10497
10498 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010499 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010500 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010501 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010502 alloc_info.descriptorPool = ds_pool;
10503 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010504 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10505 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010506 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010507
Tony Barboureb254902015-07-15 12:50:33 -060010508 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010509 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10510 sampler_ci.pNext = NULL;
10511 sampler_ci.magFilter = VK_FILTER_NEAREST;
10512 sampler_ci.minFilter = VK_FILTER_NEAREST;
10513 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10514 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10515 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10516 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10517 sampler_ci.mipLodBias = 1.0;
10518 sampler_ci.anisotropyEnable = VK_FALSE;
10519 sampler_ci.maxAnisotropy = 1;
10520 sampler_ci.compareEnable = VK_FALSE;
10521 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10522 sampler_ci.minLod = 1.0;
10523 sampler_ci.maxLod = 1.0;
10524 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10525 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010526 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010527 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010528 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010529
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010530 VkDescriptorImageInfo info = {};
10531 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010532
10533 VkWriteDescriptorSet descriptor_write;
10534 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -070010535 descriptor_write.sType =
10536 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010537 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010538 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010539 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010540 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010541 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010542
10543 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10544
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010545 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010546
Chia-I Wuf7458c52015-10-26 21:10:41 +080010547 vkDestroySampler(m_device->device(), sampler, NULL);
10548 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10549 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010550}
10551
Karl Schultz6addd812016-02-02 17:17:23 -070010552TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010553 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010554 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010555
Karl Schultz6addd812016-02-02 17:17:23 -070010556 m_errorMonitor->SetDesiredFailureMsg(
10557 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010558 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010559
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010560 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010561 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10562 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010563 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010564 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10565 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010566
10567 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010568 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10569 ds_pool_ci.pNext = NULL;
10570 ds_pool_ci.maxSets = 1;
10571 ds_pool_ci.poolSizeCount = 1;
10572 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010573
10574 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010575 err =
10576 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010577 ASSERT_VK_SUCCESS(err);
10578
10579 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010580 dsl_binding.binding = 0;
10581 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10582 dsl_binding.descriptorCount = 1;
10583 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10584 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010585
10586 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010587 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10588 ds_layout_ci.pNext = NULL;
10589 ds_layout_ci.bindingCount = 1;
10590 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010591 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010592 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10593 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010594 ASSERT_VK_SUCCESS(err);
10595
10596 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010597 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010598 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010599 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010600 alloc_info.descriptorPool = ds_pool;
10601 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010602 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10603 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010604 ASSERT_VK_SUCCESS(err);
10605
Karl Schultz6addd812016-02-02 17:17:23 -070010606 VkSampler sampler =
10607 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010608
10609 VkDescriptorImageInfo descriptor_info;
10610 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10611 descriptor_info.sampler = sampler;
10612
10613 VkWriteDescriptorSet descriptor_write;
10614 memset(&descriptor_write, 0, sizeof(descriptor_write));
10615 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010616 descriptor_write.dstSet = descriptorSet;
10617 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010618 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010619 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10620 descriptor_write.pImageInfo = &descriptor_info;
10621
10622 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10623
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010624 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010625
Chia-I Wuf7458c52015-10-26 21:10:41 +080010626 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10627 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010628}
10629
Karl Schultz6addd812016-02-02 17:17:23 -070010630TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10631 // Create a single combined Image/Sampler descriptor and send it an invalid
10632 // imageView
10633 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010634
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010635 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10636 "Attempted write update to combined "
10637 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -060010638 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010639
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010640 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010641 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010642 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10643 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010644
10645 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010646 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10647 ds_pool_ci.pNext = NULL;
10648 ds_pool_ci.maxSets = 1;
10649 ds_pool_ci.poolSizeCount = 1;
10650 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010651
10652 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010653 err =
10654 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010655 ASSERT_VK_SUCCESS(err);
10656
10657 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010658 dsl_binding.binding = 0;
10659 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10660 dsl_binding.descriptorCount = 1;
10661 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10662 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010663
10664 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010665 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10666 ds_layout_ci.pNext = NULL;
10667 ds_layout_ci.bindingCount = 1;
10668 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010669 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010670 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10671 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010672 ASSERT_VK_SUCCESS(err);
10673
10674 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010675 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010676 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010677 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010678 alloc_info.descriptorPool = ds_pool;
10679 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010680 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10681 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010682 ASSERT_VK_SUCCESS(err);
10683
10684 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010685 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10686 sampler_ci.pNext = NULL;
10687 sampler_ci.magFilter = VK_FILTER_NEAREST;
10688 sampler_ci.minFilter = VK_FILTER_NEAREST;
10689 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10690 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10691 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10692 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10693 sampler_ci.mipLodBias = 1.0;
10694 sampler_ci.anisotropyEnable = VK_FALSE;
10695 sampler_ci.maxAnisotropy = 1;
10696 sampler_ci.compareEnable = VK_FALSE;
10697 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10698 sampler_ci.minLod = 1.0;
10699 sampler_ci.maxLod = 1.0;
10700 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10701 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010702
10703 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010704 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010705 ASSERT_VK_SUCCESS(err);
10706
Karl Schultz6addd812016-02-02 17:17:23 -070010707 VkImageView view =
10708 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010709
10710 VkDescriptorImageInfo descriptor_info;
10711 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10712 descriptor_info.sampler = sampler;
10713 descriptor_info.imageView = view;
10714
10715 VkWriteDescriptorSet descriptor_write;
10716 memset(&descriptor_write, 0, sizeof(descriptor_write));
10717 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010718 descriptor_write.dstSet = descriptorSet;
10719 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010720 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010721 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10722 descriptor_write.pImageInfo = &descriptor_info;
10723
10724 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10725
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010726 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010727
Chia-I Wuf7458c52015-10-26 21:10:41 +080010728 vkDestroySampler(m_device->device(), sampler, NULL);
10729 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10730 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010731}
10732
Karl Schultz6addd812016-02-02 17:17:23 -070010733TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10734 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10735 // into the other
10736 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010737
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010738 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10739 " binding #1 with type "
10740 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10741 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010742
Tobin Ehlis04356f92015-10-27 16:35:27 -060010743 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010744 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010745 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010746 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10747 ds_type_count[0].descriptorCount = 1;
10748 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10749 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010750
10751 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010752 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10753 ds_pool_ci.pNext = NULL;
10754 ds_pool_ci.maxSets = 1;
10755 ds_pool_ci.poolSizeCount = 2;
10756 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010757
10758 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010759 err =
10760 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010761 ASSERT_VK_SUCCESS(err);
10762 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010763 dsl_binding[0].binding = 0;
10764 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10765 dsl_binding[0].descriptorCount = 1;
10766 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10767 dsl_binding[0].pImmutableSamplers = NULL;
10768 dsl_binding[1].binding = 1;
10769 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10770 dsl_binding[1].descriptorCount = 1;
10771 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10772 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010773
10774 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010775 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10776 ds_layout_ci.pNext = NULL;
10777 ds_layout_ci.bindingCount = 2;
10778 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010779
10780 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010781 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10782 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010783 ASSERT_VK_SUCCESS(err);
10784
10785 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010786 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010787 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010788 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010789 alloc_info.descriptorPool = ds_pool;
10790 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010791 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10792 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010793 ASSERT_VK_SUCCESS(err);
10794
10795 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010796 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10797 sampler_ci.pNext = NULL;
10798 sampler_ci.magFilter = VK_FILTER_NEAREST;
10799 sampler_ci.minFilter = VK_FILTER_NEAREST;
10800 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10801 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10802 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10803 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10804 sampler_ci.mipLodBias = 1.0;
10805 sampler_ci.anisotropyEnable = VK_FALSE;
10806 sampler_ci.maxAnisotropy = 1;
10807 sampler_ci.compareEnable = VK_FALSE;
10808 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10809 sampler_ci.minLod = 1.0;
10810 sampler_ci.maxLod = 1.0;
10811 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10812 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010813
10814 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010815 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010816 ASSERT_VK_SUCCESS(err);
10817
10818 VkDescriptorImageInfo info = {};
10819 info.sampler = sampler;
10820
10821 VkWriteDescriptorSet descriptor_write;
10822 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
10823 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010824 descriptor_write.dstSet = descriptorSet;
10825 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080010826 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010827 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10828 descriptor_write.pImageInfo = &info;
10829 // This write update should succeed
10830 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10831 // Now perform a copy update that fails due to type mismatch
10832 VkCopyDescriptorSet copy_ds_update;
10833 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10834 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10835 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -060010836 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010837 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070010838 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +080010839 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010840 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10841
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010842 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010843 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070010844 m_errorMonitor->SetDesiredFailureMsg(
10845 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010846 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -060010847 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10848 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10849 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070010850 copy_ds_update.srcBinding =
10851 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010852 copy_ds_update.dstSet = descriptorSet;
10853 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -060010854 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010855 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10856
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010857 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010858
Tobin Ehlis04356f92015-10-27 16:35:27 -060010859 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070010860 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010861 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
10862 "update array offset of 0 and update of "
10863 "5 descriptors oversteps total number "
10864 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010865
Tobin Ehlis04356f92015-10-27 16:35:27 -060010866 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10867 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10868 copy_ds_update.srcSet = descriptorSet;
10869 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010870 copy_ds_update.dstSet = descriptorSet;
10871 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070010872 copy_ds_update.descriptorCount =
10873 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060010874 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10875
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010876 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010877
Chia-I Wuf7458c52015-10-26 21:10:41 +080010878 vkDestroySampler(m_device->device(), sampler, NULL);
10879 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10880 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010881}
10882
Karl Schultz6addd812016-02-02 17:17:23 -070010883TEST_F(VkLayerTest, NumSamplesMismatch) {
10884 // Create CommandBuffer where MSAA samples doesn't match RenderPass
10885 // sampleCount
10886 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010887
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070010888 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070010889 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010890
Tobin Ehlis3b780662015-05-28 12:11:26 -060010891 ASSERT_NO_FATAL_FAILURE(InitState());
10892 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010893 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060010894 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010895 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010896
10897 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010898 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10899 ds_pool_ci.pNext = NULL;
10900 ds_pool_ci.maxSets = 1;
10901 ds_pool_ci.poolSizeCount = 1;
10902 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010903
Tobin Ehlis3b780662015-05-28 12:11:26 -060010904 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010905 err =
10906 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010907 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010908
Tony Barboureb254902015-07-15 12:50:33 -060010909 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080010910 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060010911 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080010912 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010913 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10914 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010915
Tony Barboureb254902015-07-15 12:50:33 -060010916 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10917 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10918 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010919 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070010920 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010921
Tobin Ehlis3b780662015-05-28 12:11:26 -060010922 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010923 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10924 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010925 ASSERT_VK_SUCCESS(err);
10926
10927 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010928 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010929 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010930 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010931 alloc_info.descriptorPool = ds_pool;
10932 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010933 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10934 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010935 ASSERT_VK_SUCCESS(err);
10936
Tony Barboureb254902015-07-15 12:50:33 -060010937 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010938 pipe_ms_state_ci.sType =
10939 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
10940 pipe_ms_state_ci.pNext = NULL;
10941 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10942 pipe_ms_state_ci.sampleShadingEnable = 0;
10943 pipe_ms_state_ci.minSampleShading = 1.0;
10944 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010945
Tony Barboureb254902015-07-15 12:50:33 -060010946 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010947 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10948 pipeline_layout_ci.pNext = NULL;
10949 pipeline_layout_ci.setLayoutCount = 1;
10950 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010951
10952 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010953 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
10954 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010955 ASSERT_VK_SUCCESS(err);
10956
Karl Schultz6addd812016-02-02 17:17:23 -070010957 VkShaderObj vs(m_device, bindStateVertShaderText,
10958 VK_SHADER_STAGE_VERTEX_BIT, this);
10959 VkShaderObj fs(m_device, bindStateFragShaderText,
10960 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060010961 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070010962 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010963 VkPipelineObj pipe(m_device);
10964 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010965 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010966 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010967 pipe.SetMSAA(&pipe_ms_state_ci);
10968 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010969
Tony Barbourfe3351b2015-07-28 10:17:20 -060010970 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070010971 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
10972 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010973
Mark Young29927482016-05-04 14:38:51 -060010974 // Render triangle (the error should trigger on the attempt to draw).
10975 Draw(3, 1, 0, 0);
10976
10977 // Finalize recording of the command buffer
10978 EndCommandBuffer();
10979
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010980 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010981
Chia-I Wuf7458c52015-10-26 21:10:41 +080010982 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10983 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10984 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010985}
Mark Young29927482016-05-04 14:38:51 -060010986
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010987TEST_F(VkLayerTest, RenderPassIncompatible) {
10988 TEST_DESCRIPTION("Hit RenderPass incompatible cases. "
10989 "Initial case is drawing with an active renderpass that's "
10990 "not compatible with the bound PSO's creation renderpass");
10991 VkResult err;
10992
10993 ASSERT_NO_FATAL_FAILURE(InitState());
10994 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10995
10996 VkDescriptorSetLayoutBinding dsl_binding = {};
10997 dsl_binding.binding = 0;
10998 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10999 dsl_binding.descriptorCount = 1;
11000 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11001 dsl_binding.pImmutableSamplers = NULL;
11002
11003 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11004 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11005 ds_layout_ci.pNext = NULL;
11006 ds_layout_ci.bindingCount = 1;
11007 ds_layout_ci.pBindings = &dsl_binding;
11008
11009 VkDescriptorSetLayout ds_layout;
11010 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11011 &ds_layout);
11012 ASSERT_VK_SUCCESS(err);
11013
11014 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11015 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11016 pipeline_layout_ci.pNext = NULL;
11017 pipeline_layout_ci.setLayoutCount = 1;
11018 pipeline_layout_ci.pSetLayouts = &ds_layout;
11019
11020 VkPipelineLayout pipeline_layout;
11021 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11022 &pipeline_layout);
11023 ASSERT_VK_SUCCESS(err);
11024
11025 VkShaderObj vs(m_device, bindStateVertShaderText,
11026 VK_SHADER_STAGE_VERTEX_BIT, this);
11027 VkShaderObj fs(m_device, bindStateFragShaderText,
11028 VK_SHADER_STAGE_FRAGMENT_BIT,
11029 this); // We shouldn't need a fragment shader
11030 // but add it to be able to run on more devices
11031 // Create a renderpass that will be incompatible with default renderpass
11032 VkAttachmentReference attach = {};
11033 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11034 VkAttachmentReference color_att = {};
11035 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11036 VkSubpassDescription subpass = {};
11037 subpass.inputAttachmentCount = 1;
11038 subpass.pInputAttachments = &attach;
11039 subpass.colorAttachmentCount = 1;
11040 subpass.pColorAttachments = &color_att;
11041 VkRenderPassCreateInfo rpci = {};
11042 rpci.subpassCount = 1;
11043 rpci.pSubpasses = &subpass;
11044 rpci.attachmentCount = 1;
11045 VkAttachmentDescription attach_desc = {};
11046 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011047 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11048 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011049 rpci.pAttachments = &attach_desc;
11050 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11051 VkRenderPass rp;
11052 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11053 VkPipelineObj pipe(m_device);
11054 pipe.AddShader(&vs);
11055 pipe.AddShader(&fs);
11056 pipe.AddColorAttachment();
11057 VkViewport view_port = {};
11058 m_viewports.push_back(view_port);
11059 pipe.SetViewport(m_viewports);
11060 VkRect2D rect = {};
11061 m_scissors.push_back(rect);
11062 pipe.SetScissor(m_scissors);
11063 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11064
11065 VkCommandBufferInheritanceInfo cbii = {};
11066 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11067 cbii.renderPass = rp;
11068 cbii.subpass = 0;
11069 VkCommandBufferBeginInfo cbbi = {};
11070 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11071 cbbi.pInheritanceInfo = &cbii;
11072 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11073 VkRenderPassBeginInfo rpbi = {};
11074 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11075 rpbi.framebuffer = m_framebuffer;
11076 rpbi.renderPass = rp;
11077 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi,
11078 VK_SUBPASS_CONTENTS_INLINE);
11079 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11080 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11081
11082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11083 " is incompatible w/ gfx pipeline ");
11084 // Render triangle (the error should trigger on the attempt to draw).
11085 Draw(3, 1, 0, 0);
11086
11087 // Finalize recording of the command buffer
11088 EndCommandBuffer();
11089
11090 m_errorMonitor->VerifyFound();
11091
11092 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11093 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11094 vkDestroyRenderPass(m_device->device(), rp, NULL);
11095}
11096
Mark Youngc89c6312016-03-31 16:03:20 -060011097TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11098 // Create Pipeline where the number of blend attachments doesn't match the
11099 // number of color attachments. In this case, we don't add any color
11100 // blend attachments even though we have a color attachment.
11101 VkResult err;
11102
11103 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -060011104 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -060011105
11106 ASSERT_NO_FATAL_FAILURE(InitState());
11107 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11108 VkDescriptorPoolSize ds_type_count = {};
11109 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11110 ds_type_count.descriptorCount = 1;
11111
11112 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11113 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11114 ds_pool_ci.pNext = NULL;
11115 ds_pool_ci.maxSets = 1;
11116 ds_pool_ci.poolSizeCount = 1;
11117 ds_pool_ci.pPoolSizes = &ds_type_count;
11118
11119 VkDescriptorPool ds_pool;
11120 err =
11121 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11122 ASSERT_VK_SUCCESS(err);
11123
11124 VkDescriptorSetLayoutBinding dsl_binding = {};
11125 dsl_binding.binding = 0;
11126 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11127 dsl_binding.descriptorCount = 1;
11128 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11129 dsl_binding.pImmutableSamplers = NULL;
11130
11131 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11132 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11133 ds_layout_ci.pNext = NULL;
11134 ds_layout_ci.bindingCount = 1;
11135 ds_layout_ci.pBindings = &dsl_binding;
11136
11137 VkDescriptorSetLayout ds_layout;
11138 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11139 &ds_layout);
11140 ASSERT_VK_SUCCESS(err);
11141
11142 VkDescriptorSet descriptorSet;
11143 VkDescriptorSetAllocateInfo alloc_info = {};
11144 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11145 alloc_info.descriptorSetCount = 1;
11146 alloc_info.descriptorPool = ds_pool;
11147 alloc_info.pSetLayouts = &ds_layout;
11148 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11149 &descriptorSet);
11150 ASSERT_VK_SUCCESS(err);
11151
11152 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
11153 pipe_ms_state_ci.sType =
11154 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11155 pipe_ms_state_ci.pNext = NULL;
11156 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11157 pipe_ms_state_ci.sampleShadingEnable = 0;
11158 pipe_ms_state_ci.minSampleShading = 1.0;
11159 pipe_ms_state_ci.pSampleMask = NULL;
11160
11161 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11162 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11163 pipeline_layout_ci.pNext = NULL;
11164 pipeline_layout_ci.setLayoutCount = 1;
11165 pipeline_layout_ci.pSetLayouts = &ds_layout;
11166
11167 VkPipelineLayout pipeline_layout;
11168 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11169 &pipeline_layout);
11170 ASSERT_VK_SUCCESS(err);
11171
11172 VkShaderObj vs(m_device, bindStateVertShaderText,
11173 VK_SHADER_STAGE_VERTEX_BIT, this);
11174 VkShaderObj fs(m_device, bindStateFragShaderText,
11175 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011176 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -060011177 // but add it to be able to run on more devices
11178 VkPipelineObj pipe(m_device);
11179 pipe.AddShader(&vs);
11180 pipe.AddShader(&fs);
11181 pipe.SetMSAA(&pipe_ms_state_ci);
11182 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11183
11184 BeginCommandBuffer();
11185 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11186 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11187
Mark Young29927482016-05-04 14:38:51 -060011188 // Render triangle (the error should trigger on the attempt to draw).
11189 Draw(3, 1, 0, 0);
11190
11191 // Finalize recording of the command buffer
11192 EndCommandBuffer();
11193
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011194 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011195
11196 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11197 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11198 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11199}
Mark Young29927482016-05-04 14:38:51 -060011200
Mark Muellerd4914412016-06-13 17:52:06 -060011201TEST_F(VkLayerTest, MissingClearAttachment) {
11202 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment "
11203 "structure passed to vkCmdClearAttachments");
11204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11205 "vkCmdClearAttachments() attachment index 1 not found in attachment "
11206 "reference array of active subpass 0");
11207
11208 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11209 m_errorMonitor->VerifyFound();
11210}
11211
Karl Schultz6addd812016-02-02 17:17:23 -070011212TEST_F(VkLayerTest, ClearCmdNoDraw) {
11213 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
11214 // to issuing a Draw
11215 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011216
Karl Schultz6addd812016-02-02 17:17:23 -070011217 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -070011218 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011219 "vkCmdClearAttachments() issued on CB object ");
11220
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011221 ASSERT_NO_FATAL_FAILURE(InitState());
11222 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011223
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011224 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011225 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11226 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011227
11228 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011229 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11230 ds_pool_ci.pNext = NULL;
11231 ds_pool_ci.maxSets = 1;
11232 ds_pool_ci.poolSizeCount = 1;
11233 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011234
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011235 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011236 err =
11237 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011238 ASSERT_VK_SUCCESS(err);
11239
Tony Barboureb254902015-07-15 12:50:33 -060011240 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011241 dsl_binding.binding = 0;
11242 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11243 dsl_binding.descriptorCount = 1;
11244 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11245 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011246
Tony Barboureb254902015-07-15 12:50:33 -060011247 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011248 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11249 ds_layout_ci.pNext = NULL;
11250 ds_layout_ci.bindingCount = 1;
11251 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011252
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011253 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011254 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11255 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011256 ASSERT_VK_SUCCESS(err);
11257
11258 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011259 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011260 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011261 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011262 alloc_info.descriptorPool = ds_pool;
11263 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011264 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11265 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011266 ASSERT_VK_SUCCESS(err);
11267
Tony Barboureb254902015-07-15 12:50:33 -060011268 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011269 pipe_ms_state_ci.sType =
11270 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11271 pipe_ms_state_ci.pNext = NULL;
11272 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11273 pipe_ms_state_ci.sampleShadingEnable = 0;
11274 pipe_ms_state_ci.minSampleShading = 1.0;
11275 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011276
Tony Barboureb254902015-07-15 12:50:33 -060011277 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011278 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11279 pipeline_layout_ci.pNext = NULL;
11280 pipeline_layout_ci.setLayoutCount = 1;
11281 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011282
11283 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011284 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11285 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011286 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011287
Karl Schultz6addd812016-02-02 17:17:23 -070011288 VkShaderObj vs(m_device, bindStateVertShaderText,
11289 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011290 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011291 // on more devices
11292 VkShaderObj fs(m_device, bindStateFragShaderText,
11293 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011294
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011295 VkPipelineObj pipe(m_device);
11296 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011297 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011298 pipe.SetMSAA(&pipe_ms_state_ci);
11299 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011300
11301 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011302
Karl Schultz6addd812016-02-02 17:17:23 -070011303 // Main thing we care about for this test is that the VkImage obj we're
11304 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011305 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011306 VkClearAttachment color_attachment;
11307 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11308 color_attachment.clearValue.color.float32[0] = 1.0;
11309 color_attachment.clearValue.color.float32[1] = 1.0;
11310 color_attachment.clearValue.color.float32[2] = 1.0;
11311 color_attachment.clearValue.color.float32[3] = 1.0;
11312 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070011313 VkClearRect clear_rect = {
11314 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011315
Karl Schultz6addd812016-02-02 17:17:23 -070011316 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
11317 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011318
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011319 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011320
Chia-I Wuf7458c52015-10-26 21:10:41 +080011321 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11322 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11323 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011324}
11325
Karl Schultz6addd812016-02-02 17:17:23 -070011326TEST_F(VkLayerTest, VtxBufferBadIndex) {
11327 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011328
Karl Schultz6addd812016-02-02 17:17:23 -070011329 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070011330 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -070011331 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011332
Tobin Ehlis502480b2015-06-24 15:53:07 -060011333 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011334 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011335 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011336
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011337 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011338 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11339 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011340
11341 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011342 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11343 ds_pool_ci.pNext = NULL;
11344 ds_pool_ci.maxSets = 1;
11345 ds_pool_ci.poolSizeCount = 1;
11346 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011347
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011348 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011349 err =
11350 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011351 ASSERT_VK_SUCCESS(err);
11352
Tony Barboureb254902015-07-15 12:50:33 -060011353 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011354 dsl_binding.binding = 0;
11355 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11356 dsl_binding.descriptorCount = 1;
11357 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11358 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011359
Tony Barboureb254902015-07-15 12:50:33 -060011360 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011361 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11362 ds_layout_ci.pNext = NULL;
11363 ds_layout_ci.bindingCount = 1;
11364 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011365
Tobin Ehlis502480b2015-06-24 15:53:07 -060011366 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011367 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11368 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011369 ASSERT_VK_SUCCESS(err);
11370
11371 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011372 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011373 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011374 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011375 alloc_info.descriptorPool = ds_pool;
11376 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011377 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11378 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011379 ASSERT_VK_SUCCESS(err);
11380
Tony Barboureb254902015-07-15 12:50:33 -060011381 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011382 pipe_ms_state_ci.sType =
11383 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11384 pipe_ms_state_ci.pNext = NULL;
11385 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11386 pipe_ms_state_ci.sampleShadingEnable = 0;
11387 pipe_ms_state_ci.minSampleShading = 1.0;
11388 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011389
Tony Barboureb254902015-07-15 12:50:33 -060011390 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011391 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11392 pipeline_layout_ci.pNext = NULL;
11393 pipeline_layout_ci.setLayoutCount = 1;
11394 pipeline_layout_ci.pSetLayouts = &ds_layout;
11395 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011396
Karl Schultz6addd812016-02-02 17:17:23 -070011397 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11398 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011399 ASSERT_VK_SUCCESS(err);
11400
Karl Schultz6addd812016-02-02 17:17:23 -070011401 VkShaderObj vs(m_device, bindStateVertShaderText,
11402 VK_SHADER_STAGE_VERTEX_BIT, this);
11403 VkShaderObj fs(m_device, bindStateFragShaderText,
11404 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011405 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070011406 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011407 VkPipelineObj pipe(m_device);
11408 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011409 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011410 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011411 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011412 pipe.SetViewport(m_viewports);
11413 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011414 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011415
11416 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070011417 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11418 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011419 // Don't care about actual data, just need to get to draw to flag error
11420 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -070011421 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
11422 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011423 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011424 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011425
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011426 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011427
Chia-I Wuf7458c52015-10-26 21:10:41 +080011428 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11429 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11430 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011431}
Mark Muellerdfe37552016-07-07 14:47:42 -060011432
11433TEST_F(VkLayerTest, VertexBufferInvalid) {
11434 TEST_DESCRIPTION("Submit a command buffer using deleted vertex buffer, "
11435 "delete a buffer twice, use an invalid offset for each "
11436 "buffer type, and attempt to bind a null buffer");
11437
11438 const char *deleted_buffer_in_command_buffer = "Cannot submit cmd buffer "
11439 "using deleted buffer ";
11440 const char *double_destroy_message = "Cannot free buffer 0x";
11441 const char *invalid_offset_message = "vkBindBufferMemory(): "
11442 "memoryOffset is 0x";
11443 const char *invalid_storage_buffer_offset_message = "vkBindBufferMemory(): "
11444 "storage memoryOffset "
11445 "is 0x";
11446 const char *invalid_texel_buffer_offset_message = "vkBindBufferMemory(): "
11447 "texel memoryOffset "
11448 "is 0x";
11449 const char *invalid_uniform_buffer_offset_message = "vkBindBufferMemory(): "
11450 "uniform memoryOffset "
11451 "is 0x";
11452 const char *bind_null_buffer_message = "In vkBindBufferMemory, attempting"
11453 " to Bind Obj(0x";
11454 const char *free_invalid_buffer_message = "Request to delete memory "
11455 "object 0x";
11456
11457 ASSERT_NO_FATAL_FAILURE(InitState());
11458 ASSERT_NO_FATAL_FAILURE(InitViewport());
11459 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11460
11461 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
11462 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 = nullptr;
11469
11470 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11471 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11472 VkPipelineLayout pipeline_layout;
11473
11474 VkResult err = vkCreatePipelineLayout(m_device->device(),
11475 &pipeline_layout_ci, nullptr,
11476 &pipeline_layout);
11477 ASSERT_VK_SUCCESS(err);
11478
11479 VkShaderObj vs(m_device, bindStateVertShaderText,
11480 VK_SHADER_STAGE_VERTEX_BIT, this);
11481 VkShaderObj fs(m_device, bindStateFragShaderText,
11482 VK_SHADER_STAGE_FRAGMENT_BIT,
11483 this);
11484 VkPipelineObj pipe(m_device);
11485 pipe.AddShader(&vs);
11486 pipe.AddShader(&fs);
11487 pipe.AddColorAttachment();
11488 pipe.SetMSAA(&pipe_ms_state_ci);
11489 pipe.SetViewport(m_viewports);
11490 pipe.SetScissor(m_scissors);
11491 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11492
11493 BeginCommandBuffer();
11494 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11495 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11496
11497 {
11498 // Create and bind a vertex buffer in a reduced scope, which will cause
11499 // it to be deleted upon leaving this scope
11500 const float vbo_data[3] = {1.f, 0.f, 1.f};
11501 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data),
11502 3, vbo_data);
11503 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11504 draw_verticies.AddVertexInputToPipe(pipe);
11505 }
11506
11507 Draw(1, 0, 0, 0);
11508
11509 EndCommandBuffer();
11510
11511 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11512 deleted_buffer_in_command_buffer);
11513 QueueCommandBuffer(false);
11514 m_errorMonitor->VerifyFound();
11515
11516 {
11517 // Create and bind a vertex buffer in a reduced scope, and delete it
11518 // twice, the second through the destructor
11519 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11520 VkBufferTest::eDoubleDelete);
11521 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11522 double_destroy_message);
11523 buffer_test.TestDoubleDestroy();
11524 }
11525 m_errorMonitor->VerifyFound();
11526
11527 if (VkBufferTest::
11528 GetTestConditionValid(m_device,
11529 VkBufferTest::eInvalidMemoryOffset)) {
11530 // Create and bind a memory buffer with an invalid offset.
11531 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11532 invalid_offset_message);
11533 VkBufferTest buffer_test(m_device,
11534 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
11535 VkBufferTest::eInvalidMemoryOffset);
11536 (void) buffer_test;
11537 m_errorMonitor->VerifyFound();
11538 }
11539
11540 if (VkBufferTest::
11541 GetTestConditionValid(m_device,
11542 VkBufferTest::eInvalidDeviceOffset,
11543 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
11544 // Create and bind a memory buffer with an invalid offset again,
11545 // but look for a texel buffer message.
11546 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11547 invalid_texel_buffer_offset_message);
11548 VkBufferTest buffer_test(m_device,
11549 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
11550 VkBufferTest::eInvalidDeviceOffset);
11551 (void) buffer_test;
11552 m_errorMonitor->VerifyFound();
11553 }
11554
11555 if (VkBufferTest::
11556 GetTestConditionValid(m_device,
11557 VkBufferTest::eInvalidDeviceOffset,
11558 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
11559 // Create and bind a memory buffer with an invalid offset again, but
11560 // look for a uniform buffer message.
11561 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11562 invalid_uniform_buffer_offset_message);
11563 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
11564 VkBufferTest::eInvalidDeviceOffset);
11565 (void) buffer_test;
11566 m_errorMonitor->VerifyFound();
11567 }
11568
11569 if (VkBufferTest::
11570 GetTestConditionValid(m_device,
11571 VkBufferTest::eInvalidDeviceOffset,
11572 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
11573 // Create and bind a memory buffer with an invalid offset again, but
11574 // look for a storage buffer message.
11575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11576 invalid_storage_buffer_offset_message);
11577 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11578 VkBufferTest::eInvalidDeviceOffset);
11579 (void) buffer_test;
11580 m_errorMonitor->VerifyFound();
11581 }
11582
11583 {
11584 // Attempt to bind a null buffer.
11585 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11586 bind_null_buffer_message);
11587 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11588 VkBufferTest::eBindNullBuffer);
11589 (void) buffer_test;
11590 m_errorMonitor->VerifyFound();
11591 }
11592
11593 {
11594 // Attempt to use an invalid handle to delete a buffer.
11595 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11596 free_invalid_buffer_message);
11597 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11598 VkBufferTest::eFreeInvalidHandle);
11599 (void) buffer_test;
11600 }
11601 m_errorMonitor->VerifyFound();
11602
11603 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11604}
11605
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011606// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11607TEST_F(VkLayerTest, InvalidImageLayout) {
11608 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
11609 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11610 "images in the wrong layout when they're copied or transitioned.");
11611 // 3 in ValidateCmdBufImageLayouts
11612 // * -1 Attempt to submit cmd buf w/ deleted image
11613 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11614 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
11615 m_errorMonitor->SetDesiredFailureMsg(
11616 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11617 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11618
11619 ASSERT_NO_FATAL_FAILURE(InitState());
11620 // Create src & dst images to use for copy operations
11621 VkImage src_image;
11622 VkImage dst_image;
11623
11624 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11625 const int32_t tex_width = 32;
11626 const int32_t tex_height = 32;
11627
11628 VkImageCreateInfo image_create_info = {};
11629 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11630 image_create_info.pNext = NULL;
11631 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11632 image_create_info.format = tex_format;
11633 image_create_info.extent.width = tex_width;
11634 image_create_info.extent.height = tex_height;
11635 image_create_info.extent.depth = 1;
11636 image_create_info.mipLevels = 1;
11637 image_create_info.arrayLayers = 4;
11638 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11639 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11640 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
11641 image_create_info.flags = 0;
11642
11643 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11644 ASSERT_VK_SUCCESS(err);
11645 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11646 ASSERT_VK_SUCCESS(err);
11647
11648 BeginCommandBuffer();
11649 VkImageCopy copyRegion;
11650 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11651 copyRegion.srcSubresource.mipLevel = 0;
11652 copyRegion.srcSubresource.baseArrayLayer = 0;
11653 copyRegion.srcSubresource.layerCount = 1;
11654 copyRegion.srcOffset.x = 0;
11655 copyRegion.srcOffset.y = 0;
11656 copyRegion.srcOffset.z = 0;
11657 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11658 copyRegion.dstSubresource.mipLevel = 0;
11659 copyRegion.dstSubresource.baseArrayLayer = 0;
11660 copyRegion.dstSubresource.layerCount = 1;
11661 copyRegion.dstOffset.x = 0;
11662 copyRegion.dstOffset.y = 0;
11663 copyRegion.dstOffset.z = 0;
11664 copyRegion.extent.width = 1;
11665 copyRegion.extent.height = 1;
11666 copyRegion.extent.depth = 1;
11667 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11668 m_errorMonitor->VerifyFound();
11669 // Now cause error due to src image layout changing
11670 m_errorMonitor->SetDesiredFailureMsg(
11671 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11672 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
11673 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11674 m_errorMonitor->VerifyFound();
11675 // Final src error is due to bad layout type
11676 m_errorMonitor->SetDesiredFailureMsg(
11677 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11678 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
11679 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11680 m_errorMonitor->VerifyFound();
11681 // Now verify same checks for dst
11682 m_errorMonitor->SetDesiredFailureMsg(
11683 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11684 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
11685 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11686 m_errorMonitor->VerifyFound();
11687 // Now cause error due to src image layout changing
11688 m_errorMonitor->SetDesiredFailureMsg(
11689 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11690 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
11691 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
11692 m_errorMonitor->VerifyFound();
11693 m_errorMonitor->SetDesiredFailureMsg(
11694 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11695 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
11696 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
11697 m_errorMonitor->VerifyFound();
11698 // Now cause error due to bad image layout transition in PipelineBarrier
11699 VkImageMemoryBarrier image_barrier[1] = {};
11700 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11701 image_barrier[0].image = src_image;
11702 image_barrier[0].subresourceRange.layerCount = 2;
11703 image_barrier[0].subresourceRange.levelCount = 2;
11704 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11705 m_errorMonitor->SetDesiredFailureMsg(
11706 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11707 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
11708 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
11709 m_errorMonitor->VerifyFound();
11710
11711 // Finally some layout errors at RenderPass create time
11712 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
11713 VkAttachmentReference attach = {};
11714 // perf warning for GENERAL layout w/ non-DS input attachment
11715 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11716 VkSubpassDescription subpass = {};
11717 subpass.inputAttachmentCount = 1;
11718 subpass.pInputAttachments = &attach;
11719 VkRenderPassCreateInfo rpci = {};
11720 rpci.subpassCount = 1;
11721 rpci.pSubpasses = &subpass;
11722 rpci.attachmentCount = 1;
11723 VkAttachmentDescription attach_desc = {};
11724 attach_desc.format = VK_FORMAT_UNDEFINED;
11725 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011726 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011727 VkRenderPass rp;
11728 m_errorMonitor->SetDesiredFailureMsg(
11729 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11730 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
11731 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11732 m_errorMonitor->VerifyFound();
11733 // error w/ non-general layout
11734 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11735
11736 m_errorMonitor->SetDesiredFailureMsg(
11737 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11738 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
11739 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11740 m_errorMonitor->VerifyFound();
11741 subpass.inputAttachmentCount = 0;
11742 subpass.colorAttachmentCount = 1;
11743 subpass.pColorAttachments = &attach;
11744 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11745 // perf warning for GENERAL layout on color attachment
11746 m_errorMonitor->SetDesiredFailureMsg(
11747 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11748 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
11749 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11750 m_errorMonitor->VerifyFound();
11751 // error w/ non-color opt or GENERAL layout for color attachment
11752 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11753 m_errorMonitor->SetDesiredFailureMsg(
11754 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11755 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
11756 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11757 m_errorMonitor->VerifyFound();
11758 subpass.colorAttachmentCount = 0;
11759 subpass.pDepthStencilAttachment = &attach;
11760 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11761 // perf warning for GENERAL layout on DS attachment
11762 m_errorMonitor->SetDesiredFailureMsg(
11763 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11764 "Layout for depth attachment is GENERAL but should be DEPTH_STENCIL_ATTACHMENT_OPTIMAL.");
11765 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11766 m_errorMonitor->VerifyFound();
11767 // error w/ non-ds opt or GENERAL layout for color attachment
11768 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11769 m_errorMonitor->SetDesiredFailureMsg(
11770 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11771 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be DEPTH_STENCIL_ATTACHMENT_OPTIMAL or GENERAL.");
11772 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11773 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060011774 // For this error we need a valid renderpass so create default one
11775 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11776 attach.attachment = 0;
11777 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
11778 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
11779 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
11780 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
11781 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
11782 // Can't do a CLEAR load on READ_ONLY initialLayout
11783 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
11784 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11785 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11786 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11787 " with invalid first layout "
11788 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
11789 "ONLY_OPTIMAL");
11790 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11791 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011792
11793 vkDestroyImage(m_device->device(), src_image, NULL);
11794 vkDestroyImage(m_device->device(), dst_image, NULL);
11795}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011796#endif // DRAW_STATE_TESTS
11797
Tobin Ehlis0788f522015-05-26 16:11:58 -060011798#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -060011799#if GTEST_IS_THREADSAFE
11800struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011801 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011802 VkEvent event;
11803 bool bailout;
11804};
11805
Karl Schultz6addd812016-02-02 17:17:23 -070011806extern "C" void *AddToCommandBuffer(void *arg) {
11807 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011808
Mike Stroyana6d14942016-07-13 15:10:05 -060011809 for (int i = 0; i < 80000; i++) {
Karl Schultz6addd812016-02-02 17:17:23 -070011810 vkCmdSetEvent(data->commandBuffer, data->event,
11811 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011812 if (data->bailout) {
11813 break;
11814 }
11815 }
11816 return NULL;
11817}
11818
Karl Schultz6addd812016-02-02 17:17:23 -070011819TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060011820 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011821
Karl Schultz6addd812016-02-02 17:17:23 -070011822 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11823 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011824
Mike Stroyanaccf7692015-05-12 16:00:45 -060011825 ASSERT_NO_FATAL_FAILURE(InitState());
11826 ASSERT_NO_FATAL_FAILURE(InitViewport());
11827 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11828
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011829 // Calls AllocateCommandBuffers
11830 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060011831
11832 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011833 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060011834
11835 VkEventCreateInfo event_info;
11836 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011837 VkResult err;
11838
11839 memset(&event_info, 0, sizeof(event_info));
11840 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11841
Chia-I Wuf7458c52015-10-26 21:10:41 +080011842 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011843 ASSERT_VK_SUCCESS(err);
11844
Mike Stroyanaccf7692015-05-12 16:00:45 -060011845 err = vkResetEvent(device(), event);
11846 ASSERT_VK_SUCCESS(err);
11847
11848 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011849 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060011850 data.event = event;
11851 data.bailout = false;
11852 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060011853
11854 // First do some correct operations using multiple threads.
11855 // Add many entries to command buffer from another thread.
11856 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
11857 // Make non-conflicting calls from this thread at the same time.
11858 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060011859 uint32_t count;
11860 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060011861 }
11862 test_platform_thread_join(thread, NULL);
11863
11864 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060011865 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060011866 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011867 // Add many entries to command buffer from this thread at the same time.
11868 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060011869
Mike Stroyan4268d1f2015-07-13 14:45:35 -060011870 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011871 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060011872
Mike Stroyan10b8cb72016-01-22 15:22:03 -070011873 m_errorMonitor->SetBailout(NULL);
11874
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011875 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060011876
Chia-I Wuf7458c52015-10-26 21:10:41 +080011877 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011878}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011879#endif // GTEST_IS_THREADSAFE
11880#endif // THREADING_TESTS
11881
Chris Forbes9f7ff632015-05-25 11:13:08 +120011882#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070011883TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011884 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120011885 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011886
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011887 ASSERT_NO_FATAL_FAILURE(InitState());
11888 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11889
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011890 VkShaderModule module;
11891 VkShaderModuleCreateInfo moduleCreateInfo;
11892 struct icd_spv_header spv;
11893
11894 spv.magic = ICD_SPV_MAGIC;
11895 spv.version = ICD_SPV_VERSION;
11896 spv.gen_magic = 0;
11897
11898 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
11899 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070011900 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011901 moduleCreateInfo.codeSize = 4;
11902 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011903 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011904
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011905 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011906}
11907
Karl Schultz6addd812016-02-02 17:17:23 -070011908TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120011910 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011911
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011912 ASSERT_NO_FATAL_FAILURE(InitState());
11913 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11914
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011915 VkShaderModule module;
11916 VkShaderModuleCreateInfo moduleCreateInfo;
11917 struct icd_spv_header spv;
11918
11919 spv.magic = ~ICD_SPV_MAGIC;
11920 spv.version = ICD_SPV_VERSION;
11921 spv.gen_magic = 0;
11922
11923 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
11924 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070011925 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011926 moduleCreateInfo.codeSize = sizeof(spv) + 10;
11927 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011928 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011929
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011930 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011931}
11932
Chris Forbesb4afd0f2016-04-04 10:48:35 +120011933#if 0
11934// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070011935TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011936 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120011937 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011938
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011939 ASSERT_NO_FATAL_FAILURE(InitState());
11940 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11941
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011942 VkShaderModule module;
11943 VkShaderModuleCreateInfo moduleCreateInfo;
11944 struct icd_spv_header spv;
11945
11946 spv.magic = ICD_SPV_MAGIC;
11947 spv.version = ~ICD_SPV_VERSION;
11948 spv.gen_magic = 0;
11949
11950 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
11951 moduleCreateInfo.pNext = NULL;
11952
Karl Schultz6addd812016-02-02 17:17:23 -070011953 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011954 moduleCreateInfo.codeSize = sizeof(spv) + 10;
11955 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011956 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011957
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011958 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011959}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120011960#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011961
Karl Schultz6addd812016-02-02 17:17:23 -070011962TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070011963 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011964 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011965
Chris Forbes9f7ff632015-05-25 11:13:08 +120011966 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060011967 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120011968
11969 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011970 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120011971 "\n"
11972 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070011973 "out gl_PerVertex {\n"
11974 " vec4 gl_Position;\n"
11975 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120011976 "void main(){\n"
11977 " gl_Position = vec4(1);\n"
11978 " x = 0;\n"
11979 "}\n";
11980 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011981 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120011982 "\n"
11983 "layout(location=0) out vec4 color;\n"
11984 "void main(){\n"
11985 " color = vec4(1);\n"
11986 "}\n";
11987
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060011988 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11989 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120011990
11991 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080011992 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120011993 pipe.AddShader(&vs);
11994 pipe.AddShader(&fs);
11995
Chris Forbes9f7ff632015-05-25 11:13:08 +120011996 VkDescriptorSetObj descriptorSet(m_device);
11997 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011998 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120011999
Tony Barbour5781e8f2015-08-04 16:23:11 -060012000 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120012001
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012002 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120012003}
Chris Forbes9f7ff632015-05-25 11:13:08 +120012004
Karl Schultz6addd812016-02-02 17:17:23 -070012005TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012006 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012007 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012008
Chris Forbes59cb88d2015-05-25 11:13:13 +120012009 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012010 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120012011
12012 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012013 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120012014 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070012015 "out gl_PerVertex {\n"
12016 " vec4 gl_Position;\n"
12017 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120012018 "void main(){\n"
12019 " gl_Position = vec4(1);\n"
12020 "}\n";
12021 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012022 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120012023 "\n"
12024 "layout(location=0) in float x;\n"
12025 "layout(location=0) out vec4 color;\n"
12026 "void main(){\n"
12027 " color = vec4(x);\n"
12028 "}\n";
12029
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012030 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12031 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120012032
12033 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012034 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120012035 pipe.AddShader(&vs);
12036 pipe.AddShader(&fs);
12037
Chris Forbes59cb88d2015-05-25 11:13:13 +120012038 VkDescriptorSetObj descriptorSet(m_device);
12039 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012040 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120012041
Tony Barbour5781e8f2015-08-04 16:23:11 -060012042 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120012043
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012044 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120012045}
12046
Karl Schultz6addd812016-02-02 17:17:23 -070012047TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +130012048 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012049 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012050
12051 ASSERT_NO_FATAL_FAILURE(InitState());
12052 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12053
12054 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012055 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130012056 "\n"
12057 "out gl_PerVertex {\n"
12058 " vec4 gl_Position;\n"
12059 "};\n"
12060 "void main(){\n"
12061 " gl_Position = vec4(1);\n"
12062 "}\n";
12063 char const *fsSource =
12064 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130012065 "\n"
12066 "in block { layout(location=0) float x; } ins;\n"
12067 "layout(location=0) out vec4 color;\n"
12068 "void main(){\n"
12069 " color = vec4(ins.x);\n"
12070 "}\n";
12071
12072 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12073 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12074
12075 VkPipelineObj pipe(m_device);
12076 pipe.AddColorAttachment();
12077 pipe.AddShader(&vs);
12078 pipe.AddShader(&fs);
12079
12080 VkDescriptorSetObj descriptorSet(m_device);
12081 descriptorSet.AppendDummy();
12082 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12083
12084 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12085
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012086 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130012087}
12088
Karl Schultz6addd812016-02-02 17:17:23 -070012089TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +130012090 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +130012091 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -070012092 "output arr[2] of float32' vs 'ptr to "
12093 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130012094
12095 ASSERT_NO_FATAL_FAILURE(InitState());
12096 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12097
12098 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012099 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130012100 "\n"
12101 "layout(location=0) out float x[2];\n"
12102 "out gl_PerVertex {\n"
12103 " vec4 gl_Position;\n"
12104 "};\n"
12105 "void main(){\n"
12106 " x[0] = 0; x[1] = 0;\n"
12107 " gl_Position = vec4(1);\n"
12108 "}\n";
12109 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012110 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130012111 "\n"
12112 "layout(location=0) in float x[3];\n"
12113 "layout(location=0) out vec4 color;\n"
12114 "void main(){\n"
12115 " color = vec4(x[0] + x[1] + x[2]);\n"
12116 "}\n";
12117
12118 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12119 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12120
12121 VkPipelineObj pipe(m_device);
12122 pipe.AddColorAttachment();
12123 pipe.AddShader(&vs);
12124 pipe.AddShader(&fs);
12125
12126 VkDescriptorSetObj descriptorSet(m_device);
12127 descriptorSet.AppendDummy();
12128 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12129
12130 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12131
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012132 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130012133}
12134
Karl Schultz6addd812016-02-02 17:17:23 -070012135TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012136 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012137 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012138
Chris Forbesb56af562015-05-25 11:13:17 +120012139 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012140 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120012141
12142 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012143 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120012144 "\n"
12145 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070012146 "out gl_PerVertex {\n"
12147 " vec4 gl_Position;\n"
12148 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +120012149 "void main(){\n"
12150 " x = 0;\n"
12151 " gl_Position = vec4(1);\n"
12152 "}\n";
12153 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012154 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120012155 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012156 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +120012157 "layout(location=0) out vec4 color;\n"
12158 "void main(){\n"
12159 " color = vec4(x);\n"
12160 "}\n";
12161
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012162 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12163 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120012164
12165 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012166 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120012167 pipe.AddShader(&vs);
12168 pipe.AddShader(&fs);
12169
Chris Forbesb56af562015-05-25 11:13:17 +120012170 VkDescriptorSetObj descriptorSet(m_device);
12171 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012172 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120012173
Tony Barbour5781e8f2015-08-04 16:23:11 -060012174 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120012175
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012176 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120012177}
12178
Karl Schultz6addd812016-02-02 17:17:23 -070012179TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +130012180 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012181 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012182
12183 ASSERT_NO_FATAL_FAILURE(InitState());
12184 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12185
12186 char const *vsSource =
12187 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130012188 "\n"
12189 "out block { layout(location=0) int x; } outs;\n"
12190 "out gl_PerVertex {\n"
12191 " vec4 gl_Position;\n"
12192 "};\n"
12193 "void main(){\n"
12194 " outs.x = 0;\n"
12195 " gl_Position = vec4(1);\n"
12196 "}\n";
12197 char const *fsSource =
12198 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130012199 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012200 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +130012201 "layout(location=0) out vec4 color;\n"
12202 "void main(){\n"
12203 " color = vec4(ins.x);\n"
12204 "}\n";
12205
12206 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12207 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12208
12209 VkPipelineObj pipe(m_device);
12210 pipe.AddColorAttachment();
12211 pipe.AddShader(&vs);
12212 pipe.AddShader(&fs);
12213
12214 VkDescriptorSetObj descriptorSet(m_device);
12215 descriptorSet.AppendDummy();
12216 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12217
12218 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12219
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012220 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130012221}
12222
12223TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
12224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12225 "location 0.0 which is not written by vertex shader");
12226
12227 ASSERT_NO_FATAL_FAILURE(InitState());
12228 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12229
12230 char const *vsSource =
12231 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130012232 "\n"
12233 "out block { layout(location=1) float x; } outs;\n"
12234 "out gl_PerVertex {\n"
12235 " vec4 gl_Position;\n"
12236 "};\n"
12237 "void main(){\n"
12238 " outs.x = 0;\n"
12239 " gl_Position = vec4(1);\n"
12240 "}\n";
12241 char const *fsSource =
12242 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130012243 "\n"
12244 "in block { layout(location=0) float x; } ins;\n"
12245 "layout(location=0) out vec4 color;\n"
12246 "void main(){\n"
12247 " color = vec4(ins.x);\n"
12248 "}\n";
12249
12250 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12251 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12252
12253 VkPipelineObj pipe(m_device);
12254 pipe.AddColorAttachment();
12255 pipe.AddShader(&vs);
12256 pipe.AddShader(&fs);
12257
12258 VkDescriptorSetObj descriptorSet(m_device);
12259 descriptorSet.AppendDummy();
12260 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12261
12262 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12263
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012264 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130012265}
12266
12267TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
12268 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12269 "location 0.1 which is not written by vertex shader");
12270
12271 ASSERT_NO_FATAL_FAILURE(InitState());
12272 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12273
12274 char const *vsSource =
12275 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130012276 "\n"
12277 "out block { layout(location=0, component=0) float x; } outs;\n"
12278 "out gl_PerVertex {\n"
12279 " vec4 gl_Position;\n"
12280 "};\n"
12281 "void main(){\n"
12282 " outs.x = 0;\n"
12283 " gl_Position = vec4(1);\n"
12284 "}\n";
12285 char const *fsSource =
12286 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130012287 "\n"
12288 "in block { layout(location=0, component=1) float x; } ins;\n"
12289 "layout(location=0) out vec4 color;\n"
12290 "void main(){\n"
12291 " color = vec4(ins.x);\n"
12292 "}\n";
12293
12294 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12295 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12296
12297 VkPipelineObj pipe(m_device);
12298 pipe.AddColorAttachment();
12299 pipe.AddShader(&vs);
12300 pipe.AddShader(&fs);
12301
12302 VkDescriptorSetObj descriptorSet(m_device);
12303 descriptorSet.AppendDummy();
12304 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12305
12306 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12307
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012308 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130012309}
12310
Karl Schultz6addd812016-02-02 17:17:23 -070012311TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012312 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012313 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012314
Chris Forbesde136e02015-05-25 11:13:28 +120012315 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012316 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120012317
12318 VkVertexInputBindingDescription input_binding;
12319 memset(&input_binding, 0, sizeof(input_binding));
12320
12321 VkVertexInputAttributeDescription input_attrib;
12322 memset(&input_attrib, 0, sizeof(input_attrib));
12323 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12324
12325 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012326 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120012327 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070012328 "out gl_PerVertex {\n"
12329 " vec4 gl_Position;\n"
12330 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +120012331 "void main(){\n"
12332 " gl_Position = vec4(1);\n"
12333 "}\n";
12334 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012335 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120012336 "\n"
12337 "layout(location=0) out vec4 color;\n"
12338 "void main(){\n"
12339 " color = vec4(1);\n"
12340 "}\n";
12341
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012342 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12343 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120012344
12345 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012346 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120012347 pipe.AddShader(&vs);
12348 pipe.AddShader(&fs);
12349
12350 pipe.AddVertexInputBindings(&input_binding, 1);
12351 pipe.AddVertexInputAttribs(&input_attrib, 1);
12352
Chris Forbesde136e02015-05-25 11:13:28 +120012353 VkDescriptorSetObj descriptorSet(m_device);
12354 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012355 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120012356
Tony Barbour5781e8f2015-08-04 16:23:11 -060012357 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120012358
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012359 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120012360}
12361
Karl Schultz6addd812016-02-02 17:17:23 -070012362TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012363 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012364 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +130012365
12366 ASSERT_NO_FATAL_FAILURE(InitState());
12367 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12368
12369 VkVertexInputBindingDescription input_binding;
12370 memset(&input_binding, 0, sizeof(input_binding));
12371
12372 VkVertexInputAttributeDescription input_attrib;
12373 memset(&input_attrib, 0, sizeof(input_attrib));
12374 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12375
12376 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012377 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130012378 "\n"
12379 "layout(location=1) in float x;\n"
12380 "out gl_PerVertex {\n"
12381 " vec4 gl_Position;\n"
12382 "};\n"
12383 "void main(){\n"
12384 " gl_Position = vec4(x);\n"
12385 "}\n";
12386 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012387 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130012388 "\n"
12389 "layout(location=0) out vec4 color;\n"
12390 "void main(){\n"
12391 " color = vec4(1);\n"
12392 "}\n";
12393
12394 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12395 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12396
12397 VkPipelineObj pipe(m_device);
12398 pipe.AddColorAttachment();
12399 pipe.AddShader(&vs);
12400 pipe.AddShader(&fs);
12401
12402 pipe.AddVertexInputBindings(&input_binding, 1);
12403 pipe.AddVertexInputAttribs(&input_attrib, 1);
12404
12405 VkDescriptorSetObj descriptorSet(m_device);
12406 descriptorSet.AppendDummy();
12407 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12408
12409 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12410
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012411 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130012412}
12413
Karl Schultz6addd812016-02-02 17:17:23 -070012414TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
12415 m_errorMonitor->SetDesiredFailureMsg(
12416 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012417 "VS consumes input at location 0 but not provided");
12418
Chris Forbes62e8e502015-05-25 11:13:29 +120012419 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012420 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120012421
12422 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012423 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120012424 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012425 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -070012426 "out gl_PerVertex {\n"
12427 " vec4 gl_Position;\n"
12428 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120012429 "void main(){\n"
12430 " gl_Position = x;\n"
12431 "}\n";
12432 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012433 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120012434 "\n"
12435 "layout(location=0) out vec4 color;\n"
12436 "void main(){\n"
12437 " color = vec4(1);\n"
12438 "}\n";
12439
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012440 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12441 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120012442
12443 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012444 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120012445 pipe.AddShader(&vs);
12446 pipe.AddShader(&fs);
12447
Chris Forbes62e8e502015-05-25 11:13:29 +120012448 VkDescriptorSetObj descriptorSet(m_device);
12449 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012450 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120012451
Tony Barbour5781e8f2015-08-04 16:23:11 -060012452 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120012453
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012454 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120012455}
12456
Karl Schultz6addd812016-02-02 17:17:23 -070012457TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
12458 m_errorMonitor->SetDesiredFailureMsg(
12459 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012460 "location 0 does not match VS input type");
12461
Chris Forbesc97d98e2015-05-25 11:13:31 +120012462 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012463 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120012464
12465 VkVertexInputBindingDescription input_binding;
12466 memset(&input_binding, 0, sizeof(input_binding));
12467
12468 VkVertexInputAttributeDescription input_attrib;
12469 memset(&input_attrib, 0, sizeof(input_attrib));
12470 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12471
12472 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012473 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120012474 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012475 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070012476 "out gl_PerVertex {\n"
12477 " vec4 gl_Position;\n"
12478 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120012479 "void main(){\n"
12480 " gl_Position = vec4(x);\n"
12481 "}\n";
12482 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012483 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120012484 "\n"
12485 "layout(location=0) out vec4 color;\n"
12486 "void main(){\n"
12487 " color = vec4(1);\n"
12488 "}\n";
12489
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012490 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12491 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120012492
12493 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012494 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120012495 pipe.AddShader(&vs);
12496 pipe.AddShader(&fs);
12497
12498 pipe.AddVertexInputBindings(&input_binding, 1);
12499 pipe.AddVertexInputAttribs(&input_attrib, 1);
12500
Chris Forbesc97d98e2015-05-25 11:13:31 +120012501 VkDescriptorSetObj descriptorSet(m_device);
12502 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012503 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120012504
Tony Barbour5781e8f2015-08-04 16:23:11 -060012505 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120012506
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012507 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120012508}
12509
Chris Forbesc68b43c2016-04-06 11:18:47 +120012510TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
12511 m_errorMonitor->SetDesiredFailureMsg(
12512 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12513 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
12514
12515 ASSERT_NO_FATAL_FAILURE(InitState());
12516 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12517
12518 char const *vsSource =
12519 "#version 450\n"
12520 "\n"
12521 "out gl_PerVertex {\n"
12522 " vec4 gl_Position;\n"
12523 "};\n"
12524 "void main(){\n"
12525 " gl_Position = vec4(1);\n"
12526 "}\n";
12527 char const *fsSource =
12528 "#version 450\n"
12529 "\n"
12530 "layout(location=0) out vec4 color;\n"
12531 "void main(){\n"
12532 " color = vec4(1);\n"
12533 "}\n";
12534
12535 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12536 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12537
12538 VkPipelineObj pipe(m_device);
12539 pipe.AddColorAttachment();
12540 pipe.AddShader(&vs);
12541 pipe.AddShader(&vs);
12542 pipe.AddShader(&fs);
12543
12544 VkDescriptorSetObj descriptorSet(m_device);
12545 descriptorSet.AppendDummy();
12546 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12547
12548 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12549
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012550 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120012551}
12552
Karl Schultz6addd812016-02-02 17:17:23 -070012553TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012554 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130012555
12556 ASSERT_NO_FATAL_FAILURE(InitState());
12557 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12558
12559 VkVertexInputBindingDescription input_binding;
12560 memset(&input_binding, 0, sizeof(input_binding));
12561
12562 VkVertexInputAttributeDescription input_attribs[2];
12563 memset(input_attribs, 0, sizeof(input_attribs));
12564
12565 for (int i = 0; i < 2; i++) {
12566 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
12567 input_attribs[i].location = i;
12568 }
12569
12570 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012571 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012572 "\n"
12573 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070012574 "out gl_PerVertex {\n"
12575 " vec4 gl_Position;\n"
12576 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012577 "void main(){\n"
12578 " gl_Position = x[0] + x[1];\n"
12579 "}\n";
12580 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012581 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012582 "\n"
12583 "layout(location=0) out vec4 color;\n"
12584 "void main(){\n"
12585 " color = vec4(1);\n"
12586 "}\n";
12587
12588 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12589 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12590
12591 VkPipelineObj pipe(m_device);
12592 pipe.AddColorAttachment();
12593 pipe.AddShader(&vs);
12594 pipe.AddShader(&fs);
12595
12596 pipe.AddVertexInputBindings(&input_binding, 1);
12597 pipe.AddVertexInputAttribs(input_attribs, 2);
12598
12599 VkDescriptorSetObj descriptorSet(m_device);
12600 descriptorSet.AppendDummy();
12601 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12602
12603 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12604
12605 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012606 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130012607}
12608
Chris Forbes2682b242015-11-24 11:13:14 +130012609TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
12610{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012611 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130012612
12613 ASSERT_NO_FATAL_FAILURE(InitState());
12614 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12615
12616 VkVertexInputBindingDescription input_binding;
12617 memset(&input_binding, 0, sizeof(input_binding));
12618
12619 VkVertexInputAttributeDescription input_attribs[2];
12620 memset(input_attribs, 0, sizeof(input_attribs));
12621
12622 for (int i = 0; i < 2; i++) {
12623 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
12624 input_attribs[i].location = i;
12625 }
12626
12627 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012628 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012629 "\n"
12630 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -070012631 "out gl_PerVertex {\n"
12632 " vec4 gl_Position;\n"
12633 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012634 "void main(){\n"
12635 " gl_Position = x[0] + x[1];\n"
12636 "}\n";
12637 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012638 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012639 "\n"
12640 "layout(location=0) out vec4 color;\n"
12641 "void main(){\n"
12642 " color = vec4(1);\n"
12643 "}\n";
12644
12645 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12646 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12647
12648 VkPipelineObj pipe(m_device);
12649 pipe.AddColorAttachment();
12650 pipe.AddShader(&vs);
12651 pipe.AddShader(&fs);
12652
12653 pipe.AddVertexInputBindings(&input_binding, 1);
12654 pipe.AddVertexInputAttribs(input_attribs, 2);
12655
12656 VkDescriptorSetObj descriptorSet(m_device);
12657 descriptorSet.AppendDummy();
12658 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12659
12660 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12661
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012662 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130012663}
Chris Forbes2682b242015-11-24 11:13:14 +130012664
Chris Forbesbc290ce2016-07-06 12:01:49 +120012665TEST_F(VkLayerTest, CreatePipelineAttribComponents)
12666{
12667 m_errorMonitor->ExpectSuccess();
12668
12669 ASSERT_NO_FATAL_FAILURE(InitState());
12670 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12671
12672 VkVertexInputBindingDescription input_binding;
12673 memset(&input_binding, 0, sizeof(input_binding));
12674
12675 VkVertexInputAttributeDescription input_attribs[3];
12676 memset(input_attribs, 0, sizeof(input_attribs));
12677
12678 for (int i = 0; i < 3; i++) {
12679 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
12680 input_attribs[i].location = i;
12681 }
12682
12683 char const *vsSource =
12684 "#version 450\n"
12685 "\n"
12686 "layout(location=0) in vec4 x;\n"
12687 "layout(location=1) in vec3 y1;\n"
12688 "layout(location=1, component=3) in float y2;\n"
12689 "layout(location=2) in vec4 z;\n"
12690 "out gl_PerVertex {\n"
12691 " vec4 gl_Position;\n"
12692 "};\n"
12693 "void main(){\n"
12694 " gl_Position = x + vec4(y1, y2) + z;\n"
12695 "}\n";
12696 char const *fsSource =
12697 "#version 450\n"
12698 "\n"
12699 "layout(location=0) out vec4 color;\n"
12700 "void main(){\n"
12701 " color = vec4(1);\n"
12702 "}\n";
12703
12704 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12705 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12706
12707 VkPipelineObj pipe(m_device);
12708 pipe.AddColorAttachment();
12709 pipe.AddShader(&vs);
12710 pipe.AddShader(&fs);
12711
12712 pipe.AddVertexInputBindings(&input_binding, 1);
12713 pipe.AddVertexInputAttribs(input_attribs, 3);
12714
12715 VkDescriptorSetObj descriptorSet(m_device);
12716 descriptorSet.AppendDummy();
12717 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12718
12719 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12720
12721 m_errorMonitor->VerifyNotFound();
12722}
12723
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012724TEST_F(VkLayerTest, CreatePipelineSimplePositive)
12725{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012726 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012727
12728 ASSERT_NO_FATAL_FAILURE(InitState());
12729 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12730
12731 char const *vsSource =
12732 "#version 450\n"
12733 "out gl_PerVertex {\n"
12734 " vec4 gl_Position;\n"
12735 "};\n"
12736 "void main(){\n"
12737 " gl_Position = vec4(0);\n"
12738 "}\n";
12739 char const *fsSource =
12740 "#version 450\n"
12741 "\n"
12742 "layout(location=0) out vec4 color;\n"
12743 "void main(){\n"
12744 " color = vec4(1);\n"
12745 "}\n";
12746
12747 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12748 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12749
12750 VkPipelineObj pipe(m_device);
12751 pipe.AddColorAttachment();
12752 pipe.AddShader(&vs);
12753 pipe.AddShader(&fs);
12754
12755 VkDescriptorSetObj descriptorSet(m_device);
12756 descriptorSet.AppendDummy();
12757 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12758
12759 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12760
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012761 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012762}
12763
Chris Forbes912c9192016-04-05 17:50:35 +120012764TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
12765{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012766 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +120012767
12768 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
12769
12770 ASSERT_NO_FATAL_FAILURE(InitState());
12771 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12772
12773 char const *vsSource =
12774 "#version 450\n"
12775 "out gl_PerVertex {\n"
12776 " vec4 gl_Position;\n"
12777 "};\n"
12778 "layout(location=0) out vec3 x;\n"
12779 "layout(location=1) out ivec3 y;\n"
12780 "layout(location=2) out vec3 z;\n"
12781 "void main(){\n"
12782 " gl_Position = vec4(0);\n"
12783 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
12784 "}\n";
12785 char const *fsSource =
12786 "#version 450\n"
12787 "\n"
12788 "layout(location=0) out vec4 color;\n"
12789 "layout(location=0) in float x;\n"
12790 "layout(location=1) flat in int y;\n"
12791 "layout(location=2) in vec2 z;\n"
12792 "void main(){\n"
12793 " color = vec4(1 + x + y + z.x);\n"
12794 "}\n";
12795
12796 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12797 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12798
12799 VkPipelineObj pipe(m_device);
12800 pipe.AddColorAttachment();
12801 pipe.AddShader(&vs);
12802 pipe.AddShader(&fs);
12803
12804 VkDescriptorSetObj descriptorSet(m_device);
12805 descriptorSet.AppendDummy();
12806 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12807
Mike Stroyan255e9582016-06-24 09:49:32 -060012808 VkResult err = VK_SUCCESS;
12809 err =
12810 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12811 ASSERT_VK_SUCCESS(err);
12812
Chris Forbes912c9192016-04-05 17:50:35 +120012813
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012814 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +120012815}
12816
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012817TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
12818{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012819 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012820
12821 ASSERT_NO_FATAL_FAILURE(InitState());
12822 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12823
Chris Forbesc1e852d2016-04-04 19:26:42 +120012824 if (!m_device->phy().features().tessellationShader) {
12825 printf("Device does not support tessellation shaders; skipped.\n");
12826 return;
12827 }
12828
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012829 char const *vsSource =
12830 "#version 450\n"
12831 "void main(){}\n";
12832 char const *tcsSource =
12833 "#version 450\n"
12834 "layout(location=0) out int x[];\n"
12835 "layout(vertices=3) out;\n"
12836 "void main(){\n"
12837 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
12838 " gl_TessLevelInner[0] = 1;\n"
12839 " x[gl_InvocationID] = gl_InvocationID;\n"
12840 "}\n";
12841 char const *tesSource =
12842 "#version 450\n"
12843 "layout(triangles, equal_spacing, cw) in;\n"
12844 "layout(location=0) in int x[];\n"
12845 "out gl_PerVertex { vec4 gl_Position; };\n"
12846 "void main(){\n"
12847 " gl_Position.xyz = gl_TessCoord;\n"
12848 " gl_Position.w = x[0] + x[1] + x[2];\n"
12849 "}\n";
12850 char const *fsSource =
12851 "#version 450\n"
12852 "layout(location=0) out vec4 color;\n"
12853 "void main(){\n"
12854 " color = vec4(1);\n"
12855 "}\n";
12856
12857 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12858 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
12859 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
12860 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12861
12862 VkPipelineInputAssemblyStateCreateInfo iasci{
12863 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
12864 nullptr,
12865 0,
12866 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
12867 VK_FALSE};
12868
Chris Forbesb4cacb62016-04-04 19:15:00 +120012869 VkPipelineTessellationStateCreateInfo tsci{
12870 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
12871 nullptr,
12872 0,
12873 3};
12874
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012875 VkPipelineObj pipe(m_device);
12876 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +120012877 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012878 pipe.AddColorAttachment();
12879 pipe.AddShader(&vs);
12880 pipe.AddShader(&tcs);
12881 pipe.AddShader(&tes);
12882 pipe.AddShader(&fs);
12883
12884 VkDescriptorSetObj descriptorSet(m_device);
12885 descriptorSet.AppendDummy();
12886 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12887
12888 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12889
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012890 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012891}
12892
Chris Forbesa0ab8152016-04-20 13:34:27 +120012893TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
12894{
12895 m_errorMonitor->ExpectSuccess();
12896
12897 ASSERT_NO_FATAL_FAILURE(InitState());
12898 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12899
12900 if (!m_device->phy().features().geometryShader) {
12901 printf("Device does not support geometry shaders; skipped.\n");
12902 return;
12903 }
12904
12905 char const *vsSource =
12906 "#version 450\n"
12907 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
12908 "void main(){\n"
12909 " vs_out.x = vec4(1);\n"
12910 "}\n";
12911 char const *gsSource =
12912 "#version 450\n"
12913 "layout(triangles) in;\n"
12914 "layout(triangle_strip, max_vertices=3) out;\n"
12915 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
12916 "out gl_PerVertex { vec4 gl_Position; };\n"
12917 "void main() {\n"
12918 " gl_Position = gs_in[0].x;\n"
12919 " EmitVertex();\n"
12920 "}\n";
12921 char const *fsSource =
12922 "#version 450\n"
12923 "layout(location=0) out vec4 color;\n"
12924 "void main(){\n"
12925 " color = vec4(1);\n"
12926 "}\n";
12927
12928 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12929 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
12930 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12931
12932 VkPipelineObj pipe(m_device);
12933 pipe.AddColorAttachment();
12934 pipe.AddShader(&vs);
12935 pipe.AddShader(&gs);
12936 pipe.AddShader(&fs);
12937
12938 VkDescriptorSetObj descriptorSet(m_device);
12939 descriptorSet.AppendDummy();
12940 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12941
12942 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12943
12944 m_errorMonitor->VerifyNotFound();
12945}
12946
Chris Forbesa0193bc2016-04-04 19:19:47 +120012947TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
12948{
12949 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12950 "is per-vertex in tessellation control shader stage "
12951 "but per-patch in tessellation evaluation shader stage");
12952
12953 ASSERT_NO_FATAL_FAILURE(InitState());
12954 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12955
Chris Forbesc1e852d2016-04-04 19:26:42 +120012956 if (!m_device->phy().features().tessellationShader) {
12957 printf("Device does not support tessellation shaders; skipped.\n");
12958 return;
12959 }
12960
Chris Forbesa0193bc2016-04-04 19:19:47 +120012961 char const *vsSource =
12962 "#version 450\n"
12963 "void main(){}\n";
12964 char const *tcsSource =
12965 "#version 450\n"
12966 "layout(location=0) out int x[];\n"
12967 "layout(vertices=3) out;\n"
12968 "void main(){\n"
12969 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
12970 " gl_TessLevelInner[0] = 1;\n"
12971 " x[gl_InvocationID] = gl_InvocationID;\n"
12972 "}\n";
12973 char const *tesSource =
12974 "#version 450\n"
12975 "layout(triangles, equal_spacing, cw) in;\n"
12976 "layout(location=0) patch in int x;\n"
12977 "out gl_PerVertex { vec4 gl_Position; };\n"
12978 "void main(){\n"
12979 " gl_Position.xyz = gl_TessCoord;\n"
12980 " gl_Position.w = x;\n"
12981 "}\n";
12982 char const *fsSource =
12983 "#version 450\n"
12984 "layout(location=0) out vec4 color;\n"
12985 "void main(){\n"
12986 " color = vec4(1);\n"
12987 "}\n";
12988
12989 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12990 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
12991 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
12992 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12993
12994 VkPipelineInputAssemblyStateCreateInfo iasci{
12995 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
12996 nullptr,
12997 0,
12998 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
12999 VK_FALSE};
13000
13001 VkPipelineTessellationStateCreateInfo tsci{
13002 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
13003 nullptr,
13004 0,
13005 3};
13006
13007 VkPipelineObj pipe(m_device);
13008 pipe.SetInputAssembly(&iasci);
13009 pipe.SetTessellation(&tsci);
13010 pipe.AddColorAttachment();
13011 pipe.AddShader(&vs);
13012 pipe.AddShader(&tcs);
13013 pipe.AddShader(&tes);
13014 pipe.AddShader(&fs);
13015
13016 VkDescriptorSetObj descriptorSet(m_device);
13017 descriptorSet.AppendDummy();
13018 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13019
13020 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13021
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013022 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120013023}
13024
Karl Schultz6addd812016-02-02 17:17:23 -070013025TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
13026 m_errorMonitor->SetDesiredFailureMsg(
13027 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013028 "Duplicate vertex input binding descriptions for binding 0");
13029
Chris Forbes280ba2c2015-06-12 11:16:41 +120013030 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013031 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120013032
13033 /* Two binding descriptions for binding 0 */
13034 VkVertexInputBindingDescription input_bindings[2];
13035 memset(input_bindings, 0, sizeof(input_bindings));
13036
13037 VkVertexInputAttributeDescription input_attrib;
13038 memset(&input_attrib, 0, sizeof(input_attrib));
13039 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13040
13041 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013042 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120013043 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013044 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070013045 "out gl_PerVertex {\n"
13046 " vec4 gl_Position;\n"
13047 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120013048 "void main(){\n"
13049 " gl_Position = vec4(x);\n"
13050 "}\n";
13051 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013052 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120013053 "\n"
13054 "layout(location=0) out vec4 color;\n"
13055 "void main(){\n"
13056 " color = vec4(1);\n"
13057 "}\n";
13058
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013059 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13060 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120013061
13062 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013063 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120013064 pipe.AddShader(&vs);
13065 pipe.AddShader(&fs);
13066
13067 pipe.AddVertexInputBindings(input_bindings, 2);
13068 pipe.AddVertexInputAttribs(&input_attrib, 1);
13069
Chris Forbes280ba2c2015-06-12 11:16:41 +120013070 VkDescriptorSetObj descriptorSet(m_device);
13071 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013072 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120013073
Tony Barbour5781e8f2015-08-04 16:23:11 -060013074 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120013075
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013076 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120013077}
Chris Forbes8f68b562015-05-25 11:13:32 +120013078
Chris Forbes35efec72016-04-21 14:32:08 +120013079TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
13080 m_errorMonitor->ExpectSuccess();
13081
13082 ASSERT_NO_FATAL_FAILURE(InitState());
13083 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13084
Chris Forbes91cf3a82016-06-28 17:51:35 +120013085 if (!m_device->phy().features().shaderFloat64) {
Chris Forbes35efec72016-04-21 14:32:08 +120013086 printf("Device does not support 64bit vertex attributes; skipped.\n");
13087 return;
13088 }
13089
13090 VkVertexInputBindingDescription input_bindings[1];
13091 memset(input_bindings, 0, sizeof(input_bindings));
13092
13093 VkVertexInputAttributeDescription input_attribs[4];
13094 memset(input_attribs, 0, sizeof(input_attribs));
13095 input_attribs[0].location = 0;
13096 input_attribs[0].offset = 0;
13097 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
13098 input_attribs[1].location = 2;
13099 input_attribs[1].offset = 32;
13100 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
13101 input_attribs[2].location = 4;
13102 input_attribs[2].offset = 64;
13103 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
13104 input_attribs[3].location = 6;
13105 input_attribs[3].offset = 96;
13106 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
13107
13108 char const *vsSource =
13109 "#version 450\n"
13110 "\n"
13111 "layout(location=0) in dmat4 x;\n"
13112 "out gl_PerVertex {\n"
13113 " vec4 gl_Position;\n"
13114 "};\n"
13115 "void main(){\n"
13116 " gl_Position = vec4(x[0][0]);\n"
13117 "}\n";
13118 char const *fsSource =
13119 "#version 450\n"
13120 "\n"
13121 "layout(location=0) out vec4 color;\n"
13122 "void main(){\n"
13123 " color = vec4(1);\n"
13124 "}\n";
13125
13126 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13127 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13128
13129 VkPipelineObj pipe(m_device);
13130 pipe.AddColorAttachment();
13131 pipe.AddShader(&vs);
13132 pipe.AddShader(&fs);
13133
13134 pipe.AddVertexInputBindings(input_bindings, 1);
13135 pipe.AddVertexInputAttribs(input_attribs, 4);
13136
13137 VkDescriptorSetObj descriptorSet(m_device);
13138 descriptorSet.AppendDummy();
13139 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13140
13141 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13142
13143 m_errorMonitor->VerifyNotFound();
13144}
13145
Karl Schultz6addd812016-02-02 17:17:23 -070013146TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013147 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013148 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013149
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013150 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013151
13152 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013153 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013154 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013155 "out gl_PerVertex {\n"
13156 " vec4 gl_Position;\n"
13157 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013158 "void main(){\n"
13159 " gl_Position = vec4(1);\n"
13160 "}\n";
13161 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013162 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013163 "\n"
13164 "void main(){\n"
13165 "}\n";
13166
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013167 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13168 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013169
13170 VkPipelineObj pipe(m_device);
13171 pipe.AddShader(&vs);
13172 pipe.AddShader(&fs);
13173
Chia-I Wu08accc62015-07-07 11:50:03 +080013174 /* set up CB 0, not written */
13175 pipe.AddColorAttachment();
13176 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013177
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013178 VkDescriptorSetObj descriptorSet(m_device);
13179 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013180 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013181
Tony Barbour5781e8f2015-08-04 16:23:11 -060013182 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013183
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013184 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013185}
13186
Karl Schultz6addd812016-02-02 17:17:23 -070013187TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -070013188 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070013189 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013190 "FS writes to output location 1 with no matching attachment");
13191
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013192 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013193
13194 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013195 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013196 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013197 "out gl_PerVertex {\n"
13198 " vec4 gl_Position;\n"
13199 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013200 "void main(){\n"
13201 " gl_Position = vec4(1);\n"
13202 "}\n";
13203 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013204 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013205 "\n"
13206 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013207 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013208 "void main(){\n"
13209 " x = vec4(1);\n"
13210 " y = vec4(1);\n"
13211 "}\n";
13212
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013213 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13214 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013215
13216 VkPipelineObj pipe(m_device);
13217 pipe.AddShader(&vs);
13218 pipe.AddShader(&fs);
13219
Chia-I Wu08accc62015-07-07 11:50:03 +080013220 /* set up CB 0, not written */
13221 pipe.AddColorAttachment();
13222 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013223 /* FS writes CB 1, but we don't configure it */
13224
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013225 VkDescriptorSetObj descriptorSet(m_device);
13226 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013227 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013228
Tony Barbour5781e8f2015-08-04 16:23:11 -060013229 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013230
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013231 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013232}
13233
Karl Schultz6addd812016-02-02 17:17:23 -070013234TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013235 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013236 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013237
Chris Forbesa36d69e2015-05-25 11:13:44 +120013238 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013239
13240 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013241 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120013242 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013243 "out gl_PerVertex {\n"
13244 " vec4 gl_Position;\n"
13245 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120013246 "void main(){\n"
13247 " gl_Position = vec4(1);\n"
13248 "}\n";
13249 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013250 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120013251 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013252 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +120013253 "void main(){\n"
13254 " x = ivec4(1);\n"
13255 "}\n";
13256
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013257 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13258 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120013259
13260 VkPipelineObj pipe(m_device);
13261 pipe.AddShader(&vs);
13262 pipe.AddShader(&fs);
13263
Chia-I Wu08accc62015-07-07 11:50:03 +080013264 /* set up CB 0; type is UNORM by default */
13265 pipe.AddColorAttachment();
13266 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013267
Chris Forbesa36d69e2015-05-25 11:13:44 +120013268 VkDescriptorSetObj descriptorSet(m_device);
13269 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013270 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120013271
Tony Barbour5781e8f2015-08-04 16:23:11 -060013272 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013273
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013274 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120013275}
Chris Forbes7b1b8932015-06-05 14:43:36 +120013276
Karl Schultz6addd812016-02-02 17:17:23 -070013277TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013278 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013279 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013280
Chris Forbes556c76c2015-08-14 12:04:59 +120013281 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120013282
13283 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013284 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120013285 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013286 "out gl_PerVertex {\n"
13287 " vec4 gl_Position;\n"
13288 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120013289 "void main(){\n"
13290 " gl_Position = vec4(1);\n"
13291 "}\n";
13292 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013293 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120013294 "\n"
13295 "layout(location=0) out vec4 x;\n"
13296 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
13297 "void main(){\n"
13298 " x = vec4(bar.y);\n"
13299 "}\n";
13300
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013301 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13302 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120013303
Chris Forbes556c76c2015-08-14 12:04:59 +120013304 VkPipelineObj pipe(m_device);
13305 pipe.AddShader(&vs);
13306 pipe.AddShader(&fs);
13307
13308 /* set up CB 0; type is UNORM by default */
13309 pipe.AddColorAttachment();
13310 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13311
13312 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013313 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120013314
13315 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13316
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013317 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120013318}
13319
Chris Forbes5c59e902016-02-26 16:56:09 +130013320TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
13321 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13322 "not declared in layout");
13323
13324 ASSERT_NO_FATAL_FAILURE(InitState());
13325
13326 char const *vsSource =
13327 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130013328 "\n"
13329 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13330 "out gl_PerVertex {\n"
13331 " vec4 gl_Position;\n"
13332 "};\n"
13333 "void main(){\n"
13334 " gl_Position = vec4(consts.x);\n"
13335 "}\n";
13336 char const *fsSource =
13337 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130013338 "\n"
13339 "layout(location=0) out vec4 x;\n"
13340 "void main(){\n"
13341 " x = vec4(1);\n"
13342 "}\n";
13343
13344 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13345 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13346
13347 VkPipelineObj pipe(m_device);
13348 pipe.AddShader(&vs);
13349 pipe.AddShader(&fs);
13350
13351 /* set up CB 0; type is UNORM by default */
13352 pipe.AddColorAttachment();
13353 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13354
13355 VkDescriptorSetObj descriptorSet(m_device);
13356 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13357
13358 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13359
13360 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013361 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130013362}
13363
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013364TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
13365 m_errorMonitor->SetDesiredFailureMsg(
13366 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13367 "Shader uses descriptor slot 0.0");
13368
13369 ASSERT_NO_FATAL_FAILURE(InitState());
13370
13371 char const *csSource =
13372 "#version 450\n"
13373 "\n"
13374 "layout(local_size_x=1) in;\n"
13375 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13376 "void main(){\n"
13377 " x = vec4(1);\n"
13378 "}\n";
13379
13380 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13381
13382 VkDescriptorSetObj descriptorSet(m_device);
13383 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13384
13385 VkComputePipelineCreateInfo cpci = {
13386 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
13387 nullptr, 0, {
13388 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
13389 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
13390 cs.handle(), "main", nullptr
13391 },
13392 descriptorSet.GetPipelineLayout(),
13393 VK_NULL_HANDLE, -1
13394 };
13395
13396 VkPipeline pipe;
13397 VkResult err = vkCreateComputePipelines(
13398 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
13399
13400 m_errorMonitor->VerifyFound();
13401
13402 if (err == VK_SUCCESS) {
13403 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13404 }
13405}
13406
13407TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
13408 m_errorMonitor->ExpectSuccess();
13409
13410 ASSERT_NO_FATAL_FAILURE(InitState());
13411
13412 char const *csSource =
13413 "#version 450\n"
13414 "\n"
13415 "layout(local_size_x=1) in;\n"
13416 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13417 "void main(){\n"
13418 " // x is not used.\n"
13419 "}\n";
13420
13421 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13422
13423 VkDescriptorSetObj descriptorSet(m_device);
13424 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13425
13426 VkComputePipelineCreateInfo cpci = {
13427 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
13428 nullptr, 0, {
13429 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
13430 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
13431 cs.handle(), "main", nullptr
13432 },
13433 descriptorSet.GetPipelineLayout(),
13434 VK_NULL_HANDLE, -1
13435 };
13436
13437 VkPipeline pipe;
13438 VkResult err = vkCreateComputePipelines(
13439 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
13440
13441 m_errorMonitor->VerifyNotFound();
13442
13443 if (err == VK_SUCCESS) {
13444 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13445 }
13446}
13447
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013448#endif // SHADER_CHECKER_TESTS
13449
13450#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -060013451TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -070013452 m_errorMonitor->SetDesiredFailureMsg(
13453 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013454 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013455
13456 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013457
13458 // Create an image
13459 VkImage image;
13460
Karl Schultz6addd812016-02-02 17:17:23 -070013461 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
13462 const int32_t tex_width = 32;
13463 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013464
13465 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013466 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13467 image_create_info.pNext = NULL;
13468 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13469 image_create_info.format = tex_format;
13470 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013471 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070013472 image_create_info.extent.depth = 1;
13473 image_create_info.mipLevels = 1;
13474 image_create_info.arrayLayers = 1;
13475 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13476 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13477 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
13478 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013479
13480 // Introduce error by sending down a bogus width extent
13481 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013482 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013483
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013484 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013485}
13486
Mark Youngc48c4c12016-04-11 14:26:49 -060013487TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
13488 m_errorMonitor->SetDesiredFailureMsg(
13489 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13490 "CreateImage extents is 0 for at least one required dimension");
13491
13492 ASSERT_NO_FATAL_FAILURE(InitState());
13493
13494 // Create an image
13495 VkImage image;
13496
13497 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
13498 const int32_t tex_width = 32;
13499 const int32_t tex_height = 32;
13500
13501 VkImageCreateInfo image_create_info = {};
13502 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13503 image_create_info.pNext = NULL;
13504 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13505 image_create_info.format = tex_format;
13506 image_create_info.extent.width = tex_width;
13507 image_create_info.extent.height = tex_height;
13508 image_create_info.extent.depth = 1;
13509 image_create_info.mipLevels = 1;
13510 image_create_info.arrayLayers = 1;
13511 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13512 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13513 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
13514 image_create_info.flags = 0;
13515
13516 // Introduce error by sending down a bogus width extent
13517 image_create_info.extent.width = 0;
13518 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
13519
13520 m_errorMonitor->VerifyFound();
13521}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013522#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +120013523
Tobin Ehliscde08892015-09-22 10:11:37 -060013524#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070013525TEST_F(VkLayerTest, InvalidImageView) {
13526 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060013527
Karl Schultz6addd812016-02-02 17:17:23 -070013528 m_errorMonitor->SetDesiredFailureMsg(
13529 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013530 "vkCreateImageView called with baseMipLevel 10 ");
13531
Tobin Ehliscde08892015-09-22 10:11:37 -060013532 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060013533
Mike Stroyana3082432015-09-25 13:39:21 -060013534 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070013535 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060013536
Karl Schultz6addd812016-02-02 17:17:23 -070013537 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
13538 const int32_t tex_width = 32;
13539 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060013540
13541 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013542 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13543 image_create_info.pNext = NULL;
13544 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13545 image_create_info.format = tex_format;
13546 image_create_info.extent.width = tex_width;
13547 image_create_info.extent.height = tex_height;
13548 image_create_info.extent.depth = 1;
13549 image_create_info.mipLevels = 1;
13550 image_create_info.arrayLayers = 1;
13551 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13552 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13553 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
13554 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060013555
Chia-I Wuf7458c52015-10-26 21:10:41 +080013556 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060013557 ASSERT_VK_SUCCESS(err);
13558
13559 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013560 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13561 image_view_create_info.image = image;
13562 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
13563 image_view_create_info.format = tex_format;
13564 image_view_create_info.subresourceRange.layerCount = 1;
13565 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
13566 image_view_create_info.subresourceRange.levelCount = 1;
13567 image_view_create_info.subresourceRange.aspectMask =
13568 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060013569
13570 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070013571 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
13572 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060013573
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013574 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060013575 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060013576}
Mike Stroyana3082432015-09-25 13:39:21 -060013577
Mark Youngd339ba32016-05-30 13:28:35 -060013578TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
13579 VkResult err;
13580
13581 m_errorMonitor->SetDesiredFailureMsg(
13582 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -060013583 "used without first calling vkBindImageMemory");
Mark Youngd339ba32016-05-30 13:28:35 -060013584
13585 ASSERT_NO_FATAL_FAILURE(InitState());
13586
13587 // Create an image and try to create a view with no memory backing the image
13588 VkImage image;
13589
13590 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
13591 const int32_t tex_width = 32;
13592 const int32_t tex_height = 32;
13593
13594 VkImageCreateInfo image_create_info = {};
13595 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13596 image_create_info.pNext = NULL;
13597 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13598 image_create_info.format = tex_format;
13599 image_create_info.extent.width = tex_width;
13600 image_create_info.extent.height = tex_height;
13601 image_create_info.extent.depth = 1;
13602 image_create_info.mipLevels = 1;
13603 image_create_info.arrayLayers = 1;
13604 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13605 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13606 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
13607 image_create_info.flags = 0;
13608
13609 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
13610 ASSERT_VK_SUCCESS(err);
13611
13612 VkImageViewCreateInfo image_view_create_info = {};
13613 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13614 image_view_create_info.image = image;
13615 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
13616 image_view_create_info.format = tex_format;
13617 image_view_create_info.subresourceRange.layerCount = 1;
13618 image_view_create_info.subresourceRange.baseMipLevel = 0;
13619 image_view_create_info.subresourceRange.levelCount = 1;
13620 image_view_create_info.subresourceRange.aspectMask =
13621 VK_IMAGE_ASPECT_COLOR_BIT;
13622
13623 VkImageView view;
13624 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
13625 &view);
13626
13627 m_errorMonitor->VerifyFound();
13628 vkDestroyImage(m_device->device(), image, NULL);
13629 // If last error is success, it still created the view, so delete it.
13630 if (err == VK_SUCCESS) {
13631 vkDestroyImageView(m_device->device(), view, NULL);
13632 }
13633
13634}
13635
Karl Schultz6addd812016-02-02 17:17:23 -070013636TEST_F(VkLayerTest, InvalidImageViewAspect) {
Tobin Ehlis1f567a22016-05-25 16:15:18 -060013637 TEST_DESCRIPTION(
13638 "Create an image and try to create a view with an invalid aspectMask");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013639 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013640 "vkCreateImageView: Color image "
13641 "formats must have ONLY the "
13642 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013643
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013644 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013645
Karl Schultz6addd812016-02-02 17:17:23 -070013646 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060013647 VkImageObj image(m_device);
13648 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT,
13649 VK_IMAGE_TILING_LINEAR, 0);
13650 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013651
13652 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013653 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060013654 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070013655 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
13656 image_view_create_info.format = tex_format;
13657 image_view_create_info.subresourceRange.baseMipLevel = 0;
13658 image_view_create_info.subresourceRange.levelCount = 1;
13659 // Cause an error by setting an invalid image aspect
13660 image_view_create_info.subresourceRange.aspectMask =
13661 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013662
13663 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060013664 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013665
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013666 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013667}
13668
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013669TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070013670 VkResult err;
13671 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060013672
Karl Schultz6addd812016-02-02 17:17:23 -070013673 m_errorMonitor->SetDesiredFailureMsg(
13674 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013675 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013676
Mike Stroyana3082432015-09-25 13:39:21 -060013677 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060013678
13679 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070013680 VkImage srcImage;
13681 VkImage dstImage;
13682 VkDeviceMemory srcMem;
13683 VkDeviceMemory destMem;
13684 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060013685
13686 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013687 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13688 image_create_info.pNext = NULL;
13689 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13690 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
13691 image_create_info.extent.width = 32;
13692 image_create_info.extent.height = 32;
13693 image_create_info.extent.depth = 1;
13694 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013695 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070013696 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13697 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
13698 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
13699 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013700
Karl Schultz6addd812016-02-02 17:17:23 -070013701 err =
13702 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060013703 ASSERT_VK_SUCCESS(err);
13704
Karl Schultz6addd812016-02-02 17:17:23 -070013705 err =
13706 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060013707 ASSERT_VK_SUCCESS(err);
13708
13709 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013710 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013711 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
13712 memAlloc.pNext = NULL;
13713 memAlloc.allocationSize = 0;
13714 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013715
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060013716 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060013717 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070013718 pass =
13719 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060013720 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013721 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060013722 ASSERT_VK_SUCCESS(err);
13723
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013724 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060013725 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070013726 pass =
13727 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060013728 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013729 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060013730 ASSERT_VK_SUCCESS(err);
13731
13732 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
13733 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013734 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060013735 ASSERT_VK_SUCCESS(err);
13736
13737 BeginCommandBuffer();
13738 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080013739 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060013740 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060013741 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013742 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060013743 copyRegion.srcOffset.x = 0;
13744 copyRegion.srcOffset.y = 0;
13745 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080013746 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013747 copyRegion.dstSubresource.mipLevel = 0;
13748 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013749 // Introduce failure by forcing the dst layerCount to differ from src
13750 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013751 copyRegion.dstOffset.x = 0;
13752 copyRegion.dstOffset.y = 0;
13753 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013754 copyRegion.extent.width = 1;
13755 copyRegion.extent.height = 1;
13756 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070013757 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
13758 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060013759 EndCommandBuffer();
13760
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013761 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060013762
Chia-I Wuf7458c52015-10-26 21:10:41 +080013763 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013764 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080013765 vkFreeMemory(m_device->device(), srcMem, NULL);
13766 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060013767}
13768
Tony Barbourd6673642016-05-05 14:46:39 -060013769TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
13770
13771 TEST_DESCRIPTION("Creating images with unsuported formats ");
13772
13773 ASSERT_NO_FATAL_FAILURE(InitState());
13774 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13775 VkImageObj image(m_device);
13776 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
13777 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
13778 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
13779 VK_IMAGE_TILING_OPTIMAL, 0);
13780 ASSERT_TRUE(image.initialized());
13781
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013782 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
13783 VkImageCreateInfo image_create_info;
13784 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13785 image_create_info.pNext = NULL;
13786 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13787 image_create_info.format = VK_FORMAT_UNDEFINED;
13788 image_create_info.extent.width = 32;
13789 image_create_info.extent.height = 32;
13790 image_create_info.extent.depth = 1;
13791 image_create_info.mipLevels = 1;
13792 image_create_info.arrayLayers = 1;
13793 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13794 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
13795 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
13796 image_create_info.flags = 0;
13797
13798 m_errorMonitor->SetDesiredFailureMsg(
13799 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13800 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
13801
13802 VkImage localImage;
13803 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
13804 m_errorMonitor->VerifyFound();
13805
Tony Barbourd6673642016-05-05 14:46:39 -060013806 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013807 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060013808 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
13809 VkFormat format = static_cast<VkFormat>(f);
13810 VkFormatProperties fProps = m_device->format_properties(format);
13811 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
13812 fProps.optimalTilingFeatures == 0) {
13813 unsupported = format;
13814 break;
13815 }
13816 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013817
Tony Barbourd6673642016-05-05 14:46:39 -060013818 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060013819 image_create_info.format = unsupported;
Tony Barbourd6673642016-05-05 14:46:39 -060013820 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013821 "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060013822
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013823 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060013824 m_errorMonitor->VerifyFound();
13825 }
13826}
13827
13828TEST_F(VkLayerTest, ImageLayerViewTests) {
13829 VkResult ret;
13830 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
13831
13832 ASSERT_NO_FATAL_FAILURE(InitState());
13833
13834 VkImageObj image(m_device);
13835 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
13836 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
13837 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
13838 VK_IMAGE_TILING_OPTIMAL, 0);
13839 ASSERT_TRUE(image.initialized());
13840
13841 VkImageView imgView;
13842 VkImageViewCreateInfo imgViewInfo = {};
13843 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13844 imgViewInfo.image = image.handle();
13845 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
13846 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
13847 imgViewInfo.subresourceRange.layerCount = 1;
13848 imgViewInfo.subresourceRange.baseMipLevel = 0;
13849 imgViewInfo.subresourceRange.levelCount = 1;
13850 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13851
13852 m_errorMonitor->SetDesiredFailureMsg(
13853 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13854 "vkCreateImageView called with baseMipLevel");
13855 // View can't have baseMipLevel >= image's mipLevels - Expect
13856 // VIEW_CREATE_ERROR
13857 imgViewInfo.subresourceRange.baseMipLevel = 1;
13858 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13859 m_errorMonitor->VerifyFound();
13860 imgViewInfo.subresourceRange.baseMipLevel = 0;
13861
13862 m_errorMonitor->SetDesiredFailureMsg(
13863 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13864 "vkCreateImageView called with baseArrayLayer");
13865 // View can't have baseArrayLayer >= image's arraySize - Expect
13866 // VIEW_CREATE_ERROR
13867 imgViewInfo.subresourceRange.baseArrayLayer = 1;
13868 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13869 m_errorMonitor->VerifyFound();
13870 imgViewInfo.subresourceRange.baseArrayLayer = 0;
13871
13872 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13873 "vkCreateImageView called with 0 in "
13874 "pCreateInfo->subresourceRange."
13875 "levelCount");
13876 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
13877 imgViewInfo.subresourceRange.levelCount = 0;
13878 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13879 m_errorMonitor->VerifyFound();
13880 imgViewInfo.subresourceRange.levelCount = 1;
13881
13882 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13883 "vkCreateImageView called with 0 in "
13884 "pCreateInfo->subresourceRange."
13885 "layerCount");
13886 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
13887 imgViewInfo.subresourceRange.layerCount = 0;
13888 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13889 m_errorMonitor->VerifyFound();
13890 imgViewInfo.subresourceRange.layerCount = 1;
13891
13892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13893 "but both must be color formats");
13894 // Can't use depth format for view into color image - Expect INVALID_FORMAT
13895 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
13896 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13897 m_errorMonitor->VerifyFound();
13898 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
13899
13900 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13901 "Formats MUST be IDENTICAL unless "
13902 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
13903 "was set on image creation.");
13904 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
13905 // VIEW_CREATE_ERROR
13906 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
13907 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13908 m_errorMonitor->VerifyFound();
13909 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
13910
13911 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13912 "can support ImageViews with "
13913 "differing formats but they must be "
13914 "in the same compatibility class.");
13915 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
13916 // VIEW_CREATE_ERROR
13917 VkImageCreateInfo mutImgInfo = image.create_info();
13918 VkImage mutImage;
13919 mutImgInfo.format = VK_FORMAT_R8_UINT;
13920 assert(
13921 m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures &
13922 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
13923 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
13924 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
13925 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
13926 ASSERT_VK_SUCCESS(ret);
13927 imgViewInfo.image = mutImage;
13928 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13929 m_errorMonitor->VerifyFound();
13930 imgViewInfo.image = image.handle();
13931 vkDestroyImage(m_device->handle(), mutImage, NULL);
13932}
13933
13934TEST_F(VkLayerTest, MiscImageLayerTests) {
13935
13936 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
13937
13938 ASSERT_NO_FATAL_FAILURE(InitState());
13939
13940 VkImageObj image(m_device);
13941 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
13942 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
13943 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
13944 VK_IMAGE_TILING_OPTIMAL, 0);
13945 ASSERT_TRUE(image.initialized());
13946
13947 m_errorMonitor->SetDesiredFailureMsg(
13948 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13949 "number of layers in image subresource is zero");
13950 vk_testing::Buffer buffer;
13951 VkMemoryPropertyFlags reqs = 0;
13952 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
13953 VkBufferImageCopy region = {};
13954 region.bufferRowLength = 128;
13955 region.bufferImageHeight = 128;
13956 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13957 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
13958 region.imageSubresource.layerCount = 0;
13959 region.imageExtent.height = 4;
13960 region.imageExtent.width = 4;
13961 region.imageExtent.depth = 1;
13962 m_commandBuffer->BeginCommandBuffer();
13963 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
13964 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
13965 1, &region);
13966 m_errorMonitor->VerifyFound();
13967 region.imageSubresource.layerCount = 1;
13968
13969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13970 "aspectMasks for each region must "
13971 "specify only COLOR or DEPTH or "
13972 "STENCIL");
13973 // Expect MISMATCHED_IMAGE_ASPECT
13974 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
13975 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
13976 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
13977 1, &region);
13978 m_errorMonitor->VerifyFound();
13979 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13980
13981 m_errorMonitor->SetDesiredFailureMsg(
13982 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13983 "If the format of srcImage is a depth, stencil, depth stencil or "
13984 "integer-based format then filter must be VK_FILTER_NEAREST");
13985 // Expect INVALID_FILTER
13986 VkImageObj intImage1(m_device);
13987 intImage1.init(128, 128, VK_FORMAT_R8_UINT,
13988 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
13989 0);
13990 VkImageObj intImage2(m_device);
13991 intImage2.init(128, 128, VK_FORMAT_R8_UINT,
13992 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
13993 0);
13994 VkImageBlit blitRegion = {};
13995 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13996 blitRegion.srcSubresource.baseArrayLayer = 0;
13997 blitRegion.srcSubresource.layerCount = 1;
13998 blitRegion.srcSubresource.mipLevel = 0;
13999 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14000 blitRegion.dstSubresource.baseArrayLayer = 0;
14001 blitRegion.dstSubresource.layerCount = 1;
14002 blitRegion.dstSubresource.mipLevel = 0;
14003
14004 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
14005 intImage1.layout(), intImage2.handle(), intImage2.layout(),
14006 16, &blitRegion, VK_FILTER_LINEAR);
14007 m_errorMonitor->VerifyFound();
14008
14009 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14010 "called with 0 in ppMemoryBarriers");
14011 VkImageMemoryBarrier img_barrier;
14012 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
14013 img_barrier.pNext = NULL;
14014 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
14015 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
14016 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14017 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14018 img_barrier.image = image.handle();
14019 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
14020 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
14021 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14022 img_barrier.subresourceRange.baseArrayLayer = 0;
14023 img_barrier.subresourceRange.baseMipLevel = 0;
14024 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
14025 img_barrier.subresourceRange.layerCount = 0;
14026 img_barrier.subresourceRange.levelCount = 1;
14027 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
14028 VK_PIPELINE_STAGE_HOST_BIT,
14029 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
14030 nullptr, 1, &img_barrier);
14031 m_errorMonitor->VerifyFound();
14032 img_barrier.subresourceRange.layerCount = 1;
14033}
14034
14035TEST_F(VkLayerTest, ImageFormatLimits) {
14036
14037 TEST_DESCRIPTION("Exceed the limits of image format ");
14038
14039 m_errorMonitor->SetDesiredFailureMsg(
14040 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14041 "CreateImage extents exceed allowable limits for format");
14042 VkImageCreateInfo image_create_info = {};
14043 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14044 image_create_info.pNext = NULL;
14045 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14046 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14047 image_create_info.extent.width = 32;
14048 image_create_info.extent.height = 32;
14049 image_create_info.extent.depth = 1;
14050 image_create_info.mipLevels = 1;
14051 image_create_info.arrayLayers = 1;
14052 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14053 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14054 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14055 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
14056 image_create_info.flags = 0;
14057
14058 VkImage nullImg;
14059 VkImageFormatProperties imgFmtProps;
14060 vkGetPhysicalDeviceImageFormatProperties(
14061 gpu(), image_create_info.format, image_create_info.imageType,
14062 image_create_info.tiling, image_create_info.usage,
14063 image_create_info.flags, &imgFmtProps);
14064 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
14065 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14066 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14067 m_errorMonitor->VerifyFound();
14068 image_create_info.extent.depth = 1;
14069
14070 m_errorMonitor->SetDesiredFailureMsg(
14071 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14072 "exceeds allowable maximum supported by format of");
14073 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
14074 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14075 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14076 m_errorMonitor->VerifyFound();
14077 image_create_info.mipLevels = 1;
14078
14079 m_errorMonitor->SetDesiredFailureMsg(
14080 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14081 "exceeds allowable maximum supported by format of");
14082 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
14083 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14084 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14085 m_errorMonitor->VerifyFound();
14086 image_create_info.arrayLayers = 1;
14087
14088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14089 "is not supported by format");
14090 int samples = imgFmtProps.sampleCounts >> 1;
14091 image_create_info.samples = (VkSampleCountFlagBits)samples;
14092 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14093 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14094 m_errorMonitor->VerifyFound();
14095 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14096
14097 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14098 "pCreateInfo->initialLayout, must be "
14099 "VK_IMAGE_LAYOUT_UNDEFINED or "
14100 "VK_IMAGE_LAYOUT_PREINITIALIZED");
14101 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14102 // Expect INVALID_LAYOUT
14103 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14104 m_errorMonitor->VerifyFound();
14105 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
14106}
14107
Karl Schultz6addd812016-02-02 17:17:23 -070014108TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060014109 VkResult err;
14110 bool pass;
14111
14112 // Create color images with different format sizes and try to copy between them
14113 m_errorMonitor->SetDesiredFailureMsg(
14114 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14115 "vkCmdCopyImage called with unmatched source and dest image format sizes");
14116
14117 ASSERT_NO_FATAL_FAILURE(InitState());
14118
14119 // Create two images of different types and try to copy between them
14120 VkImage srcImage;
14121 VkImage dstImage;
14122 VkDeviceMemory srcMem;
14123 VkDeviceMemory destMem;
14124 VkMemoryRequirements memReqs;
14125
14126 VkImageCreateInfo image_create_info = {};
14127 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14128 image_create_info.pNext = NULL;
14129 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14130 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14131 image_create_info.extent.width = 32;
14132 image_create_info.extent.height = 32;
14133 image_create_info.extent.depth = 1;
14134 image_create_info.mipLevels = 1;
14135 image_create_info.arrayLayers = 1;
14136 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14137 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14138 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14139 image_create_info.flags = 0;
14140
14141 err =
14142 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
14143 ASSERT_VK_SUCCESS(err);
14144
14145 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
14146 // Introduce failure by creating second image with a different-sized format.
14147 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
14148
14149 err =
14150 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
14151 ASSERT_VK_SUCCESS(err);
14152
14153 // Allocate memory
14154 VkMemoryAllocateInfo memAlloc = {};
14155 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14156 memAlloc.pNext = NULL;
14157 memAlloc.allocationSize = 0;
14158 memAlloc.memoryTypeIndex = 0;
14159
14160 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
14161 memAlloc.allocationSize = memReqs.size;
14162 pass =
14163 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
14164 ASSERT_TRUE(pass);
14165 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
14166 ASSERT_VK_SUCCESS(err);
14167
14168 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
14169 memAlloc.allocationSize = memReqs.size;
14170 pass =
14171 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
14172 ASSERT_TRUE(pass);
14173 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
14174 ASSERT_VK_SUCCESS(err);
14175
14176 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14177 ASSERT_VK_SUCCESS(err);
14178 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
14179 ASSERT_VK_SUCCESS(err);
14180
14181 BeginCommandBuffer();
14182 VkImageCopy copyRegion;
14183 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14184 copyRegion.srcSubresource.mipLevel = 0;
14185 copyRegion.srcSubresource.baseArrayLayer = 0;
14186 copyRegion.srcSubresource.layerCount = 0;
14187 copyRegion.srcOffset.x = 0;
14188 copyRegion.srcOffset.y = 0;
14189 copyRegion.srcOffset.z = 0;
14190 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14191 copyRegion.dstSubresource.mipLevel = 0;
14192 copyRegion.dstSubresource.baseArrayLayer = 0;
14193 copyRegion.dstSubresource.layerCount = 0;
14194 copyRegion.dstOffset.x = 0;
14195 copyRegion.dstOffset.y = 0;
14196 copyRegion.dstOffset.z = 0;
14197 copyRegion.extent.width = 1;
14198 copyRegion.extent.height = 1;
14199 copyRegion.extent.depth = 1;
14200 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14201 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
14202 EndCommandBuffer();
14203
14204 m_errorMonitor->VerifyFound();
14205
14206 vkDestroyImage(m_device->device(), srcImage, NULL);
14207 vkDestroyImage(m_device->device(), dstImage, NULL);
14208 vkFreeMemory(m_device->device(), srcMem, NULL);
14209 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014210}
14211
Karl Schultz6addd812016-02-02 17:17:23 -070014212TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
14213 VkResult err;
14214 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014215
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014216 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014217 m_errorMonitor->SetDesiredFailureMsg(
14218 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014219 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014220
Mike Stroyana3082432015-09-25 13:39:21 -060014221 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014222
14223 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014224 VkImage srcImage;
14225 VkImage dstImage;
14226 VkDeviceMemory srcMem;
14227 VkDeviceMemory destMem;
14228 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014229
14230 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014231 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14232 image_create_info.pNext = NULL;
14233 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14234 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14235 image_create_info.extent.width = 32;
14236 image_create_info.extent.height = 32;
14237 image_create_info.extent.depth = 1;
14238 image_create_info.mipLevels = 1;
14239 image_create_info.arrayLayers = 1;
14240 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14241 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14242 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14243 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014244
Karl Schultz6addd812016-02-02 17:17:23 -070014245 err =
14246 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014247 ASSERT_VK_SUCCESS(err);
14248
Karl Schultzbdb75952016-04-19 11:36:49 -060014249 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
14250
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014251 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070014252 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014253 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
14254 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014255
Karl Schultz6addd812016-02-02 17:17:23 -070014256 err =
14257 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014258 ASSERT_VK_SUCCESS(err);
14259
14260 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014261 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014262 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14263 memAlloc.pNext = NULL;
14264 memAlloc.allocationSize = 0;
14265 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014266
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014267 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014268 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014269 pass =
14270 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014271 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014272 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014273 ASSERT_VK_SUCCESS(err);
14274
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014275 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014276 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014277 pass =
14278 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014279 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014280 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014281 ASSERT_VK_SUCCESS(err);
14282
14283 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14284 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014285 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014286 ASSERT_VK_SUCCESS(err);
14287
14288 BeginCommandBuffer();
14289 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014290 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014291 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014292 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014293 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014294 copyRegion.srcOffset.x = 0;
14295 copyRegion.srcOffset.y = 0;
14296 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014297 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014298 copyRegion.dstSubresource.mipLevel = 0;
14299 copyRegion.dstSubresource.baseArrayLayer = 0;
14300 copyRegion.dstSubresource.layerCount = 0;
14301 copyRegion.dstOffset.x = 0;
14302 copyRegion.dstOffset.y = 0;
14303 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014304 copyRegion.extent.width = 1;
14305 copyRegion.extent.height = 1;
14306 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014307 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14308 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014309 EndCommandBuffer();
14310
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014311 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014312
Chia-I Wuf7458c52015-10-26 21:10:41 +080014313 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014314 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014315 vkFreeMemory(m_device->device(), srcMem, NULL);
14316 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014317}
14318
Karl Schultz6addd812016-02-02 17:17:23 -070014319TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
14320 VkResult err;
14321 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014322
Karl Schultz6addd812016-02-02 17:17:23 -070014323 m_errorMonitor->SetDesiredFailureMsg(
14324 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014325 "vkCmdResolveImage called with source sample count less than 2.");
14326
Mike Stroyana3082432015-09-25 13:39:21 -060014327 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014328
14329 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070014330 VkImage srcImage;
14331 VkImage dstImage;
14332 VkDeviceMemory srcMem;
14333 VkDeviceMemory destMem;
14334 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014335
14336 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014337 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14338 image_create_info.pNext = NULL;
14339 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14340 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14341 image_create_info.extent.width = 32;
14342 image_create_info.extent.height = 1;
14343 image_create_info.extent.depth = 1;
14344 image_create_info.mipLevels = 1;
14345 image_create_info.arrayLayers = 1;
14346 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14347 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14348 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14349 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014350
Karl Schultz6addd812016-02-02 17:17:23 -070014351 err =
14352 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014353 ASSERT_VK_SUCCESS(err);
14354
Karl Schultz6addd812016-02-02 17:17:23 -070014355 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014356
Karl Schultz6addd812016-02-02 17:17:23 -070014357 err =
14358 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014359 ASSERT_VK_SUCCESS(err);
14360
14361 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014362 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014363 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14364 memAlloc.pNext = NULL;
14365 memAlloc.allocationSize = 0;
14366 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014367
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014368 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014369 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014370 pass =
14371 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014372 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014373 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014374 ASSERT_VK_SUCCESS(err);
14375
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014376 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014377 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014378 pass =
14379 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014380 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014381 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014382 ASSERT_VK_SUCCESS(err);
14383
14384 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14385 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014386 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014387 ASSERT_VK_SUCCESS(err);
14388
14389 BeginCommandBuffer();
14390 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070014391 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
14392 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060014393 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014394 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014395 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014396 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014397 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014398 resolveRegion.srcOffset.x = 0;
14399 resolveRegion.srcOffset.y = 0;
14400 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014401 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014402 resolveRegion.dstSubresource.mipLevel = 0;
14403 resolveRegion.dstSubresource.baseArrayLayer = 0;
14404 resolveRegion.dstSubresource.layerCount = 0;
14405 resolveRegion.dstOffset.x = 0;
14406 resolveRegion.dstOffset.y = 0;
14407 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014408 resolveRegion.extent.width = 1;
14409 resolveRegion.extent.height = 1;
14410 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014411 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14412 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014413 EndCommandBuffer();
14414
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014415 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014416
Chia-I Wuf7458c52015-10-26 21:10:41 +080014417 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014418 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014419 vkFreeMemory(m_device->device(), srcMem, NULL);
14420 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014421}
14422
Karl Schultz6addd812016-02-02 17:17:23 -070014423TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
14424 VkResult err;
14425 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014426
Karl Schultz6addd812016-02-02 17:17:23 -070014427 m_errorMonitor->SetDesiredFailureMsg(
14428 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014429 "vkCmdResolveImage called with dest sample count greater than 1.");
14430
Mike Stroyana3082432015-09-25 13:39:21 -060014431 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014432
Chris Forbesa7530692016-05-08 12:35:39 +120014433 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070014434 VkImage srcImage;
14435 VkImage dstImage;
14436 VkDeviceMemory srcMem;
14437 VkDeviceMemory destMem;
14438 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014439
14440 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014441 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14442 image_create_info.pNext = NULL;
14443 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14444 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14445 image_create_info.extent.width = 32;
14446 image_create_info.extent.height = 1;
14447 image_create_info.extent.depth = 1;
14448 image_create_info.mipLevels = 1;
14449 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120014450 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070014451 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14452 // Note: Some implementations expect color attachment usage for any
14453 // multisample surface
14454 image_create_info.usage =
14455 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14456 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014457
Karl Schultz6addd812016-02-02 17:17:23 -070014458 err =
14459 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014460 ASSERT_VK_SUCCESS(err);
14461
Karl Schultz6addd812016-02-02 17:17:23 -070014462 // Note: Some implementations expect color attachment usage for any
14463 // multisample surface
14464 image_create_info.usage =
14465 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014466
Karl Schultz6addd812016-02-02 17:17:23 -070014467 err =
14468 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014469 ASSERT_VK_SUCCESS(err);
14470
14471 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014472 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014473 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14474 memAlloc.pNext = NULL;
14475 memAlloc.allocationSize = 0;
14476 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014477
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014478 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014479 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014480 pass =
14481 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014482 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014483 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014484 ASSERT_VK_SUCCESS(err);
14485
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014486 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014487 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014488 pass =
14489 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014490 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014491 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014492 ASSERT_VK_SUCCESS(err);
14493
14494 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14495 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014496 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014497 ASSERT_VK_SUCCESS(err);
14498
14499 BeginCommandBuffer();
14500 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070014501 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
14502 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060014503 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014504 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014505 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014506 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014507 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014508 resolveRegion.srcOffset.x = 0;
14509 resolveRegion.srcOffset.y = 0;
14510 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014511 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014512 resolveRegion.dstSubresource.mipLevel = 0;
14513 resolveRegion.dstSubresource.baseArrayLayer = 0;
14514 resolveRegion.dstSubresource.layerCount = 0;
14515 resolveRegion.dstOffset.x = 0;
14516 resolveRegion.dstOffset.y = 0;
14517 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014518 resolveRegion.extent.width = 1;
14519 resolveRegion.extent.height = 1;
14520 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014521 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14522 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014523 EndCommandBuffer();
14524
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014525 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014526
Chia-I Wuf7458c52015-10-26 21:10:41 +080014527 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014528 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014529 vkFreeMemory(m_device->device(), srcMem, NULL);
14530 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014531}
14532
Karl Schultz6addd812016-02-02 17:17:23 -070014533TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
14534 VkResult err;
14535 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014536
Karl Schultz6addd812016-02-02 17:17:23 -070014537 m_errorMonitor->SetDesiredFailureMsg(
14538 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014539 "vkCmdResolveImage called with unmatched source and dest formats.");
14540
Mike Stroyana3082432015-09-25 13:39:21 -060014541 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014542
14543 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014544 VkImage srcImage;
14545 VkImage dstImage;
14546 VkDeviceMemory srcMem;
14547 VkDeviceMemory destMem;
14548 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014549
14550 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014551 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14552 image_create_info.pNext = NULL;
14553 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14554 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14555 image_create_info.extent.width = 32;
14556 image_create_info.extent.height = 1;
14557 image_create_info.extent.depth = 1;
14558 image_create_info.mipLevels = 1;
14559 image_create_info.arrayLayers = 1;
14560 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
14561 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14562 // Note: Some implementations expect color attachment usage for any
14563 // multisample surface
14564 image_create_info.usage =
14565 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14566 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014567
Karl Schultz6addd812016-02-02 17:17:23 -070014568 err =
14569 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014570 ASSERT_VK_SUCCESS(err);
14571
Karl Schultz6addd812016-02-02 17:17:23 -070014572 // Set format to something other than source image
14573 image_create_info.format = VK_FORMAT_R32_SFLOAT;
14574 // Note: Some implementations expect color attachment usage for any
14575 // multisample surface
14576 image_create_info.usage =
14577 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14578 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014579
Karl Schultz6addd812016-02-02 17:17:23 -070014580 err =
14581 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014582 ASSERT_VK_SUCCESS(err);
14583
14584 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014585 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014586 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14587 memAlloc.pNext = NULL;
14588 memAlloc.allocationSize = 0;
14589 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014590
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014591 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014592 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014593 pass =
14594 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014595 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014596 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014597 ASSERT_VK_SUCCESS(err);
14598
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014599 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014600 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014601 pass =
14602 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014603 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014604 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014605 ASSERT_VK_SUCCESS(err);
14606
14607 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14608 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014609 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014610 ASSERT_VK_SUCCESS(err);
14611
14612 BeginCommandBuffer();
14613 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070014614 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
14615 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060014616 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014617 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014618 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014619 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014620 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014621 resolveRegion.srcOffset.x = 0;
14622 resolveRegion.srcOffset.y = 0;
14623 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014624 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014625 resolveRegion.dstSubresource.mipLevel = 0;
14626 resolveRegion.dstSubresource.baseArrayLayer = 0;
14627 resolveRegion.dstSubresource.layerCount = 0;
14628 resolveRegion.dstOffset.x = 0;
14629 resolveRegion.dstOffset.y = 0;
14630 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014631 resolveRegion.extent.width = 1;
14632 resolveRegion.extent.height = 1;
14633 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014634 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14635 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014636 EndCommandBuffer();
14637
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014638 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014639
Chia-I Wuf7458c52015-10-26 21:10:41 +080014640 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014641 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014642 vkFreeMemory(m_device->device(), srcMem, NULL);
14643 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014644}
14645
Karl Schultz6addd812016-02-02 17:17:23 -070014646TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
14647 VkResult err;
14648 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014649
Karl Schultz6addd812016-02-02 17:17:23 -070014650 m_errorMonitor->SetDesiredFailureMsg(
14651 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014652 "vkCmdResolveImage called with unmatched source and dest image types.");
14653
Mike Stroyana3082432015-09-25 13:39:21 -060014654 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014655
14656 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014657 VkImage srcImage;
14658 VkImage dstImage;
14659 VkDeviceMemory srcMem;
14660 VkDeviceMemory destMem;
14661 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014662
14663 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014664 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14665 image_create_info.pNext = NULL;
14666 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14667 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14668 image_create_info.extent.width = 32;
14669 image_create_info.extent.height = 1;
14670 image_create_info.extent.depth = 1;
14671 image_create_info.mipLevels = 1;
14672 image_create_info.arrayLayers = 1;
14673 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
14674 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14675 // Note: Some implementations expect color attachment usage for any
14676 // multisample surface
14677 image_create_info.usage =
14678 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14679 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014680
Karl Schultz6addd812016-02-02 17:17:23 -070014681 err =
14682 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014683 ASSERT_VK_SUCCESS(err);
14684
Karl Schultz6addd812016-02-02 17:17:23 -070014685 image_create_info.imageType = VK_IMAGE_TYPE_1D;
14686 // Note: Some implementations expect color attachment usage for any
14687 // multisample surface
14688 image_create_info.usage =
14689 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14690 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014691
Karl Schultz6addd812016-02-02 17:17:23 -070014692 err =
14693 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014694 ASSERT_VK_SUCCESS(err);
14695
14696 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014697 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014698 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14699 memAlloc.pNext = NULL;
14700 memAlloc.allocationSize = 0;
14701 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014702
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014703 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014704 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014705 pass =
14706 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014707 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014708 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014709 ASSERT_VK_SUCCESS(err);
14710
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014711 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014712 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014713 pass =
14714 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014715 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014716 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014717 ASSERT_VK_SUCCESS(err);
14718
14719 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14720 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014721 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014722 ASSERT_VK_SUCCESS(err);
14723
14724 BeginCommandBuffer();
14725 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070014726 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
14727 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060014728 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014729 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014730 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014731 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014732 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014733 resolveRegion.srcOffset.x = 0;
14734 resolveRegion.srcOffset.y = 0;
14735 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014736 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014737 resolveRegion.dstSubresource.mipLevel = 0;
14738 resolveRegion.dstSubresource.baseArrayLayer = 0;
14739 resolveRegion.dstSubresource.layerCount = 0;
14740 resolveRegion.dstOffset.x = 0;
14741 resolveRegion.dstOffset.y = 0;
14742 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014743 resolveRegion.extent.width = 1;
14744 resolveRegion.extent.height = 1;
14745 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014746 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14747 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014748 EndCommandBuffer();
14749
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014750 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014751
Chia-I Wuf7458c52015-10-26 21:10:41 +080014752 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014753 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014754 vkFreeMemory(m_device->device(), srcMem, NULL);
14755 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014756}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014757
Karl Schultz6addd812016-02-02 17:17:23 -070014758TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014759 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070014760 // to using a DS format, then cause it to hit error due to COLOR_BIT not
14761 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014762 // The image format check comes 2nd in validation so we trigger it first,
14763 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070014764 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014765
Karl Schultz6addd812016-02-02 17:17:23 -070014766 m_errorMonitor->SetDesiredFailureMsg(
14767 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014768 "Combination depth/stencil image formats can have only the ");
14769
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014770 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014771
Chia-I Wu1b99bb22015-10-27 19:25:11 +080014772 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014773 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
14774 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014775
14776 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014777 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
14778 ds_pool_ci.pNext = NULL;
14779 ds_pool_ci.maxSets = 1;
14780 ds_pool_ci.poolSizeCount = 1;
14781 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014782
14783 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070014784 err =
14785 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014786 ASSERT_VK_SUCCESS(err);
14787
14788 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014789 dsl_binding.binding = 0;
14790 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
14791 dsl_binding.descriptorCount = 1;
14792 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
14793 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014794
14795 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014796 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
14797 ds_layout_ci.pNext = NULL;
14798 ds_layout_ci.bindingCount = 1;
14799 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014800 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070014801 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
14802 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014803 ASSERT_VK_SUCCESS(err);
14804
14805 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014806 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080014807 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070014808 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014809 alloc_info.descriptorPool = ds_pool;
14810 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070014811 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
14812 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014813 ASSERT_VK_SUCCESS(err);
14814
Karl Schultz6addd812016-02-02 17:17:23 -070014815 VkImage image_bad;
14816 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014817 // One bad format and one good format for Color attachment
Tobin Ehlis269f0322016-05-25 16:24:21 -060014818 const VkFormat tex_format_bad = VK_FORMAT_D24_UNORM_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014819 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070014820 const int32_t tex_width = 32;
14821 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -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 = tex_format_bad;
14828 image_create_info.extent.width = tex_width;
14829 image_create_info.extent.height = tex_height;
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_SAMPLED_BIT |
14836 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
14837 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014838
Karl Schultz6addd812016-02-02 17:17:23 -070014839 err =
14840 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014841 ASSERT_VK_SUCCESS(err);
14842 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -070014843 image_create_info.usage =
14844 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14845 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
14846 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014847 ASSERT_VK_SUCCESS(err);
14848
14849 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014850 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14851 image_view_create_info.image = image_bad;
14852 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14853 image_view_create_info.format = tex_format_bad;
14854 image_view_create_info.subresourceRange.baseArrayLayer = 0;
14855 image_view_create_info.subresourceRange.baseMipLevel = 0;
14856 image_view_create_info.subresourceRange.layerCount = 1;
14857 image_view_create_info.subresourceRange.levelCount = 1;
14858 image_view_create_info.subresourceRange.aspectMask =
14859 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014860
14861 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070014862 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
14863 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014864
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014865 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014866
Chia-I Wuf7458c52015-10-26 21:10:41 +080014867 vkDestroyImage(m_device->device(), image_bad, NULL);
14868 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014869 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
14870 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014871}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060014872
14873TEST_F(VkLayerTest, ClearImageErrors) {
14874 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and "
14875 "ClearDepthStencilImage with a color image.");
14876
14877 ASSERT_NO_FATAL_FAILURE(InitState());
14878 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14879
14880 // Renderpass is started here so end it as Clear cmds can't be in renderpass
14881 BeginCommandBuffer();
14882 m_commandBuffer->EndRenderPass();
14883
14884 // Color image
14885 VkClearColorValue clear_color;
14886 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
14887 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
14888 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
14889 const int32_t img_width = 32;
14890 const int32_t img_height = 32;
14891 VkImageCreateInfo image_create_info = {};
14892 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14893 image_create_info.pNext = NULL;
14894 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14895 image_create_info.format = color_format;
14896 image_create_info.extent.width = img_width;
14897 image_create_info.extent.height = img_height;
14898 image_create_info.extent.depth = 1;
14899 image_create_info.mipLevels = 1;
14900 image_create_info.arrayLayers = 1;
14901 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14902 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14903 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14904
14905 vk_testing::Image color_image;
14906 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info,
14907 reqs);
14908
14909 const VkImageSubresourceRange color_range =
14910 vk_testing::Image::subresource_range(image_create_info,
14911 VK_IMAGE_ASPECT_COLOR_BIT);
14912
14913 // Depth/Stencil image
14914 VkClearDepthStencilValue clear_value = {0};
14915 reqs = 0; // don't need HOST_VISIBLE DS image
14916 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
14917 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
14918 ds_image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
14919 ds_image_create_info.extent.width = 64;
14920 ds_image_create_info.extent.height = 64;
14921 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14922 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
14923
14924 vk_testing::Image ds_image;
14925 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info,
14926 reqs);
14927
14928 const VkImageSubresourceRange ds_range =
14929 vk_testing::Image::subresource_range(ds_image_create_info,
14930 VK_IMAGE_ASPECT_DEPTH_BIT);
14931
14932 m_errorMonitor->SetDesiredFailureMsg(
14933 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14934 "vkCmdClearColorImage called with depth/stencil image.");
14935
14936 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
14937 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
14938 &color_range);
14939
14940 m_errorMonitor->VerifyFound();
14941
Tony Barbour26434b92016-06-02 09:43:50 -060014942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14943 "vkCmdClearColorImage called with "
14944 "image created without "
14945 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
14946
14947 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
14948 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
14949 &color_range);
14950
14951 m_errorMonitor->VerifyFound();
14952
Tobin Ehlis6e23d772016-05-19 11:08:34 -060014953 // Call CmdClearDepthStencilImage with color image
14954 m_errorMonitor->SetDesiredFailureMsg(
14955 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14956 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
14957
14958 vkCmdClearDepthStencilImage(
14959 m_commandBuffer->GetBufferHandle(), color_image.handle(),
14960 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
14961 &ds_range);
14962
14963 m_errorMonitor->VerifyFound();
14964}
Tobin Ehliscde08892015-09-22 10:11:37 -060014965#endif // IMAGE_TESTS
14966
Tony Barbour300a6082015-04-07 13:44:53 -060014967int main(int argc, char **argv) {
14968 int result;
14969
Cody Northrop8e54a402016-03-08 22:25:52 -070014970#ifdef ANDROID
14971 int vulkanSupport = InitVulkan();
14972 if (vulkanSupport == 0)
14973 return 1;
14974#endif
14975
Tony Barbour300a6082015-04-07 13:44:53 -060014976 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060014977 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060014978
14979 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
14980
14981 result = RUN_ALL_TESTS();
14982
Tony Barbour6918cd52015-04-09 12:58:51 -060014983 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060014984 return result;
14985}