blob: 717ed6d8b53dee4c33889741b8e619f914883510 [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 Gravesfd1c8fe2016-07-15 11:40:20 -06001117 // Positive test to check parameter_validation and unique_objects support
1118 // for NV_dedicated_allocation
1119 uint32_t extension_count = 0;
1120 bool supports_nv_dedicated_allocation = false;
1121 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count,
1122 nullptr);
1123 ASSERT_VK_SUCCESS(err);
1124
1125 if (extension_count > 0) {
1126 std::vector<VkExtensionProperties> available_extensions(
1127 extension_count);
1128
1129 err = vkEnumerateDeviceExtensionProperties(
1130 gpu(), nullptr, &extension_count, &available_extensions[0]);
1131 ASSERT_VK_SUCCESS(err);
1132
1133 for (const auto &extension_props : available_extensions) {
1134 if (strcmp(extension_props.extensionName,
1135 VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
1136 supports_nv_dedicated_allocation = true;
1137 }
1138 }
1139 }
1140
1141 if (supports_nv_dedicated_allocation) {
1142 m_errorMonitor->ExpectSuccess();
1143
1144 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info =
1145 {};
1146 dedicated_buffer_create_info.sType =
1147 VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
1148 dedicated_buffer_create_info.pNext = nullptr;
1149 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
1150
1151 uint32_t queue_family_index = 0;
1152 VkBufferCreateInfo buffer_create_info = {};
1153 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1154 buffer_create_info.pNext = &dedicated_buffer_create_info;
1155 buffer_create_info.size = 1024;
1156 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1157 buffer_create_info.queueFamilyIndexCount = 1;
1158 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1159
1160 VkBuffer buffer;
1161 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info,
1162 NULL, &buffer);
1163 ASSERT_VK_SUCCESS(err);
1164
1165 VkMemoryRequirements memory_reqs;
1166 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1167
1168 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
1169 dedicated_memory_info.sType =
1170 VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
1171 dedicated_memory_info.pNext = nullptr;
1172 dedicated_memory_info.buffer = buffer;
1173 dedicated_memory_info.image = VK_NULL_HANDLE;
1174
1175 VkMemoryAllocateInfo memory_info = {};
1176 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1177 memory_info.pNext = &dedicated_memory_info;
1178 memory_info.allocationSize = memory_reqs.size;
1179
1180 bool pass;
1181 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1182 &memory_info, 0);
1183 ASSERT_TRUE(pass);
1184
1185 VkDeviceMemory buffer_memory;
1186 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1187 &buffer_memory);
1188 ASSERT_VK_SUCCESS(err);
1189
1190 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1191 ASSERT_VK_SUCCESS(err);
1192
1193 vkDestroyBuffer(m_device->device(), buffer, NULL);
1194 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1195
1196 m_errorMonitor->VerifyNotFound();
1197 }
Dustin Gravesc99cf5a2016-05-09 14:40:29 -06001198}
Dustin Graves5d33d532016-05-09 16:21:12 -06001199
1200TEST_F(VkLayerTest, UnrecognizedValue) {
1201 TEST_DESCRIPTION(
1202 "Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
1203
1204 ASSERT_NO_FATAL_FAILURE(InitState());
1205
1206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1207 "does not fall within the begin..end "
1208 "range of the core VkFormat "
1209 "enumeration tokens");
1210 // Specify an invalid VkFormat value
1211 // Expected to trigger an error with
1212 // parameter_validation::validate_ranged_enum
1213 VkFormatProperties format_properties;
1214 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000),
1215 &format_properties);
1216 m_errorMonitor->VerifyFound();
1217
1218 m_errorMonitor->SetDesiredFailureMsg(
1219 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1220 "contains flag bits that are not recognized members of");
1221 // Specify an invalid VkFlags bitmask value
1222 // Expected to trigger an error with parameter_validation::validate_flags
1223 VkImageFormatProperties image_format_properties;
1224 vkGetPhysicalDeviceImageFormatProperties(
1225 gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D,
1226 VK_IMAGE_TILING_OPTIMAL, static_cast<VkImageUsageFlags>(1 << 25), 0,
1227 &image_format_properties);
1228 m_errorMonitor->VerifyFound();
1229
1230 m_errorMonitor->SetDesiredFailureMsg(
1231 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1232 "contains flag bits that are not recognized members of");
1233 // Specify an invalid VkFlags array entry
1234 // Expected to trigger an error with
1235 // parameter_validation::validate_flags_array
1236 VkSemaphore semaphore = VK_NULL_HANDLE;
1237 VkPipelineStageFlags stage_flags =
1238 static_cast<VkPipelineStageFlags>(1 << 25);
1239 VkSubmitInfo submit_info = {};
1240 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1241 submit_info.waitSemaphoreCount = 1;
1242 submit_info.pWaitSemaphores = &semaphore;
1243 submit_info.pWaitDstStageMask = &stage_flags;
1244 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1245 m_errorMonitor->VerifyFound();
1246
1247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1248 "is neither VK_TRUE nor VK_FALSE");
1249 // Specify an invalid VkBool32 value
1250 // Expected to trigger a warning with
1251 // parameter_validation::validate_bool32
1252 VkSampler sampler = VK_NULL_HANDLE;
1253 VkSamplerCreateInfo sampler_info = {};
1254 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1255 sampler_info.pNext = NULL;
1256 sampler_info.magFilter = VK_FILTER_NEAREST;
1257 sampler_info.minFilter = VK_FILTER_NEAREST;
1258 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1259 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1260 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1261 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1262 sampler_info.mipLodBias = 1.0;
1263 sampler_info.maxAnisotropy = 1;
1264 sampler_info.compareEnable = VK_FALSE;
1265 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1266 sampler_info.minLod = 1.0;
1267 sampler_info.maxLod = 1.0;
1268 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1269 sampler_info.unnormalizedCoordinates = VK_FALSE;
1270 // Not VK_TRUE or VK_FALSE
1271 sampler_info.anisotropyEnable = 3;
1272 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1273 m_errorMonitor->VerifyFound();
1274}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001275
1276TEST_F(VkLayerTest, FailedReturnValue) {
1277 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1278
1279 ASSERT_NO_FATAL_FAILURE(InitState());
1280
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001281 // Find an unsupported image format
1282 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1283 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1284 VkFormat format = static_cast<VkFormat>(f);
1285 VkFormatProperties fProps = m_device->format_properties(format);
1286 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
1287 fProps.optimalTilingFeatures == 0) {
1288 unsupported = format;
1289 break;
1290 }
1291 }
1292
1293 if (unsupported != VK_FORMAT_UNDEFINED) {
1294 m_errorMonitor->SetDesiredFailureMsg(
1295 VK_DEBUG_REPORT_WARNING_BIT_EXT,
1296 "the requested format is not supported on this device");
1297 // Specify an unsupported VkFormat value to generate a
1298 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1299 // Expected to trigger a warning from
1300 // parameter_validation::validate_result
1301 VkImageFormatProperties image_format_properties;
1302 VkResult err = vkGetPhysicalDeviceImageFormatProperties(
1303 gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1304 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
1305 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1306 m_errorMonitor->VerifyFound();
1307 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001308}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001309
1310TEST_F(VkLayerTest, UpdateBufferAlignment) {
1311 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
1312 uint32_t updateData[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
1313
1314 ASSERT_NO_FATAL_FAILURE(InitState());
1315
1316 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1317 vk_testing::Buffer buffer;
1318 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1319
1320 BeginCommandBuffer();
1321 // Introduce failure by using dstOffset that is not multiple of 4
1322 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1323 " is not a multiple of 4");
1324 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1325 m_errorMonitor->VerifyFound();
1326
1327 // Introduce failure by using dataSize that is not multiple of 4
1328 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1329 " is not a multiple of 4");
1330 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1331 m_errorMonitor->VerifyFound();
1332
1333 // Introduce failure by using dataSize that is < 0
1334 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1335 "must be greater than zero and less than or equal to 65536");
1336 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1337 m_errorMonitor->VerifyFound();
1338
1339 // Introduce failure by using dataSize that is > 65536
1340 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1341 "must be greater than zero and less than or equal to 65536");
1342 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1343 m_errorMonitor->VerifyFound();
1344
1345 EndCommandBuffer();
1346}
1347
1348TEST_F(VkLayerTest, FillBufferAlignment) {
1349 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1350
1351 ASSERT_NO_FATAL_FAILURE(InitState());
1352
1353 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1354 vk_testing::Buffer buffer;
1355 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1356
1357 BeginCommandBuffer();
1358
1359 // Introduce failure by using dstOffset that is not multiple of 4
1360 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1361 " is not a multiple of 4");
1362 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1363 m_errorMonitor->VerifyFound();
1364
1365 // Introduce failure by using size that is not multiple of 4
1366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1367 " is not a multiple of 4");
1368 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1369 m_errorMonitor->VerifyFound();
1370
1371 // Introduce failure by using size that is zero
1372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1373 "must be greater than zero");
1374 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1375 m_errorMonitor->VerifyFound();
1376
1377 EndCommandBuffer();
1378}
Dustin Graves40f35822016-06-23 11:12:53 -06001379
1380// This is a positive test. No failures are expected.
1381TEST_F(VkLayerTest, IgnoreUnrelatedDescriptor) {
1382 TEST_DESCRIPTION("Ensure that the vkUpdateDescriptorSet validation code "
1383 "is ignoring VkWriteDescriptorSet members that are not "
1384 "related to the descriptor type specified by "
1385 "VkWriteDescriptorSet::descriptorType. Correct "
1386 "validation behavior will result in the test running to "
1387 "completion without validation errors.");
1388
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001389 const uintptr_t invalid_ptr = 0xcdcdcdcd;
1390
Dustin Graves40f35822016-06-23 11:12:53 -06001391 ASSERT_NO_FATAL_FAILURE(InitState());
1392
1393 // Image Case
1394 {
1395 m_errorMonitor->ExpectSuccess();
1396
1397 VkImage image;
1398 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1399 const int32_t tex_width = 32;
1400 const int32_t tex_height = 32;
1401 VkImageCreateInfo image_create_info = {};
1402 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1403 image_create_info.pNext = NULL;
1404 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1405 image_create_info.format = tex_format;
1406 image_create_info.extent.width = tex_width;
1407 image_create_info.extent.height = tex_height;
1408 image_create_info.extent.depth = 1;
1409 image_create_info.mipLevels = 1;
1410 image_create_info.arrayLayers = 1;
1411 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis51cde412016-07-11 16:08:30 -06001412 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Dustin Graves40f35822016-06-23 11:12:53 -06001413 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1414 image_create_info.flags = 0;
1415 VkResult err =
1416 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1417 ASSERT_VK_SUCCESS(err);
1418
1419 VkMemoryRequirements memory_reqs;
1420 VkDeviceMemory image_memory;
1421 bool pass;
1422 VkMemoryAllocateInfo memory_info = {};
1423 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1424 memory_info.pNext = NULL;
1425 memory_info.allocationSize = 0;
1426 memory_info.memoryTypeIndex = 0;
1427 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
1428 memory_info.allocationSize = memory_reqs.size;
1429 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1430 &memory_info, 0);
1431 ASSERT_TRUE(pass);
1432 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1433 &image_memory);
1434 ASSERT_VK_SUCCESS(err);
1435 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
1436 ASSERT_VK_SUCCESS(err);
1437
1438 VkImageViewCreateInfo image_view_create_info = {};
1439 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
1440 image_view_create_info.image = image;
1441 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
1442 image_view_create_info.format = tex_format;
1443 image_view_create_info.subresourceRange.layerCount = 1;
1444 image_view_create_info.subresourceRange.baseMipLevel = 0;
1445 image_view_create_info.subresourceRange.levelCount = 1;
1446 image_view_create_info.subresourceRange.aspectMask =
1447 VK_IMAGE_ASPECT_COLOR_BIT;
1448
1449 VkImageView view;
1450 err = vkCreateImageView(m_device->device(), &image_view_create_info,
1451 NULL, &view);
1452 ASSERT_VK_SUCCESS(err);
1453
1454 VkDescriptorPoolSize ds_type_count = {};
1455 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1456 ds_type_count.descriptorCount = 1;
1457
1458 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1459 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1460 ds_pool_ci.pNext = NULL;
1461 ds_pool_ci.maxSets = 1;
1462 ds_pool_ci.poolSizeCount = 1;
1463 ds_pool_ci.pPoolSizes = &ds_type_count;
1464
1465 VkDescriptorPool ds_pool;
1466 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL,
1467 &ds_pool);
1468 ASSERT_VK_SUCCESS(err);
1469
1470 VkDescriptorSetLayoutBinding dsl_binding = {};
1471 dsl_binding.binding = 0;
1472 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1473 dsl_binding.descriptorCount = 1;
1474 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1475 dsl_binding.pImmutableSamplers = NULL;
1476
1477 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1478 ds_layout_ci.sType =
1479 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1480 ds_layout_ci.pNext = NULL;
1481 ds_layout_ci.bindingCount = 1;
1482 ds_layout_ci.pBindings = &dsl_binding;
1483 VkDescriptorSetLayout ds_layout;
1484 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
1485 NULL, &ds_layout);
1486 ASSERT_VK_SUCCESS(err);
1487
1488 VkDescriptorSet descriptor_set;
1489 VkDescriptorSetAllocateInfo alloc_info = {};
1490 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1491 alloc_info.descriptorSetCount = 1;
1492 alloc_info.descriptorPool = ds_pool;
1493 alloc_info.pSetLayouts = &ds_layout;
1494 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1495 &descriptor_set);
1496 ASSERT_VK_SUCCESS(err);
1497
1498 VkDescriptorImageInfo image_info = {};
1499 image_info.imageView = view;
1500 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
1501
1502 VkWriteDescriptorSet descriptor_write;
1503 memset(&descriptor_write, 0, sizeof(descriptor_write));
1504 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1505 descriptor_write.dstSet = descriptor_set;
1506 descriptor_write.dstBinding = 0;
1507 descriptor_write.descriptorCount = 1;
1508 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1509 descriptor_write.pImageInfo = &image_info;
1510
1511 // Set pBufferInfo and pTexelBufferView to invalid values, which should
1512 // be
1513 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
1514 // This will most likely produce a crash if the parameter_validation
1515 // layer
1516 // does not correctly ignore pBufferInfo.
1517 descriptor_write.pBufferInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001518 reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001519 descriptor_write.pTexelBufferView =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001520 reinterpret_cast<const VkBufferView *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001521
1522 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
1523 NULL);
1524
1525 m_errorMonitor->VerifyNotFound();
1526
1527 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
1528 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1529 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1530 vkDestroyImageView(m_device->device(), view, NULL);
1531 vkDestroyImage(m_device->device(), image, NULL);
1532 vkFreeMemory(m_device->device(), image_memory, NULL);
1533 }
1534
1535 // Buffer Case
1536 {
1537 m_errorMonitor->ExpectSuccess();
1538
1539 VkBuffer buffer;
1540 uint32_t queue_family_index = 0;
1541 VkBufferCreateInfo buffer_create_info = {};
1542 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1543 buffer_create_info.size = 1024;
1544 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1545 buffer_create_info.queueFamilyIndexCount = 1;
1546 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1547
1548 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info,
1549 NULL, &buffer);
1550 ASSERT_VK_SUCCESS(err);
1551
1552 VkMemoryRequirements memory_reqs;
1553 VkDeviceMemory buffer_memory;
1554 bool pass;
1555 VkMemoryAllocateInfo memory_info = {};
1556 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1557 memory_info.pNext = NULL;
1558 memory_info.allocationSize = 0;
1559 memory_info.memoryTypeIndex = 0;
1560
1561 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1562 memory_info.allocationSize = memory_reqs.size;
1563 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1564 &memory_info, 0);
1565 ASSERT_TRUE(pass);
1566
1567 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1568 &buffer_memory);
1569 ASSERT_VK_SUCCESS(err);
1570 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1571 ASSERT_VK_SUCCESS(err);
1572
1573 VkDescriptorPoolSize ds_type_count = {};
1574 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1575 ds_type_count.descriptorCount = 1;
1576
1577 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1578 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1579 ds_pool_ci.pNext = NULL;
1580 ds_pool_ci.maxSets = 1;
1581 ds_pool_ci.poolSizeCount = 1;
1582 ds_pool_ci.pPoolSizes = &ds_type_count;
1583
1584 VkDescriptorPool ds_pool;
1585 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL,
1586 &ds_pool);
1587 ASSERT_VK_SUCCESS(err);
1588
1589 VkDescriptorSetLayoutBinding dsl_binding = {};
1590 dsl_binding.binding = 0;
1591 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1592 dsl_binding.descriptorCount = 1;
1593 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1594 dsl_binding.pImmutableSamplers = NULL;
1595
1596 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1597 ds_layout_ci.sType =
1598 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1599 ds_layout_ci.pNext = NULL;
1600 ds_layout_ci.bindingCount = 1;
1601 ds_layout_ci.pBindings = &dsl_binding;
1602 VkDescriptorSetLayout ds_layout;
1603 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
1604 NULL, &ds_layout);
1605 ASSERT_VK_SUCCESS(err);
1606
1607 VkDescriptorSet descriptor_set;
1608 VkDescriptorSetAllocateInfo alloc_info = {};
1609 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1610 alloc_info.descriptorSetCount = 1;
1611 alloc_info.descriptorPool = ds_pool;
1612 alloc_info.pSetLayouts = &ds_layout;
1613 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1614 &descriptor_set);
1615 ASSERT_VK_SUCCESS(err);
1616
1617 VkDescriptorBufferInfo buffer_info = {};
1618 buffer_info.buffer = buffer;
1619 buffer_info.offset = 0;
1620 buffer_info.range = 1024;
1621
1622 VkWriteDescriptorSet descriptor_write;
1623 memset(&descriptor_write, 0, sizeof(descriptor_write));
1624 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1625 descriptor_write.dstSet = descriptor_set;
1626 descriptor_write.dstBinding = 0;
1627 descriptor_write.descriptorCount = 1;
1628 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1629 descriptor_write.pBufferInfo = &buffer_info;
1630
1631 // Set pImageInfo and pTexelBufferView to invalid values, which should
1632 // be
1633 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
1634 // This will most likely produce a crash if the parameter_validation
1635 // layer
1636 // does not correctly ignore pImageInfo.
1637 descriptor_write.pImageInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001638 reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001639 descriptor_write.pTexelBufferView =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001640 reinterpret_cast<const VkBufferView *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001641
1642 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
1643 NULL);
1644
1645 m_errorMonitor->VerifyNotFound();
1646
1647 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
1648 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1649 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1650 vkDestroyBuffer(m_device->device(), buffer, NULL);
1651 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1652 }
1653
1654 // Texel Buffer Case
1655 {
1656 m_errorMonitor->ExpectSuccess();
1657
1658 VkBuffer buffer;
1659 uint32_t queue_family_index = 0;
1660 VkBufferCreateInfo buffer_create_info = {};
1661 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1662 buffer_create_info.size = 1024;
1663 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
1664 buffer_create_info.queueFamilyIndexCount = 1;
1665 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1666
1667 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info,
1668 NULL, &buffer);
1669 ASSERT_VK_SUCCESS(err);
1670
1671 VkMemoryRequirements memory_reqs;
1672 VkDeviceMemory buffer_memory;
1673 bool pass;
1674 VkMemoryAllocateInfo memory_info = {};
1675 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1676 memory_info.pNext = NULL;
1677 memory_info.allocationSize = 0;
1678 memory_info.memoryTypeIndex = 0;
1679
1680 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1681 memory_info.allocationSize = memory_reqs.size;
1682 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1683 &memory_info, 0);
1684 ASSERT_TRUE(pass);
1685
1686 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1687 &buffer_memory);
1688 ASSERT_VK_SUCCESS(err);
1689 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1690 ASSERT_VK_SUCCESS(err);
1691
1692 VkBufferViewCreateInfo buff_view_ci = {};
1693 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
1694 buff_view_ci.buffer = buffer;
1695 buff_view_ci.format = VK_FORMAT_R8_UNORM;
1696 buff_view_ci.range = VK_WHOLE_SIZE;
1697 VkBufferView buffer_view;
1698 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL,
1699 &buffer_view);
1700
1701 VkDescriptorPoolSize ds_type_count = {};
1702 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1703 ds_type_count.descriptorCount = 1;
1704
1705 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1706 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1707 ds_pool_ci.pNext = NULL;
1708 ds_pool_ci.maxSets = 1;
1709 ds_pool_ci.poolSizeCount = 1;
1710 ds_pool_ci.pPoolSizes = &ds_type_count;
1711
1712 VkDescriptorPool ds_pool;
1713 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL,
1714 &ds_pool);
1715 ASSERT_VK_SUCCESS(err);
1716
1717 VkDescriptorSetLayoutBinding dsl_binding = {};
1718 dsl_binding.binding = 0;
1719 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1720 dsl_binding.descriptorCount = 1;
1721 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1722 dsl_binding.pImmutableSamplers = NULL;
1723
1724 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1725 ds_layout_ci.sType =
1726 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1727 ds_layout_ci.pNext = NULL;
1728 ds_layout_ci.bindingCount = 1;
1729 ds_layout_ci.pBindings = &dsl_binding;
1730 VkDescriptorSetLayout ds_layout;
1731 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
1732 NULL, &ds_layout);
1733 ASSERT_VK_SUCCESS(err);
1734
1735 VkDescriptorSet descriptor_set;
1736 VkDescriptorSetAllocateInfo alloc_info = {};
1737 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1738 alloc_info.descriptorSetCount = 1;
1739 alloc_info.descriptorPool = ds_pool;
1740 alloc_info.pSetLayouts = &ds_layout;
1741 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1742 &descriptor_set);
1743 ASSERT_VK_SUCCESS(err);
1744
1745 VkWriteDescriptorSet descriptor_write;
1746 memset(&descriptor_write, 0, sizeof(descriptor_write));
1747 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1748 descriptor_write.dstSet = descriptor_set;
1749 descriptor_write.dstBinding = 0;
1750 descriptor_write.descriptorCount = 1;
1751 descriptor_write.descriptorType =
1752 VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1753 descriptor_write.pTexelBufferView = &buffer_view;
1754
1755 // Set pImageInfo and pBufferInfo to invalid values, which should be
1756 // ignored for descriptorType ==
1757 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
1758 // This will most likely produce a crash if the parameter_validation
1759 // layer
1760 // does not correctly ignore pImageInfo and pBufferInfo.
1761 descriptor_write.pImageInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001762 reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001763 descriptor_write.pBufferInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001764 reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001765
1766 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
1767 NULL);
1768
1769 m_errorMonitor->VerifyNotFound();
1770
1771 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
1772 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1773 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1774 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
1775 vkDestroyBuffer(m_device->device(), buffer, NULL);
1776 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1777 }
1778}
Dustin Gravesffa90fa2016-05-06 11:20:38 -06001779#endif // PARAMETER_VALIDATION_TESTS
1780
Tobin Ehlis0788f522015-05-26 16:11:58 -06001781#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001782#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001783TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001784{
1785 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001786 VkFenceCreateInfo fenceInfo = {};
1787 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1788 fenceInfo.pNext = NULL;
1789 fenceInfo.flags = 0;
1790
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001791 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001792
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001793 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001794
1795 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1796 vk_testing::Buffer buffer;
1797 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001798
Tony Barbourfe3351b2015-07-28 10:17:20 -06001799 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001800 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001801 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001802
1803 testFence.init(*m_device, fenceInfo);
1804
1805 // Bypass framework since it does the waits automatically
1806 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001807 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001808 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1809 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001810 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001811 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001812 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001813 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001814 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001815 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001816 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001817
1818 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001819 ASSERT_VK_SUCCESS( err );
1820
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001821 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001822 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001823
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001824 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001825}
1826
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001827TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001828{
1829 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001830 VkFenceCreateInfo fenceInfo = {};
1831 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1832 fenceInfo.pNext = NULL;
1833 fenceInfo.flags = 0;
1834
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001836
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001837 ASSERT_NO_FATAL_FAILURE(InitState());
1838 ASSERT_NO_FATAL_FAILURE(InitViewport());
1839 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1840
Tony Barbourfe3351b2015-07-28 10:17:20 -06001841 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001842 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001843 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001844
1845 testFence.init(*m_device, fenceInfo);
1846
1847 // Bypass framework since it does the waits automatically
1848 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001849 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001850 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1851 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001852 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001853 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001854 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001855 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001856 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001857 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001858 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001859
1860 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001861 ASSERT_VK_SUCCESS( err );
1862
Jon Ashburnf19916e2016-01-11 13:12:43 -07001863 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001864 VkCommandBufferBeginInfo info = {};
1865 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1866 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001867 info.renderPass = VK_NULL_HANDLE;
1868 info.subpass = 0;
1869 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001870 info.occlusionQueryEnable = VK_FALSE;
1871 info.queryFlags = 0;
1872 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001873
1874 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001875 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001876
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001877 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001878}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001879#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001880
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001881// This is a positive test. No failures are expected.
1882TEST_F(VkLayerTest, TestAliasedMemoryTracking) {
1883 VkResult err;
1884 bool pass;
1885
1886 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
1887 "the buffer, create an image, and bind the same memory to "
1888 "it");
1889
1890 m_errorMonitor->ExpectSuccess();
1891
1892 ASSERT_NO_FATAL_FAILURE(InitState());
1893
1894 VkBuffer buffer;
1895 VkImage image;
1896 VkDeviceMemory mem;
1897 VkMemoryRequirements mem_reqs;
1898
1899 VkBufferCreateInfo buf_info = {};
1900 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1901 buf_info.pNext = NULL;
1902 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1903 buf_info.size = 256;
1904 buf_info.queueFamilyIndexCount = 0;
1905 buf_info.pQueueFamilyIndices = NULL;
1906 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1907 buf_info.flags = 0;
1908 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1909 ASSERT_VK_SUCCESS(err);
1910
1911 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1912
1913 VkMemoryAllocateInfo alloc_info = {};
1914 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1915 alloc_info.pNext = NULL;
1916 alloc_info.memoryTypeIndex = 0;
1917
1918 // Ensure memory is big enough for both bindings
1919 alloc_info.allocationSize = 0x10000;
1920
1921 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
1922 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1923 if (!pass) {
1924 vkDestroyBuffer(m_device->device(), buffer, NULL);
1925 return;
1926 }
1927
1928 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1929 ASSERT_VK_SUCCESS(err);
1930
1931 uint8_t *pData;
1932 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
1933 (void **)&pData);
1934 ASSERT_VK_SUCCESS(err);
1935
Mark Lobodzinski2abefa92016-05-05 11:45:57 -06001936 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001937
1938 vkUnmapMemory(m_device->device(), mem);
1939
1940 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1941 ASSERT_VK_SUCCESS(err);
1942
1943 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
1944 // memory. In fact, it was never used by the GPU.
1945 // Just be be sure, wait for idle.
1946 vkDestroyBuffer(m_device->device(), buffer, NULL);
1947 vkDeviceWaitIdle(m_device->device());
1948
1949 VkImageCreateInfo image_create_info = {};
1950 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1951 image_create_info.pNext = NULL;
1952 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1953 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1954 image_create_info.extent.width = 64;
1955 image_create_info.extent.height = 64;
1956 image_create_info.extent.depth = 1;
1957 image_create_info.mipLevels = 1;
1958 image_create_info.arrayLayers = 1;
1959 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1960 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1961 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1962 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1963 image_create_info.queueFamilyIndexCount = 0;
1964 image_create_info.pQueueFamilyIndices = NULL;
1965 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1966 image_create_info.flags = 0;
1967
1968 VkMemoryAllocateInfo mem_alloc = {};
1969 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1970 mem_alloc.pNext = NULL;
1971 mem_alloc.allocationSize = 0;
1972 mem_alloc.memoryTypeIndex = 0;
1973
1974 /* Create a mappable image. It will be the texture if linear images are ok
1975 * to be textures or it will be the staging image if they are not.
1976 */
1977 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1978 ASSERT_VK_SUCCESS(err);
1979
1980 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
1981
1982 mem_alloc.allocationSize = mem_reqs.size;
1983
1984 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
1985 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1986 if (!pass) {
1987 vkDestroyImage(m_device->device(), image, NULL);
1988 return;
1989 }
1990
Tobin Ehlis077ded32016-05-12 17:39:13 -06001991 // VALIDATION FAILURE:
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001992 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1993 ASSERT_VK_SUCCESS(err);
1994
1995 m_errorMonitor->VerifyNotFound();
1996
Tony Barbourdf4c0042016-06-01 15:55:43 -06001997 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001998 vkDestroyBuffer(m_device->device(), buffer, NULL);
1999 vkDestroyImage(m_device->device(), image, NULL);
2000}
2001
Tobin Ehlisf11be982016-05-11 13:52:53 -06002002TEST_F(VkLayerTest, InvalidMemoryAliasing) {
2003 TEST_DESCRIPTION("Create a buffer and image, allocate memory, and bind the "
2004 "buffer and image to memory such that they will alias.");
2005 VkResult err;
2006 bool pass;
2007 ASSERT_NO_FATAL_FAILURE(InitState());
2008
Tobin Ehlis077ded32016-05-12 17:39:13 -06002009 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06002010 VkImage image;
2011 VkDeviceMemory mem; // buffer will be bound first
2012 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06002013 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Tobin Ehlisf11be982016-05-11 13:52:53 -06002014
2015 VkBufferCreateInfo buf_info = {};
2016 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2017 buf_info.pNext = NULL;
2018 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2019 buf_info.size = 256;
2020 buf_info.queueFamilyIndexCount = 0;
2021 buf_info.pQueueFamilyIndices = NULL;
2022 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2023 buf_info.flags = 0;
2024 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
2025 ASSERT_VK_SUCCESS(err);
2026
Tobin Ehlis077ded32016-05-12 17:39:13 -06002027 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002028
2029 VkImageCreateInfo image_create_info = {};
2030 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2031 image_create_info.pNext = NULL;
2032 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2033 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
2034 image_create_info.extent.width = 64;
2035 image_create_info.extent.height = 64;
2036 image_create_info.extent.depth = 1;
2037 image_create_info.mipLevels = 1;
2038 image_create_info.arrayLayers = 1;
2039 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2040 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2041 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
2042 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
2043 image_create_info.queueFamilyIndexCount = 0;
2044 image_create_info.pQueueFamilyIndices = NULL;
2045 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2046 image_create_info.flags = 0;
2047
Tobin Ehlisf11be982016-05-11 13:52:53 -06002048 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2049 ASSERT_VK_SUCCESS(err);
2050
Tobin Ehlis077ded32016-05-12 17:39:13 -06002051 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
2052
2053 VkMemoryAllocateInfo alloc_info = {};
2054 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2055 alloc_info.pNext = NULL;
2056 alloc_info.memoryTypeIndex = 0;
2057 // Ensure memory is big enough for both bindings
2058 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
2059 pass = m_device->phy().set_memory_type(
2060 buff_mem_reqs.memoryTypeBits | img_mem_reqs.memoryTypeBits, &alloc_info,
2061 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002062 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06002063 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002064 vkDestroyImage(m_device->device(), image, NULL);
2065 return;
2066 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06002067 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
2068 ASSERT_VK_SUCCESS(err);
2069 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
2070 ASSERT_VK_SUCCESS(err);
2071
Tobin Ehlisf11be982016-05-11 13:52:53 -06002072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2073 " is aliased with buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06002074 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06002075 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2076 m_errorMonitor->VerifyFound();
2077
2078 // Now correctly bind image to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06002079 // aliasing buffer2
2080 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
2081 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002082 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
2083 ASSERT_VK_SUCCESS(err);
2084 err = vkBindImageMemory(m_device->device(), image, mem_img, 0);
2085 ASSERT_VK_SUCCESS(err);
2086 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2087 " is aliased with image 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06002088 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002089 m_errorMonitor->VerifyFound();
2090
2091 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06002092 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002093 vkDestroyImage(m_device->device(), image, NULL);
2094 vkFreeMemory(m_device->device(), mem, NULL);
2095 vkFreeMemory(m_device->device(), mem_img, NULL);
2096}
2097
Tobin Ehlis35372522016-05-12 08:32:31 -06002098TEST_F(VkLayerTest, InvalidMemoryMapping) {
2099 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
2100 VkResult err;
2101 bool pass;
2102 ASSERT_NO_FATAL_FAILURE(InitState());
2103
2104 VkBuffer buffer;
2105 VkDeviceMemory mem;
2106 VkMemoryRequirements mem_reqs;
2107
2108 VkBufferCreateInfo buf_info = {};
2109 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2110 buf_info.pNext = NULL;
2111 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2112 buf_info.size = 256;
2113 buf_info.queueFamilyIndexCount = 0;
2114 buf_info.pQueueFamilyIndices = NULL;
2115 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2116 buf_info.flags = 0;
2117 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
2118 ASSERT_VK_SUCCESS(err);
2119
2120 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
2121 VkMemoryAllocateInfo alloc_info = {};
2122 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2123 alloc_info.pNext = NULL;
2124 alloc_info.memoryTypeIndex = 0;
2125
2126 // Ensure memory is big enough for both bindings
2127 static const VkDeviceSize allocation_size = 0x10000;
2128 alloc_info.allocationSize = allocation_size;
2129 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
2130 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
2131 if (!pass) {
2132 vkDestroyBuffer(m_device->device(), buffer, NULL);
2133 return;
2134 }
2135 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
2136 ASSERT_VK_SUCCESS(err);
2137
2138 uint8_t *pData;
2139 // Attempt to map memory size 0 is invalid
2140 m_errorMonitor->SetDesiredFailureMsg(
2141 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2142 "VkMapMemory: Attempting to map memory range of size zero");
2143 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
2144 m_errorMonitor->VerifyFound();
2145 // Map memory twice
2146 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
2147 (void **)&pData);
2148 ASSERT_VK_SUCCESS(err);
2149 m_errorMonitor->SetDesiredFailureMsg(
2150 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2151 "VkMapMemory: Attempting to map memory on an already-mapped object ");
2152 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
2153 (void **)&pData);
2154 m_errorMonitor->VerifyFound();
2155
2156 // Unmap the memory to avoid re-map error
2157 vkUnmapMemory(m_device->device(), mem);
2158 // overstep allocation with VK_WHOLE_SIZE
2159 m_errorMonitor->SetDesiredFailureMsg(
2160 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2161 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
2162 err = vkMapMemory(m_device->device(), mem, allocation_size + 1,
2163 VK_WHOLE_SIZE, 0, (void **)&pData);
2164 m_errorMonitor->VerifyFound();
2165 // overstep allocation w/o VK_WHOLE_SIZE
2166 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2167 " oversteps total array size 0x");
2168 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0,
2169 (void **)&pData);
2170 m_errorMonitor->VerifyFound();
2171 // Now error due to unmapping memory that's not mapped
2172 m_errorMonitor->SetDesiredFailureMsg(
2173 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2174 "Unmapping Memory without memory being mapped: ");
2175 vkUnmapMemory(m_device->device(), mem);
2176 m_errorMonitor->VerifyFound();
2177 // Now map memory and cause errors due to flushing invalid ranges
2178 err = vkMapMemory(m_device->device(), mem, 16, VK_WHOLE_SIZE, 0,
2179 (void **)&pData);
2180 ASSERT_VK_SUCCESS(err);
2181 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12002182 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06002183 mmr.memory = mem;
2184 mmr.offset = 15; // Error b/c offset less than offset of mapped mem
2185 m_errorMonitor->SetDesiredFailureMsg(
2186 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2187 ") is less than Memory Object's offset (");
2188 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2189 m_errorMonitor->VerifyFound();
2190 // Now flush range that oversteps mapped range
2191 vkUnmapMemory(m_device->device(), mem);
2192 err = vkMapMemory(m_device->device(), mem, 0, 256, 0, (void **)&pData);
2193 ASSERT_VK_SUCCESS(err);
2194 mmr.offset = 16;
2195 mmr.size = 256; // flushing bounds (272) exceed mapped bounds (256)
2196 m_errorMonitor->SetDesiredFailureMsg(
2197 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2198 ") exceeds the Memory Object's upper-bound (");
2199 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2200 m_errorMonitor->VerifyFound();
2201
2202 pass =
2203 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
2204 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
2205 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
2206 if (!pass) {
2207 vkFreeMemory(m_device->device(), mem, NULL);
2208 vkDestroyBuffer(m_device->device(), buffer, NULL);
2209 return;
2210 }
2211 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
2212 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
2213
2214 vkDestroyBuffer(m_device->device(), buffer, NULL);
2215 vkFreeMemory(m_device->device(), mem, NULL);
2216}
2217
Ian Elliott1c32c772016-04-28 14:47:13 -06002218TEST_F(VkLayerTest, EnableWsiBeforeUse) {
2219 VkResult err;
2220 bool pass;
2221
Ian Elliott489eec02016-05-05 14:12:44 -06002222// FIXME: After we turn on this code for non-Linux platforms, uncomment the
2223// following declaration (which is temporarily being moved below):
2224// VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002225 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2226 VkSwapchainCreateInfoKHR swapchain_create_info = {};
2227 uint32_t swapchain_image_count = 0;
2228// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
2229 uint32_t image_index = 0;
2230// VkPresentInfoKHR present_info = {};
2231
2232 ASSERT_NO_FATAL_FAILURE(InitState());
2233
Ian Elliott3f06ce52016-04-29 14:46:21 -06002234#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
2235#if defined(VK_USE_PLATFORM_ANDROID_KHR)
2236 // Use the functions from the VK_KHR_android_surface extension without
2237 // enabling that extension:
2238
2239 // Create a surface:
2240 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002241 m_errorMonitor->SetDesiredFailureMsg(
2242 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2243 "extension was not enabled for this");
2244 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
2245 &surface);
2246 pass = (err != VK_SUCCESS);
2247 ASSERT_TRUE(pass);
2248 m_errorMonitor->VerifyFound();
2249#endif // VK_USE_PLATFORM_ANDROID_KHR
2250
2251
2252#if defined(VK_USE_PLATFORM_MIR_KHR)
2253 // Use the functions from the VK_KHR_mir_surface extension without enabling
2254 // that extension:
2255
2256 // Create a surface:
2257 VkMirSurfaceCreateInfoKHR mir_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002258 m_errorMonitor->SetDesiredFailureMsg(
2259 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2260 "extension was not enabled for this");
2261 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
2262 pass = (err != VK_SUCCESS);
2263 ASSERT_TRUE(pass);
2264 m_errorMonitor->VerifyFound();
2265
2266 // Tell whether an mir_connection supports presentation:
2267 MirConnection *mir_connection = NULL;
2268 m_errorMonitor->SetDesiredFailureMsg(
2269 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2270 "extension was not enabled for this");
2271 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
2272 visual_id);
2273 m_errorMonitor->VerifyFound();
2274#endif // VK_USE_PLATFORM_MIR_KHR
2275
2276
2277#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
2278 // Use the functions from the VK_KHR_wayland_surface extension without
2279 // enabling that extension:
2280
2281 // Create a surface:
2282 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002283 m_errorMonitor->SetDesiredFailureMsg(
2284 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2285 "extension was not enabled for this");
2286 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
2287 &surface);
2288 pass = (err != VK_SUCCESS);
2289 ASSERT_TRUE(pass);
2290 m_errorMonitor->VerifyFound();
2291
2292 // Tell whether an wayland_display supports presentation:
2293 struct wl_display wayland_display = {};
2294 m_errorMonitor->SetDesiredFailureMsg(
2295 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2296 "extension was not enabled for this");
2297 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
2298 &wayland_display);
2299 m_errorMonitor->VerifyFound();
2300#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -06002301#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06002302
2303
2304#if defined(VK_USE_PLATFORM_WIN32_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06002305// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2306// TO NON-LINUX PLATFORMS:
2307VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06002308 // Use the functions from the VK_KHR_win32_surface extension without
2309 // enabling that extension:
2310
2311 // Create a surface:
2312 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002313 m_errorMonitor->SetDesiredFailureMsg(
2314 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2315 "extension was not enabled for this");
2316 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
2317 &surface);
2318 pass = (err != VK_SUCCESS);
2319 ASSERT_TRUE(pass);
2320 m_errorMonitor->VerifyFound();
2321
2322 // Tell whether win32 supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06002323 m_errorMonitor->SetDesiredFailureMsg(
2324 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2325 "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06002326 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06002327 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002328// Set this (for now, until all platforms are supported and tested):
2329#define NEED_TO_TEST_THIS_ON_PLATFORM
2330#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06002331
2332
Ian Elliott1c32c772016-04-28 14:47:13 -06002333#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06002334// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2335// TO NON-LINUX PLATFORMS:
2336VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002337 // Use the functions from the VK_KHR_xcb_surface extension without enabling
2338 // that extension:
2339
2340 // Create a surface:
2341 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06002342 m_errorMonitor->SetDesiredFailureMsg(
2343 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2344 "extension was not enabled for this");
2345 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2346 pass = (err != VK_SUCCESS);
2347 ASSERT_TRUE(pass);
2348 m_errorMonitor->VerifyFound();
2349
2350 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06002351 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06002352 xcb_visualid_t visual_id = 0;
2353 m_errorMonitor->SetDesiredFailureMsg(
2354 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2355 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06002356 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -06002357 visual_id);
2358 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002359// Set this (for now, until all platforms are supported and tested):
2360#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002361#endif // VK_USE_PLATFORM_XCB_KHR
2362
2363
Ian Elliott12630812016-04-29 14:35:43 -06002364#if defined(VK_USE_PLATFORM_XLIB_KHR)
2365 // Use the functions from the VK_KHR_xlib_surface extension without enabling
2366 // that extension:
2367
2368 // Create a surface:
2369 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
Ian Elliott12630812016-04-29 14:35:43 -06002370 m_errorMonitor->SetDesiredFailureMsg(
2371 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2372 "extension was not enabled for this");
2373 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
2374 pass = (err != VK_SUCCESS);
2375 ASSERT_TRUE(pass);
2376 m_errorMonitor->VerifyFound();
2377
2378 // Tell whether an Xlib VisualID supports presentation:
2379 Display *dpy = NULL;
2380 VisualID visual = 0;
2381 m_errorMonitor->SetDesiredFailureMsg(
2382 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2383 "extension was not enabled for this");
2384 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
2385 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002386// Set this (for now, until all platforms are supported and tested):
2387#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06002388#endif // VK_USE_PLATFORM_XLIB_KHR
2389
2390
Ian Elliott1c32c772016-04-28 14:47:13 -06002391 // Use the functions from the VK_KHR_surface extension without enabling
2392 // that extension:
2393
Ian Elliott489eec02016-05-05 14:12:44 -06002394#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002395 // Destroy a surface:
2396 m_errorMonitor->SetDesiredFailureMsg(
2397 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2398 "extension was not enabled for this");
2399 vkDestroySurfaceKHR(instance(), surface, NULL);
2400 m_errorMonitor->VerifyFound();
2401
2402 // Check if surface supports presentation:
2403 VkBool32 supported = false;
2404 m_errorMonitor->SetDesiredFailureMsg(
2405 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2406 "extension was not enabled for this");
2407 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2408 pass = (err != VK_SUCCESS);
2409 ASSERT_TRUE(pass);
2410 m_errorMonitor->VerifyFound();
2411
2412 // Check surface capabilities:
2413 VkSurfaceCapabilitiesKHR capabilities = {};
2414 m_errorMonitor->SetDesiredFailureMsg(
2415 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2416 "extension was not enabled for this");
2417 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
2418 &capabilities);
2419 pass = (err != VK_SUCCESS);
2420 ASSERT_TRUE(pass);
2421 m_errorMonitor->VerifyFound();
2422
2423 // Check surface formats:
2424 uint32_t format_count = 0;
2425 VkSurfaceFormatKHR *formats = NULL;
2426 m_errorMonitor->SetDesiredFailureMsg(
2427 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2428 "extension was not enabled for this");
2429 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
2430 &format_count, formats);
2431 pass = (err != VK_SUCCESS);
2432 ASSERT_TRUE(pass);
2433 m_errorMonitor->VerifyFound();
2434
2435 // Check surface present modes:
2436 uint32_t present_mode_count = 0;
2437 VkSurfaceFormatKHR *present_modes = NULL;
2438 m_errorMonitor->SetDesiredFailureMsg(
2439 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2440 "extension was not enabled for this");
2441 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
2442 &present_mode_count, present_modes);
2443 pass = (err != VK_SUCCESS);
2444 ASSERT_TRUE(pass);
2445 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002446#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002447
2448
2449 // Use the functions from the VK_KHR_swapchain extension without enabling
2450 // that extension:
2451
2452 // Create a swapchain:
2453 m_errorMonitor->SetDesiredFailureMsg(
2454 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2455 "extension was not enabled for this");
2456 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2457 swapchain_create_info.pNext = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06002458 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
2459 NULL, &swapchain);
2460 pass = (err != VK_SUCCESS);
2461 ASSERT_TRUE(pass);
2462 m_errorMonitor->VerifyFound();
2463
2464 // Get the images from the swapchain:
2465 m_errorMonitor->SetDesiredFailureMsg(
2466 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2467 "extension was not enabled for this");
2468 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
2469 &swapchain_image_count, NULL);
2470 pass = (err != VK_SUCCESS);
2471 ASSERT_TRUE(pass);
2472 m_errorMonitor->VerifyFound();
2473
2474 // Try to acquire an image:
2475 m_errorMonitor->SetDesiredFailureMsg(
2476 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2477 "extension was not enabled for this");
2478 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
2479 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
2480 pass = (err != VK_SUCCESS);
2481 ASSERT_TRUE(pass);
2482 m_errorMonitor->VerifyFound();
2483
2484 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002485 //
2486 // NOTE: Currently can't test this because a real swapchain is needed (as
2487 // opposed to the fake one we created) in order for the layer to lookup the
2488 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06002489
2490 // Destroy the swapchain:
2491 m_errorMonitor->SetDesiredFailureMsg(
2492 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2493 "extension was not enabled for this");
2494 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
2495 m_errorMonitor->VerifyFound();
2496}
2497
Ian Elliott2c1daf52016-05-12 09:41:46 -06002498TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
Ian Elliott2c1daf52016-05-12 09:41:46 -06002499
Dustin Graves6c6d8982016-05-17 10:09:21 -06002500#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott2c1daf52016-05-12 09:41:46 -06002501 VkSurfaceKHR surface = VK_NULL_HANDLE;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002502
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002503 VkResult err;
2504 bool pass;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002505 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2506 VkSwapchainCreateInfoKHR swapchain_create_info = {};
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002507 // uint32_t swapchain_image_count = 0;
2508 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
2509 // uint32_t image_index = 0;
2510 // VkPresentInfoKHR present_info = {};
Ian Elliott2c1daf52016-05-12 09:41:46 -06002511
2512 ASSERT_NO_FATAL_FAILURE(InitState());
2513
2514 // Use the create function from one of the VK_KHR_*_surface extension in
2515 // order to create a surface, testing all known errors in the process,
2516 // before successfully creating a surface:
2517 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002518 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2519 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002520 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
2521 pass = (err != VK_SUCCESS);
2522 ASSERT_TRUE(pass);
2523 m_errorMonitor->VerifyFound();
2524
2525 // Next, try to create a surface with the wrong
2526 // VkXcbSurfaceCreateInfoKHR::sType:
2527 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
2528 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002529 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2530 "called with the wrong value for");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002531 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2532 pass = (err != VK_SUCCESS);
2533 ASSERT_TRUE(pass);
2534 m_errorMonitor->VerifyFound();
2535
Ian Elliott2c1daf52016-05-12 09:41:46 -06002536 // Create a native window, and then correctly create a surface:
2537 xcb_connection_t *connection;
2538 xcb_screen_t *screen;
2539 xcb_window_t xcb_window;
2540 xcb_intern_atom_reply_t *atom_wm_delete_window;
2541
2542 const xcb_setup_t *setup;
2543 xcb_screen_iterator_t iter;
2544 int scr;
2545 uint32_t value_mask, value_list[32];
2546 int width = 1;
2547 int height = 1;
2548
2549 connection = xcb_connect(NULL, &scr);
2550 ASSERT_TRUE(connection != NULL);
2551 setup = xcb_get_setup(connection);
2552 iter = xcb_setup_roots_iterator(setup);
2553 while (scr-- > 0)
2554 xcb_screen_next(&iter);
2555 screen = iter.data;
2556
2557 xcb_window = xcb_generate_id(connection);
2558
2559 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
2560 value_list[0] = screen->black_pixel;
2561 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE |
2562 XCB_EVENT_MASK_STRUCTURE_NOTIFY;
2563
2564 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window,
2565 screen->root, 0, 0, width, height, 0,
2566 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual,
2567 value_mask, value_list);
2568
2569 /* Magic code that will send notification when window is destroyed */
2570 xcb_intern_atom_cookie_t cookie =
2571 xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
2572 xcb_intern_atom_reply_t *reply =
2573 xcb_intern_atom_reply(connection, cookie, 0);
2574
2575 xcb_intern_atom_cookie_t cookie2 =
2576 xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002577 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002578 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window,
2579 (*reply).atom, 4, 32, 1,
2580 &(*atom_wm_delete_window).atom);
2581 free(reply);
2582
2583 xcb_map_window(connection, xcb_window);
2584
2585 // Force the x/y coordinates to 100,100 results are identical in consecutive
2586 // runs
2587 const uint32_t coords[] = {100, 100};
2588 xcb_configure_window(connection, xcb_window,
2589 XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
2590
Ian Elliott2c1daf52016-05-12 09:41:46 -06002591 // Finally, try to correctly create a surface:
2592 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
2593 xcb_create_info.pNext = NULL;
2594 xcb_create_info.flags = 0;
2595 xcb_create_info.connection = connection;
2596 xcb_create_info.window = xcb_window;
2597 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2598 pass = (err == VK_SUCCESS);
2599 ASSERT_TRUE(pass);
2600
Ian Elliott2c1daf52016-05-12 09:41:46 -06002601 // Check if surface supports presentation:
2602
2603 // 1st, do so without having queried the queue families:
2604 VkBool32 supported = false;
2605 // TODO: Get the following error to come out:
2606 m_errorMonitor->SetDesiredFailureMsg(
2607 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2608 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
2609 "function");
2610 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2611 pass = (err != VK_SUCCESS);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002612 // ASSERT_TRUE(pass);
2613 // m_errorMonitor->VerifyFound();
Ian Elliott2c1daf52016-05-12 09:41:46 -06002614
2615 // Next, query a queue family index that's too large:
2616 m_errorMonitor->SetDesiredFailureMsg(
2617 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2618 "called with a queueFamilyIndex that is too large");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002619 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface,
2620 &supported);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002621 pass = (err != VK_SUCCESS);
2622 ASSERT_TRUE(pass);
2623 m_errorMonitor->VerifyFound();
2624
2625 // Finally, do so correctly:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002626 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2627 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002628 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2629 pass = (err == VK_SUCCESS);
2630 ASSERT_TRUE(pass);
2631
Ian Elliott2c1daf52016-05-12 09:41:46 -06002632 // Before proceeding, try to create a swapchain without having called
2633 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
2634 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2635 swapchain_create_info.pNext = NULL;
2636 swapchain_create_info.flags = 0;
2637 m_errorMonitor->SetDesiredFailureMsg(
2638 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2639 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002640 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2641 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002642 pass = (err != VK_SUCCESS);
2643 ASSERT_TRUE(pass);
2644 m_errorMonitor->VerifyFound();
2645
Ian Elliott2c1daf52016-05-12 09:41:46 -06002646 // Get the surface capabilities:
2647 VkSurfaceCapabilitiesKHR surface_capabilities;
2648
2649 // Do so correctly (only error logged by this entrypoint is if the
2650 // extension isn't enabled):
2651 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
2652 &surface_capabilities);
2653 pass = (err == VK_SUCCESS);
2654 ASSERT_TRUE(pass);
2655
Ian Elliott2c1daf52016-05-12 09:41:46 -06002656 // Get the surface formats:
2657 uint32_t surface_format_count;
2658
2659 // First, try without a pointer to surface_format_count:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2661 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002662 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
2663 pass = (err == VK_SUCCESS);
2664 ASSERT_TRUE(pass);
2665 m_errorMonitor->VerifyFound();
2666
2667 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
2668 // correctly done a 1st try (to get the count):
2669 m_errorMonitor->SetDesiredFailureMsg(
2670 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2671 "but no prior positive value has been seen for");
2672 surface_format_count = 0;
2673 vkGetPhysicalDeviceSurfaceFormatsKHR(
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002674 gpu(), surface, &surface_format_count,
2675 (VkSurfaceFormatKHR *)&surface_format_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002676 pass = (err == VK_SUCCESS);
2677 ASSERT_TRUE(pass);
2678 m_errorMonitor->VerifyFound();
2679
2680 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002681 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
2682 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002683 pass = (err == VK_SUCCESS);
2684 ASSERT_TRUE(pass);
2685
2686 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002687 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(
2688 surface_format_count * sizeof(VkSurfaceFormatKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002689
2690 // Next, do a 2nd try with surface_format_count being set too high:
2691 surface_format_count += 5;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002692 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2693 "that is greater than the value");
2694 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002695 surface_formats);
2696 pass = (err == VK_SUCCESS);
2697 ASSERT_TRUE(pass);
2698 m_errorMonitor->VerifyFound();
2699
2700 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002701 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
2702 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002703 pass = (err == VK_SUCCESS);
2704 ASSERT_TRUE(pass);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002705 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002706 surface_formats);
2707 pass = (err == VK_SUCCESS);
2708 ASSERT_TRUE(pass);
2709
Ian Elliott2c1daf52016-05-12 09:41:46 -06002710 // Get the surface present modes:
2711 uint32_t surface_present_mode_count;
2712
2713 // First, try without a pointer to surface_format_count:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002714 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2715 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002716 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
2717 pass = (err == VK_SUCCESS);
2718 ASSERT_TRUE(pass);
2719 m_errorMonitor->VerifyFound();
2720
2721 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
2722 // correctly done a 1st try (to get the count):
2723 m_errorMonitor->SetDesiredFailureMsg(
2724 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2725 "but no prior positive value has been seen for");
2726 surface_present_mode_count = 0;
2727 vkGetPhysicalDeviceSurfacePresentModesKHR(
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002728 gpu(), surface, &surface_present_mode_count,
2729 (VkPresentModeKHR *)&surface_present_mode_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002730 pass = (err == VK_SUCCESS);
2731 ASSERT_TRUE(pass);
2732 m_errorMonitor->VerifyFound();
2733
2734 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002735 vkGetPhysicalDeviceSurfacePresentModesKHR(
2736 gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002737 pass = (err == VK_SUCCESS);
2738 ASSERT_TRUE(pass);
2739
2740 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002741 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(
2742 surface_present_mode_count * sizeof(VkPresentModeKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002743
2744 // Next, do a 2nd try with surface_format_count being set too high:
2745 surface_present_mode_count += 5;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002746 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2747 "that is greater than the value");
2748 vkGetPhysicalDeviceSurfacePresentModesKHR(
2749 gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002750 pass = (err == VK_SUCCESS);
2751 ASSERT_TRUE(pass);
2752 m_errorMonitor->VerifyFound();
2753
2754 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002755 vkGetPhysicalDeviceSurfacePresentModesKHR(
2756 gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002757 pass = (err == VK_SUCCESS);
2758 ASSERT_TRUE(pass);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002759 vkGetPhysicalDeviceSurfacePresentModesKHR(
2760 gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002761 pass = (err == VK_SUCCESS);
2762 ASSERT_TRUE(pass);
2763
Ian Elliott2c1daf52016-05-12 09:41:46 -06002764 // Create a swapchain:
2765
2766 // First, try without a pointer to swapchain_create_info:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002767 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2768 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002769 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
2770 pass = (err != VK_SUCCESS);
2771 ASSERT_TRUE(pass);
2772 m_errorMonitor->VerifyFound();
2773
2774 // Next, call with a non-NULL swapchain_create_info, that has the wrong
2775 // sType:
2776 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2778 "called with the wrong value for");
2779 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2780 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002781 pass = (err != VK_SUCCESS);
2782 ASSERT_TRUE(pass);
2783 m_errorMonitor->VerifyFound();
2784
2785 // Next, call with a NULL swapchain pointer:
2786 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2787 swapchain_create_info.pNext = NULL;
2788 swapchain_create_info.flags = 0;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002789 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2790 "called with NULL pointer");
2791 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2792 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002793 pass = (err != VK_SUCCESS);
2794 ASSERT_TRUE(pass);
2795 m_errorMonitor->VerifyFound();
2796
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002797 // TODO: Enhance swapchain layer so that
2798 // swapchain_create_info.queueFamilyIndexCount is checked against something?
Ian Elliott2c1daf52016-05-12 09:41:46 -06002799
2800 // Next, call with a queue family index that's too large:
2801 uint32_t queueFamilyIndex[2] = {100000, 0};
2802 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2803 swapchain_create_info.queueFamilyIndexCount = 2;
2804 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
2805 m_errorMonitor->SetDesiredFailureMsg(
2806 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2807 "called with a queueFamilyIndex that is too large");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002808 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2809 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002810 pass = (err != VK_SUCCESS);
2811 ASSERT_TRUE(pass);
2812 m_errorMonitor->VerifyFound();
2813
2814 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
2815 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2816 swapchain_create_info.queueFamilyIndexCount = 1;
2817 m_errorMonitor->SetDesiredFailureMsg(
2818 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2819 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
2820 "pCreateInfo->pQueueFamilyIndices).");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002821 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2822 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002823 pass = (err != VK_SUCCESS);
2824 ASSERT_TRUE(pass);
2825 m_errorMonitor->VerifyFound();
2826
2827 // Next, call with an invalid imageSharingMode:
2828 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
2829 swapchain_create_info.queueFamilyIndexCount = 1;
2830 m_errorMonitor->SetDesiredFailureMsg(
2831 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2832 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002833 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2834 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002835 pass = (err != VK_SUCCESS);
2836 ASSERT_TRUE(pass);
2837 m_errorMonitor->VerifyFound();
2838 // Fix for the future:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002839 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2840 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002841 swapchain_create_info.queueFamilyIndexCount = 0;
2842 queueFamilyIndex[0] = 0;
2843 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
2844
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002845 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
Ian Elliott2c1daf52016-05-12 09:41:46 -06002846 // Get the images from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002847 // Acquire an image from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002848 // Present an image to a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002849 // Destroy the swapchain:
2850
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002851 // TODOs:
2852 //
2853 // - Try destroying the device without first destroying the swapchain
2854 //
2855 // - Try destroying the device without first destroying the surface
2856 //
2857 // - Try destroying the surface without first destroying the swapchain
Ian Elliott2c1daf52016-05-12 09:41:46 -06002858
2859 // Destroy the surface:
2860 vkDestroySurfaceKHR(instance(), surface, NULL);
2861
Ian Elliott2c1daf52016-05-12 09:41:46 -06002862 // Tear down the window:
2863 xcb_destroy_window(connection, xcb_window);
2864 xcb_disconnect(connection);
2865
2866#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002867 return;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002868#endif // VK_USE_PLATFORM_XCB_KHR
2869}
2870
Karl Schultz6addd812016-02-02 17:17:23 -07002871TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
2872 VkResult err;
2873 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002874
Karl Schultz6addd812016-02-02 17:17:23 -07002875 m_errorMonitor->SetDesiredFailureMsg(
2876 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002877 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
2878
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002879 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002880
2881 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002882 VkImage image;
2883 VkDeviceMemory mem;
2884 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002885
Karl Schultz6addd812016-02-02 17:17:23 -07002886 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2887 const int32_t tex_width = 32;
2888 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002889
Tony Barboureb254902015-07-15 12:50:33 -06002890 VkImageCreateInfo image_create_info = {};
2891 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002892 image_create_info.pNext = NULL;
2893 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2894 image_create_info.format = tex_format;
2895 image_create_info.extent.width = tex_width;
2896 image_create_info.extent.height = tex_height;
2897 image_create_info.extent.depth = 1;
2898 image_create_info.mipLevels = 1;
2899 image_create_info.arrayLayers = 1;
2900 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2901 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2902 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2903 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002904
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002905 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002906 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002907 mem_alloc.pNext = NULL;
2908 mem_alloc.allocationSize = 0;
2909 // Introduce failure, do NOT set memProps to
2910 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
2911 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002912
Chia-I Wuf7458c52015-10-26 21:10:41 +08002913 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002914 ASSERT_VK_SUCCESS(err);
2915
Karl Schultz6addd812016-02-02 17:17:23 -07002916 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002917
Mark Lobodzinski23065352015-05-29 09:32:35 -05002918 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002919
Karl Schultz6addd812016-02-02 17:17:23 -07002920 pass =
2921 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
2922 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
2923 if (!pass) { // If we can't find any unmappable memory this test doesn't
2924 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002925 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002926 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002927 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002928
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002929 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002930 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002931 ASSERT_VK_SUCCESS(err);
2932
2933 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002934 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002935 ASSERT_VK_SUCCESS(err);
2936
2937 // Map memory as if to initialize the image
2938 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07002939 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
2940 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002941
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002942 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002943
Chia-I Wuf7458c52015-10-26 21:10:41 +08002944 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002945 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002946}
2947
Karl Schultz6addd812016-02-02 17:17:23 -07002948TEST_F(VkLayerTest, RebindMemory) {
2949 VkResult err;
2950 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002951
Karl Schultz6addd812016-02-02 17:17:23 -07002952 m_errorMonitor->SetDesiredFailureMsg(
2953 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002954 "which has already been bound to mem object");
2955
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002956 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002957
2958 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002959 VkImage image;
2960 VkDeviceMemory mem1;
2961 VkDeviceMemory mem2;
2962 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002963
Karl Schultz6addd812016-02-02 17:17:23 -07002964 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2965 const int32_t tex_width = 32;
2966 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002967
Tony Barboureb254902015-07-15 12:50:33 -06002968 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002969 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2970 image_create_info.pNext = NULL;
2971 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2972 image_create_info.format = tex_format;
2973 image_create_info.extent.width = tex_width;
2974 image_create_info.extent.height = tex_height;
2975 image_create_info.extent.depth = 1;
2976 image_create_info.mipLevels = 1;
2977 image_create_info.arrayLayers = 1;
2978 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2979 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2980 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2981 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002982
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002983 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002984 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2985 mem_alloc.pNext = NULL;
2986 mem_alloc.allocationSize = 0;
2987 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002988
Karl Schultz6addd812016-02-02 17:17:23 -07002989 // Introduce failure, do NOT set memProps to
2990 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002991 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002992 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002993 ASSERT_VK_SUCCESS(err);
2994
Karl Schultz6addd812016-02-02 17:17:23 -07002995 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002996
2997 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002998 pass =
2999 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003000 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003001
3002 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003003 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003004 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003005 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003006 ASSERT_VK_SUCCESS(err);
3007
3008 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06003009 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003010 ASSERT_VK_SUCCESS(err);
3011
Karl Schultz6addd812016-02-02 17:17:23 -07003012 // Introduce validation failure, try to bind a different memory object to
3013 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06003014 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003015
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003016 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003017
Chia-I Wuf7458c52015-10-26 21:10:41 +08003018 vkDestroyImage(m_device->device(), image, NULL);
3019 vkFreeMemory(m_device->device(), mem1, NULL);
3020 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003021}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05003022
Karl Schultz6addd812016-02-02 17:17:23 -07003023TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003024 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003025
Karl Schultz6addd812016-02-02 17:17:23 -07003026 m_errorMonitor->SetDesiredFailureMsg(
3027 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
3028 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06003029
3030 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06003031 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3032 fenceInfo.pNext = NULL;
3033 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06003034
Tony Barbour300a6082015-04-07 13:44:53 -06003035 ASSERT_NO_FATAL_FAILURE(InitState());
3036 ASSERT_NO_FATAL_FAILURE(InitViewport());
3037 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3038
Tony Barbourfe3351b2015-07-28 10:17:20 -06003039 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003040 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
3041 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06003042 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06003043
3044 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06003045
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003046 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08003047 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3048 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003049 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003050 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07003051 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003052 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003053 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08003054 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003055 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06003056
3057 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07003058 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06003059
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003060 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06003061}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003062// This is a positive test. We used to expect error in this case but spec now
3063// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07003064TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003065 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06003066 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06003067 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06003068 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3069 fenceInfo.pNext = NULL;
3070
Tony Barbour0b4d9562015-04-09 10:48:04 -06003071 ASSERT_NO_FATAL_FAILURE(InitState());
3072 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08003073 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003074 VkResult result = vkResetFences(m_device->device(), 1, fences);
3075 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06003076
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003077 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06003078}
Tobin Ehlis41376e12015-07-03 08:45:14 -06003079
Chris Forbese70b7d32016-06-15 15:49:12 +12003080#if 0
3081TEST_F(VkLayerTest, LongFenceChain)
3082{
3083 m_errorMonitor->ExpectSuccess();
3084
3085 ASSERT_NO_FATAL_FAILURE(InitState());
3086 VkResult err;
3087
3088 std::vector<VkFence> fences;
3089
3090 const int chainLength = 32768;
3091
3092 for (int i = 0; i < chainLength; i++) {
3093 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3094 VkFence fence;
3095 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
3096 ASSERT_VK_SUCCESS(err);
3097
3098 fences.push_back(fence);
3099
3100 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3101 0, nullptr, 0, nullptr };
3102 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
3103 ASSERT_VK_SUCCESS(err);
3104
3105 }
3106
3107 // BOOM, stack overflow.
3108 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
3109
3110 for (auto fence : fences)
3111 vkDestroyFence(m_device->device(), fence, nullptr);
3112
3113 m_errorMonitor->VerifyNotFound();
3114}
3115#endif
3116
Chris Forbes18127d12016-06-08 16:52:28 +12003117TEST_F(VkLayerTest, CommandBufferSimultaneousUseSync)
3118{
3119 m_errorMonitor->ExpectSuccess();
3120
3121 ASSERT_NO_FATAL_FAILURE(InitState());
3122 VkResult err;
3123
3124 // Record (empty!) command buffer that can be submitted multiple times
3125 // simultaneously.
3126 VkCommandBufferBeginInfo cbbi = {
3127 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
3128 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr
3129 };
3130 m_commandBuffer->BeginCommandBuffer(&cbbi);
3131 m_commandBuffer->EndCommandBuffer();
3132
3133 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3134 VkFence fence;
3135 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
3136 ASSERT_VK_SUCCESS(err);
3137
3138 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
3139 VkSemaphore s1, s2;
3140 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
3141 ASSERT_VK_SUCCESS(err);
3142 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
3143 ASSERT_VK_SUCCESS(err);
3144
3145 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
3146 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3147 1, &m_commandBuffer->handle(), 1, &s1 };
3148 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
3149 ASSERT_VK_SUCCESS(err);
3150
3151 // Submit CB again, signaling s2.
3152 si.pSignalSemaphores = &s2;
3153 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
3154 ASSERT_VK_SUCCESS(err);
3155
3156 // Wait for fence.
3157 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3158 ASSERT_VK_SUCCESS(err);
3159
3160 // CB is still in flight from second submission, but semaphore s1 is no
3161 // longer in flight. delete it.
3162 vkDestroySemaphore(m_device->device(), s1, nullptr);
3163
3164 m_errorMonitor->VerifyNotFound();
3165
3166 // Force device idle and clean up remaining objects
3167 vkDeviceWaitIdle(m_device->device());
3168 vkDestroySemaphore(m_device->device(), s2, nullptr);
3169 vkDestroyFence(m_device->device(), fence, nullptr);
3170}
3171
Chris Forbes4e44c912016-06-16 10:20:00 +12003172TEST_F(VkLayerTest, FenceCreateSignaledWaitHandling)
3173{
3174 m_errorMonitor->ExpectSuccess();
3175
3176 ASSERT_NO_FATAL_FAILURE(InitState());
3177 VkResult err;
3178
3179 // A fence created signaled
3180 VkFenceCreateInfo fci1 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT };
3181 VkFence f1;
3182 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
3183 ASSERT_VK_SUCCESS(err);
3184
3185 // A fence created not
3186 VkFenceCreateInfo fci2 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3187 VkFence f2;
3188 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
3189 ASSERT_VK_SUCCESS(err);
3190
3191 // Submit the unsignaled fence
3192 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3193 0, nullptr, 0, nullptr };
3194 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
3195
3196 // Wait on both fences, with signaled first.
3197 VkFence fences[] = { f1, f2 };
3198 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
3199
3200 // Should have both retired!
3201 vkDestroyFence(m_device->device(), f1, nullptr);
3202 vkDestroyFence(m_device->device(), f2, nullptr);
3203
3204 m_errorMonitor->VerifyNotFound();
3205}
3206
Tobin Ehlis41376e12015-07-03 08:45:14 -06003207TEST_F(VkLayerTest, InvalidUsageBits)
3208{
Tony Barbourf92621a2016-05-02 14:28:12 -06003209 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06003210 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06003211 "Initialize buffer with wrong usage then perform copy expecting errors "
3212 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003213 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003214 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06003215
3216 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06003217 VkImageObj image(m_device);
3218 // Initialize image with USAGE_INPUT_ATTACHMENT
Tobin Ehlis8b313c02016-05-25 15:01:52 -06003219 image.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06003220 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
3221 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06003222
Tony Barbourf92621a2016-05-02 14:28:12 -06003223 VkImageView dsv;
3224 VkImageViewCreateInfo dsvci = {};
3225 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3226 dsvci.image = image.handle();
3227 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3228 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
3229 dsvci.subresourceRange.layerCount = 1;
3230 dsvci.subresourceRange.baseMipLevel = 0;
3231 dsvci.subresourceRange.levelCount = 1;
3232 dsvci.subresourceRange.aspectMask =
3233 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06003234
Tony Barbourf92621a2016-05-02 14:28:12 -06003235 // Create a view with depth / stencil aspect for image with different usage
3236 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003237
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003238 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06003239
3240 // Initialize buffer with TRANSFER_DST usage
3241 vk_testing::Buffer buffer;
3242 VkMemoryPropertyFlags reqs = 0;
3243 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3244 VkBufferImageCopy region = {};
3245 region.bufferRowLength = 128;
3246 region.bufferImageHeight = 128;
3247 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3248 region.imageSubresource.layerCount = 1;
3249 region.imageExtent.height = 16;
3250 region.imageExtent.width = 16;
3251 region.imageExtent.depth = 1;
3252
3253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3254 "Invalid usage flag for buffer ");
3255 // Buffer usage not set to TRANSFER_SRC and image usage not set to
3256 // TRANSFER_DST
3257 BeginCommandBuffer();
3258 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
3259 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
3260 1, &region);
3261 m_errorMonitor->VerifyFound();
3262
3263 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3264 "Invalid usage flag for image ");
3265 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
3266 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
3267 1, &region);
3268 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06003269}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003270#endif // MEM_TRACKER_TESTS
3271
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06003272#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003273
3274TEST_F(VkLayerTest, LeakAnObject) {
3275 VkResult err;
3276
3277 TEST_DESCRIPTION(
3278 "Create a fence and destroy its device without first destroying the fence.");
3279
3280 // Note that we have to create a new device since destroying the
3281 // framework's device causes Teardown() to fail and just calling Teardown
3282 // will destroy the errorMonitor.
3283
3284 m_errorMonitor->SetDesiredFailureMsg(
3285 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3286 "OBJ ERROR : VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT object");
3287
3288 ASSERT_NO_FATAL_FAILURE(InitState());
3289
3290 const std::vector<VkQueueFamilyProperties> queue_props =
3291 m_device->queue_props;
3292 std::vector<VkDeviceQueueCreateInfo> queue_info;
3293 queue_info.reserve(queue_props.size());
3294 std::vector<std::vector<float>> queue_priorities;
3295 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
3296 VkDeviceQueueCreateInfo qi = {};
3297 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
3298 qi.pNext = NULL;
3299 qi.queueFamilyIndex = i;
3300 qi.queueCount = queue_props[i].queueCount;
3301 queue_priorities.emplace_back(qi.queueCount, 0.0f);
3302 qi.pQueuePriorities = queue_priorities[i].data();
3303 queue_info.push_back(qi);
3304 }
3305
3306 std::vector<const char *> device_layer_names;
3307 std::vector<const char *> device_extension_names;
3308 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
3309 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
3310 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
3311 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003312 device_layer_names.push_back("VK_LAYER_LUNARG_image");
3313 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
3314
3315 // The sacrificial device object
3316 VkDevice testDevice;
3317 VkDeviceCreateInfo device_create_info = {};
3318 auto features = m_device->phy().features();
3319 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
3320 device_create_info.pNext = NULL;
3321 device_create_info.queueCreateInfoCount = queue_info.size();
3322 device_create_info.pQueueCreateInfos = queue_info.data();
3323 device_create_info.enabledLayerCount = device_layer_names.size();
3324 device_create_info.ppEnabledLayerNames = device_layer_names.data();
3325 device_create_info.pEnabledFeatures = &features;
3326 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
3327 ASSERT_VK_SUCCESS(err);
3328
3329 VkFence fence;
3330 VkFenceCreateInfo fence_create_info = {};
3331 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3332 fence_create_info.pNext = NULL;
3333 fence_create_info.flags = 0;
3334 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
3335 ASSERT_VK_SUCCESS(err);
3336
3337 // Induce failure by not calling vkDestroyFence
3338 vkDestroyDevice(testDevice, NULL);
3339 m_errorMonitor->VerifyFound();
3340}
3341
3342TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
3343
3344 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
3345 "attempt to delete them from another.");
3346
3347 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3348 "FreeCommandBuffers is attempting to free Command Buffer");
3349
3350 VkCommandPool command_pool_one;
3351 VkCommandPool command_pool_two;
3352
3353 VkCommandPoolCreateInfo pool_create_info{};
3354 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3355 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3356 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3357
3358 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3359 &command_pool_one);
3360
3361 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3362 &command_pool_two);
3363
3364 VkCommandBuffer command_buffer[9];
3365 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3366 command_buffer_allocate_info.sType =
3367 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3368 command_buffer_allocate_info.commandPool = command_pool_one;
3369 command_buffer_allocate_info.commandBufferCount = 9;
3370 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3371 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3372 command_buffer);
3373
3374 vkFreeCommandBuffers(m_device->device(), command_pool_two, 4,
3375 &command_buffer[3]);
3376
3377 m_errorMonitor->VerifyFound();
3378
3379 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
3380 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
3381}
3382
3383TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
3384 VkResult err;
3385
3386 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
3387 "attempt to delete them from another.");
3388
3389 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3390 "FreeDescriptorSets is attempting to free descriptorSet");
3391
3392 ASSERT_NO_FATAL_FAILURE(InitState());
3393 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3394
3395 VkDescriptorPoolSize ds_type_count = {};
3396 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
3397 ds_type_count.descriptorCount = 1;
3398
3399 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3400 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3401 ds_pool_ci.pNext = NULL;
3402 ds_pool_ci.flags = 0;
3403 ds_pool_ci.maxSets = 1;
3404 ds_pool_ci.poolSizeCount = 1;
3405 ds_pool_ci.pPoolSizes = &ds_type_count;
3406
3407 VkDescriptorPool ds_pool_one;
3408 err =
3409 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
3410 ASSERT_VK_SUCCESS(err);
3411
3412 // Create a second descriptor pool
3413 VkDescriptorPool ds_pool_two;
3414 err =
3415 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
3416 ASSERT_VK_SUCCESS(err);
3417
3418 VkDescriptorSetLayoutBinding dsl_binding = {};
3419 dsl_binding.binding = 0;
3420 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3421 dsl_binding.descriptorCount = 1;
3422 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3423 dsl_binding.pImmutableSamplers = NULL;
3424
3425 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3426 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3427 ds_layout_ci.pNext = NULL;
3428 ds_layout_ci.bindingCount = 1;
3429 ds_layout_ci.pBindings = &dsl_binding;
3430
3431 VkDescriptorSetLayout ds_layout;
3432 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3433 &ds_layout);
3434 ASSERT_VK_SUCCESS(err);
3435
3436 VkDescriptorSet descriptorSet;
3437 VkDescriptorSetAllocateInfo alloc_info = {};
3438 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3439 alloc_info.descriptorSetCount = 1;
3440 alloc_info.descriptorPool = ds_pool_one;
3441 alloc_info.pSetLayouts = &ds_layout;
3442 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3443 &descriptorSet);
3444 ASSERT_VK_SUCCESS(err);
3445
3446 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
3447
3448 m_errorMonitor->VerifyFound();
3449
3450 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3451 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
3452 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
3453}
3454
3455TEST_F(VkLayerTest, CreateUnknownObject) {
3456 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3457 "Invalid VkImage Object ");
3458
3459 TEST_DESCRIPTION(
3460 "Pass an invalid image object handle into a Vulkan API call.");
3461
3462 ASSERT_NO_FATAL_FAILURE(InitState());
3463
3464 // Pass bogus handle into GetImageMemoryRequirements
3465 VkMemoryRequirements mem_reqs;
3466 uint64_t fakeImageHandle = 0xCADECADE;
3467 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
3468
3469 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
3470
3471 m_errorMonitor->VerifyFound();
3472}
3473
Karl Schultz6addd812016-02-02 17:17:23 -07003474TEST_F(VkLayerTest, PipelineNotBound) {
3475 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003476
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003477 TEST_DESCRIPTION(
3478 "Pass in an invalid pipeline object handle into a Vulkan API call.");
3479
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003480 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003481 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003482
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003483 ASSERT_NO_FATAL_FAILURE(InitState());
3484 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003485
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003486 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003487 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3488 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003489
3490 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003491 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3492 ds_pool_ci.pNext = NULL;
3493 ds_pool_ci.maxSets = 1;
3494 ds_pool_ci.poolSizeCount = 1;
3495 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003496
3497 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003498 err =
3499 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003500 ASSERT_VK_SUCCESS(err);
3501
3502 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003503 dsl_binding.binding = 0;
3504 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3505 dsl_binding.descriptorCount = 1;
3506 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3507 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003508
3509 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003510 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3511 ds_layout_ci.pNext = NULL;
3512 ds_layout_ci.bindingCount = 1;
3513 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003514
3515 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003516 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3517 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003518 ASSERT_VK_SUCCESS(err);
3519
3520 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003521 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003522 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003523 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003524 alloc_info.descriptorPool = ds_pool;
3525 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003526 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3527 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003528 ASSERT_VK_SUCCESS(err);
3529
3530 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003531 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3532 pipeline_layout_ci.pNext = NULL;
3533 pipeline_layout_ci.setLayoutCount = 1;
3534 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003535
3536 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003537 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3538 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003539 ASSERT_VK_SUCCESS(err);
3540
Mark Youngad779052016-01-06 14:26:04 -07003541 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003542
3543 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003544 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3545 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003546
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003547 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003548
Chia-I Wuf7458c52015-10-26 21:10:41 +08003549 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3550 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3551 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003552}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003553
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003554TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
3555 VkResult err;
3556
3557 TEST_DESCRIPTION("Test validation check for an invalid memory type index "
3558 "during bind[Buffer|Image]Memory time");
3559
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003560 ASSERT_NO_FATAL_FAILURE(InitState());
3561
3562 // Create an image, allocate memory, set a bad typeIndex and then try to
3563 // bind it
3564 VkImage image;
3565 VkDeviceMemory mem;
3566 VkMemoryRequirements mem_reqs;
3567 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3568 const int32_t tex_width = 32;
3569 const int32_t tex_height = 32;
3570
3571 VkImageCreateInfo image_create_info = {};
3572 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3573 image_create_info.pNext = NULL;
3574 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3575 image_create_info.format = tex_format;
3576 image_create_info.extent.width = tex_width;
3577 image_create_info.extent.height = tex_height;
3578 image_create_info.extent.depth = 1;
3579 image_create_info.mipLevels = 1;
3580 image_create_info.arrayLayers = 1;
3581 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3582 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3583 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3584 image_create_info.flags = 0;
3585
3586 VkMemoryAllocateInfo mem_alloc = {};
3587 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3588 mem_alloc.pNext = NULL;
3589 mem_alloc.allocationSize = 0;
3590 mem_alloc.memoryTypeIndex = 0;
3591
3592 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3593 ASSERT_VK_SUCCESS(err);
3594
3595 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
3596 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003597
3598 // Introduce Failure, select invalid TypeIndex
3599 VkPhysicalDeviceMemoryProperties memory_info;
3600
3601 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
3602 unsigned int i;
3603 for (i = 0; i < memory_info.memoryTypeCount; i++) {
3604 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
3605 mem_alloc.memoryTypeIndex = i;
3606 break;
3607 }
3608 }
3609 if (i >= memory_info.memoryTypeCount) {
3610 printf("No invalid memory type index could be found; skipped.\n");
3611 vkDestroyImage(m_device->device(), image, NULL);
3612 return;
3613 }
3614
3615 m_errorMonitor->SetDesiredFailureMsg(
3616 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3617 "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003618
3619 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
3620 ASSERT_VK_SUCCESS(err);
3621
3622 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3623 (void)err;
3624
3625 m_errorMonitor->VerifyFound();
3626
3627 vkDestroyImage(m_device->device(), image, NULL);
3628 vkFreeMemory(m_device->device(), mem, NULL);
3629}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003630
Karl Schultz6addd812016-02-02 17:17:23 -07003631TEST_F(VkLayerTest, BindInvalidMemory) {
3632 VkResult err;
3633 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003634
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003635 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003636 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003637
Tobin Ehlisec598302015-09-15 15:02:17 -06003638 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003639
3640 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07003641 VkImage image;
3642 VkDeviceMemory mem;
3643 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003644
Karl Schultz6addd812016-02-02 17:17:23 -07003645 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3646 const int32_t tex_width = 32;
3647 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003648
3649 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003650 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3651 image_create_info.pNext = NULL;
3652 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3653 image_create_info.format = tex_format;
3654 image_create_info.extent.width = tex_width;
3655 image_create_info.extent.height = tex_height;
3656 image_create_info.extent.depth = 1;
3657 image_create_info.mipLevels = 1;
3658 image_create_info.arrayLayers = 1;
3659 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3660 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3661 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3662 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003663
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003664 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003665 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3666 mem_alloc.pNext = NULL;
3667 mem_alloc.allocationSize = 0;
3668 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003669
Chia-I Wuf7458c52015-10-26 21:10:41 +08003670 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003671 ASSERT_VK_SUCCESS(err);
3672
Karl Schultz6addd812016-02-02 17:17:23 -07003673 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003674
3675 mem_alloc.allocationSize = mem_reqs.size;
3676
Karl Schultz6addd812016-02-02 17:17:23 -07003677 pass =
3678 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003679 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003680
3681 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003682 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003683 ASSERT_VK_SUCCESS(err);
3684
3685 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003686 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003687
3688 // Try to bind free memory that has been freed
3689 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3690 // This may very well return an error.
3691 (void)err;
3692
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003693 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003694
Chia-I Wuf7458c52015-10-26 21:10:41 +08003695 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003696}
3697
Karl Schultz6addd812016-02-02 17:17:23 -07003698TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
3699 VkResult err;
3700 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003701
Karl Schultz6addd812016-02-02 17:17:23 -07003702 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3703 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003704
Tobin Ehlisec598302015-09-15 15:02:17 -06003705 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003706
Karl Schultz6addd812016-02-02 17:17:23 -07003707 // Create an image object, allocate memory, destroy the object and then try
3708 // to bind it
3709 VkImage image;
3710 VkDeviceMemory mem;
3711 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003712
Karl Schultz6addd812016-02-02 17:17:23 -07003713 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3714 const int32_t tex_width = 32;
3715 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003716
3717 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003718 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3719 image_create_info.pNext = NULL;
3720 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3721 image_create_info.format = tex_format;
3722 image_create_info.extent.width = tex_width;
3723 image_create_info.extent.height = tex_height;
3724 image_create_info.extent.depth = 1;
3725 image_create_info.mipLevels = 1;
3726 image_create_info.arrayLayers = 1;
3727 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3728 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3729 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3730 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003731
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003732 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003733 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3734 mem_alloc.pNext = NULL;
3735 mem_alloc.allocationSize = 0;
3736 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003737
Chia-I Wuf7458c52015-10-26 21:10:41 +08003738 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003739 ASSERT_VK_SUCCESS(err);
3740
Karl Schultz6addd812016-02-02 17:17:23 -07003741 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003742
3743 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003744 pass =
3745 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003746 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003747
3748 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003749 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003750 ASSERT_VK_SUCCESS(err);
3751
3752 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003753 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003754 ASSERT_VK_SUCCESS(err);
3755
3756 // Now Try to bind memory to this destroyed object
3757 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3758 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07003759 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06003760
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003761 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003762
Chia-I Wuf7458c52015-10-26 21:10:41 +08003763 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003764}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003765
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003766#endif // OBJ_TRACKER_TESTS
3767
Tobin Ehlis0788f522015-05-26 16:11:58 -06003768#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06003769
Chris Forbes48a53902016-06-30 11:46:27 +12003770TEST_F(VkLayerTest, RenderPassInitialLayoutUndefined) {
3771 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass with an attachment's "
3772 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
3773 "the command buffer has prior knowledge of that "
3774 "attachment's layout.");
3775
3776 m_errorMonitor->ExpectSuccess();
3777
3778 ASSERT_NO_FATAL_FAILURE(InitState());
3779
3780 // A renderpass with one color attachment.
3781 VkAttachmentDescription attachment = {
3782 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3783 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3784 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3785 VK_IMAGE_LAYOUT_UNDEFINED,
3786 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3787 };
3788
3789 VkAttachmentReference att_ref = {
3790 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3791 };
3792
3793 VkSubpassDescription subpass = {
3794 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3795 1, &att_ref, nullptr, nullptr, 0, nullptr
3796 };
3797
3798 VkRenderPassCreateInfo rpci = {
3799 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3800 0, 1, &attachment, 1, &subpass, 0, nullptr
3801 };
3802
3803 VkRenderPass rp;
3804 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3805 ASSERT_VK_SUCCESS(err);
3806
3807 // A compatible framebuffer.
3808 VkImageObj image(m_device);
3809 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3810 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3811 VK_IMAGE_TILING_OPTIMAL, 0);
3812 ASSERT_TRUE(image.initialized());
3813
3814 VkImageViewCreateInfo ivci = {
3815 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3816 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3817 {
3818 VK_COMPONENT_SWIZZLE_IDENTITY,
3819 VK_COMPONENT_SWIZZLE_IDENTITY,
3820 VK_COMPONENT_SWIZZLE_IDENTITY,
3821 VK_COMPONENT_SWIZZLE_IDENTITY
3822 },
3823 {
3824 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3825 },
3826 };
3827 VkImageView view;
3828 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3829 ASSERT_VK_SUCCESS(err);
3830
3831 VkFramebufferCreateInfo fci = {
3832 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3833 0, rp, 1, &view,
3834 32, 32, 1
3835 };
3836 VkFramebuffer fb;
3837 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3838 ASSERT_VK_SUCCESS(err);
3839
3840 // Record a single command buffer which uses this renderpass twice. The
3841 // bug is triggered at the beginning of the second renderpass, when the
3842 // command buffer already has a layout recorded for the attachment.
3843 VkRenderPassBeginInfo rpbi = {
3844 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06003845 rp, fb, { { 0, 0 } , { 32, 32 } },
Chris Forbes48a53902016-06-30 11:46:27 +12003846 0, nullptr
3847 };
3848 BeginCommandBuffer();
3849 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3850 VK_SUBPASS_CONTENTS_INLINE);
3851 vkCmdEndRenderPass(m_commandBuffer->handle());
3852 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3853 VK_SUBPASS_CONTENTS_INLINE);
3854
3855 m_errorMonitor->VerifyNotFound();
3856
3857 vkCmdEndRenderPass(m_commandBuffer->handle());
3858 EndCommandBuffer();
3859
3860 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3861 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3862 vkDestroyImageView(m_device->device(), view, nullptr);
3863}
3864
Chris Forbes51bf7c92016-06-30 15:22:08 +12003865TEST_F(VkLayerTest, RenderPassSubpassZeroTransitionsApplied) {
3866 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass applies the layout "
3867 "transitions for the first subpass");
3868
3869 m_errorMonitor->ExpectSuccess();
3870
3871 ASSERT_NO_FATAL_FAILURE(InitState());
3872
3873 // A renderpass with one color attachment.
3874 VkAttachmentDescription attachment = {
3875 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3876 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3877 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3878 VK_IMAGE_LAYOUT_UNDEFINED,
3879 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3880 };
3881
3882 VkAttachmentReference att_ref = {
3883 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3884 };
3885
3886 VkSubpassDescription subpass = {
3887 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3888 1, &att_ref, nullptr, nullptr, 0, nullptr
3889 };
3890
3891 VkSubpassDependency dep = {
Chris Forbescb4c7ad2016-07-06 10:28:18 +12003892 0, 0, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3893 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Chris Forbes51bf7c92016-06-30 15:22:08 +12003894 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3895 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3896 VK_DEPENDENCY_BY_REGION_BIT
3897 };
3898
3899 VkRenderPassCreateInfo rpci = {
3900 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3901 0, 1, &attachment, 1, &subpass, 1, &dep
3902 };
3903
3904 VkResult err;
3905 VkRenderPass rp;
3906 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3907 ASSERT_VK_SUCCESS(err);
3908
3909 // A compatible framebuffer.
3910 VkImageObj image(m_device);
3911 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3912 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3913 VK_IMAGE_TILING_OPTIMAL, 0);
3914 ASSERT_TRUE(image.initialized());
3915
3916 VkImageViewCreateInfo ivci = {
3917 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3918 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3919 {
3920 VK_COMPONENT_SWIZZLE_IDENTITY,
3921 VK_COMPONENT_SWIZZLE_IDENTITY,
3922 VK_COMPONENT_SWIZZLE_IDENTITY,
3923 VK_COMPONENT_SWIZZLE_IDENTITY
3924 },
3925 {
3926 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3927 },
3928 };
3929 VkImageView view;
3930 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3931 ASSERT_VK_SUCCESS(err);
3932
3933 VkFramebufferCreateInfo fci = {
3934 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3935 0, rp, 1, &view,
3936 32, 32, 1
3937 };
3938 VkFramebuffer fb;
3939 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3940 ASSERT_VK_SUCCESS(err);
3941
3942 // Record a single command buffer which issues a pipeline barrier w/
3943 // image memory barrier for the attachment. This detects the previously
3944 // missing tracking of the subpass layout by throwing a validation error
3945 // if it doesn't occur.
3946 VkRenderPassBeginInfo rpbi = {
3947 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06003948 rp, fb, { { 0, 0 }, { 32, 32 } },
Chris Forbes51bf7c92016-06-30 15:22:08 +12003949 0, nullptr
3950 };
3951 BeginCommandBuffer();
3952 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3953 VK_SUBPASS_CONTENTS_INLINE);
3954
3955 VkImageMemoryBarrier imb = {
3956 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, nullptr,
3957 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3958 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3959 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3960 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3961 VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
3962 image.handle(),
3963 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
3964 };
3965 vkCmdPipelineBarrier(m_commandBuffer->handle(),
Chris Forbescb4c7ad2016-07-06 10:28:18 +12003966 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3967 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Chris Forbes51bf7c92016-06-30 15:22:08 +12003968 VK_DEPENDENCY_BY_REGION_BIT,
3969 0, nullptr, 0, nullptr, 1, &imb);
3970
3971 vkCmdEndRenderPass(m_commandBuffer->handle());
3972 m_errorMonitor->VerifyNotFound();
3973 EndCommandBuffer();
3974
3975 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3976 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3977 vkDestroyImageView(m_device->device(), view, nullptr);
3978}
3979
Chris Forbes6b3d3f42016-06-30 16:09:47 +12003980TEST_F(VkLayerTest, RenderPassTransitionsAttachmentUnused) {
3981 TEST_DESCRIPTION("Ensure that layout transitions work correctly without "
3982 "errors, when an attachment reference is "
3983 "VK_ATTACHMENT_UNUSED");
3984
3985 m_errorMonitor->ExpectSuccess();
3986
3987 ASSERT_NO_FATAL_FAILURE(InitState());
3988
3989 // A renderpass with no attachments
3990 VkAttachmentReference att_ref = {
3991 VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3992 };
3993
3994 VkSubpassDescription subpass = {
3995 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3996 1, &att_ref, nullptr, nullptr, 0, nullptr
3997 };
3998
3999 VkRenderPassCreateInfo rpci = {
4000 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4001 0, 0, nullptr, 1, &subpass, 0, nullptr
4002 };
4003
4004 VkRenderPass rp;
4005 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4006 ASSERT_VK_SUCCESS(err);
4007
4008 // A compatible framebuffer.
4009 VkFramebufferCreateInfo fci = {
4010 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
4011 0, rp, 0, nullptr,
4012 32, 32, 1
4013 };
4014 VkFramebuffer fb;
4015 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4016 ASSERT_VK_SUCCESS(err);
4017
4018 // Record a command buffer which just begins and ends the renderpass. The
4019 // bug manifests in BeginRenderPass.
4020 VkRenderPassBeginInfo rpbi = {
4021 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06004022 rp, fb, { { 0, 0 }, { 32, 32 } },
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004023 0, nullptr
4024 };
4025 BeginCommandBuffer();
4026 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
4027 VK_SUBPASS_CONTENTS_INLINE);
4028 vkCmdEndRenderPass(m_commandBuffer->handle());
4029 m_errorMonitor->VerifyNotFound();
4030 EndCommandBuffer();
4031
4032 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4033 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4034}
4035
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004036// This is a positive test. No errors are expected.
4037TEST_F(VkLayerTest, StencilLoadOp) {
4038 TEST_DESCRIPTION("Create a stencil-only attachment with a LOAD_OP set to "
4039 "CLEAR. stencil[Load|Store]Op used to be ignored.");
4040 VkResult result = VK_SUCCESS;
4041 VkImageFormatProperties formatProps;
4042 vkGetPhysicalDeviceImageFormatProperties(
4043 gpu(), VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_TYPE_2D,
4044 VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4045 VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
4046 0, &formatProps);
4047 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
4048 return;
4049 }
4050
4051 ASSERT_NO_FATAL_FAILURE(InitState());
4052 VkFormat depth_stencil_fmt = VK_FORMAT_D24_UNORM_S8_UINT;
4053 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
4054 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4055 VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
4056 VkAttachmentDescription att = {};
4057 VkAttachmentReference ref = {};
4058 att.format = depth_stencil_fmt;
4059 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
4060 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
4061 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
4062 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
4063 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4064 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4065
4066 VkClearValue clear;
4067 clear.depthStencil.depth = 1.0;
4068 clear.depthStencil.stencil = 0;
4069 ref.attachment = 0;
4070 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4071
4072 VkSubpassDescription subpass = {};
4073 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
4074 subpass.flags = 0;
4075 subpass.inputAttachmentCount = 0;
4076 subpass.pInputAttachments = NULL;
4077 subpass.colorAttachmentCount = 0;
4078 subpass.pColorAttachments = NULL;
4079 subpass.pResolveAttachments = NULL;
4080 subpass.pDepthStencilAttachment = &ref;
4081 subpass.preserveAttachmentCount = 0;
4082 subpass.pPreserveAttachments = NULL;
4083
4084 VkRenderPass rp;
4085 VkRenderPassCreateInfo rp_info = {};
4086 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4087 rp_info.attachmentCount = 1;
4088 rp_info.pAttachments = &att;
4089 rp_info.subpassCount = 1;
4090 rp_info.pSubpasses = &subpass;
4091 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
4092 ASSERT_VK_SUCCESS(result);
4093
4094 VkImageView *depthView = m_depthStencil->BindInfo();
4095 VkFramebufferCreateInfo fb_info = {};
4096 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4097 fb_info.pNext = NULL;
4098 fb_info.renderPass = rp;
4099 fb_info.attachmentCount = 1;
4100 fb_info.pAttachments = depthView;
4101 fb_info.width = 100;
4102 fb_info.height = 100;
4103 fb_info.layers = 1;
4104 VkFramebuffer fb;
4105 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4106 ASSERT_VK_SUCCESS(result);
4107
4108
4109 VkRenderPassBeginInfo rpbinfo = {};
4110 rpbinfo.clearValueCount = 1;
4111 rpbinfo.pClearValues = &clear;
4112 rpbinfo.pNext = NULL;
4113 rpbinfo.renderPass = rp;
4114 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4115 rpbinfo.renderArea.extent.width = 100;
4116 rpbinfo.renderArea.extent.height = 100;
4117 rpbinfo.renderArea.offset.x = 0;
4118 rpbinfo.renderArea.offset.y = 0;
4119 rpbinfo.framebuffer = fb;
4120
4121 VkFence fence = {};
4122 VkFenceCreateInfo fence_ci = {};
4123 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4124 fence_ci.pNext = nullptr;
4125 fence_ci.flags = 0;
4126 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
4127 ASSERT_VK_SUCCESS(result);
4128
4129
4130 m_commandBuffer->BeginCommandBuffer();
4131 m_commandBuffer->BeginRenderPass(rpbinfo);
4132 m_commandBuffer->EndRenderPass();
4133 m_commandBuffer->EndCommandBuffer();
4134 m_commandBuffer->QueueCommandBuffer(fence);
4135
4136 VkImageObj destImage(m_device);
4137 destImage.init(100, 100, depth_stencil_fmt,
4138 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4139 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4140 VK_IMAGE_TILING_OPTIMAL, 0);
4141 VkImageMemoryBarrier barrier = {};
4142 VkImageSubresourceRange range;
4143 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
4144 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
4145 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4146 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT |
4147 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
4148 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4149 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
4150 barrier.image = m_depthStencil->handle();
4151 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4152 range.baseMipLevel = 0;
4153 range.levelCount = 1;
4154 range.baseArrayLayer = 0;
4155 range.layerCount = 1;
4156 barrier.subresourceRange = range;
4157 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
4158 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
4159 cmdbuf.BeginCommandBuffer();
4160 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4161 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
4162 nullptr, 1, &barrier);
4163 barrier.srcAccessMask = 0;
4164 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4165 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
4166 barrier.image = destImage.handle();
4167 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
4168 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4169 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4170 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
4171 nullptr, 1, &barrier);
4172 VkImageCopy cregion;
4173 cregion.srcSubresource.aspectMask =
4174 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4175 cregion.srcSubresource.mipLevel = 0;
4176 cregion.srcSubresource.baseArrayLayer = 0;
4177 cregion.srcSubresource.layerCount = 1;
4178 cregion.srcOffset.x = 0;
4179 cregion.srcOffset.y = 0;
4180 cregion.srcOffset.z = 0;
4181 cregion.dstSubresource.aspectMask =
4182 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4183 cregion.dstSubresource.mipLevel = 0;
4184 cregion.dstSubresource.baseArrayLayer = 0;
4185 cregion.dstSubresource.layerCount = 1;
4186 cregion.dstOffset.x = 0;
4187 cregion.dstOffset.y = 0;
4188 cregion.dstOffset.z = 0;
4189 cregion.extent.width = 100;
4190 cregion.extent.height = 100;
4191 cregion.extent.depth = 1;
4192 cmdbuf.CopyImage(m_depthStencil->handle(),
4193 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
4194 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
4195 cmdbuf.EndCommandBuffer();
4196
4197 VkSubmitInfo submit_info;
4198 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4199 submit_info.pNext = NULL;
4200 submit_info.waitSemaphoreCount = 0;
4201 submit_info.pWaitSemaphores = NULL;
4202 submit_info.pWaitDstStageMask = NULL;
4203 submit_info.commandBufferCount = 1;
4204 submit_info.pCommandBuffers = &cmdbuf.handle();
4205 submit_info.signalSemaphoreCount = 0;
4206 submit_info.pSignalSemaphores = NULL;
4207
4208 m_errorMonitor->ExpectSuccess();
4209 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4210 m_errorMonitor->VerifyNotFound();
4211
Mark Lobodzinskid0440da2016-06-17 15:10:03 -06004212 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004213 vkDestroyFence(m_device->device(), fence, nullptr);
4214 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4215 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4216}
4217
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004218TEST_F(VkLayerTest, UnusedPreserveAttachment) {
4219 TEST_DESCRIPTION("Create a framebuffer where a subpass has a preserve "
4220 "attachment reference of VK_ATTACHMENT_UNUSED");
4221
4222 ASSERT_NO_FATAL_FAILURE(InitState());
4223 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4224
4225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4226 "must not be VK_ATTACHMENT_UNUSED");
4227
4228 VkAttachmentReference color_attach = {};
4229 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4230 color_attach.attachment = 0;
4231 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
4232 VkSubpassDescription subpass = {};
4233 subpass.colorAttachmentCount = 1;
4234 subpass.pColorAttachments = &color_attach;
4235 subpass.preserveAttachmentCount = 1;
4236 subpass.pPreserveAttachments = &preserve_attachment;
4237
4238 VkRenderPassCreateInfo rpci = {};
4239 rpci.subpassCount = 1;
4240 rpci.pSubpasses = &subpass;
4241 rpci.attachmentCount = 1;
4242 VkAttachmentDescription attach_desc = {};
4243 attach_desc.format = VK_FORMAT_UNDEFINED;
4244 rpci.pAttachments = &attach_desc;
4245 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4246 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004247 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004248
4249 m_errorMonitor->VerifyFound();
4250
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004251 if (result == VK_SUCCESS) {
4252 vkDestroyRenderPass(m_device->device(), rp, NULL);
4253 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004254}
4255
Chris Forbesc5389742016-06-29 11:49:23 +12004256TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004257 TEST_DESCRIPTION("Ensure that CreateRenderPass produces a validation error "
4258 "when the source of a subpass multisample resolve "
4259 "does not have multiple samples.");
4260
Chris Forbesc5389742016-06-29 11:49:23 +12004261 ASSERT_NO_FATAL_FAILURE(InitState());
4262
4263 m_errorMonitor->SetDesiredFailureMsg(
4264 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbes6655bb32016-07-01 18:27:30 +12004265 "Subpass 0 requests multisample resolve from attachment 0 which has "
4266 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12004267
4268 VkAttachmentDescription attachments[] = {
4269 {
4270 0, VK_FORMAT_R8G8B8A8_UNORM,
4271 VK_SAMPLE_COUNT_1_BIT,
4272 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4273 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4274 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4275 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4276 },
4277 {
4278 0, VK_FORMAT_R8G8B8A8_UNORM,
4279 VK_SAMPLE_COUNT_1_BIT,
4280 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4281 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4282 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4283 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4284 },
4285 };
4286
4287 VkAttachmentReference color = {
4288 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4289 };
4290
4291 VkAttachmentReference resolve = {
4292 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4293 };
4294
4295 VkSubpassDescription subpass = {
4296 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4297 0, nullptr,
4298 1, &color,
4299 &resolve,
4300 nullptr,
4301 0, nullptr
4302 };
4303
4304 VkRenderPassCreateInfo rpci = {
4305 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4306 0, 2, attachments, 1, &subpass, 0, nullptr
4307 };
4308
4309 VkRenderPass rp;
4310 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4311
4312 m_errorMonitor->VerifyFound();
4313
4314 if (err == VK_SUCCESS)
4315 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4316}
4317
4318TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004319 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4320 "when a subpass multisample resolve operation is "
4321 "requested, and the destination of that resolve has "
4322 "multiple samples.");
4323
Chris Forbesc5389742016-06-29 11:49:23 +12004324 ASSERT_NO_FATAL_FAILURE(InitState());
4325
4326 m_errorMonitor->SetDesiredFailureMsg(
4327 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4328 "Subpass 0 requests multisample resolve into attachment 1, which "
4329 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
4330
4331 VkAttachmentDescription attachments[] = {
4332 {
4333 0, VK_FORMAT_R8G8B8A8_UNORM,
4334 VK_SAMPLE_COUNT_4_BIT,
4335 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4336 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4337 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4338 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4339 },
4340 {
4341 0, VK_FORMAT_R8G8B8A8_UNORM,
4342 VK_SAMPLE_COUNT_4_BIT,
4343 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4344 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4345 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4346 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4347 },
4348 };
4349
4350 VkAttachmentReference color = {
4351 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4352 };
4353
4354 VkAttachmentReference resolve = {
4355 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4356 };
4357
4358 VkSubpassDescription subpass = {
4359 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4360 0, nullptr,
4361 1, &color,
4362 &resolve,
4363 nullptr,
4364 0, nullptr
4365 };
4366
4367 VkRenderPassCreateInfo rpci = {
4368 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4369 0, 2, attachments, 1, &subpass, 0, nullptr
4370 };
4371
4372 VkRenderPass rp;
4373 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4374
4375 m_errorMonitor->VerifyFound();
4376
4377 if (err == VK_SUCCESS)
4378 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4379}
4380
Chris Forbes3f128ef2016-06-29 14:58:53 +12004381TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004382 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4383 "when the color and depth attachments used by a subpass "
4384 "have inconsistent sample counts");
4385
Chris Forbes3f128ef2016-06-29 14:58:53 +12004386 ASSERT_NO_FATAL_FAILURE(InitState());
4387
4388 m_errorMonitor->SetDesiredFailureMsg(
4389 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4390 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
4391
4392 VkAttachmentDescription attachments[] = {
4393 {
4394 0, VK_FORMAT_R8G8B8A8_UNORM,
4395 VK_SAMPLE_COUNT_1_BIT,
4396 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4397 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4398 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4399 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4400 },
4401 {
4402 0, VK_FORMAT_R8G8B8A8_UNORM,
4403 VK_SAMPLE_COUNT_4_BIT,
4404 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4405 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4406 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4407 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4408 },
4409 };
4410
4411 VkAttachmentReference color[] = {
4412 {
4413 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4414 },
4415 {
4416 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4417 },
4418 };
4419
4420 VkSubpassDescription subpass = {
4421 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4422 0, nullptr,
4423 2, color,
4424 nullptr,
4425 nullptr,
4426 0, nullptr
4427 };
4428
4429 VkRenderPassCreateInfo rpci = {
4430 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4431 0, 2, attachments, 1, &subpass, 0, nullptr
4432 };
4433
4434 VkRenderPass rp;
4435 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4436
4437 m_errorMonitor->VerifyFound();
4438
4439 if (err == VK_SUCCESS)
4440 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4441}
4442
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004443TEST_F(VkLayerTest, FramebufferCreateErrors) {
4444 TEST_DESCRIPTION("Hit errors when attempting to create a framebuffer :\n"
4445 " 1. Mismatch between fb & renderPass attachmentCount\n"
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004446 " 2. Use a color image as depthStencil attachment\n"
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004447 " 3. Mismatch fb & renderPass attachment formats\n"
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004448 " 4. Mismatch fb & renderPass attachment #samples\n"
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004449 " 5. FB attachment w/ non-1 mip-levels\n"
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004450 " 6. FB attachment where dimensions don't match\n"
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004451 " 7. FB attachment w/o identity swizzle\n"
4452 " 8. FB dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004453
4454 ASSERT_NO_FATAL_FAILURE(InitState());
4455 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4456
4457 m_errorMonitor->SetDesiredFailureMsg(
4458 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004459 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 "
4460 "does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004461
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004462 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004463 VkAttachmentReference attach = {};
4464 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4465 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004466 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004467 VkRenderPassCreateInfo rpci = {};
4468 rpci.subpassCount = 1;
4469 rpci.pSubpasses = &subpass;
4470 rpci.attachmentCount = 1;
4471 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004472 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004473 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004474 rpci.pAttachments = &attach_desc;
4475 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4476 VkRenderPass rp;
4477 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4478 ASSERT_VK_SUCCESS(err);
4479
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004480 VkImageView ivs[2];
4481 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
4482 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004483 VkFramebufferCreateInfo fb_info = {};
4484 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4485 fb_info.pNext = NULL;
4486 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004487 // Set mis-matching attachmentCount
4488 fb_info.attachmentCount = 2;
4489 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004490 fb_info.width = 100;
4491 fb_info.height = 100;
4492 fb_info.layers = 1;
4493
4494 VkFramebuffer fb;
4495 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4496
4497 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004498 if (err == VK_SUCCESS) {
4499 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4500 }
4501 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004502
4503 // Create a renderPass with a depth-stencil attachment created with
4504 // IMAGE_USAGE_COLOR_ATTACHMENT
4505 // Add our color attachment to pDepthStencilAttachment
4506 subpass.pDepthStencilAttachment = &attach;
4507 subpass.pColorAttachments = NULL;
4508 VkRenderPass rp_ds;
4509 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
4510 ASSERT_VK_SUCCESS(err);
4511 // Set correct attachment count, but attachment has COLOR usage bit set
4512 fb_info.attachmentCount = 1;
4513 fb_info.renderPass = rp_ds;
4514
4515 m_errorMonitor->SetDesiredFailureMsg(
4516 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4517 " conflicts with the image's IMAGE_USAGE flags ");
4518 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4519
4520 m_errorMonitor->VerifyFound();
4521 if (err == VK_SUCCESS) {
4522 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4523 }
4524 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004525
4526 // Create new renderpass with alternate attachment format from fb
4527 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
4528 subpass.pDepthStencilAttachment = NULL;
4529 subpass.pColorAttachments = &attach;
4530 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4531 ASSERT_VK_SUCCESS(err);
4532
4533 // Cause error due to mis-matched formats between rp & fb
4534 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
4535 fb_info.renderPass = rp;
4536 m_errorMonitor->SetDesiredFailureMsg(
4537 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4538 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
4539 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4540
4541 m_errorMonitor->VerifyFound();
4542 if (err == VK_SUCCESS) {
4543 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4544 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004545 vkDestroyRenderPass(m_device->device(), rp, NULL);
4546
4547 // Create new renderpass with alternate sample count from fb
4548 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
4549 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
4550 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4551 ASSERT_VK_SUCCESS(err);
4552
4553 // Cause error due to mis-matched sample count between rp & fb
4554 fb_info.renderPass = rp;
4555 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4556 " has VK_SAMPLE_COUNT_1_BIT samples "
4557 "that do not match the "
4558 "VK_SAMPLE_COUNT_4_BIT ");
4559 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4560
4561 m_errorMonitor->VerifyFound();
4562 if (err == VK_SUCCESS) {
4563 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4564 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004565
4566 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004567
4568 // Create a custom imageView with non-1 mip levels
4569 VkImageObj image(m_device);
4570 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
4571 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4572 ASSERT_TRUE(image.initialized());
4573
4574 VkImageView view;
4575 VkImageViewCreateInfo ivci = {};
4576 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4577 ivci.image = image.handle();
4578 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4579 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4580 ivci.subresourceRange.layerCount = 1;
4581 ivci.subresourceRange.baseMipLevel = 0;
4582 // Set level count 2 (only 1 is allowed for FB attachment)
4583 ivci.subresourceRange.levelCount = 2;
4584 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4585 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4586 ASSERT_VK_SUCCESS(err);
4587 // Re-create renderpass to have matching sample count
4588 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4589 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4590 ASSERT_VK_SUCCESS(err);
4591
4592 fb_info.renderPass = rp;
4593 fb_info.pAttachments = &view;
4594 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4595 " has mip levelCount of 2 but only ");
4596 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4597
4598 m_errorMonitor->VerifyFound();
4599 if (err == VK_SUCCESS) {
4600 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4601 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004602 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004603 // Update view to original color buffer and grow FB dimensions too big
4604 fb_info.pAttachments = ivs;
4605 fb_info.height = 1024;
4606 fb_info.width = 1024;
4607 fb_info.layers = 2;
4608 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4609 " Attachment dimensions must be at "
4610 "least as large. ");
4611 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4612
4613 m_errorMonitor->VerifyFound();
4614 if (err == VK_SUCCESS) {
4615 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4616 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004617 // Create view attachment with non-identity swizzle
4618 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4619 ivci.image = image.handle();
4620 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4621 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4622 ivci.subresourceRange.layerCount = 1;
4623 ivci.subresourceRange.baseMipLevel = 0;
4624 ivci.subresourceRange.levelCount = 1;
4625 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4626 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4627 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4628 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4629 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4630 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4631 ASSERT_VK_SUCCESS(err);
4632
4633 fb_info.pAttachments = &view;
4634 fb_info.height = 100;
4635 fb_info.width = 100;
4636 fb_info.layers = 1;
4637 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4638 " has non-identy swizzle. All "
4639 "framebuffer attachments must have "
4640 "been created with the identity "
4641 "swizzle. ");
4642 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4643
4644 m_errorMonitor->VerifyFound();
4645 if (err == VK_SUCCESS) {
4646 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4647 }
4648 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004649 // Request fb that exceeds max dimensions
4650 // reset attachment to color attachment
4651 fb_info.pAttachments = ivs;
4652 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
4653 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
4654 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
4655 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4656 " Requested VkFramebufferCreateInfo "
4657 "dimensions exceed physical device "
4658 "limits. ");
4659 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4660
4661 m_errorMonitor->VerifyFound();
4662 if (err == VK_SUCCESS) {
4663 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4664 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004665
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004666 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004667}
4668
Mark Lobodzinskic808d442016-04-14 10:57:23 -06004669// This is a positive test. No errors should be generated.
Michael Lentine860b0fe2016-05-20 10:14:00 -05004670TEST_F(VkLayerTest, WaitEventThenSet) {
4671 TEST_DESCRIPTION(
4672 "Wait on a event then set it after the wait has been submitted.");
4673
Michael Lentine860b0fe2016-05-20 10:14:00 -05004674 m_errorMonitor->ExpectSuccess();
4675
4676 VkEvent event;
4677 VkEventCreateInfo event_create_info{};
4678 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4679 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
4680
4681 VkCommandPool command_pool;
4682 VkCommandPoolCreateInfo pool_create_info{};
4683 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4684 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4685 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4686 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4687 &command_pool);
4688
4689 VkCommandBuffer command_buffer;
4690 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4691 command_buffer_allocate_info.sType =
4692 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4693 command_buffer_allocate_info.commandPool = command_pool;
4694 command_buffer_allocate_info.commandBufferCount = 1;
4695 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4696 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4697 &command_buffer);
4698
4699 VkQueue queue = VK_NULL_HANDLE;
4700 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06004701 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05004702
4703 {
4704 VkCommandBufferBeginInfo begin_info{};
4705 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4706 vkBeginCommandBuffer(command_buffer, &begin_info);
4707
4708 vkCmdWaitEvents(command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT,
4709 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
4710 nullptr, 0, nullptr);
4711 vkCmdResetEvent(command_buffer, event,
4712 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
4713 vkEndCommandBuffer(command_buffer);
4714 }
4715 {
4716 VkSubmitInfo submit_info{};
4717 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4718 submit_info.commandBufferCount = 1;
4719 submit_info.pCommandBuffers = &command_buffer;
4720 submit_info.signalSemaphoreCount = 0;
4721 submit_info.pSignalSemaphores = nullptr;
4722 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4723 }
4724 { vkSetEvent(m_device->device(), event); }
4725
4726 vkQueueWaitIdle(queue);
4727
4728 vkDestroyEvent(m_device->device(), event, nullptr);
4729 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
4730 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
4731
4732 m_errorMonitor->VerifyNotFound();
4733}
Michael Lentine5627e692016-05-20 17:45:02 -05004734// This is a positive test. No errors should be generated.
4735TEST_F(VkLayerTest, QueryAndCopyMultipleCommandBuffers) {
4736 TEST_DESCRIPTION(
4737 "Issue a query and copy from it on a second command buffer.");
4738
4739 if ((m_device->queue_props.empty()) ||
4740 (m_device->queue_props[0].queueCount < 2))
4741 return;
4742
4743 m_errorMonitor->ExpectSuccess();
4744
4745 VkQueryPool query_pool;
4746 VkQueryPoolCreateInfo query_pool_create_info{};
4747 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
4748 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
4749 query_pool_create_info.queryCount = 1;
4750 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr,
4751 &query_pool);
4752
4753 VkCommandPool command_pool;
4754 VkCommandPoolCreateInfo pool_create_info{};
4755 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4756 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4757 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4758 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4759 &command_pool);
4760
4761 VkCommandBuffer command_buffer[2];
4762 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4763 command_buffer_allocate_info.sType =
4764 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4765 command_buffer_allocate_info.commandPool = command_pool;
4766 command_buffer_allocate_info.commandBufferCount = 2;
4767 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4768 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4769 command_buffer);
4770
4771 VkQueue queue = VK_NULL_HANDLE;
4772 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
4773 1, &queue);
4774
4775 uint32_t qfi = 0;
4776 VkBufferCreateInfo buff_create_info = {};
4777 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4778 buff_create_info.size = 1024;
4779 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
4780 buff_create_info.queueFamilyIndexCount = 1;
4781 buff_create_info.pQueueFamilyIndices = &qfi;
4782
4783 VkResult err;
4784 VkBuffer buffer;
4785 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
4786 ASSERT_VK_SUCCESS(err);
4787 VkMemoryAllocateInfo mem_alloc = {};
4788 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4789 mem_alloc.pNext = NULL;
4790 mem_alloc.allocationSize = 1024;
4791 mem_alloc.memoryTypeIndex = 0;
4792
4793 VkMemoryRequirements memReqs;
4794 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
4795 bool pass =
4796 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
4797 if (!pass) {
4798 vkDestroyBuffer(m_device->device(), buffer, NULL);
4799 return;
4800 }
4801
4802 VkDeviceMemory mem;
4803 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
4804 ASSERT_VK_SUCCESS(err);
4805 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4806 ASSERT_VK_SUCCESS(err);
4807
4808 {
4809 VkCommandBufferBeginInfo begin_info{};
4810 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4811 vkBeginCommandBuffer(command_buffer[0], &begin_info);
4812
4813 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
4814 vkCmdWriteTimestamp(command_buffer[0],
4815 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
4816
4817 vkEndCommandBuffer(command_buffer[0]);
4818
4819 vkBeginCommandBuffer(command_buffer[1], &begin_info);
4820
4821 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer,
4822 0, 0, 0);
4823
4824 vkEndCommandBuffer(command_buffer[1]);
4825 }
4826 {
4827 VkSubmitInfo submit_info{};
4828 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4829 submit_info.commandBufferCount = 2;
4830 submit_info.pCommandBuffers = command_buffer;
4831 submit_info.signalSemaphoreCount = 0;
4832 submit_info.pSignalSemaphores = nullptr;
4833 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4834 }
4835
4836 vkQueueWaitIdle(queue);
4837
4838 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
4839 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
4840 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06004841 vkDestroyBuffer(m_device->device(), buffer, NULL);
4842 vkFreeMemory(m_device->device(), mem, NULL);
Michael Lentine5627e692016-05-20 17:45:02 -05004843
4844 m_errorMonitor->VerifyNotFound();
4845}
Michael Lentine860b0fe2016-05-20 10:14:00 -05004846
4847TEST_F(VkLayerTest, ResetEventThenSet) {
4848 TEST_DESCRIPTION(
4849 "Reset an event then set it after the reset has been submitted.");
4850
Michael Lentine860b0fe2016-05-20 10:14:00 -05004851 m_errorMonitor->ExpectSuccess();
4852
4853 VkEvent event;
4854 VkEventCreateInfo event_create_info{};
4855 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4856 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
4857
4858 VkCommandPool command_pool;
4859 VkCommandPoolCreateInfo pool_create_info{};
4860 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4861 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4862 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4863 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4864 &command_pool);
4865
4866 VkCommandBuffer command_buffer;
4867 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4868 command_buffer_allocate_info.sType =
4869 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4870 command_buffer_allocate_info.commandPool = command_pool;
4871 command_buffer_allocate_info.commandBufferCount = 1;
4872 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4873 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4874 &command_buffer);
4875
4876 VkQueue queue = VK_NULL_HANDLE;
4877 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06004878 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05004879
4880 {
4881 VkCommandBufferBeginInfo begin_info{};
4882 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4883 vkBeginCommandBuffer(command_buffer, &begin_info);
4884
4885 vkCmdResetEvent(command_buffer, event,
4886 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
4887 vkCmdWaitEvents(command_buffer, 1, &event,
4888 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4889 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
4890 nullptr, 0, nullptr);
4891 vkEndCommandBuffer(command_buffer);
4892 }
4893 {
4894 VkSubmitInfo submit_info{};
4895 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4896 submit_info.commandBufferCount = 1;
4897 submit_info.pCommandBuffers = &command_buffer;
4898 submit_info.signalSemaphoreCount = 0;
4899 submit_info.pSignalSemaphores = nullptr;
4900 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4901 }
4902 {
4903 m_errorMonitor->SetDesiredFailureMsg(
4904 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkSetEvent() on event "
4905 "0x1 that is already in use by a "
4906 "command buffer.");
4907 vkSetEvent(m_device->device(), event);
4908 m_errorMonitor->VerifyFound();
4909 }
4910
4911 vkQueueWaitIdle(queue);
4912
4913 vkDestroyEvent(m_device->device(), event, nullptr);
4914 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
4915 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
4916}
4917
4918// This is a positive test. No errors should be generated.
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004919TEST_F(VkLayerTest, TwoFencesThreeFrames) {
4920 TEST_DESCRIPTION("Two command buffers with two separate fences are each "
4921 "run through a Submit & WaitForFences cycle 3 times. This "
4922 "previously revealed a bug so running this positive test "
4923 "to prevent a regression.");
4924 m_errorMonitor->ExpectSuccess();
4925
4926 ASSERT_NO_FATAL_FAILURE(InitState());
4927 VkQueue queue = VK_NULL_HANDLE;
4928 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
4929 0, &queue);
4930
4931 static const uint32_t NUM_OBJECTS = 2;
4932 static const uint32_t NUM_FRAMES = 3;
4933 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
4934 VkFence fences[NUM_OBJECTS] = {};
4935
4936 VkCommandPool cmd_pool;
4937 VkCommandPoolCreateInfo cmd_pool_ci = {};
4938 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4939 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
4940 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4941 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci,
4942 nullptr, &cmd_pool);
4943 ASSERT_VK_SUCCESS(err);
4944
4945 VkCommandBufferAllocateInfo cmd_buf_info = {};
4946 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4947 cmd_buf_info.commandPool = cmd_pool;
4948 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4949 cmd_buf_info.commandBufferCount = 1;
4950
4951 VkFenceCreateInfo fence_ci = {};
4952 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4953 fence_ci.pNext = nullptr;
4954 fence_ci.flags = 0;
4955
4956 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
4957 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info,
4958 &cmd_buffers[i]);
4959 ASSERT_VK_SUCCESS(err);
4960 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
4961 ASSERT_VK_SUCCESS(err);
4962 }
4963
4964 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
Tobin Ehlisf9025162016-05-26 06:55:21 -06004965 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
4966 // Create empty cmd buffer
4967 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
4968 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004969
Tobin Ehlisf9025162016-05-26 06:55:21 -06004970 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
4971 ASSERT_VK_SUCCESS(err);
4972 err = vkEndCommandBuffer(cmd_buffers[obj]);
4973 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004974
Tobin Ehlisf9025162016-05-26 06:55:21 -06004975 VkSubmitInfo submit_info = {};
4976 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4977 submit_info.commandBufferCount = 1;
4978 submit_info.pCommandBuffers = &cmd_buffers[obj];
4979 // Submit cmd buffer and wait for fence
4980 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
4981 ASSERT_VK_SUCCESS(err);
4982 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE,
4983 UINT64_MAX);
4984 ASSERT_VK_SUCCESS(err);
4985 err = vkResetFences(m_device->device(), 1, &fences[obj]);
4986 ASSERT_VK_SUCCESS(err);
4987 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004988 }
4989 m_errorMonitor->VerifyNotFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06004990 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
4991 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
4992 vkDestroyFence(m_device->device(), fences[i], nullptr);
4993 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004994}
4995// This is a positive test. No errors should be generated.
Mark Lobodzinskic808d442016-04-14 10:57:23 -06004996TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
4997
4998 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
4999 "submitted on separate queues followed by a QueueWaitIdle.");
5000
Dustin Graves48458142016-04-29 16:11:55 -06005001 if ((m_device->queue_props.empty()) ||
5002 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005003 return;
5004
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005005 m_errorMonitor->ExpectSuccess();
5006
5007 VkSemaphore semaphore;
5008 VkSemaphoreCreateInfo semaphore_create_info{};
5009 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5010 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5011 &semaphore);
5012
5013 VkCommandPool command_pool;
5014 VkCommandPoolCreateInfo pool_create_info{};
5015 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5016 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5017 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5018 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5019 &command_pool);
5020
5021 VkCommandBuffer command_buffer[2];
5022 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5023 command_buffer_allocate_info.sType =
5024 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5025 command_buffer_allocate_info.commandPool = command_pool;
5026 command_buffer_allocate_info.commandBufferCount = 2;
5027 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5028 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5029 command_buffer);
5030
5031 VkQueue queue = VK_NULL_HANDLE;
5032 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5033 1, &queue);
5034
5035 {
5036 VkCommandBufferBeginInfo begin_info{};
5037 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5038 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5039
5040 vkCmdPipelineBarrier(command_buffer[0],
5041 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5042 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5043 0, nullptr, 0, nullptr);
5044
5045 VkViewport viewport{};
5046 viewport.maxDepth = 1.0f;
5047 viewport.minDepth = 0.0f;
5048 viewport.width = 512;
5049 viewport.height = 512;
5050 viewport.x = 0;
5051 viewport.y = 0;
5052 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5053 vkEndCommandBuffer(command_buffer[0]);
5054 }
5055 {
5056 VkCommandBufferBeginInfo begin_info{};
5057 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5058 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5059
5060 VkViewport viewport{};
5061 viewport.maxDepth = 1.0f;
5062 viewport.minDepth = 0.0f;
5063 viewport.width = 512;
5064 viewport.height = 512;
5065 viewport.x = 0;
5066 viewport.y = 0;
5067 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5068 vkEndCommandBuffer(command_buffer[1]);
5069 }
5070 {
5071 VkSubmitInfo submit_info{};
5072 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5073 submit_info.commandBufferCount = 1;
5074 submit_info.pCommandBuffers = &command_buffer[0];
5075 submit_info.signalSemaphoreCount = 1;
5076 submit_info.pSignalSemaphores = &semaphore;
5077 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5078 }
5079 {
5080 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5081 VkSubmitInfo submit_info{};
5082 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5083 submit_info.commandBufferCount = 1;
5084 submit_info.pCommandBuffers = &command_buffer[1];
5085 submit_info.waitSemaphoreCount = 1;
5086 submit_info.pWaitSemaphores = &semaphore;
5087 submit_info.pWaitDstStageMask = flags;
5088 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5089 }
5090
5091 vkQueueWaitIdle(m_device->m_queue);
5092
5093 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5094 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5095 &command_buffer[0]);
5096 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5097
5098 m_errorMonitor->VerifyNotFound();
5099}
5100
5101// This is a positive test. No errors should be generated.
5102TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
5103
5104 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5105 "submitted on separate queues, the second having a fence"
5106 "followed by a QueueWaitIdle.");
5107
Dustin Graves48458142016-04-29 16:11:55 -06005108 if ((m_device->queue_props.empty()) ||
5109 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005110 return;
5111
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005112 m_errorMonitor->ExpectSuccess();
5113
5114 VkFence fence;
5115 VkFenceCreateInfo fence_create_info{};
5116 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5117 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5118
5119 VkSemaphore semaphore;
5120 VkSemaphoreCreateInfo semaphore_create_info{};
5121 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5122 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5123 &semaphore);
5124
5125 VkCommandPool command_pool;
5126 VkCommandPoolCreateInfo pool_create_info{};
5127 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5128 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5129 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5130 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5131 &command_pool);
5132
5133 VkCommandBuffer command_buffer[2];
5134 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5135 command_buffer_allocate_info.sType =
5136 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5137 command_buffer_allocate_info.commandPool = command_pool;
5138 command_buffer_allocate_info.commandBufferCount = 2;
5139 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5140 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5141 command_buffer);
5142
5143 VkQueue queue = VK_NULL_HANDLE;
5144 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5145 1, &queue);
5146
5147 {
5148 VkCommandBufferBeginInfo begin_info{};
5149 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5150 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5151
5152 vkCmdPipelineBarrier(command_buffer[0],
5153 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5154 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5155 0, nullptr, 0, nullptr);
5156
5157 VkViewport viewport{};
5158 viewport.maxDepth = 1.0f;
5159 viewport.minDepth = 0.0f;
5160 viewport.width = 512;
5161 viewport.height = 512;
5162 viewport.x = 0;
5163 viewport.y = 0;
5164 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5165 vkEndCommandBuffer(command_buffer[0]);
5166 }
5167 {
5168 VkCommandBufferBeginInfo begin_info{};
5169 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5170 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5171
5172 VkViewport viewport{};
5173 viewport.maxDepth = 1.0f;
5174 viewport.minDepth = 0.0f;
5175 viewport.width = 512;
5176 viewport.height = 512;
5177 viewport.x = 0;
5178 viewport.y = 0;
5179 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5180 vkEndCommandBuffer(command_buffer[1]);
5181 }
5182 {
5183 VkSubmitInfo submit_info{};
5184 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5185 submit_info.commandBufferCount = 1;
5186 submit_info.pCommandBuffers = &command_buffer[0];
5187 submit_info.signalSemaphoreCount = 1;
5188 submit_info.pSignalSemaphores = &semaphore;
5189 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5190 }
5191 {
5192 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5193 VkSubmitInfo submit_info{};
5194 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5195 submit_info.commandBufferCount = 1;
5196 submit_info.pCommandBuffers = &command_buffer[1];
5197 submit_info.waitSemaphoreCount = 1;
5198 submit_info.pWaitSemaphores = &semaphore;
5199 submit_info.pWaitDstStageMask = flags;
5200 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5201 }
5202
5203 vkQueueWaitIdle(m_device->m_queue);
5204
5205 vkDestroyFence(m_device->device(), fence, nullptr);
5206 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5207 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5208 &command_buffer[0]);
5209 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5210
5211 m_errorMonitor->VerifyNotFound();
5212}
5213
5214// This is a positive test. No errors should be generated.
5215TEST_F(VkLayerTest,
5216 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
5217
5218 TEST_DESCRIPTION(
5219 "Two command buffers, each in a separate QueueSubmit call "
5220 "submitted on separate queues, the second having a fence"
5221 "followed by two consecutive WaitForFences calls on the same fence.");
5222
Dustin Graves48458142016-04-29 16:11:55 -06005223 if ((m_device->queue_props.empty()) ||
5224 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005225 return;
5226
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005227 m_errorMonitor->ExpectSuccess();
5228
5229 VkFence fence;
5230 VkFenceCreateInfo fence_create_info{};
5231 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5232 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5233
5234 VkSemaphore semaphore;
5235 VkSemaphoreCreateInfo semaphore_create_info{};
5236 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5237 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5238 &semaphore);
5239
5240 VkCommandPool command_pool;
5241 VkCommandPoolCreateInfo pool_create_info{};
5242 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5243 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5244 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5245 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5246 &command_pool);
5247
5248 VkCommandBuffer command_buffer[2];
5249 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5250 command_buffer_allocate_info.sType =
5251 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5252 command_buffer_allocate_info.commandPool = command_pool;
5253 command_buffer_allocate_info.commandBufferCount = 2;
5254 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5255 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5256 command_buffer);
5257
5258 VkQueue queue = VK_NULL_HANDLE;
5259 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5260 1, &queue);
5261
5262 {
5263 VkCommandBufferBeginInfo begin_info{};
5264 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5265 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5266
5267 vkCmdPipelineBarrier(command_buffer[0],
5268 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5269 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5270 0, nullptr, 0, nullptr);
5271
5272 VkViewport viewport{};
5273 viewport.maxDepth = 1.0f;
5274 viewport.minDepth = 0.0f;
5275 viewport.width = 512;
5276 viewport.height = 512;
5277 viewport.x = 0;
5278 viewport.y = 0;
5279 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5280 vkEndCommandBuffer(command_buffer[0]);
5281 }
5282 {
5283 VkCommandBufferBeginInfo begin_info{};
5284 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5285 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5286
5287 VkViewport viewport{};
5288 viewport.maxDepth = 1.0f;
5289 viewport.minDepth = 0.0f;
5290 viewport.width = 512;
5291 viewport.height = 512;
5292 viewport.x = 0;
5293 viewport.y = 0;
5294 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5295 vkEndCommandBuffer(command_buffer[1]);
5296 }
5297 {
5298 VkSubmitInfo submit_info{};
5299 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5300 submit_info.commandBufferCount = 1;
5301 submit_info.pCommandBuffers = &command_buffer[0];
5302 submit_info.signalSemaphoreCount = 1;
5303 submit_info.pSignalSemaphores = &semaphore;
5304 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5305 }
5306 {
5307 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5308 VkSubmitInfo submit_info{};
5309 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5310 submit_info.commandBufferCount = 1;
5311 submit_info.pCommandBuffers = &command_buffer[1];
5312 submit_info.waitSemaphoreCount = 1;
5313 submit_info.pWaitSemaphores = &semaphore;
5314 submit_info.pWaitDstStageMask = flags;
5315 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5316 }
5317
5318 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5319 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5320
5321 vkDestroyFence(m_device->device(), fence, nullptr);
5322 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5323 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5324 &command_buffer[0]);
5325 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5326
5327 m_errorMonitor->VerifyNotFound();
5328}
5329
Chris Forbes0f8126b2016-06-20 17:48:22 +12005330#if 0
5331TEST_F(VkLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
5332 if ((m_device->queue_props.empty()) ||
5333 (m_device->queue_props[0].queueCount < 2)) {
5334 printf("Test requires two queues, skipping\n");
5335 return;
5336 }
5337
5338 VkResult err;
5339
5340 m_errorMonitor->ExpectSuccess();
5341
5342 VkQueue q0 = m_device->m_queue;
5343 VkQueue q1 = nullptr;
5344 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
5345 ASSERT_NE(q1, nullptr);
5346
5347 // An (empty) command buffer. We must have work in the first submission --
5348 // the layer treats unfenced work differently from fenced work.
5349 VkCommandPoolCreateInfo cpci = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0 };
5350 VkCommandPool pool;
5351 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
5352 ASSERT_VK_SUCCESS(err);
5353 VkCommandBufferAllocateInfo cbai = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr,
5354 pool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1
5355 };
5356 VkCommandBuffer cb;
5357 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
5358 ASSERT_VK_SUCCESS(err);
5359 VkCommandBufferBeginInfo cbbi = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
5360 0, nullptr
5361 };
5362 err = vkBeginCommandBuffer(cb, &cbbi);
5363 ASSERT_VK_SUCCESS(err);
5364 err = vkEndCommandBuffer(cb);
5365 ASSERT_VK_SUCCESS(err);
5366
5367 // A semaphore
5368 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
5369 VkSemaphore s;
5370 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
5371 ASSERT_VK_SUCCESS(err);
5372
5373 // First submission, to q0
5374 VkSubmitInfo s0 = {
5375 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
5376 0, nullptr, nullptr,
5377 1, &cb,
5378 1, &s
5379 };
5380
5381 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
5382 ASSERT_VK_SUCCESS(err);
5383
5384 // Second submission, to q1, waiting on s
5385 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
5386 VkSubmitInfo s1 = {
5387 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
5388 1, &s, &waitmask,
5389 0, nullptr,
5390 0, nullptr
5391 };
5392
5393 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
5394 ASSERT_VK_SUCCESS(err);
5395
5396 // Wait for q0 idle
5397 err = vkQueueWaitIdle(q0);
5398 ASSERT_VK_SUCCESS(err);
5399
5400 // Command buffer should have been completed (it was on q0); reset the pool.
5401 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
5402
5403 m_errorMonitor->VerifyNotFound();
5404
5405 // Force device completely idle and clean up resources
5406 vkDeviceWaitIdle(m_device->device());
5407 vkDestroyCommandPool(m_device->device(), pool, nullptr);
5408 vkDestroySemaphore(m_device->device(), s, nullptr);
5409}
5410#endif
5411
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005412// This is a positive test. No errors should be generated.
5413TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
5414
5415 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5416 "submitted on separate queues, the second having a fence, "
5417 "followed by a WaitForFences call.");
5418
Dustin Graves48458142016-04-29 16:11:55 -06005419 if ((m_device->queue_props.empty()) ||
5420 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005421 return;
5422
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005423 m_errorMonitor->ExpectSuccess();
5424
5425 VkFence fence;
5426 VkFenceCreateInfo fence_create_info{};
5427 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5428 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5429
5430 VkSemaphore semaphore;
5431 VkSemaphoreCreateInfo semaphore_create_info{};
5432 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5433 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5434 &semaphore);
5435
5436 VkCommandPool command_pool;
5437 VkCommandPoolCreateInfo pool_create_info{};
5438 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5439 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5440 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5441 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5442 &command_pool);
5443
5444 VkCommandBuffer command_buffer[2];
5445 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5446 command_buffer_allocate_info.sType =
5447 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5448 command_buffer_allocate_info.commandPool = command_pool;
5449 command_buffer_allocate_info.commandBufferCount = 2;
5450 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5451 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5452 command_buffer);
5453
5454 VkQueue queue = VK_NULL_HANDLE;
5455 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5456 1, &queue);
5457
5458
5459 {
5460 VkCommandBufferBeginInfo begin_info{};
5461 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5462 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5463
5464 vkCmdPipelineBarrier(command_buffer[0],
5465 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5466 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5467 0, nullptr, 0, nullptr);
5468
5469 VkViewport viewport{};
5470 viewport.maxDepth = 1.0f;
5471 viewport.minDepth = 0.0f;
5472 viewport.width = 512;
5473 viewport.height = 512;
5474 viewport.x = 0;
5475 viewport.y = 0;
5476 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5477 vkEndCommandBuffer(command_buffer[0]);
5478 }
5479 {
5480 VkCommandBufferBeginInfo begin_info{};
5481 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5482 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5483
5484 VkViewport viewport{};
5485 viewport.maxDepth = 1.0f;
5486 viewport.minDepth = 0.0f;
5487 viewport.width = 512;
5488 viewport.height = 512;
5489 viewport.x = 0;
5490 viewport.y = 0;
5491 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5492 vkEndCommandBuffer(command_buffer[1]);
5493 }
5494 {
5495 VkSubmitInfo submit_info{};
5496 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5497 submit_info.commandBufferCount = 1;
5498 submit_info.pCommandBuffers = &command_buffer[0];
5499 submit_info.signalSemaphoreCount = 1;
5500 submit_info.pSignalSemaphores = &semaphore;
5501 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5502 }
5503 {
5504 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5505 VkSubmitInfo submit_info{};
5506 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5507 submit_info.commandBufferCount = 1;
5508 submit_info.pCommandBuffers = &command_buffer[1];
5509 submit_info.waitSemaphoreCount = 1;
5510 submit_info.pWaitSemaphores = &semaphore;
5511 submit_info.pWaitDstStageMask = flags;
5512 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5513 }
5514
5515 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5516
5517 vkDestroyFence(m_device->device(), fence, nullptr);
5518 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5519 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5520 &command_buffer[0]);
5521 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5522
5523 m_errorMonitor->VerifyNotFound();
5524}
5525
5526// This is a positive test. No errors should be generated.
5527TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
5528
5529 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5530 "on the same queue, sharing a signal/wait semaphore, the "
5531 "second having a fence, "
5532 "followed by a WaitForFences call.");
5533
5534 m_errorMonitor->ExpectSuccess();
5535
5536 VkFence fence;
5537 VkFenceCreateInfo fence_create_info{};
5538 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5539 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5540
5541 VkSemaphore semaphore;
5542 VkSemaphoreCreateInfo semaphore_create_info{};
5543 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5544 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5545 &semaphore);
5546
5547 VkCommandPool command_pool;
5548 VkCommandPoolCreateInfo pool_create_info{};
5549 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5550 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5551 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5552 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5553 &command_pool);
5554
5555 VkCommandBuffer command_buffer[2];
5556 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5557 command_buffer_allocate_info.sType =
5558 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5559 command_buffer_allocate_info.commandPool = command_pool;
5560 command_buffer_allocate_info.commandBufferCount = 2;
5561 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5562 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5563 command_buffer);
5564
5565 {
5566 VkCommandBufferBeginInfo begin_info{};
5567 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5568 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5569
5570 vkCmdPipelineBarrier(command_buffer[0],
5571 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5572 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5573 0, nullptr, 0, nullptr);
5574
5575 VkViewport viewport{};
5576 viewport.maxDepth = 1.0f;
5577 viewport.minDepth = 0.0f;
5578 viewport.width = 512;
5579 viewport.height = 512;
5580 viewport.x = 0;
5581 viewport.y = 0;
5582 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5583 vkEndCommandBuffer(command_buffer[0]);
5584 }
5585 {
5586 VkCommandBufferBeginInfo begin_info{};
5587 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5588 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5589
5590 VkViewport viewport{};
5591 viewport.maxDepth = 1.0f;
5592 viewport.minDepth = 0.0f;
5593 viewport.width = 512;
5594 viewport.height = 512;
5595 viewport.x = 0;
5596 viewport.y = 0;
5597 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5598 vkEndCommandBuffer(command_buffer[1]);
5599 }
5600 {
5601 VkSubmitInfo submit_info{};
5602 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5603 submit_info.commandBufferCount = 1;
5604 submit_info.pCommandBuffers = &command_buffer[0];
5605 submit_info.signalSemaphoreCount = 1;
5606 submit_info.pSignalSemaphores = &semaphore;
5607 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5608 }
5609 {
5610 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5611 VkSubmitInfo submit_info{};
5612 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5613 submit_info.commandBufferCount = 1;
5614 submit_info.pCommandBuffers = &command_buffer[1];
5615 submit_info.waitSemaphoreCount = 1;
5616 submit_info.pWaitSemaphores = &semaphore;
5617 submit_info.pWaitDstStageMask = flags;
5618 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5619 }
5620
5621 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5622
5623 vkDestroyFence(m_device->device(), fence, nullptr);
5624 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5625 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5626 &command_buffer[0]);
5627 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5628
5629 m_errorMonitor->VerifyNotFound();
5630}
5631
5632// This is a positive test. No errors should be generated.
5633TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
5634
5635 TEST_DESCRIPTION(
5636 "Two command buffers, each in a separate QueueSubmit call "
5637 "on the same queue, no fences, followed by a third QueueSubmit with NO "
5638 "SubmitInfos but with a fence, followed by a WaitForFences call.");
5639
5640 m_errorMonitor->ExpectSuccess();
5641
5642 VkFence fence;
5643 VkFenceCreateInfo fence_create_info{};
5644 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5645 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5646
5647 VkCommandPool command_pool;
5648 VkCommandPoolCreateInfo pool_create_info{};
5649 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5650 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5651 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5652 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5653 &command_pool);
5654
5655 VkCommandBuffer command_buffer[2];
5656 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5657 command_buffer_allocate_info.sType =
5658 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5659 command_buffer_allocate_info.commandPool = command_pool;
5660 command_buffer_allocate_info.commandBufferCount = 2;
5661 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5662 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5663 command_buffer);
5664
5665 {
5666 VkCommandBufferBeginInfo begin_info{};
5667 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5668 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5669
5670 vkCmdPipelineBarrier(command_buffer[0],
5671 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5672 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5673 0, nullptr, 0, nullptr);
5674
5675 VkViewport viewport{};
5676 viewport.maxDepth = 1.0f;
5677 viewport.minDepth = 0.0f;
5678 viewport.width = 512;
5679 viewport.height = 512;
5680 viewport.x = 0;
5681 viewport.y = 0;
5682 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5683 vkEndCommandBuffer(command_buffer[0]);
5684 }
5685 {
5686 VkCommandBufferBeginInfo begin_info{};
5687 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5688 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5689
5690 VkViewport viewport{};
5691 viewport.maxDepth = 1.0f;
5692 viewport.minDepth = 0.0f;
5693 viewport.width = 512;
5694 viewport.height = 512;
5695 viewport.x = 0;
5696 viewport.y = 0;
5697 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5698 vkEndCommandBuffer(command_buffer[1]);
5699 }
5700 {
5701 VkSubmitInfo submit_info{};
5702 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5703 submit_info.commandBufferCount = 1;
5704 submit_info.pCommandBuffers = &command_buffer[0];
5705 submit_info.signalSemaphoreCount = 0;
5706 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
5707 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5708 }
5709 {
5710 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5711 VkSubmitInfo submit_info{};
5712 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5713 submit_info.commandBufferCount = 1;
5714 submit_info.pCommandBuffers = &command_buffer[1];
5715 submit_info.waitSemaphoreCount = 0;
5716 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
5717 submit_info.pWaitDstStageMask = flags;
5718 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5719 }
5720
5721 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
5722
Mike Stroyancd1c3e52016-06-21 09:20:01 -06005723 VkResult err =
5724 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5725 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005726
5727 vkDestroyFence(m_device->device(), fence, nullptr);
5728 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5729 &command_buffer[0]);
5730 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5731
5732 m_errorMonitor->VerifyNotFound();
5733}
5734
5735// This is a positive test. No errors should be generated.
5736TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
5737
5738 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5739 "on the same queue, the second having a fence, followed "
5740 "by a WaitForFences call.");
5741
5742 m_errorMonitor->ExpectSuccess();
5743
5744 VkFence fence;
5745 VkFenceCreateInfo fence_create_info{};
5746 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5747 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5748
5749 VkCommandPool command_pool;
5750 VkCommandPoolCreateInfo pool_create_info{};
5751 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5752 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5753 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5754 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5755 &command_pool);
5756
5757 VkCommandBuffer command_buffer[2];
5758 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5759 command_buffer_allocate_info.sType =
5760 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5761 command_buffer_allocate_info.commandPool = command_pool;
5762 command_buffer_allocate_info.commandBufferCount = 2;
5763 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5764 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5765 command_buffer);
5766
5767 {
5768 VkCommandBufferBeginInfo begin_info{};
5769 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5770 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5771
5772 vkCmdPipelineBarrier(command_buffer[0],
5773 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5774 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5775 0, nullptr, 0, nullptr);
5776
5777 VkViewport viewport{};
5778 viewport.maxDepth = 1.0f;
5779 viewport.minDepth = 0.0f;
5780 viewport.width = 512;
5781 viewport.height = 512;
5782 viewport.x = 0;
5783 viewport.y = 0;
5784 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5785 vkEndCommandBuffer(command_buffer[0]);
5786 }
5787 {
5788 VkCommandBufferBeginInfo begin_info{};
5789 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5790 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5791
5792 VkViewport viewport{};
5793 viewport.maxDepth = 1.0f;
5794 viewport.minDepth = 0.0f;
5795 viewport.width = 512;
5796 viewport.height = 512;
5797 viewport.x = 0;
5798 viewport.y = 0;
5799 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5800 vkEndCommandBuffer(command_buffer[1]);
5801 }
5802 {
5803 VkSubmitInfo submit_info{};
5804 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5805 submit_info.commandBufferCount = 1;
5806 submit_info.pCommandBuffers = &command_buffer[0];
5807 submit_info.signalSemaphoreCount = 0;
5808 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
5809 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5810 }
5811 {
5812 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5813 VkSubmitInfo submit_info{};
5814 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5815 submit_info.commandBufferCount = 1;
5816 submit_info.pCommandBuffers = &command_buffer[1];
5817 submit_info.waitSemaphoreCount = 0;
5818 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
5819 submit_info.pWaitDstStageMask = flags;
5820 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5821 }
5822
5823 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5824
5825 vkDestroyFence(m_device->device(), fence, nullptr);
5826 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5827 &command_buffer[0]);
5828 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5829
5830 m_errorMonitor->VerifyNotFound();
5831}
5832
5833// This is a positive test. No errors should be generated.
5834TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
5835
5836 TEST_DESCRIPTION(
5837 "Two command buffers each in a separate SubmitInfo sent in a single "
5838 "QueueSubmit call followed by a WaitForFences call.");
5839
5840 m_errorMonitor->ExpectSuccess();
5841
5842 VkFence fence;
5843 VkFenceCreateInfo fence_create_info{};
5844 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5845 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5846
5847 VkSemaphore semaphore;
5848 VkSemaphoreCreateInfo semaphore_create_info{};
5849 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5850 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5851 &semaphore);
5852
5853 VkCommandPool command_pool;
5854 VkCommandPoolCreateInfo pool_create_info{};
5855 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5856 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5857 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5858 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5859 &command_pool);
5860
5861 VkCommandBuffer command_buffer[2];
5862 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5863 command_buffer_allocate_info.sType =
5864 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5865 command_buffer_allocate_info.commandPool = command_pool;
5866 command_buffer_allocate_info.commandBufferCount = 2;
5867 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5868 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5869 command_buffer);
5870
5871 {
5872 VkCommandBufferBeginInfo begin_info{};
5873 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5874 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5875
5876 vkCmdPipelineBarrier(command_buffer[0],
5877 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5878 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5879 0, nullptr, 0, nullptr);
5880
5881 VkViewport viewport{};
5882 viewport.maxDepth = 1.0f;
5883 viewport.minDepth = 0.0f;
5884 viewport.width = 512;
5885 viewport.height = 512;
5886 viewport.x = 0;
5887 viewport.y = 0;
5888 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5889 vkEndCommandBuffer(command_buffer[0]);
5890 }
5891 {
5892 VkCommandBufferBeginInfo begin_info{};
5893 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5894 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5895
5896 VkViewport viewport{};
5897 viewport.maxDepth = 1.0f;
5898 viewport.minDepth = 0.0f;
5899 viewport.width = 512;
5900 viewport.height = 512;
5901 viewport.x = 0;
5902 viewport.y = 0;
5903 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5904 vkEndCommandBuffer(command_buffer[1]);
5905 }
5906 {
5907 VkSubmitInfo submit_info[2];
5908 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5909
5910 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5911 submit_info[0].pNext = NULL;
5912 submit_info[0].commandBufferCount = 1;
5913 submit_info[0].pCommandBuffers = &command_buffer[0];
5914 submit_info[0].signalSemaphoreCount = 1;
5915 submit_info[0].pSignalSemaphores = &semaphore;
5916 submit_info[0].waitSemaphoreCount = 0;
5917 submit_info[0].pWaitSemaphores = NULL;
5918 submit_info[0].pWaitDstStageMask = 0;
5919
5920 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5921 submit_info[1].pNext = NULL;
5922 submit_info[1].commandBufferCount = 1;
5923 submit_info[1].pCommandBuffers = &command_buffer[1];
5924 submit_info[1].waitSemaphoreCount = 1;
5925 submit_info[1].pWaitSemaphores = &semaphore;
5926 submit_info[1].pWaitDstStageMask = flags;
5927 submit_info[1].signalSemaphoreCount = 0;
5928 submit_info[1].pSignalSemaphores = NULL;
5929 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
5930 }
5931
5932 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5933
5934 vkDestroyFence(m_device->device(), fence, nullptr);
5935 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5936 &command_buffer[0]);
5937 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06005938 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005939
5940 m_errorMonitor->VerifyNotFound();
5941}
5942
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005943TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005944 TEST_DESCRIPTION(
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005945 "Run a simple draw calls to validate failure when Depth Bias dynamic "
5946 "state is required but not correctly bound.");
5947
5948 // Dynamic depth bias
5949 m_errorMonitor->SetDesiredFailureMsg(
5950 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5951 "Dynamic depth bias state not set for this command buffer");
5952 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5953 BsoFailDepthBias);
5954 m_errorMonitor->VerifyFound();
5955}
5956
5957TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
5958 TEST_DESCRIPTION(
5959 "Run a simple draw calls to validate failure when Line Width dynamic "
5960 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005961
5962 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07005963 m_errorMonitor->SetDesiredFailureMsg(
5964 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005965 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005966 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5967 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005968 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005969}
5970
5971TEST_F(VkLayerTest, DynamicViewportNotBound) {
5972 TEST_DESCRIPTION(
5973 "Run a simple draw calls to validate failure when Viewport dynamic "
5974 "state is required but not correctly bound.");
5975
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005976 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07005977 m_errorMonitor->SetDesiredFailureMsg(
5978 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005979 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005980 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5981 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005982 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005983}
5984
5985TEST_F(VkLayerTest, DynamicScissorNotBound) {
5986 TEST_DESCRIPTION(
5987 "Run a simple draw calls to validate failure when Scissor dynamic "
5988 "state is required but not correctly bound.");
5989
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005990 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07005991 m_errorMonitor->SetDesiredFailureMsg(
5992 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005993 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005994 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5995 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005996 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005997}
5998
Tobin Ehlis21c88352016-05-26 06:15:45 -06005999TEST_F(VkLayerTest, DynamiBlendConstantsNotBound) {
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006000 TEST_DESCRIPTION(
Tobin Ehlis21c88352016-05-26 06:15:45 -06006001 "Run a simple draw calls to validate failure when Blend Constants "
6002 "dynamic state is required but not correctly bound.");
6003 // Dynamic blend constant state
6004 m_errorMonitor->SetDesiredFailureMsg(
6005 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6006 "Dynamic blend constants state not set for this command buffer");
6007 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6008 BsoFailBlend);
6009 m_errorMonitor->VerifyFound();
6010}
6011
6012TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
6013 TEST_DESCRIPTION(
6014 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006015 "state is required but not correctly bound.");
Tobin Ehlis21c88352016-05-26 06:15:45 -06006016 if (!m_device->phy().features().depthBounds) {
6017 printf("Device does not support depthBounds test; skipped.\n");
6018 return;
6019 }
6020 // Dynamic depth bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006021 m_errorMonitor->SetDesiredFailureMsg(
6022 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006023 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006024 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6025 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006026 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006027}
6028
6029TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
6030 TEST_DESCRIPTION(
6031 "Run a simple draw calls to validate failure when Stencil Read dynamic "
6032 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006033 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07006034 m_errorMonitor->SetDesiredFailureMsg(
6035 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006036 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006037 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6038 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006039 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006040}
6041
6042TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
6043 TEST_DESCRIPTION(
6044 "Run a simple draw calls to validate failure when Stencil Write dynamic"
6045 " state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006046 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07006047 m_errorMonitor->SetDesiredFailureMsg(
6048 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006049 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006050 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6051 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006052 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006053}
6054
6055TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
6056 TEST_DESCRIPTION(
6057 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
6058 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006059 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07006060 m_errorMonitor->SetDesiredFailureMsg(
6061 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006062 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006063 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6064 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006065 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06006066}
6067
Karl Schultz6addd812016-02-02 17:17:23 -07006068TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Karl Schultz6addd812016-02-02 17:17:23 -07006069 m_errorMonitor->SetDesiredFailureMsg(
6070 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6071 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
6072 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006073
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006074 ASSERT_NO_FATAL_FAILURE(InitState());
6075 ASSERT_NO_FATAL_FAILURE(InitViewport());
6076 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6077
Karl Schultz6addd812016-02-02 17:17:23 -07006078 // We luck out b/c by default the framework creates CB w/ the
6079 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006080 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006081 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
6082 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006083 EndCommandBuffer();
6084
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006085 // Bypass framework since it does the waits automatically
6086 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006087 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08006088 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6089 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006090 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006091 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07006092 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006093 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006094 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08006095 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006096 submit_info.pSignalSemaphores = NULL;
6097
Chris Forbes40028e22016-06-13 09:59:34 +12006098 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07006099 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006100
Karl Schultz6addd812016-02-02 17:17:23 -07006101 // Cause validation error by re-submitting cmd buffer that should only be
6102 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12006103 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006104
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006105 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006106}
6107
Karl Schultz6addd812016-02-02 17:17:23 -07006108TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006109 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07006110 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006111
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006112 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006113 "Unable to allocate 1 descriptors of "
6114 "type "
6115 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006116
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006117 ASSERT_NO_FATAL_FAILURE(InitState());
6118 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006119
Karl Schultz6addd812016-02-02 17:17:23 -07006120 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
6121 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006122 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006123 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
6124 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006125
6126 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006127 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6128 ds_pool_ci.pNext = NULL;
6129 ds_pool_ci.flags = 0;
6130 ds_pool_ci.maxSets = 1;
6131 ds_pool_ci.poolSizeCount = 1;
6132 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006133
6134 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006135 err =
6136 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006137 ASSERT_VK_SUCCESS(err);
6138
6139 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006140 dsl_binding.binding = 0;
6141 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6142 dsl_binding.descriptorCount = 1;
6143 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6144 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006145
6146 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006147 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6148 ds_layout_ci.pNext = NULL;
6149 ds_layout_ci.bindingCount = 1;
6150 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006151
6152 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006153 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6154 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006155 ASSERT_VK_SUCCESS(err);
6156
6157 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006158 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006159 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006160 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006161 alloc_info.descriptorPool = ds_pool;
6162 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006163 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6164 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006165
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006166 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006167
Chia-I Wuf7458c52015-10-26 21:10:41 +08006168 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6169 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006170}
6171
Karl Schultz6addd812016-02-02 17:17:23 -07006172TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
6173 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06006174
Karl Schultz6addd812016-02-02 17:17:23 -07006175 m_errorMonitor->SetDesiredFailureMsg(
6176 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6177 "It is invalid to call vkFreeDescriptorSets() with a pool created "
6178 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006179
Tobin Ehlise735c692015-10-08 13:13:50 -06006180 ASSERT_NO_FATAL_FAILURE(InitState());
6181 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06006182
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006183 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006184 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6185 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06006186
6187 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006188 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6189 ds_pool_ci.pNext = NULL;
6190 ds_pool_ci.maxSets = 1;
6191 ds_pool_ci.poolSizeCount = 1;
6192 ds_pool_ci.flags = 0;
6193 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
6194 // app can only call vkResetDescriptorPool on this pool.;
6195 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06006196
6197 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006198 err =
6199 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06006200 ASSERT_VK_SUCCESS(err);
6201
6202 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006203 dsl_binding.binding = 0;
6204 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6205 dsl_binding.descriptorCount = 1;
6206 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6207 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06006208
6209 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006210 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6211 ds_layout_ci.pNext = NULL;
6212 ds_layout_ci.bindingCount = 1;
6213 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06006214
6215 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006216 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6217 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06006218 ASSERT_VK_SUCCESS(err);
6219
6220 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006221 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006222 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006223 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006224 alloc_info.descriptorPool = ds_pool;
6225 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006226 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6227 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06006228 ASSERT_VK_SUCCESS(err);
6229
6230 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006231 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06006232
Chia-I Wuf7458c52015-10-26 21:10:41 +08006233 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6234 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06006235}
6236
Karl Schultz6addd812016-02-02 17:17:23 -07006237TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006238 // Attempt to clear Descriptor Pool with bad object.
6239 // ObjectTracker should catch this.
6240 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6241 "Invalid VkDescriptorPool Object 0xbaad6001");
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006242 uint64_t fake_pool_handle = 0xbaad6001;
6243 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
6244 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06006245 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006246}
6247
Karl Schultz6addd812016-02-02 17:17:23 -07006248TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006249 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
6250 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006251 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06006252 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006253
6254 uint64_t fake_set_handle = 0xbaad6001;
6255 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006256 VkResult err;
6257 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6258 "Invalid VkDescriptorSet Object 0xbaad6001");
6259
6260 ASSERT_NO_FATAL_FAILURE(InitState());
6261
6262 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
6263 layout_bindings[0].binding = 0;
6264 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6265 layout_bindings[0].descriptorCount = 1;
6266 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
6267 layout_bindings[0].pImmutableSamplers = NULL;
6268
6269 VkDescriptorSetLayout descriptor_set_layout;
6270 VkDescriptorSetLayoutCreateInfo dslci = {};
6271 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6272 dslci.pNext = NULL;
6273 dslci.bindingCount = 1;
6274 dslci.pBindings = layout_bindings;
6275 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006276 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006277
6278 VkPipelineLayout pipeline_layout;
6279 VkPipelineLayoutCreateInfo plci = {};
6280 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6281 plci.pNext = NULL;
6282 plci.setLayoutCount = 1;
6283 plci.pSetLayouts = &descriptor_set_layout;
6284 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006285 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006286
6287 BeginCommandBuffer();
6288 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006289 pipeline_layout, 0, 1, &bad_set, 0, NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06006290 m_errorMonitor->VerifyFound();
6291 EndCommandBuffer();
6292 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
6293 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006294}
6295
Karl Schultz6addd812016-02-02 17:17:23 -07006296TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006297 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
6298 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006299 uint64_t fake_layout_handle = 0xbaad6001;
6300 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006301 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6302 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
6303
6304 VkPipelineLayout pipeline_layout;
6305 VkPipelineLayoutCreateInfo plci = {};
6306 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6307 plci.pNext = NULL;
6308 plci.setLayoutCount = 1;
6309 plci.pSetLayouts = &bad_layout;
6310 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
6311
6312 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006313}
6314
Mark Muellerd4914412016-06-13 17:52:06 -06006315TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
6316 TEST_DESCRIPTION("This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
6317 "1) A uniform buffer update must have a valid buffer index."
6318 "2) When using an array of descriptors in a single WriteDescriptor,"
6319 " the descriptor types and stageflags must all be the same."
6320 "3) Immutable Sampler state must match across descriptors");
6321
6322 const char *invalid_BufferInfo_ErrorMessage =
6323 "vkUpdateDescriptorSets: if pDescriptorWrites[0].descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, "
6324 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or "
6325 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pDescriptorWrites[0].pBufferInfo must not be NULL";
6326 const char *stateFlag_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06006327 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006328 const char *immutable_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06006329 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006330
Mark Muellerd4914412016-06-13 17:52:06 -06006331 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_BufferInfo_ErrorMessage);
6332
6333 ASSERT_NO_FATAL_FAILURE(InitState());
6334 VkDescriptorPoolSize ds_type_count[4] = {};
6335 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6336 ds_type_count[0].descriptorCount = 1;
6337 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6338 ds_type_count[1].descriptorCount = 1;
6339 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6340 ds_type_count[2].descriptorCount = 1;
6341 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
6342 ds_type_count[3].descriptorCount = 1;
6343
6344 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6345 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6346 ds_pool_ci.maxSets = 1;
6347 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
6348 ds_pool_ci.pPoolSizes = ds_type_count;
6349
6350 VkDescriptorPool ds_pool;
6351 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6352 ASSERT_VK_SUCCESS(err);
6353
Mark Muellerb9896722016-06-16 09:54:29 -06006354 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006355 layout_binding[0].binding = 0;
6356 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6357 layout_binding[0].descriptorCount = 1;
6358 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6359 layout_binding[0].pImmutableSamplers = NULL;
6360
6361 layout_binding[1].binding = 1;
6362 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6363 layout_binding[1].descriptorCount = 1;
6364 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6365 layout_binding[1].pImmutableSamplers = NULL;
6366
6367 VkSamplerCreateInfo sampler_ci = {};
6368 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6369 sampler_ci.pNext = NULL;
6370 sampler_ci.magFilter = VK_FILTER_NEAREST;
6371 sampler_ci.minFilter = VK_FILTER_NEAREST;
6372 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6373 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6374 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6375 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6376 sampler_ci.mipLodBias = 1.0;
6377 sampler_ci.anisotropyEnable = VK_FALSE;
6378 sampler_ci.maxAnisotropy = 1;
6379 sampler_ci.compareEnable = VK_FALSE;
6380 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6381 sampler_ci.minLod = 1.0;
6382 sampler_ci.maxLod = 1.0;
6383 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6384 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6385 VkSampler sampler;
6386
6387 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6388 ASSERT_VK_SUCCESS(err);
6389
6390 layout_binding[2].binding = 2;
6391 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6392 layout_binding[2].descriptorCount = 1;
6393 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6394 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
6395
Mark Muellerd4914412016-06-13 17:52:06 -06006396 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6397 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6398 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
6399 ds_layout_ci.pBindings = layout_binding;
6400 VkDescriptorSetLayout ds_layout;
6401 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6402 ASSERT_VK_SUCCESS(err);
6403
6404 VkDescriptorSetAllocateInfo alloc_info = {};
6405 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6406 alloc_info.descriptorSetCount = 1;
6407 alloc_info.descriptorPool = ds_pool;
6408 alloc_info.pSetLayouts = &ds_layout;
6409 VkDescriptorSet descriptorSet;
6410 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6411 ASSERT_VK_SUCCESS(err);
6412
6413 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6414 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6415 pipeline_layout_ci.pNext = NULL;
6416 pipeline_layout_ci.setLayoutCount = 1;
6417 pipeline_layout_ci.pSetLayouts = &ds_layout;
6418
6419 VkPipelineLayout pipeline_layout;
6420 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6421 ASSERT_VK_SUCCESS(err);
6422
Mark Mueller5c838ce2016-06-16 09:54:29 -06006423 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006424 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6425 descriptor_write.dstSet = descriptorSet;
6426 descriptor_write.dstBinding = 0;
6427 descriptor_write.descriptorCount = 1;
6428 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6429
Mark Mueller5c838ce2016-06-16 09:54:29 -06006430 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06006431 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6432 m_errorMonitor->VerifyFound();
6433
6434 // Create a buffer to update the descriptor with
6435 uint32_t qfi = 0;
6436 VkBufferCreateInfo buffCI = {};
6437 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6438 buffCI.size = 1024;
6439 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6440 buffCI.queueFamilyIndexCount = 1;
6441 buffCI.pQueueFamilyIndices = &qfi;
6442
6443 VkBuffer dyub;
6444 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6445 ASSERT_VK_SUCCESS(err);
6446 VkDescriptorBufferInfo buffInfo = {};
6447 buffInfo.buffer = dyub;
6448 buffInfo.offset = 0;
6449 buffInfo.range = 1024;
6450
6451 descriptor_write.pBufferInfo = &buffInfo;
6452 descriptor_write.descriptorCount = 2;
6453
Mark Mueller5c838ce2016-06-16 09:54:29 -06006454 // 2) The stateFlags don't match between the first and second descriptor
Mark Muellerd4914412016-06-13 17:52:06 -06006455 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, stateFlag_ErrorMessage);
6456 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6457 m_errorMonitor->VerifyFound();
6458
Mark Mueller5c838ce2016-06-16 09:54:29 -06006459 // 3) The second descriptor has a null_ptr pImmutableSamplers and
6460 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06006461 descriptor_write.dstBinding = 1;
6462 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06006463
6464
6465 // Make pImageInfo index non-null to avoid complaints of it missing
6466 VkDescriptorImageInfo imageInfo = {};
6467 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6468 descriptor_write.pImageInfo = &imageInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06006469 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, immutable_ErrorMessage);
6470 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6471 m_errorMonitor->VerifyFound();
6472
Mark Muellerd4914412016-06-13 17:52:06 -06006473 vkDestroyBuffer(m_device->device(), dyub, NULL);
6474 vkDestroySampler(m_device->device(), sampler, NULL);
6475 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6476 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6477 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6478}
6479
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06006480TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
6481 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6482 "due to a buffer dependency being destroyed.");
6483 ASSERT_NO_FATAL_FAILURE(InitState());
6484
6485 VkImageObj image(m_device);
6486 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
6487 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
6488 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
6489 VK_IMAGE_TILING_OPTIMAL, 0);
6490 ASSERT_TRUE(image.initialized());
6491
6492 VkBuffer buffer;
6493 VkDeviceMemory mem;
6494 VkMemoryRequirements mem_reqs;
6495
6496 VkBufferCreateInfo buf_info = {};
6497 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6498 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6499 buf_info.size = 256;
6500 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6501 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
6502 ASSERT_VK_SUCCESS(err);
6503
6504 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
6505
6506 VkMemoryAllocateInfo alloc_info = {};
6507 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6508 alloc_info.allocationSize = 256;
6509 bool pass = false;
6510 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
6511 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
6512 if (!pass) {
6513 vkDestroyBuffer(m_device->device(), buffer, NULL);
6514 return;
6515 }
6516 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
6517 ASSERT_VK_SUCCESS(err);
6518
6519 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
6520 ASSERT_VK_SUCCESS(err);
6521
6522 VkBufferImageCopy region = {};
6523 region.bufferRowLength = 128;
6524 region.bufferImageHeight = 128;
6525 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6526
6527 region.imageSubresource.layerCount = 1;
6528 region.imageExtent.height = 4;
6529 region.imageExtent.width = 4;
6530 region.imageExtent.depth = 1;
6531 m_commandBuffer->BeginCommandBuffer();
6532 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer,
6533 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
6534 1, &region);
6535 m_commandBuffer->EndCommandBuffer();
6536
6537 m_errorMonitor->SetDesiredFailureMsg(
6538 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6539 " that is invalid because bound buffer ");
6540 // Destroy buffer dependency prior to submit to cause ERROR
6541 vkDestroyBuffer(m_device->device(), buffer, NULL);
6542
6543 VkSubmitInfo submit_info = {};
6544 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6545 submit_info.commandBufferCount = 1;
6546 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6547 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6548
6549 m_errorMonitor->VerifyFound();
6550 vkFreeMemory(m_device->handle(), mem, NULL);
6551}
6552
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006553TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
6554 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6555 "due to an image dependency being destroyed.");
6556 ASSERT_NO_FATAL_FAILURE(InitState());
6557
6558 VkImage image;
6559 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6560 VkImageCreateInfo image_create_info = {};
6561 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6562 image_create_info.pNext = NULL;
6563 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6564 image_create_info.format = tex_format;
6565 image_create_info.extent.width = 32;
6566 image_create_info.extent.height = 32;
6567 image_create_info.extent.depth = 1;
6568 image_create_info.mipLevels = 1;
6569 image_create_info.arrayLayers = 1;
6570 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6571 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6572 image_create_info.usage =
6573 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
6574 image_create_info.flags = 0;
6575 VkResult err =
6576 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6577 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06006578 // Have to bind memory to image before recording cmd in cmd buffer using it
6579 VkMemoryRequirements mem_reqs;
6580 VkDeviceMemory image_mem;
6581 bool pass;
6582 VkMemoryAllocateInfo mem_alloc = {};
6583 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6584 mem_alloc.pNext = NULL;
6585 mem_alloc.memoryTypeIndex = 0;
6586 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
6587 mem_alloc.allocationSize = mem_reqs.size;
6588 pass =
6589 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
6590 ASSERT_TRUE(pass);
6591 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
6592 ASSERT_VK_SUCCESS(err);
6593 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
6594 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006595
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006596 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06006597 VkClearColorValue ccv;
6598 ccv.float32[0] = 1.0f;
6599 ccv.float32[1] = 1.0f;
6600 ccv.float32[2] = 1.0f;
6601 ccv.float32[3] = 1.0f;
6602 VkImageSubresourceRange isr = {};
6603 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06006604 isr.baseArrayLayer = 0;
6605 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06006606 isr.layerCount = 1;
6607 isr.levelCount = 1;
6608 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image,
6609 VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006610 m_commandBuffer->EndCommandBuffer();
6611
6612 m_errorMonitor->SetDesiredFailureMsg(
6613 VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
6614 // Destroy image dependency prior to submit to cause ERROR
6615 vkDestroyImage(m_device->device(), image, NULL);
6616
6617 VkSubmitInfo submit_info = {};
6618 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6619 submit_info.commandBufferCount = 1;
6620 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6621 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6622
6623 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06006624 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006625}
6626
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06006627TEST_F(VkLayerTest, ImageMemoryNotBound) {
6628 TEST_DESCRIPTION(
6629 "Attempt to draw with an image which has not had memory bound to it.");
6630 ASSERT_NO_FATAL_FAILURE(InitState());
6631
6632 VkImage image;
6633 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6634 VkImageCreateInfo image_create_info = {};
6635 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6636 image_create_info.pNext = NULL;
6637 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6638 image_create_info.format = tex_format;
6639 image_create_info.extent.width = 32;
6640 image_create_info.extent.height = 32;
6641 image_create_info.extent.depth = 1;
6642 image_create_info.mipLevels = 1;
6643 image_create_info.arrayLayers = 1;
6644 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6645 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6646 image_create_info.usage =
6647 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
6648 image_create_info.flags = 0;
6649 VkResult err =
6650 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6651 ASSERT_VK_SUCCESS(err);
6652 // Have to bind memory to image before recording cmd in cmd buffer using it
6653 VkMemoryRequirements mem_reqs;
6654 VkDeviceMemory image_mem;
6655 bool pass;
6656 VkMemoryAllocateInfo mem_alloc = {};
6657 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6658 mem_alloc.pNext = NULL;
6659 mem_alloc.memoryTypeIndex = 0;
6660 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
6661 mem_alloc.allocationSize = mem_reqs.size;
6662 pass =
6663 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
6664 ASSERT_TRUE(pass);
6665 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
6666 ASSERT_VK_SUCCESS(err);
6667
6668 // Introduce error, do not call vkBindImageMemory(m_device->device(), image,
6669 // image_mem, 0);
6670 m_errorMonitor->SetDesiredFailureMsg(
6671 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6672 "used without first calling vkBindImageMemory");
6673
6674 m_commandBuffer->BeginCommandBuffer();
6675 VkClearColorValue ccv;
6676 ccv.float32[0] = 1.0f;
6677 ccv.float32[1] = 1.0f;
6678 ccv.float32[2] = 1.0f;
6679 ccv.float32[3] = 1.0f;
6680 VkImageSubresourceRange isr = {};
6681 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6682 isr.baseArrayLayer = 0;
6683 isr.baseMipLevel = 0;
6684 isr.layerCount = 1;
6685 isr.levelCount = 1;
6686 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image,
6687 VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
6688 m_commandBuffer->EndCommandBuffer();
6689
6690 m_errorMonitor->VerifyFound();
6691 vkDestroyImage(m_device->device(), image, NULL);
6692 vkFreeMemory(m_device->device(), image_mem, nullptr);
6693}
6694
6695TEST_F(VkLayerTest, BufferMemoryNotBound) {
6696 TEST_DESCRIPTION(
6697 "Attempt to copy from a buffer which has not had memory bound to it.");
6698 ASSERT_NO_FATAL_FAILURE(InitState());
6699
6700 VkImageObj image(m_device);
6701 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
6702 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
6703 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
6704 VK_IMAGE_TILING_OPTIMAL, 0);
6705 ASSERT_TRUE(image.initialized());
6706
6707 VkBuffer buffer;
6708 VkDeviceMemory mem;
6709 VkMemoryRequirements mem_reqs;
6710
6711 VkBufferCreateInfo buf_info = {};
6712 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6713 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6714 buf_info.size = 256;
6715 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6716 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
6717 ASSERT_VK_SUCCESS(err);
6718
6719 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
6720
6721 VkMemoryAllocateInfo alloc_info = {};
6722 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6723 alloc_info.allocationSize = 256;
6724 bool pass = false;
6725 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
6726 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
6727 if (!pass) {
6728 vkDestroyBuffer(m_device->device(), buffer, NULL);
6729 return;
6730 }
6731 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
6732 ASSERT_VK_SUCCESS(err);
6733
6734 // Introduce failure by not calling vkBindBufferMemory(m_device->device(),
6735 // buffer, mem, 0);
6736 m_errorMonitor->SetDesiredFailureMsg(
6737 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6738 "used without first calling vkBindBufferMemory");
6739 VkBufferImageCopy region = {};
6740 region.bufferRowLength = 128;
6741 region.bufferImageHeight = 128;
6742 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6743
6744 region.imageSubresource.layerCount = 1;
6745 region.imageExtent.height = 4;
6746 region.imageExtent.width = 4;
6747 region.imageExtent.depth = 1;
6748 m_commandBuffer->BeginCommandBuffer();
6749 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer,
6750 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
6751 1, &region);
6752 m_commandBuffer->EndCommandBuffer();
6753
6754 m_errorMonitor->VerifyFound();
6755
6756 vkDestroyBuffer(m_device->device(), buffer, NULL);
6757 vkFreeMemory(m_device->handle(), mem, NULL);
6758}
6759
Tobin Ehlis85940f52016-07-07 16:57:21 -06006760TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
6761 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6762 "due to an event dependency being destroyed.");
6763 ASSERT_NO_FATAL_FAILURE(InitState());
6764
6765 VkEvent event;
6766 VkEventCreateInfo evci = {};
6767 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
6768 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
6769 ASSERT_VK_SUCCESS(result);
6770
6771 m_commandBuffer->BeginCommandBuffer();
6772 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event,
6773 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
6774 m_commandBuffer->EndCommandBuffer();
6775
6776 m_errorMonitor->SetDesiredFailureMsg(
6777 VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
6778 // Destroy event dependency prior to submit to cause ERROR
6779 vkDestroyEvent(m_device->device(), event, NULL);
6780
6781 VkSubmitInfo submit_info = {};
6782 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6783 submit_info.commandBufferCount = 1;
6784 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6785 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6786
6787 m_errorMonitor->VerifyFound();
6788}
6789
Tobin Ehlisdbea7552016-07-08 14:33:31 -06006790TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
6791 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6792 "due to a query pool dependency being destroyed.");
6793 ASSERT_NO_FATAL_FAILURE(InitState());
6794
6795 VkQueryPool query_pool;
6796 VkQueryPoolCreateInfo qpci{};
6797 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
6798 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
6799 qpci.queryCount = 1;
6800 VkResult result =
6801 vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
6802 ASSERT_VK_SUCCESS(result);
6803
6804 m_commandBuffer->BeginCommandBuffer();
6805 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
6806 m_commandBuffer->EndCommandBuffer();
6807
6808 m_errorMonitor->SetDesiredFailureMsg(
6809 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6810 " that is invalid because bound query pool ");
6811 // Destroy query pool dependency prior to submit to cause ERROR
6812 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
6813
6814 VkSubmitInfo submit_info = {};
6815 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6816 submit_info.commandBufferCount = 1;
6817 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6818 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6819
6820 m_errorMonitor->VerifyFound();
6821}
6822
Tobin Ehlis24130d92016-07-08 15:50:53 -06006823TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
6824 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6825 "due to a pipeline dependency being destroyed.");
6826 ASSERT_NO_FATAL_FAILURE(InitState());
6827 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6828
6829 VkResult err;
6830
6831 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6832 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6833
6834 VkPipelineLayout pipeline_layout;
6835 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6836 &pipeline_layout);
6837 ASSERT_VK_SUCCESS(err);
6838
6839 VkPipelineViewportStateCreateInfo vp_state_ci = {};
6840 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
6841 vp_state_ci.viewportCount = 1;
6842 VkViewport vp = {}; // Just need dummy vp to point to
6843 vp_state_ci.pViewports = &vp; // Null vp w/ count of 1 should cause error
6844 vp_state_ci.scissorCount = 1;
6845 VkRect2D scissors = {}; // Dummy scissors to point to
6846 vp_state_ci.pScissors = &scissors;
6847 // No dynamic state
6848 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
6849 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
6850
6851 VkPipelineShaderStageCreateInfo shaderStages[2];
6852 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
6853
6854 VkShaderObj vs(m_device, bindStateVertShaderText,
6855 VK_SHADER_STAGE_VERTEX_BIT, this);
6856 VkShaderObj fs(m_device, bindStateFragShaderText,
6857 VK_SHADER_STAGE_FRAGMENT_BIT,
6858 this); // We shouldn't need a fragment shader
6859 // but add it to be able to run on more devices
6860 shaderStages[0] = vs.GetStageCreateInfo();
6861 shaderStages[1] = fs.GetStageCreateInfo();
6862
6863 VkPipelineVertexInputStateCreateInfo vi_ci = {};
6864 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
6865
6866 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
6867 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
6868 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
6869
6870 VkPipelineRasterizationStateCreateInfo rs_ci = {};
6871 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
6872
6873 VkPipelineColorBlendAttachmentState att = {};
6874 att.blendEnable = VK_FALSE;
6875 att.colorWriteMask = 0xf;
6876
6877 VkPipelineColorBlendStateCreateInfo cb_ci = {};
6878 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
6879 cb_ci.attachmentCount = 1;
6880 cb_ci.pAttachments = &att;
6881
6882 VkGraphicsPipelineCreateInfo gp_ci = {};
6883 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
6884 gp_ci.stageCount = 2;
6885 gp_ci.pStages = shaderStages;
6886 gp_ci.pVertexInputState = &vi_ci;
6887 gp_ci.pInputAssemblyState = &ia_ci;
6888 gp_ci.pViewportState = &vp_state_ci;
6889 gp_ci.pRasterizationState = &rs_ci;
6890 gp_ci.pColorBlendState = &cb_ci;
6891 gp_ci.pDynamicState = &dyn_state_ci;
6892 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
6893 gp_ci.layout = pipeline_layout;
6894 gp_ci.renderPass = renderPass();
6895
6896 VkPipelineCacheCreateInfo pc_ci = {};
6897 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
6898
6899 VkPipeline pipeline;
6900 VkPipelineCache pipelineCache;
6901 err =
6902 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
6903 ASSERT_VK_SUCCESS(err);
6904
6905 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
6906 &gp_ci, NULL, &pipeline);
6907 ASSERT_VK_SUCCESS(err);
6908
6909 m_commandBuffer->BeginCommandBuffer();
6910 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6911 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
6912 m_commandBuffer->EndCommandBuffer();
6913 // Now destroy pipeline in order to cause error when submitting
6914 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
6915
6916 m_errorMonitor->SetDesiredFailureMsg(
6917 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6918 " that is invalid because bound pipeline ");
6919
6920 VkSubmitInfo submit_info = {};
6921 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6922 submit_info.commandBufferCount = 1;
6923 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6924 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6925
6926 m_errorMonitor->VerifyFound();
6927 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
6928 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6929}
6930
Karl Schultz6addd812016-02-02 17:17:23 -07006931TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006932 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6933 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006934 // Create a valid cmd buffer
6935 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006936 uint64_t fake_pipeline_handle = 0xbaad6001;
6937 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6939 "Invalid VkPipeline Object 0xbaad6001");
6940 ASSERT_NO_FATAL_FAILURE(InitState());
6941 BeginCommandBuffer();
6942 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6943 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
6944 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006945 // Now issue a draw call with no pipeline bound
6946 m_errorMonitor->SetDesiredFailureMsg(
6947 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6948 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tony Barbourdf4c0042016-06-01 15:55:43 -06006949
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006950 BeginCommandBuffer();
6951 Draw(1, 0, 0, 0);
6952 m_errorMonitor->VerifyFound();
6953 // Finally same check once more but with Dispatch/Compute
6954 m_errorMonitor->SetDesiredFailureMsg(
6955 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6956 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006957 BeginCommandBuffer();
6958 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6959 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006960}
6961
Karl Schultz6addd812016-02-02 17:17:23 -07006962TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
6963 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
6964 // CommandBuffer
6965 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006966
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006968 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006969
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006970 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006971 ASSERT_NO_FATAL_FAILURE(InitViewport());
6972 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006973 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006974 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6975 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006976
6977 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006978 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6979 ds_pool_ci.pNext = NULL;
6980 ds_pool_ci.maxSets = 1;
6981 ds_pool_ci.poolSizeCount = 1;
6982 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006983
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006984 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006985 err =
6986 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006987 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006988
Tony Barboureb254902015-07-15 12:50:33 -06006989 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006990 dsl_binding.binding = 0;
6991 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6992 dsl_binding.descriptorCount = 1;
6993 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6994 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006995
Tony Barboureb254902015-07-15 12:50:33 -06006996 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006997 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6998 ds_layout_ci.pNext = NULL;
6999 ds_layout_ci.bindingCount = 1;
7000 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007001 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007002 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7003 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007004 ASSERT_VK_SUCCESS(err);
7005
7006 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007007 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007008 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007009 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007010 alloc_info.descriptorPool = ds_pool;
7011 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007012 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7013 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007014 ASSERT_VK_SUCCESS(err);
7015
Tony Barboureb254902015-07-15 12:50:33 -06007016 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007017 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7018 pipeline_layout_ci.pNext = NULL;
7019 pipeline_layout_ci.setLayoutCount = 1;
7020 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007021
7022 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007023 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7024 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007025 ASSERT_VK_SUCCESS(err);
7026
Karl Schultz6addd812016-02-02 17:17:23 -07007027 VkShaderObj vs(m_device, bindStateVertShaderText,
7028 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06007029 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07007030 // on more devices
7031 VkShaderObj fs(m_device, bindStateFragShaderText,
7032 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007033
Tony Barbourc95e4ac2015-08-04 17:05:26 -06007034 VkPipelineObj pipe(m_device);
7035 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06007036 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06007037 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06007038 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06007039
7040 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007041 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7042 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7043 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7044 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7045 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007046
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007047 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007048
Chia-I Wuf7458c52015-10-26 21:10:41 +08007049 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7050 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7051 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007052}
7053
Karl Schultz6addd812016-02-02 17:17:23 -07007054TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007055 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07007056 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007057
Karl Schultz6addd812016-02-02 17:17:23 -07007058 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007059 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
7060 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007061
7062 ASSERT_NO_FATAL_FAILURE(InitState());
7063 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007064 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7065 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007066
7067 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007068 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7069 ds_pool_ci.pNext = NULL;
7070 ds_pool_ci.maxSets = 1;
7071 ds_pool_ci.poolSizeCount = 1;
7072 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007073
7074 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007075 err =
7076 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007077 ASSERT_VK_SUCCESS(err);
7078
7079 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007080 dsl_binding.binding = 0;
7081 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7082 dsl_binding.descriptorCount = 1;
7083 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7084 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007085
7086 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007087 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7088 ds_layout_ci.pNext = NULL;
7089 ds_layout_ci.bindingCount = 1;
7090 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007091 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007092 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7093 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007094 ASSERT_VK_SUCCESS(err);
7095
7096 VkDescriptorSet descriptorSet;
7097 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007098 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007099 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007100 alloc_info.descriptorPool = ds_pool;
7101 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007102 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7103 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007104 ASSERT_VK_SUCCESS(err);
7105
Karl Schultz6addd812016-02-02 17:17:23 -07007106 VkBufferView view =
7107 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007108 VkWriteDescriptorSet descriptor_write;
7109 memset(&descriptor_write, 0, sizeof(descriptor_write));
7110 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7111 descriptor_write.dstSet = descriptorSet;
7112 descriptor_write.dstBinding = 0;
7113 descriptor_write.descriptorCount = 1;
7114 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7115 descriptor_write.pTexelBufferView = &view;
7116
7117 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7118
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007119 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007120
7121 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7122 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7123}
7124
Mark Youngd339ba32016-05-30 13:28:35 -06007125TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
7126 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has"
7127 " no memory bound to it.");
7128
7129 VkResult err;
7130 m_errorMonitor->SetDesiredFailureMsg(
7131 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -06007132 "used without first calling vkBindBufferMemory");
Mark Youngd339ba32016-05-30 13:28:35 -06007133
7134 ASSERT_NO_FATAL_FAILURE(InitState());
7135
7136 // Create a buffer with no bound memory and then attempt to create
7137 // a buffer view.
7138 VkBufferCreateInfo buff_ci = {};
7139 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7140 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7141 buff_ci.size = 256;
7142 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7143 VkBuffer buffer;
7144 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
7145 ASSERT_VK_SUCCESS(err);
7146
7147 VkBufferViewCreateInfo buff_view_ci = {};
7148 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
7149 buff_view_ci.buffer = buffer;
7150 buff_view_ci.format = VK_FORMAT_R8_UNORM;
7151 buff_view_ci.range = VK_WHOLE_SIZE;
7152 VkBufferView buff_view;
7153 err =
7154 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
7155
7156 m_errorMonitor->VerifyFound();
7157 vkDestroyBuffer(m_device->device(), buffer, NULL);
7158 // If last error is success, it still created the view, so delete it.
7159 if (err == VK_SUCCESS) {
7160 vkDestroyBufferView(m_device->device(), buff_view, NULL);
7161 }
7162}
7163
Karl Schultz6addd812016-02-02 17:17:23 -07007164TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
7165 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
7166 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07007167 // 1. No dynamicOffset supplied
7168 // 2. Too many dynamicOffsets supplied
7169 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07007170 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007172 " requires 1 dynamicOffsets, but only "
7173 "0 dynamicOffsets are left in "
7174 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007175
7176 ASSERT_NO_FATAL_FAILURE(InitState());
7177 ASSERT_NO_FATAL_FAILURE(InitViewport());
7178 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7179
7180 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007181 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7182 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007183
7184 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007185 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7186 ds_pool_ci.pNext = NULL;
7187 ds_pool_ci.maxSets = 1;
7188 ds_pool_ci.poolSizeCount = 1;
7189 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007190
7191 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007192 err =
7193 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007194 ASSERT_VK_SUCCESS(err);
7195
7196 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007197 dsl_binding.binding = 0;
7198 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7199 dsl_binding.descriptorCount = 1;
7200 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7201 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007202
7203 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007204 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7205 ds_layout_ci.pNext = NULL;
7206 ds_layout_ci.bindingCount = 1;
7207 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007208 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007209 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7210 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007211 ASSERT_VK_SUCCESS(err);
7212
7213 VkDescriptorSet descriptorSet;
7214 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007215 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007216 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007217 alloc_info.descriptorPool = ds_pool;
7218 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007219 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7220 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007221 ASSERT_VK_SUCCESS(err);
7222
7223 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007224 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7225 pipeline_layout_ci.pNext = NULL;
7226 pipeline_layout_ci.setLayoutCount = 1;
7227 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007228
7229 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007230 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7231 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007232 ASSERT_VK_SUCCESS(err);
7233
7234 // Create a buffer to update the descriptor with
7235 uint32_t qfi = 0;
7236 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007237 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7238 buffCI.size = 1024;
7239 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7240 buffCI.queueFamilyIndexCount = 1;
7241 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007242
7243 VkBuffer dyub;
7244 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7245 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007246 // Allocate memory and bind to buffer so we can make it to the appropriate
7247 // error
7248 VkMemoryAllocateInfo mem_alloc = {};
7249 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7250 mem_alloc.pNext = NULL;
7251 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12007252 mem_alloc.memoryTypeIndex = 0;
7253
7254 VkMemoryRequirements memReqs;
7255 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
7256 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc,
7257 0);
7258 if (!pass) {
7259 vkDestroyBuffer(m_device->device(), dyub, NULL);
7260 return;
7261 }
7262
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007263 VkDeviceMemory mem;
7264 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
7265 ASSERT_VK_SUCCESS(err);
7266 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
7267 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007268 // Correctly update descriptor to avoid "NOT_UPDATED" error
7269 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007270 buffInfo.buffer = dyub;
7271 buffInfo.offset = 0;
7272 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007273
7274 VkWriteDescriptorSet descriptor_write;
7275 memset(&descriptor_write, 0, sizeof(descriptor_write));
7276 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7277 descriptor_write.dstSet = descriptorSet;
7278 descriptor_write.dstBinding = 0;
7279 descriptor_write.descriptorCount = 1;
7280 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7281 descriptor_write.pBufferInfo = &buffInfo;
7282
7283 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7284
7285 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007286 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7287 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7288 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007289 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07007290 uint32_t pDynOff[2] = {512, 756};
7291 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07007292 m_errorMonitor->SetDesiredFailureMsg(
7293 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07007294 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07007295 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7296 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7297 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12007298 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07007299 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007300 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7301 " dynamic offset 512 combined with "
7302 "offset 0 and range 1024 that "
7303 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07007304 // Create PSO to be used for draw-time errors below
7305 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007306 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007307 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007308 "out gl_PerVertex { \n"
7309 " vec4 gl_Position;\n"
7310 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007311 "void main(){\n"
7312 " gl_Position = vec4(1);\n"
7313 "}\n";
7314 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007315 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007316 "\n"
7317 "layout(location=0) out vec4 x;\n"
7318 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7319 "void main(){\n"
7320 " x = vec4(bar.y);\n"
7321 "}\n";
7322 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7323 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7324 VkPipelineObj pipe(m_device);
7325 pipe.AddShader(&vs);
7326 pipe.AddShader(&fs);
7327 pipe.AddColorAttachment();
7328 pipe.CreateVKPipeline(pipeline_layout, renderPass());
7329
Karl Schultz6addd812016-02-02 17:17:23 -07007330 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7331 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7332 // This update should succeed, but offset size of 512 will overstep buffer
7333 // /w range 1024 & size 1024
7334 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7335 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7336 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07007337 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007338 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007339
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007340 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06007341 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007342
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007343 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007344 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007345 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7346}
7347
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007348TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007349 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007350 ASSERT_NO_FATAL_FAILURE(InitState());
7351 ASSERT_NO_FATAL_FAILURE(InitViewport());
7352 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7353
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007354 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007355 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007356 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7357 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7358 pipeline_layout_ci.pushConstantRangeCount = 1;
7359 pipeline_layout_ci.pPushConstantRanges = &pc_range;
7360
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007361 //
7362 // Check for invalid push constant ranges in pipeline layouts.
7363 //
7364 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007365 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007366 char const *msg;
7367 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007368
Karl Schultzc81037d2016-05-12 08:11:23 -06007369 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
7370 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
7371 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7372 "vkCreatePipelineLayout() call has push constants index 0 with "
7373 "size 0."},
7374 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7375 "vkCreatePipelineLayout() call has push constants index 0 with "
7376 "size 1."},
7377 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
7378 "vkCreatePipelineLayout() call has push constants index 0 with "
7379 "size 1."},
7380 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
7381 "vkCreatePipelineLayout() call has push constants index 0 with "
7382 "size 0."},
7383 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7384 "vkCreatePipelineLayout() call has push constants index 0 with "
7385 "offset 1. Offset must"},
7386 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
7387 "vkCreatePipelineLayout() call has push constants index 0 "
7388 "with offset "},
7389 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
7390 "vkCreatePipelineLayout() call has push constants "
7391 "index 0 with offset "},
7392 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
7393 "vkCreatePipelineLayout() call has push constants index 0 "
7394 "with offset "},
7395 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
7396 "vkCreatePipelineLayout() call has push "
7397 "constants index 0 with offset "},
7398 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
7399 "vkCreatePipelineLayout() call has push "
7400 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007401 }};
7402
7403 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06007404 for (const auto &iter : range_tests) {
7405 pc_range = iter.range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007406 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7407 iter.msg);
7408 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7409 NULL, &pipeline_layout);
7410 m_errorMonitor->VerifyFound();
7411 if (VK_SUCCESS == err) {
7412 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7413 }
7414 }
7415
7416 // Check for invalid stage flag
7417 pc_range.offset = 0;
7418 pc_range.size = 16;
7419 pc_range.stageFlags = 0;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007420 m_errorMonitor->SetDesiredFailureMsg(
7421 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007422 "vkCreatePipelineLayout() call has no stageFlags set.");
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007423 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7424 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007425 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007426 if (VK_SUCCESS == err) {
7427 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7428 }
7429
7430 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06007431 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007432 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007433 VkPushConstantRange const ranges[ranges_per_test];
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007434 char const *msg;
7435 };
7436
Karl Schultzc81037d2016-05-12 08:11:23 -06007437 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007438 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7439 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7440 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7441 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7442 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7443 "vkCreatePipelineLayout() call has push constants with overlapping "
7444 "ranges: 0:[0, 4), 1:[0, 4)"},
7445 {
7446 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7447 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7448 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7449 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7450 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
7451 "vkCreatePipelineLayout() call has push constants with "
7452 "overlapping "
7453 "ranges: 3:[12, 20), 4:[16, 20)",
7454 },
7455 {
7456 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7457 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7458 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7459 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7460 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7461 "vkCreatePipelineLayout() call has push constants with "
7462 "overlapping "
7463 "ranges: 0:[16, 20), 1:[12, 20)",
7464 },
7465 {
7466 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7467 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7468 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7469 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7470 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7471 "vkCreatePipelineLayout() call has push constants with "
7472 "overlapping "
7473 "ranges: 0:[16, 20), 3:[12, 20)",
7474 },
7475 {
7476 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7477 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
7478 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
7479 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
7480 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
7481 "vkCreatePipelineLayout() call has push constants with "
7482 "overlapping "
7483 "ranges: 0:[16, 20), 2:[4, 100)",
7484 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007485
Karl Schultzc81037d2016-05-12 08:11:23 -06007486 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007487 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06007488 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
7489 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007490 iter.msg);
7491 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7492 NULL, &pipeline_layout);
7493 m_errorMonitor->VerifyFound();
7494 if (VK_SUCCESS == err) {
7495 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7496 }
7497 }
7498
7499 // Run some positive tests to make sure overlap checking in the layer is OK
Karl Schultzc81037d2016-05-12 08:11:23 -06007500 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos =
7501 {{{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7502 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7503 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7504 {VK_SHADER_STAGE_VERTEX_BIT, 12, 4},
7505 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
7506 ""},
7507 {{{VK_SHADER_STAGE_VERTEX_BIT, 92, 24},
7508 {VK_SHADER_STAGE_VERTEX_BIT, 80, 4},
7509 {VK_SHADER_STAGE_VERTEX_BIT, 64, 8},
7510 {VK_SHADER_STAGE_VERTEX_BIT, 4, 16},
7511 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7512 ""}}};
7513 for (const auto &iter : overlapping_range_tests_pos) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007514 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
7515 m_errorMonitor->ExpectSuccess();
7516 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7517 NULL, &pipeline_layout);
7518 m_errorMonitor->VerifyNotFound();
7519 if (VK_SUCCESS == err) {
7520 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7521 }
7522 }
7523
7524 //
7525 // CmdPushConstants tests
7526 //
Karl Schultzc81037d2016-05-12 08:11:23 -06007527 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007528
7529 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzc81037d2016-05-12 08:11:23 -06007530 const std::array<PipelineLayoutTestCase, 16> cmd_range_tests = {{
7531 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7532 "vkCmdPushConstants() call has push constants with size 0. Size "
7533 "must be greater than zero and a multiple of 4."},
7534 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7535 "vkCmdPushConstants() call has push constants with size 1. Size "
7536 "must be greater than zero and a multiple of 4."},
7537 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
7538 "vkCmdPushConstants() call has push constants with size 1. Size "
7539 "must be greater than zero and a multiple of 4."},
7540 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
7541 "vkCmdPushConstants() call has push constants with offset 1. "
7542 "Offset must be a multiple of 4."},
7543 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7544 "vkCmdPushConstants() call has push constants with offset 1. "
7545 "Offset must be a multiple of 4."},
7546 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
7547 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
7548 "0x1 not within flag-matching ranges in pipeline layout"},
7549 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
7550 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
7551 "0x1 not within flag-matching ranges in pipeline layout"},
7552 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
7553 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
7554 "0x1 not within flag-matching ranges in pipeline layout"},
7555 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
7556 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
7557 "0x1 not within flag-matching ranges in pipeline layout"},
7558 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
7559 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
7560 "any of the ranges in pipeline layout"},
7561 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7562 0, 16},
7563 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
7564 "any of the ranges in pipeline layout"},
7565 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007566 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007567 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007568 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007569 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007570 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007571 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007572 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007573 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007574 "vkCmdPushConstants() call has push constants with offset "},
7575 }};
7576
7577 // Two ranges for testing robustness
Karl Schultzc81037d2016-05-12 08:11:23 -06007578 const VkPushConstantRange pc_range2[] = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007579 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06007580 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007581 };
Karl Schultzc81037d2016-05-12 08:11:23 -06007582 pipeline_layout_ci.pushConstantRangeCount =
7583 sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007584 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007585 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7586 &pipeline_layout);
7587 ASSERT_VK_SUCCESS(err);
7588 BeginCommandBuffer();
Karl Schultzc81037d2016-05-12 08:11:23 -06007589 for (const auto &iter : cmd_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007590 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7591 iter.msg);
7592 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
Karl Schultzc81037d2016-05-12 08:11:23 -06007593 iter.range.stageFlags, iter.range.offset,
7594 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007595 m_errorMonitor->VerifyFound();
7596 }
7597
7598 // Check for invalid stage flag
7599 m_errorMonitor->SetDesiredFailureMsg(
7600 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7601 "vkCmdPushConstants() call has no stageFlags set.");
7602 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0,
Karl Schultzc81037d2016-05-12 08:11:23 -06007603 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007604 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06007605 EndCommandBuffer();
7606 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
7607 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007608
Karl Schultzc81037d2016-05-12 08:11:23 -06007609 // overlapping range tests with cmd
7610 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
7611 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
7612 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
7613 "0x1 not within flag-matching ranges in pipeline layout"},
7614 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7615 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
7616 "0x1 not within flag-matching ranges in pipeline layout"},
7617 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
7618 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
7619 "0x1 not within flag-matching ranges in pipeline layout"},
7620 }};
7621 const VkPushConstantRange pc_range3[] = {
7622 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
7623 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7624 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7625 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
7626 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
7627 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
7628 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
7629 };
7630 pipeline_layout_ci.pushConstantRangeCount =
7631 sizeof(pc_range3) / sizeof(VkPushConstantRange);
7632 pipeline_layout_ci.pPushConstantRanges = pc_range3;
7633 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7634 &pipeline_layout);
7635 ASSERT_VK_SUCCESS(err);
7636 BeginCommandBuffer();
7637 for (const auto &iter : cmd_overlap_tests) {
7638 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7639 iter.msg);
7640 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
7641 iter.range.stageFlags, iter.range.offset,
7642 iter.range.size, dummy_values);
7643 m_errorMonitor->VerifyFound();
7644 }
7645 EndCommandBuffer();
7646 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
7647 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7648
7649 // positive overlapping range tests with cmd
7650 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = {{
7651 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, ""},
7652 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4}, ""},
7653 {{VK_SHADER_STAGE_VERTEX_BIT, 20, 12}, ""},
7654 {{VK_SHADER_STAGE_VERTEX_BIT, 56, 36}, ""},
7655 }};
7656 const VkPushConstantRange pc_range4[] = {
7657 {VK_SHADER_STAGE_VERTEX_BIT, 0, 64},
7658 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
7659 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7660 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7661 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
7662 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
7663 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
7664 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
7665 };
7666 pipeline_layout_ci.pushConstantRangeCount =
7667 sizeof(pc_range4) / sizeof(VkPushConstantRange);
7668 pipeline_layout_ci.pPushConstantRanges = pc_range4;
7669 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7670 &pipeline_layout);
7671 ASSERT_VK_SUCCESS(err);
7672 BeginCommandBuffer();
7673 for (const auto &iter : cmd_overlap_tests_pos) {
7674 m_errorMonitor->ExpectSuccess();
7675 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
7676 iter.range.stageFlags, iter.range.offset,
7677 iter.range.size, dummy_values);
7678 m_errorMonitor->VerifyNotFound();
7679 }
7680 EndCommandBuffer();
7681 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007682 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7683}
7684
Karl Schultz6addd812016-02-02 17:17:23 -07007685TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007686 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007687 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007688
7689 ASSERT_NO_FATAL_FAILURE(InitState());
7690 ASSERT_NO_FATAL_FAILURE(InitViewport());
7691 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7692
Mike Stroyanb8a61002016-06-20 16:00:28 -06007693 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
7694 VkImageTiling tiling;
7695 VkFormatProperties format_properties;
7696 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
7697 if (format_properties.linearTilingFeatures &
7698 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
7699 tiling = VK_IMAGE_TILING_LINEAR;
7700 } else if (format_properties.optimalTilingFeatures &
7701 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
7702 tiling = VK_IMAGE_TILING_OPTIMAL;
7703 } else {
7704 printf("Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
7705 "skipped.\n");
7706 return;
7707 }
7708
Tobin Ehlis559c6382015-11-05 09:52:49 -07007709 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7710 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007711 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7712 ds_type_count[0].descriptorCount = 10;
7713 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7714 ds_type_count[1].descriptorCount = 2;
7715 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7716 ds_type_count[2].descriptorCount = 2;
7717 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7718 ds_type_count[3].descriptorCount = 5;
7719 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7720 // type
7721 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7722 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7723 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007724
7725 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007726 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7727 ds_pool_ci.pNext = NULL;
7728 ds_pool_ci.maxSets = 5;
7729 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7730 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007731
7732 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007733 err =
7734 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007735 ASSERT_VK_SUCCESS(err);
7736
7737 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7738 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007739 dsl_binding[0].binding = 0;
7740 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7741 dsl_binding[0].descriptorCount = 5;
7742 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7743 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007744
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007745 // Create layout identical to set0 layout but w/ different stageFlags
7746 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007747 dsl_fs_stage_only.binding = 0;
7748 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7749 dsl_fs_stage_only.descriptorCount = 5;
7750 dsl_fs_stage_only.stageFlags =
7751 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7752 // bind time
7753 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007754 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007755 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7756 ds_layout_ci.pNext = NULL;
7757 ds_layout_ci.bindingCount = 1;
7758 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007759 static const uint32_t NUM_LAYOUTS = 4;
7760 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007761 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007762 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7763 // layout for error case
7764 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7765 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007766 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007767 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07007768 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7769 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007770 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007771 dsl_binding[0].binding = 0;
7772 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007773 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007774 dsl_binding[1].binding = 1;
7775 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7776 dsl_binding[1].descriptorCount = 2;
7777 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7778 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007779 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007780 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07007781 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7782 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007783 ASSERT_VK_SUCCESS(err);
7784 dsl_binding[0].binding = 0;
7785 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007786 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007787 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007788 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7789 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007790 ASSERT_VK_SUCCESS(err);
7791 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007792 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07007793 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7794 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007795 ASSERT_VK_SUCCESS(err);
7796
7797 static const uint32_t NUM_SETS = 4;
7798 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7799 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007800 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007801 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007802 alloc_info.descriptorPool = ds_pool;
7803 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007804 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7805 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007806 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007807 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007808 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007809 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07007810 err =
7811 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007812 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007813
7814 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007815 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7816 pipeline_layout_ci.pNext = NULL;
7817 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7818 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007819
7820 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007821 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7822 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007823 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007824 // Create pipelineLayout with only one setLayout
7825 pipeline_layout_ci.setLayoutCount = 1;
7826 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007827 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7828 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007829 ASSERT_VK_SUCCESS(err);
7830 // Create pipelineLayout with 2 descriptor setLayout at index 0
7831 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7832 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07007833 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7834 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007835 ASSERT_VK_SUCCESS(err);
7836 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7837 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7838 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07007839 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7840 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007841 ASSERT_VK_SUCCESS(err);
7842 // Create pipelineLayout with UB type, but stageFlags for FS only
7843 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7844 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07007845 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7846 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007847 ASSERT_VK_SUCCESS(err);
7848 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7849 VkDescriptorSetLayout pl_bad_s0[2] = {};
7850 pl_bad_s0[0] = ds_layout_fs_only;
7851 pl_bad_s0[1] = ds_layout[1];
7852 pipeline_layout_ci.setLayoutCount = 2;
7853 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7854 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07007855 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7856 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007857 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007858
7859 // Create a buffer to update the descriptor with
7860 uint32_t qfi = 0;
7861 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007862 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7863 buffCI.size = 1024;
7864 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7865 buffCI.queueFamilyIndexCount = 1;
7866 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007867
7868 VkBuffer dyub;
7869 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7870 ASSERT_VK_SUCCESS(err);
7871 // Correctly update descriptor to avoid "NOT_UPDATED" error
7872 static const uint32_t NUM_BUFFS = 5;
7873 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007874 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007875 buffInfo[i].buffer = dyub;
7876 buffInfo[i].offset = 0;
7877 buffInfo[i].range = 1024;
7878 }
Karl Schultz6addd812016-02-02 17:17:23 -07007879 VkImage image;
Karl Schultz6addd812016-02-02 17:17:23 -07007880 const int32_t tex_width = 32;
7881 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007882 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007883 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7884 image_create_info.pNext = NULL;
7885 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7886 image_create_info.format = tex_format;
7887 image_create_info.extent.width = tex_width;
7888 image_create_info.extent.height = tex_height;
7889 image_create_info.extent.depth = 1;
7890 image_create_info.mipLevels = 1;
7891 image_create_info.arrayLayers = 1;
7892 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyanb8a61002016-06-20 16:00:28 -06007893 image_create_info.tiling = tiling;
7894 image_create_info.usage =
7895 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07007896 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007897 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7898 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007899
Karl Schultz6addd812016-02-02 17:17:23 -07007900 VkMemoryRequirements memReqs;
7901 VkDeviceMemory imageMem;
7902 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007903 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007904 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7905 memAlloc.pNext = NULL;
7906 memAlloc.allocationSize = 0;
7907 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007908 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
7909 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007910 pass =
7911 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007912 ASSERT_TRUE(pass);
7913 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
7914 ASSERT_VK_SUCCESS(err);
7915 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
7916 ASSERT_VK_SUCCESS(err);
7917
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007918 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007919 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
7920 image_view_create_info.image = image;
7921 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7922 image_view_create_info.format = tex_format;
7923 image_view_create_info.subresourceRange.layerCount = 1;
7924 image_view_create_info.subresourceRange.baseMipLevel = 0;
7925 image_view_create_info.subresourceRange.levelCount = 1;
7926 image_view_create_info.subresourceRange.aspectMask =
7927 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007928
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007929 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007930 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7931 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007932 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007933 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007934 imageInfo[0].imageView = view;
7935 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
7936 imageInfo[1].imageView = view;
7937 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007938 imageInfo[2].imageView = view;
7939 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
7940 imageInfo[3].imageView = view;
7941 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007942
7943 static const uint32_t NUM_SET_UPDATES = 3;
7944 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
7945 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7946 descriptor_write[0].dstSet = descriptorSet[0];
7947 descriptor_write[0].dstBinding = 0;
7948 descriptor_write[0].descriptorCount = 5;
7949 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7950 descriptor_write[0].pBufferInfo = buffInfo;
7951 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7952 descriptor_write[1].dstSet = descriptorSet[1];
7953 descriptor_write[1].dstBinding = 0;
7954 descriptor_write[1].descriptorCount = 2;
7955 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7956 descriptor_write[1].pImageInfo = imageInfo;
7957 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7958 descriptor_write[2].dstSet = descriptorSet[1];
7959 descriptor_write[2].dstBinding = 1;
7960 descriptor_write[2].descriptorCount = 2;
7961 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007962 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007963
7964 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007965
Tobin Ehlis88452832015-12-03 09:40:56 -07007966 // Create PSO to be used for draw-time errors below
7967 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007968 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07007969 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007970 "out gl_PerVertex {\n"
7971 " vec4 gl_Position;\n"
7972 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07007973 "void main(){\n"
7974 " gl_Position = vec4(1);\n"
7975 "}\n";
7976 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007977 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07007978 "\n"
7979 "layout(location=0) out vec4 x;\n"
7980 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7981 "void main(){\n"
7982 " x = vec4(bar.y);\n"
7983 "}\n";
7984 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7985 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007986 VkPipelineObj pipe(m_device);
7987 pipe.AddShader(&vs);
7988 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007989 pipe.AddColorAttachment();
7990 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007991
7992 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07007993
Karl Schultz6addd812016-02-02 17:17:23 -07007994 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7995 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7996 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7997 // of PSO
7998 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7999 // cmd_pipeline.c
8000 // due to the fact that cmd_alloc_dset_data() has not been called in
8001 // cmd_bind_graphics_pipeline()
8002 // TODO : Want to cause various binding incompatibility issues here to test
8003 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07008004 // First cause various verify_layout_compatibility() fails
8005 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008006 // verify_set_layout_compatibility fail cases:
8007 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07008008 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis10fad692016-07-07 12:00:36 -06008009 "Invalid VkPipelineLayout Object ");
Karl Schultz6addd812016-02-02 17:17:23 -07008010 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8011 VK_PIPELINE_BIND_POINT_GRAPHICS,
8012 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
8013 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008014 m_errorMonitor->VerifyFound();
8015
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008016 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07008017 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8018 " attempting to bind set to index 1");
8019 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8020 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
8021 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008022 m_errorMonitor->VerifyFound();
8023
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008024 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008025 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
8026 // descriptors
8027 m_errorMonitor->SetDesiredFailureMsg(
8028 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06008029 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07008030 vkCmdBindDescriptorSets(
8031 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8032 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008033 m_errorMonitor->VerifyFound();
8034
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008035 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
8036 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07008037 m_errorMonitor->SetDesiredFailureMsg(
8038 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06008039 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07008040 vkCmdBindDescriptorSets(
8041 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8042 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008043 m_errorMonitor->VerifyFound();
8044
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008045 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
8046 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07008047 m_errorMonitor->SetDesiredFailureMsg(
8048 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06008049 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07008050 vkCmdBindDescriptorSets(
8051 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8052 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008053 m_errorMonitor->VerifyFound();
8054
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008055 // Cause INFO messages due to disturbing previously bound Sets
8056 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07008057 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8058 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8059 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008060 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07008061 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008062 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008063 " previously bound as set #0 was disturbed ");
8064 vkCmdBindDescriptorSets(
8065 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8066 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008067 m_errorMonitor->VerifyFound();
8068
Karl Schultz6addd812016-02-02 17:17:23 -07008069 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8070 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8071 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008072 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008073 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008074 " newly bound as set #0 so set #1 and "
8075 "any subsequent sets were disturbed ");
8076 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8077 VK_PIPELINE_BIND_POINT_GRAPHICS,
8078 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008079 m_errorMonitor->VerifyFound();
8080
Tobin Ehlis10fad692016-07-07 12:00:36 -06008081 // Now that we're done actively using the pipelineLayout that gfx pipeline
8082 // was created with, we should be able to delete it. Do that now to verify
8083 // that validation obeys pipelineLayout lifetime
8084 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
8085
Tobin Ehlis88452832015-12-03 09:40:56 -07008086 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07008087 // 1. Error due to not binding required set (we actually use same code as
8088 // above to disturb set0)
8089 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8090 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8091 2, &descriptorSet[0], 0, NULL);
8092 vkCmdBindDescriptorSets(
8093 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8094 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
8095 m_errorMonitor->SetDesiredFailureMsg(
8096 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8097 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07008098 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008099 m_errorMonitor->VerifyFound();
8100
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008101 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008102 // 2. Error due to bound set not being compatible with PSO's
8103 // VkPipelineLayout (diff stageFlags in this case)
8104 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8105 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8106 2, &descriptorSet[0], 0, NULL);
8107 m_errorMonitor->SetDesiredFailureMsg(
8108 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8109 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07008110 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008111 m_errorMonitor->VerifyFound();
8112
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008113 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07008114 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008115 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
8116 }
8117 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06008118 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
8119 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008120 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008121 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8122 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008123 vkFreeMemory(m_device->device(), imageMem, NULL);
8124 vkDestroyImage(m_device->device(), image, NULL);
8125 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008126}
Tobin Ehlis559c6382015-11-05 09:52:49 -07008127
Karl Schultz6addd812016-02-02 17:17:23 -07008128TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008129
Karl Schultz6addd812016-02-02 17:17:23 -07008130 m_errorMonitor->SetDesiredFailureMsg(
8131 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008132 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008133
8134 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008135 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008136 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008137 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008138
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008139 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008140}
8141
Karl Schultz6addd812016-02-02 17:17:23 -07008142TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
8143 VkResult err;
8144 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008145
Karl Schultz6addd812016-02-02 17:17:23 -07008146 m_errorMonitor->SetDesiredFailureMsg(
8147 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07008148 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008149
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008150 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008151
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008152 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008153 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06008154 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008155 cmd.commandPool = m_commandPool;
8156 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008157 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06008158
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008159 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06008160 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008161
8162 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008163 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07008164 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008165 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06008166 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008167 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
8168 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008169 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008170
8171 // The error should be caught by validation of the BeginCommandBuffer call
8172 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
8173
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008174 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008175 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008176}
8177
Karl Schultz6addd812016-02-02 17:17:23 -07008178TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008179 // Cause error due to Begin while recording CB
8180 // Then cause 2 errors for attempting to reset CB w/o having
8181 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
8182 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008183 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008184 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008185
8186 ASSERT_NO_FATAL_FAILURE(InitState());
8187
8188 // Calls AllocateCommandBuffers
8189 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
8190
Karl Schultz6addd812016-02-02 17:17:23 -07008191 // Force the failure by setting the Renderpass and Framebuffer fields with
8192 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008193 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07008194 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008195 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8196 cmd_buf_info.pNext = NULL;
8197 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008198 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008199
8200 // Begin CB to transition to recording state
8201 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
8202 // Can't re-begin. This should trigger error
8203 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008204 m_errorMonitor->VerifyFound();
8205
Karl Schultz6addd812016-02-02 17:17:23 -07008206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8207 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008208 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
8209 // Reset attempt will trigger error due to incorrect CommandPool state
8210 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008211 m_errorMonitor->VerifyFound();
8212
Karl Schultz6addd812016-02-02 17:17:23 -07008213 m_errorMonitor->SetDesiredFailureMsg(
8214 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8215 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008216 // Transition CB to RECORDED state
8217 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
8218 // Now attempting to Begin will implicitly reset, which triggers error
8219 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008220 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008221}
8222
Karl Schultz6addd812016-02-02 17:17:23 -07008223TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008224 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07008225 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008226
Karl Schultz6addd812016-02-02 17:17:23 -07008227 m_errorMonitor->SetDesiredFailureMsg(
8228 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008229 "Invalid Pipeline CreateInfo State: Vtx Shader required");
8230
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008231 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008232 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008233
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008234 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008235 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8236 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06008237
8238 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008239 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8240 ds_pool_ci.pNext = NULL;
8241 ds_pool_ci.maxSets = 1;
8242 ds_pool_ci.poolSizeCount = 1;
8243 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008244
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008245 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008246 err =
8247 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008248 ASSERT_VK_SUCCESS(err);
8249
Tony Barboureb254902015-07-15 12:50:33 -06008250 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008251 dsl_binding.binding = 0;
8252 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8253 dsl_binding.descriptorCount = 1;
8254 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8255 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008256
Tony Barboureb254902015-07-15 12:50:33 -06008257 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008258 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8259 ds_layout_ci.pNext = NULL;
8260 ds_layout_ci.bindingCount = 1;
8261 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06008262
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008263 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008264 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8265 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008266 ASSERT_VK_SUCCESS(err);
8267
8268 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008269 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008270 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008271 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008272 alloc_info.descriptorPool = ds_pool;
8273 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008274 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8275 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008276 ASSERT_VK_SUCCESS(err);
8277
Tony Barboureb254902015-07-15 12:50:33 -06008278 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008279 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8280 pipeline_layout_ci.setLayoutCount = 1;
8281 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008282
8283 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008284 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8285 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008286 ASSERT_VK_SUCCESS(err);
8287
Tobin Ehlise68360f2015-10-01 11:15:13 -06008288 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008289 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06008290
8291 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008292 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8293 vp_state_ci.scissorCount = 1;
8294 vp_state_ci.pScissors = &sc;
8295 vp_state_ci.viewportCount = 1;
8296 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008297
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008298 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8299 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8300 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8301 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8302 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8303 rs_state_ci.depthClampEnable = VK_FALSE;
8304 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8305 rs_state_ci.depthBiasEnable = VK_FALSE;
8306
Tony Barboureb254902015-07-15 12:50:33 -06008307 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008308 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8309 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008310 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008311 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8312 gp_ci.layout = pipeline_layout;
8313 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06008314
8315 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008316 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8317 pc_ci.initialDataSize = 0;
8318 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008319
8320 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06008321 VkPipelineCache pipelineCache;
8322
Karl Schultz6addd812016-02-02 17:17:23 -07008323 err =
8324 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06008325 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008326 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8327 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008328
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008329 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008330
Chia-I Wuf7458c52015-10-26 21:10:41 +08008331 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8332 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8333 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8334 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008335}
Tobin Ehlis912df022015-09-17 08:46:18 -06008336/*// TODO : This test should be good, but needs Tess support in compiler to run
8337TEST_F(VkLayerTest, InvalidPatchControlPoints)
8338{
8339 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06008340 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008341
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008342 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008343 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
8344primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008345
Tobin Ehlis912df022015-09-17 08:46:18 -06008346 ASSERT_NO_FATAL_FAILURE(InitState());
8347 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06008348
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008349 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06008350 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008351 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008352
8353 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8354 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8355 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008356 ds_pool_ci.poolSizeCount = 1;
8357 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06008358
8359 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008360 err = vkCreateDescriptorPool(m_device->device(),
8361VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06008362 ASSERT_VK_SUCCESS(err);
8363
8364 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08008365 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06008366 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08008367 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008368 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8369 dsl_binding.pImmutableSamplers = NULL;
8370
8371 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008372 ds_layout_ci.sType =
8373VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06008374 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008375 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07008376 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06008377
8378 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008379 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8380&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06008381 ASSERT_VK_SUCCESS(err);
8382
8383 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07008384 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
8385VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06008386 ASSERT_VK_SUCCESS(err);
8387
8388 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008389 pipeline_layout_ci.sType =
8390VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06008391 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008392 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008393 pipeline_layout_ci.pSetLayouts = &ds_layout;
8394
8395 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008396 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8397&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06008398 ASSERT_VK_SUCCESS(err);
8399
8400 VkPipelineShaderStageCreateInfo shaderStages[3];
8401 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
8402
Karl Schultz6addd812016-02-02 17:17:23 -07008403 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
8404this);
Tobin Ehlis912df022015-09-17 08:46:18 -06008405 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07008406 VkShaderObj
8407tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
8408this);
8409 VkShaderObj
8410te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
8411this);
Tobin Ehlis912df022015-09-17 08:46:18 -06008412
Karl Schultz6addd812016-02-02 17:17:23 -07008413 shaderStages[0].sType =
8414VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008415 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008416 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07008417 shaderStages[1].sType =
8418VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008419 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008420 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07008421 shaderStages[2].sType =
8422VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008423 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008424 shaderStages[2].shader = te.handle();
8425
8426 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008427 iaCI.sType =
8428VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08008429 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06008430
8431 VkPipelineTessellationStateCreateInfo tsCI = {};
8432 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
8433 tsCI.patchControlPoints = 0; // This will cause an error
8434
8435 VkGraphicsPipelineCreateInfo gp_ci = {};
8436 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8437 gp_ci.pNext = NULL;
8438 gp_ci.stageCount = 3;
8439 gp_ci.pStages = shaderStages;
8440 gp_ci.pVertexInputState = NULL;
8441 gp_ci.pInputAssemblyState = &iaCI;
8442 gp_ci.pTessellationState = &tsCI;
8443 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008444 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06008445 gp_ci.pMultisampleState = NULL;
8446 gp_ci.pDepthStencilState = NULL;
8447 gp_ci.pColorBlendState = NULL;
8448 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8449 gp_ci.layout = pipeline_layout;
8450 gp_ci.renderPass = renderPass();
8451
8452 VkPipelineCacheCreateInfo pc_ci = {};
8453 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8454 pc_ci.pNext = NULL;
8455 pc_ci.initialSize = 0;
8456 pc_ci.initialData = 0;
8457 pc_ci.maxSize = 0;
8458
8459 VkPipeline pipeline;
8460 VkPipelineCache pipelineCache;
8461
Karl Schultz6addd812016-02-02 17:17:23 -07008462 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
8463&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06008464 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008465 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8466&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06008467
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008468 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008469
Chia-I Wuf7458c52015-10-26 21:10:41 +08008470 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8471 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8472 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8473 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06008474}
8475*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06008476// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07008477TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07008478 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008479
Karl Schultz6addd812016-02-02 17:17:23 -07008480 m_errorMonitor->SetDesiredFailureMsg(
8481 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008482 "Gfx Pipeline viewport count (1) must match scissor count (0).");
8483
Tobin Ehlise68360f2015-10-01 11:15:13 -06008484 ASSERT_NO_FATAL_FAILURE(InitState());
8485 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008486
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008487 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008488 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8489 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008490
8491 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008492 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8493 ds_pool_ci.maxSets = 1;
8494 ds_pool_ci.poolSizeCount = 1;
8495 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008496
8497 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008498 err =
8499 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008500 ASSERT_VK_SUCCESS(err);
8501
8502 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008503 dsl_binding.binding = 0;
8504 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8505 dsl_binding.descriptorCount = 1;
8506 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008507
8508 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008509 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8510 ds_layout_ci.bindingCount = 1;
8511 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008512
8513 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008514 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8515 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008516 ASSERT_VK_SUCCESS(err);
8517
8518 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008519 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008520 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008521 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008522 alloc_info.descriptorPool = ds_pool;
8523 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008524 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8525 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008526 ASSERT_VK_SUCCESS(err);
8527
8528 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008529 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8530 pipeline_layout_ci.setLayoutCount = 1;
8531 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008532
8533 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008534 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8535 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008536 ASSERT_VK_SUCCESS(err);
8537
8538 VkViewport vp = {}; // Just need dummy vp to point to
8539
8540 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008541 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8542 vp_state_ci.scissorCount = 0;
8543 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
8544 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008545
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008546 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8547 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8548 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8549 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8550 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8551 rs_state_ci.depthClampEnable = VK_FALSE;
8552 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8553 rs_state_ci.depthBiasEnable = VK_FALSE;
8554
Cody Northropeb3a6c12015-10-05 14:44:45 -06008555 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008556 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008557
Karl Schultz6addd812016-02-02 17:17:23 -07008558 VkShaderObj vs(m_device, bindStateVertShaderText,
8559 VK_SHADER_STAGE_VERTEX_BIT, this);
8560 VkShaderObj fs(m_device, bindStateFragShaderText,
8561 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008562 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008563 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008564 shaderStages[0] = vs.GetStageCreateInfo();
8565 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008566
8567 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008568 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8569 gp_ci.stageCount = 2;
8570 gp_ci.pStages = shaderStages;
8571 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008572 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008573 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8574 gp_ci.layout = pipeline_layout;
8575 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008576
8577 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008578 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008579
8580 VkPipeline pipeline;
8581 VkPipelineCache pipelineCache;
8582
Karl Schultz6addd812016-02-02 17:17:23 -07008583 err =
8584 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008585 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008586 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8587 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008588
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008589 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008590
Chia-I Wuf7458c52015-10-26 21:10:41 +08008591 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8592 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8593 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8594 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008595}
Karl Schultz6addd812016-02-02 17:17:23 -07008596// Don't set viewport state in PSO. This is an error b/c we always need this
8597// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06008598// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07008599TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06008600 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07008601 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008602
Karl Schultz6addd812016-02-02 17:17:23 -07008603 m_errorMonitor->SetDesiredFailureMsg(
8604 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008605 "Gfx Pipeline pViewportState is null. Even if ");
8606
Tobin Ehlise68360f2015-10-01 11:15:13 -06008607 ASSERT_NO_FATAL_FAILURE(InitState());
8608 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008609
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008610 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008611 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8612 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008613
8614 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008615 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8616 ds_pool_ci.maxSets = 1;
8617 ds_pool_ci.poolSizeCount = 1;
8618 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008619
8620 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008621 err =
8622 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008623 ASSERT_VK_SUCCESS(err);
8624
8625 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008626 dsl_binding.binding = 0;
8627 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8628 dsl_binding.descriptorCount = 1;
8629 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008630
8631 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008632 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8633 ds_layout_ci.bindingCount = 1;
8634 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008635
8636 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008637 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8638 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008639 ASSERT_VK_SUCCESS(err);
8640
8641 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008642 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008643 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008644 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008645 alloc_info.descriptorPool = ds_pool;
8646 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008647 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8648 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008649 ASSERT_VK_SUCCESS(err);
8650
8651 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008652 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8653 pipeline_layout_ci.setLayoutCount = 1;
8654 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008655
8656 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008657 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8658 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008659 ASSERT_VK_SUCCESS(err);
8660
8661 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8662 // Set scissor as dynamic to avoid second error
8663 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008664 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8665 dyn_state_ci.dynamicStateCount = 1;
8666 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008667
Cody Northropeb3a6c12015-10-05 14:44:45 -06008668 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008669 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008670
Karl Schultz6addd812016-02-02 17:17:23 -07008671 VkShaderObj vs(m_device, bindStateVertShaderText,
8672 VK_SHADER_STAGE_VERTEX_BIT, this);
8673 VkShaderObj fs(m_device, bindStateFragShaderText,
8674 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008675 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008676 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008677 shaderStages[0] = vs.GetStageCreateInfo();
8678 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008679
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008680
8681 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8682 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8683 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8684 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8685 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8686 rs_state_ci.depthClampEnable = VK_FALSE;
8687 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8688 rs_state_ci.depthBiasEnable = VK_FALSE;
8689
Tobin Ehlise68360f2015-10-01 11:15:13 -06008690 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008691 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8692 gp_ci.stageCount = 2;
8693 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008694 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008695 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
8696 // should cause validation error
8697 gp_ci.pDynamicState = &dyn_state_ci;
8698 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8699 gp_ci.layout = pipeline_layout;
8700 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008701
8702 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008703 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008704
8705 VkPipeline pipeline;
8706 VkPipelineCache pipelineCache;
8707
Karl Schultz6addd812016-02-02 17:17:23 -07008708 err =
8709 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008710 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008711 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8712 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008713
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008714 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008715
Chia-I Wuf7458c52015-10-26 21:10:41 +08008716 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8717 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8718 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8719 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008720}
8721// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07008722// Then run second test where dynamic scissor count doesn't match PSO scissor
8723// count
8724TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
8725 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008726
Karl Schultz6addd812016-02-02 17:17:23 -07008727 m_errorMonitor->SetDesiredFailureMsg(
8728 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008729 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
8730
Tobin Ehlise68360f2015-10-01 11:15:13 -06008731 ASSERT_NO_FATAL_FAILURE(InitState());
8732 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008733
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008734 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008735 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8736 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008737
8738 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008739 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8740 ds_pool_ci.maxSets = 1;
8741 ds_pool_ci.poolSizeCount = 1;
8742 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008743
8744 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008745 err =
8746 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008747 ASSERT_VK_SUCCESS(err);
8748
8749 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008750 dsl_binding.binding = 0;
8751 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8752 dsl_binding.descriptorCount = 1;
8753 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008754
8755 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008756 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8757 ds_layout_ci.bindingCount = 1;
8758 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008759
8760 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008761 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8762 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008763 ASSERT_VK_SUCCESS(err);
8764
8765 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008766 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008767 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008768 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008769 alloc_info.descriptorPool = ds_pool;
8770 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008771 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8772 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008773 ASSERT_VK_SUCCESS(err);
8774
8775 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008776 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8777 pipeline_layout_ci.setLayoutCount = 1;
8778 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008779
8780 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008781 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8782 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008783 ASSERT_VK_SUCCESS(err);
8784
8785 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008786 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8787 vp_state_ci.viewportCount = 1;
8788 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
8789 vp_state_ci.scissorCount = 1;
8790 vp_state_ci.pScissors =
8791 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008792
8793 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8794 // Set scissor as dynamic to avoid that error
8795 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008796 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8797 dyn_state_ci.dynamicStateCount = 1;
8798 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008799
Cody Northropeb3a6c12015-10-05 14:44:45 -06008800 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008801 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008802
Karl Schultz6addd812016-02-02 17:17:23 -07008803 VkShaderObj vs(m_device, bindStateVertShaderText,
8804 VK_SHADER_STAGE_VERTEX_BIT, this);
8805 VkShaderObj fs(m_device, bindStateFragShaderText,
8806 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008807 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008808 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008809 shaderStages[0] = vs.GetStageCreateInfo();
8810 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008811
Cody Northropf6622dc2015-10-06 10:33:21 -06008812 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8813 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8814 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008815 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008816 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008817 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008818 vi_ci.pVertexAttributeDescriptions = nullptr;
8819
8820 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8821 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8822 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8823
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008824 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008825 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06008826 rs_ci.pNext = nullptr;
8827
Mark Youngc89c6312016-03-31 16:03:20 -06008828 VkPipelineColorBlendAttachmentState att = {};
8829 att.blendEnable = VK_FALSE;
8830 att.colorWriteMask = 0xf;
8831
Cody Northropf6622dc2015-10-06 10:33:21 -06008832 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8833 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8834 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008835 cb_ci.attachmentCount = 1;
8836 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008837
Tobin Ehlise68360f2015-10-01 11:15:13 -06008838 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008839 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8840 gp_ci.stageCount = 2;
8841 gp_ci.pStages = shaderStages;
8842 gp_ci.pVertexInputState = &vi_ci;
8843 gp_ci.pInputAssemblyState = &ia_ci;
8844 gp_ci.pViewportState = &vp_state_ci;
8845 gp_ci.pRasterizationState = &rs_ci;
8846 gp_ci.pColorBlendState = &cb_ci;
8847 gp_ci.pDynamicState = &dyn_state_ci;
8848 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8849 gp_ci.layout = pipeline_layout;
8850 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008851
8852 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008853 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008854
8855 VkPipeline pipeline;
8856 VkPipelineCache pipelineCache;
8857
Karl Schultz6addd812016-02-02 17:17:23 -07008858 err =
8859 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008860 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008861 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8862 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008863
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008864 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008865
Tobin Ehlisd332f282015-10-02 11:00:56 -06008866 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008867 // First need to successfully create the PSO from above by setting
8868 // pViewports
8869 m_errorMonitor->SetDesiredFailureMsg(
8870 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8871 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
8872 "scissorCount is 1. These counts must match.");
8873
8874 VkViewport vp = {}; // Just need dummy vp to point to
8875 vp_state_ci.pViewports = &vp;
8876 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8877 &gp_ci, NULL, &pipeline);
8878 ASSERT_VK_SUCCESS(err);
8879 BeginCommandBuffer();
8880 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8881 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
8882 VkRect2D scissors[2] = {}; // don't care about data
8883 // Count of 2 doesn't match PSO count of 1
8884 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
8885 Draw(1, 0, 0, 0);
8886
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008887 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008888
8889 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8890 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8891 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8892 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008893 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008894}
8895// Create PSO w/o non-zero scissorCount but no scissor data
8896// Then run second test where dynamic viewportCount doesn't match PSO
8897// viewportCount
8898TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8899 VkResult err;
8900
8901 m_errorMonitor->SetDesiredFailureMsg(
8902 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8903 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
8904
8905 ASSERT_NO_FATAL_FAILURE(InitState());
8906 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8907
8908 VkDescriptorPoolSize ds_type_count = {};
8909 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8910 ds_type_count.descriptorCount = 1;
8911
8912 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8913 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8914 ds_pool_ci.maxSets = 1;
8915 ds_pool_ci.poolSizeCount = 1;
8916 ds_pool_ci.pPoolSizes = &ds_type_count;
8917
8918 VkDescriptorPool ds_pool;
8919 err =
8920 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
8921 ASSERT_VK_SUCCESS(err);
8922
8923 VkDescriptorSetLayoutBinding dsl_binding = {};
8924 dsl_binding.binding = 0;
8925 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8926 dsl_binding.descriptorCount = 1;
8927 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8928
8929 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8930 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8931 ds_layout_ci.bindingCount = 1;
8932 ds_layout_ci.pBindings = &dsl_binding;
8933
8934 VkDescriptorSetLayout ds_layout;
8935 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8936 &ds_layout);
8937 ASSERT_VK_SUCCESS(err);
8938
8939 VkDescriptorSet descriptorSet;
8940 VkDescriptorSetAllocateInfo alloc_info = {};
8941 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8942 alloc_info.descriptorSetCount = 1;
8943 alloc_info.descriptorPool = ds_pool;
8944 alloc_info.pSetLayouts = &ds_layout;
8945 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8946 &descriptorSet);
8947 ASSERT_VK_SUCCESS(err);
8948
8949 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8950 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8951 pipeline_layout_ci.setLayoutCount = 1;
8952 pipeline_layout_ci.pSetLayouts = &ds_layout;
8953
8954 VkPipelineLayout pipeline_layout;
8955 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8956 &pipeline_layout);
8957 ASSERT_VK_SUCCESS(err);
8958
8959 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8960 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8961 vp_state_ci.scissorCount = 1;
8962 vp_state_ci.pScissors =
8963 NULL; // Null scissor w/ count of 1 should cause error
8964 vp_state_ci.viewportCount = 1;
8965 vp_state_ci.pViewports =
8966 NULL; // vp is dynamic (below) so this won't cause error
8967
8968 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8969 // Set scissor as dynamic to avoid that error
8970 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8971 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8972 dyn_state_ci.dynamicStateCount = 1;
8973 dyn_state_ci.pDynamicStates = &vp_state;
8974
8975 VkPipelineShaderStageCreateInfo shaderStages[2];
8976 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8977
8978 VkShaderObj vs(m_device, bindStateVertShaderText,
8979 VK_SHADER_STAGE_VERTEX_BIT, this);
8980 VkShaderObj fs(m_device, bindStateFragShaderText,
8981 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008982 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008983 // but add it to be able to run on more devices
8984 shaderStages[0] = vs.GetStageCreateInfo();
8985 shaderStages[1] = fs.GetStageCreateInfo();
8986
8987 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8988 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8989 vi_ci.pNext = nullptr;
8990 vi_ci.vertexBindingDescriptionCount = 0;
8991 vi_ci.pVertexBindingDescriptions = nullptr;
8992 vi_ci.vertexAttributeDescriptionCount = 0;
8993 vi_ci.pVertexAttributeDescriptions = nullptr;
8994
8995 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8996 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8997 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8998
8999 VkPipelineRasterizationStateCreateInfo rs_ci = {};
9000 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9001 rs_ci.pNext = nullptr;
9002
Mark Youngc89c6312016-03-31 16:03:20 -06009003 VkPipelineColorBlendAttachmentState att = {};
9004 att.blendEnable = VK_FALSE;
9005 att.colorWriteMask = 0xf;
9006
Karl Schultz6addd812016-02-02 17:17:23 -07009007 VkPipelineColorBlendStateCreateInfo cb_ci = {};
9008 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
9009 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06009010 cb_ci.attachmentCount = 1;
9011 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07009012
9013 VkGraphicsPipelineCreateInfo gp_ci = {};
9014 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9015 gp_ci.stageCount = 2;
9016 gp_ci.pStages = shaderStages;
9017 gp_ci.pVertexInputState = &vi_ci;
9018 gp_ci.pInputAssemblyState = &ia_ci;
9019 gp_ci.pViewportState = &vp_state_ci;
9020 gp_ci.pRasterizationState = &rs_ci;
9021 gp_ci.pColorBlendState = &cb_ci;
9022 gp_ci.pDynamicState = &dyn_state_ci;
9023 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9024 gp_ci.layout = pipeline_layout;
9025 gp_ci.renderPass = renderPass();
9026
9027 VkPipelineCacheCreateInfo pc_ci = {};
9028 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9029
9030 VkPipeline pipeline;
9031 VkPipelineCache pipelineCache;
9032
9033 err =
9034 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9035 ASSERT_VK_SUCCESS(err);
9036 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9037 &gp_ci, NULL, &pipeline);
9038
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009039 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07009040
9041 // Now hit second fail case where we set scissor w/ different count than PSO
9042 // First need to successfully create the PSO from above by setting
9043 // pViewports
9044 m_errorMonitor->SetDesiredFailureMsg(
9045 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9046 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
9047 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009048
Tobin Ehlisd332f282015-10-02 11:00:56 -06009049 VkRect2D sc = {}; // Just need dummy vp to point to
9050 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07009051 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9052 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06009053 ASSERT_VK_SUCCESS(err);
9054 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009055 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9056 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06009057 VkViewport viewports[2] = {}; // don't care about data
9058 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07009059 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06009060 Draw(1, 0, 0, 0);
9061
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009062 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009063
Chia-I Wuf7458c52015-10-26 21:10:41 +08009064 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9065 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9066 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9067 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009068 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009069}
9070
Mark Young7394fdd2016-03-31 14:56:43 -06009071TEST_F(VkLayerTest, PSOLineWidthInvalid) {
9072 VkResult err;
9073
9074 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06009075 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06009076
9077 ASSERT_NO_FATAL_FAILURE(InitState());
9078 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9079
9080 VkDescriptorPoolSize ds_type_count = {};
9081 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9082 ds_type_count.descriptorCount = 1;
9083
9084 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9085 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9086 ds_pool_ci.maxSets = 1;
9087 ds_pool_ci.poolSizeCount = 1;
9088 ds_pool_ci.pPoolSizes = &ds_type_count;
9089
9090 VkDescriptorPool ds_pool;
9091 err =
9092 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9093 ASSERT_VK_SUCCESS(err);
9094
9095 VkDescriptorSetLayoutBinding dsl_binding = {};
9096 dsl_binding.binding = 0;
9097 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9098 dsl_binding.descriptorCount = 1;
9099 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9100
9101 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9102 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9103 ds_layout_ci.bindingCount = 1;
9104 ds_layout_ci.pBindings = &dsl_binding;
9105
9106 VkDescriptorSetLayout ds_layout;
9107 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9108 &ds_layout);
9109 ASSERT_VK_SUCCESS(err);
9110
9111 VkDescriptorSet descriptorSet;
9112 VkDescriptorSetAllocateInfo alloc_info = {};
9113 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9114 alloc_info.descriptorSetCount = 1;
9115 alloc_info.descriptorPool = ds_pool;
9116 alloc_info.pSetLayouts = &ds_layout;
9117 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9118 &descriptorSet);
9119 ASSERT_VK_SUCCESS(err);
9120
9121 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
9122 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9123 pipeline_layout_ci.setLayoutCount = 1;
9124 pipeline_layout_ci.pSetLayouts = &ds_layout;
9125
9126 VkPipelineLayout pipeline_layout;
9127 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9128 &pipeline_layout);
9129 ASSERT_VK_SUCCESS(err);
9130
9131 VkPipelineViewportStateCreateInfo vp_state_ci = {};
9132 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9133 vp_state_ci.scissorCount = 1;
9134 vp_state_ci.pScissors = NULL;
9135 vp_state_ci.viewportCount = 1;
9136 vp_state_ci.pViewports = NULL;
9137
9138 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
9139 VK_DYNAMIC_STATE_SCISSOR,
9140 VK_DYNAMIC_STATE_LINE_WIDTH};
9141 // Set scissor as dynamic to avoid that error
9142 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
9143 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9144 dyn_state_ci.dynamicStateCount = 2;
9145 dyn_state_ci.pDynamicStates = dynamic_states;
9146
9147 VkPipelineShaderStageCreateInfo shaderStages[2];
9148 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
9149
9150 VkShaderObj vs(m_device, bindStateVertShaderText,
9151 VK_SHADER_STAGE_VERTEX_BIT, this);
9152 VkShaderObj fs(m_device, bindStateFragShaderText,
9153 VK_SHADER_STAGE_FRAGMENT_BIT,
9154 this); // TODO - We shouldn't need a fragment shader
9155 // but add it to be able to run on more devices
9156 shaderStages[0] = vs.GetStageCreateInfo();
9157 shaderStages[1] = fs.GetStageCreateInfo();
9158
9159 VkPipelineVertexInputStateCreateInfo vi_ci = {};
9160 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9161 vi_ci.pNext = nullptr;
9162 vi_ci.vertexBindingDescriptionCount = 0;
9163 vi_ci.pVertexBindingDescriptions = nullptr;
9164 vi_ci.vertexAttributeDescriptionCount = 0;
9165 vi_ci.pVertexAttributeDescriptions = nullptr;
9166
9167 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
9168 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9169 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9170
9171 VkPipelineRasterizationStateCreateInfo rs_ci = {};
9172 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9173 rs_ci.pNext = nullptr;
9174
Mark Young47107952016-05-02 15:59:55 -06009175 // Check too low (line width of -1.0f).
9176 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06009177
9178 VkPipelineColorBlendAttachmentState att = {};
9179 att.blendEnable = VK_FALSE;
9180 att.colorWriteMask = 0xf;
9181
9182 VkPipelineColorBlendStateCreateInfo cb_ci = {};
9183 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
9184 cb_ci.pNext = nullptr;
9185 cb_ci.attachmentCount = 1;
9186 cb_ci.pAttachments = &att;
9187
9188 VkGraphicsPipelineCreateInfo gp_ci = {};
9189 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9190 gp_ci.stageCount = 2;
9191 gp_ci.pStages = shaderStages;
9192 gp_ci.pVertexInputState = &vi_ci;
9193 gp_ci.pInputAssemblyState = &ia_ci;
9194 gp_ci.pViewportState = &vp_state_ci;
9195 gp_ci.pRasterizationState = &rs_ci;
9196 gp_ci.pColorBlendState = &cb_ci;
9197 gp_ci.pDynamicState = &dyn_state_ci;
9198 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9199 gp_ci.layout = pipeline_layout;
9200 gp_ci.renderPass = renderPass();
9201
9202 VkPipelineCacheCreateInfo pc_ci = {};
9203 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9204
9205 VkPipeline pipeline;
9206 VkPipelineCache pipelineCache;
9207
9208 err =
9209 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9210 ASSERT_VK_SUCCESS(err);
9211 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9212 &gp_ci, NULL, &pipeline);
9213
9214 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009215 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009216
9217 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9218 "Attempt to set lineWidth to 65536");
9219
9220 // Check too high (line width of 65536.0f).
9221 rs_ci.lineWidth = 65536.0f;
9222
9223 err =
9224 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9225 ASSERT_VK_SUCCESS(err);
9226 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9227 &gp_ci, NULL, &pipeline);
9228
9229 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009230 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009231
9232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06009233 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06009234
9235 dyn_state_ci.dynamicStateCount = 3;
9236
9237 rs_ci.lineWidth = 1.0f;
9238
9239 err =
9240 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9241 ASSERT_VK_SUCCESS(err);
9242 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9243 &gp_ci, NULL, &pipeline);
9244 BeginCommandBuffer();
9245 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9246 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
9247
9248 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06009249 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06009250 m_errorMonitor->VerifyFound();
9251
9252 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9253 "Attempt to set lineWidth to 65536");
9254
9255 // Check too high with dynamic setting.
9256 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
9257 m_errorMonitor->VerifyFound();
9258 EndCommandBuffer();
9259
9260 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9261 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9262 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9263 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009264 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009265}
9266
Karl Schultz6addd812016-02-02 17:17:23 -07009267TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009268 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009269 m_errorMonitor->SetDesiredFailureMsg(
9270 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009271 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009272
9273 ASSERT_NO_FATAL_FAILURE(InitState());
9274 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009275
Tony Barbourfe3351b2015-07-28 10:17:20 -06009276 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009277 // Don't care about RenderPass handle b/c error should be flagged before
9278 // that
9279 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
9280 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009281
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009282 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009283}
9284
Karl Schultz6addd812016-02-02 17:17:23 -07009285TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009286 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009287 m_errorMonitor->SetDesiredFailureMsg(
9288 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009289 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009290
9291 ASSERT_NO_FATAL_FAILURE(InitState());
9292 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009293
Tony Barbourfe3351b2015-07-28 10:17:20 -06009294 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009295 // Just create a dummy Renderpass that's non-NULL so we can get to the
9296 // proper error
Chris Forbes38ae7c42016-06-21 20:51:44 +12009297 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
Karl Schultz6addd812016-02-02 17:17:23 -07009298 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009299
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009300 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009301}
9302
Chris Forbes2eeabe32016-06-21 20:52:34 +12009303TEST_F(VkLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
9304 m_errorMonitor->ExpectSuccess();
9305
9306 ASSERT_NO_FATAL_FAILURE(InitState());
9307 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9308
9309 BeginCommandBuffer(); // framework implicitly begins the renderpass.
9310 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // end implicit.
9311
9312 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
9313 VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9314 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9315 m_errorMonitor->VerifyNotFound();
9316 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
9317 VK_SUBPASS_CONTENTS_INLINE);
9318 m_errorMonitor->VerifyNotFound();
9319 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9320 m_errorMonitor->VerifyNotFound();
9321
9322 m_commandBuffer->EndCommandBuffer();
9323 m_errorMonitor->VerifyNotFound();
9324}
9325
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009326TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
9327 TEST_DESCRIPTION("Begin a renderPass where clearValueCount is less than"
9328 "the number of renderPass attachments that use loadOp"
9329 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
9330
9331 ASSERT_NO_FATAL_FAILURE(InitState());
9332 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9333
9334 // Create a renderPass with a single attachment that uses loadOp CLEAR
9335 VkAttachmentReference attach = {};
9336 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
9337 VkSubpassDescription subpass = {};
9338 subpass.inputAttachmentCount = 1;
9339 subpass.pInputAttachments = &attach;
9340 VkRenderPassCreateInfo rpci = {};
9341 rpci.subpassCount = 1;
9342 rpci.pSubpasses = &subpass;
9343 rpci.attachmentCount = 1;
9344 VkAttachmentDescription attach_desc = {};
9345 attach_desc.format = VK_FORMAT_UNDEFINED;
9346 // Set loadOp to CLEAR
9347 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
9348 rpci.pAttachments = &attach_desc;
9349 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9350 VkRenderPass rp;
9351 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
9352
9353 VkCommandBufferInheritanceInfo hinfo = {};
9354 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
9355 hinfo.renderPass = VK_NULL_HANDLE;
9356 hinfo.subpass = 0;
9357 hinfo.framebuffer = VK_NULL_HANDLE;
9358 hinfo.occlusionQueryEnable = VK_FALSE;
9359 hinfo.queryFlags = 0;
9360 hinfo.pipelineStatistics = 0;
9361 VkCommandBufferBeginInfo info = {};
9362 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
9363 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9364 info.pInheritanceInfo = &hinfo;
9365
9366 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
9367 VkRenderPassBeginInfo rp_begin = {};
9368 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
9369 rp_begin.pNext = NULL;
9370 rp_begin.renderPass = renderPass();
9371 rp_begin.framebuffer = framebuffer();
9372 rp_begin.clearValueCount = 0; // Should be 1
9373
9374 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis7f0416c2016-07-15 16:01:13 -06009375 " has a clearValueCount of 0 but "
9376 "there must be at least 1 entries in "
9377 "pClearValues array to account for ");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009378
9379 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
9380 VK_SUBPASS_CONTENTS_INLINE);
9381
9382 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06009383
9384 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009385}
9386
Cody Northrop3bb4d962016-05-09 16:15:57 -06009387TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
9388
9389 TEST_DESCRIPTION("End a command buffer with an active render pass");
9390
9391 m_errorMonitor->SetDesiredFailureMsg(
9392 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9393 "It is invalid to issue this call inside an active render pass");
9394
9395 ASSERT_NO_FATAL_FAILURE(InitState());
9396 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9397
9398 // The framework's BeginCommandBuffer calls CreateRenderPass
9399 BeginCommandBuffer();
9400
9401 // Call directly into vkEndCommandBuffer instead of the
9402 // the framework's EndCommandBuffer, which inserts a
9403 // vkEndRenderPass
9404 vkEndCommandBuffer(m_commandBuffer->GetBufferHandle());
9405
9406 m_errorMonitor->VerifyFound();
9407
9408 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
9409 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
9410}
9411
Karl Schultz6addd812016-02-02 17:17:23 -07009412TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009413 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07009414 m_errorMonitor->SetDesiredFailureMsg(
9415 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009416 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009417
9418 ASSERT_NO_FATAL_FAILURE(InitState());
9419 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009420
9421 // Renderpass is started here
9422 BeginCommandBuffer();
9423
9424 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009425 vk_testing::Buffer dstBuffer;
9426 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009427
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009428 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009429
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009430 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009431}
9432
Karl Schultz6addd812016-02-02 17:17:23 -07009433TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009434 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07009435 m_errorMonitor->SetDesiredFailureMsg(
9436 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009437 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009438
9439 ASSERT_NO_FATAL_FAILURE(InitState());
9440 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009441
9442 // Renderpass is started here
9443 BeginCommandBuffer();
9444
9445 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009446 vk_testing::Buffer dstBuffer;
9447 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009448
Karl Schultz6addd812016-02-02 17:17:23 -07009449 VkDeviceSize dstOffset = 0;
9450 VkDeviceSize dataSize = 1024;
Karl Schultzee344492016-07-11 15:09:57 -06009451 const void *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009452
Karl Schultz6addd812016-02-02 17:17:23 -07009453 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
9454 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009455
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009456 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009457}
9458
Karl Schultz6addd812016-02-02 17:17:23 -07009459TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009460 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009461 m_errorMonitor->SetDesiredFailureMsg(
9462 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009463 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009464
9465 ASSERT_NO_FATAL_FAILURE(InitState());
9466 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009467
9468 // Renderpass is started here
9469 BeginCommandBuffer();
9470
Michael Lentine0a369f62016-02-03 16:51:46 -06009471 VkClearColorValue clear_color;
9472 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07009473 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9474 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9475 const int32_t tex_width = 32;
9476 const int32_t tex_height = 32;
9477 VkImageCreateInfo image_create_info = {};
9478 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9479 image_create_info.pNext = NULL;
9480 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9481 image_create_info.format = tex_format;
9482 image_create_info.extent.width = tex_width;
9483 image_create_info.extent.height = tex_height;
9484 image_create_info.extent.depth = 1;
9485 image_create_info.mipLevels = 1;
9486 image_create_info.arrayLayers = 1;
9487 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9488 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9489 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009490
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009491 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07009492 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
9493 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009494
Karl Schultz6addd812016-02-02 17:17:23 -07009495 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
9496 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009497
Karl Schultz6addd812016-02-02 17:17:23 -07009498 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
9499 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009500
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009501 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009502}
9503
Karl Schultz6addd812016-02-02 17:17:23 -07009504TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009505 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009506 m_errorMonitor->SetDesiredFailureMsg(
9507 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009508 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009509
9510 ASSERT_NO_FATAL_FAILURE(InitState());
9511 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009512
9513 // Renderpass is started here
9514 BeginCommandBuffer();
9515
9516 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07009517 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009518 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
9519 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9520 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
9521 image_create_info.extent.width = 64;
9522 image_create_info.extent.height = 64;
9523 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9524 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009525
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009526 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07009527 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
9528 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009529
Karl Schultz6addd812016-02-02 17:17:23 -07009530 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
9531 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009532
Karl Schultz6addd812016-02-02 17:17:23 -07009533 vkCmdClearDepthStencilImage(
9534 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
9535 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
9536 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009537
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009538 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009539}
9540
Karl Schultz6addd812016-02-02 17:17:23 -07009541TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009542 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009543 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009544
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009545 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -06009546 "vkCmdClearAttachments(): This call "
Karl Schultz6addd812016-02-02 17:17:23 -07009547 "must be issued inside an active "
9548 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009549
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009550 ASSERT_NO_FATAL_FAILURE(InitState());
9551 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009552
9553 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009554 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009555 ASSERT_VK_SUCCESS(err);
9556
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009557 VkClearAttachment color_attachment;
9558 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9559 color_attachment.clearValue.color.float32[0] = 0;
9560 color_attachment.clearValue.color.float32[1] = 0;
9561 color_attachment.clearValue.color.float32[2] = 0;
9562 color_attachment.clearValue.color.float32[3] = 0;
9563 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009564 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
9565 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
9566 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009567
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009568 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009569}
9570
Karl Schultz9e66a292016-04-21 15:57:51 -06009571TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
9572 // Try to add a buffer memory barrier with no buffer.
9573 m_errorMonitor->SetDesiredFailureMsg(
9574 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9575 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
9576
9577 ASSERT_NO_FATAL_FAILURE(InitState());
9578 BeginCommandBuffer();
9579
9580 VkBufferMemoryBarrier buf_barrier = {};
9581 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9582 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9583 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9584 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9585 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9586 buf_barrier.buffer = VK_NULL_HANDLE;
9587 buf_barrier.offset = 0;
9588 buf_barrier.size = VK_WHOLE_SIZE;
9589 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9590 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
9591 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
9592
9593 m_errorMonitor->VerifyFound();
9594}
9595
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009596TEST_F(VkLayerTest, InvalidBarriers) {
9597 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
9598
9599 m_errorMonitor->SetDesiredFailureMsg(
9600 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
9601
9602 ASSERT_NO_FATAL_FAILURE(InitState());
9603 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9604
9605 VkMemoryBarrier mem_barrier = {};
9606 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
9607 mem_barrier.pNext = NULL;
9608 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9609 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9610 BeginCommandBuffer();
9611 // BeginCommandBuffer() starts a render pass
9612 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9613 VK_PIPELINE_STAGE_HOST_BIT,
9614 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
9615 &mem_barrier, 0, nullptr, 0, nullptr);
9616 m_errorMonitor->VerifyFound();
9617
9618 m_errorMonitor->SetDesiredFailureMsg(
9619 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9620 "Image Layout cannot be transitioned to UNDEFINED");
9621 VkImageObj image(m_device);
9622 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
9623 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9624 ASSERT_TRUE(image.initialized());
9625 VkImageMemoryBarrier img_barrier = {};
9626 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9627 img_barrier.pNext = NULL;
9628 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9629 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9630 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9631 // New layout can't be UNDEFINED
9632 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9633 img_barrier.image = image.handle();
9634 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9635 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9636 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9637 img_barrier.subresourceRange.baseArrayLayer = 0;
9638 img_barrier.subresourceRange.baseMipLevel = 0;
9639 img_barrier.subresourceRange.layerCount = 1;
9640 img_barrier.subresourceRange.levelCount = 1;
9641 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9642 VK_PIPELINE_STAGE_HOST_BIT,
9643 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9644 nullptr, 1, &img_barrier);
9645 m_errorMonitor->VerifyFound();
9646 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9647
9648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9649 "Subresource must have the sum of the "
9650 "baseArrayLayer");
9651 // baseArrayLayer + layerCount must be <= image's arrayLayers
9652 img_barrier.subresourceRange.baseArrayLayer = 1;
9653 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9654 VK_PIPELINE_STAGE_HOST_BIT,
9655 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9656 nullptr, 1, &img_barrier);
9657 m_errorMonitor->VerifyFound();
9658 img_barrier.subresourceRange.baseArrayLayer = 0;
9659
9660 m_errorMonitor->SetDesiredFailureMsg(
9661 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9662 "Subresource must have the sum of the baseMipLevel");
9663 // baseMipLevel + levelCount must be <= image's mipLevels
9664 img_barrier.subresourceRange.baseMipLevel = 1;
9665 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9666 VK_PIPELINE_STAGE_HOST_BIT,
9667 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9668 nullptr, 1, &img_barrier);
9669 m_errorMonitor->VerifyFound();
9670 img_barrier.subresourceRange.baseMipLevel = 0;
9671
9672 m_errorMonitor->SetDesiredFailureMsg(
9673 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9674 "Buffer Barriers cannot be used during a render pass");
9675 vk_testing::Buffer buffer;
9676 buffer.init(*m_device, 256);
9677 VkBufferMemoryBarrier buf_barrier = {};
9678 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9679 buf_barrier.pNext = NULL;
9680 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9681 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9682 buf_barrier.buffer = buffer.handle();
9683 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9684 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9685 buf_barrier.offset = 0;
9686 buf_barrier.size = VK_WHOLE_SIZE;
9687 // Can't send buffer barrier during a render pass
9688 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9689 VK_PIPELINE_STAGE_HOST_BIT,
9690 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9691 &buf_barrier, 0, nullptr);
9692 m_errorMonitor->VerifyFound();
9693 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9694
9695 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9696 "which is not less than total size");
9697 buf_barrier.offset = 257;
9698 // Offset greater than total size
9699 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9700 VK_PIPELINE_STAGE_HOST_BIT,
9701 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9702 &buf_barrier, 0, nullptr);
9703 m_errorMonitor->VerifyFound();
9704 buf_barrier.offset = 0;
9705
9706 m_errorMonitor->SetDesiredFailureMsg(
9707 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
9708 buf_barrier.size = 257;
9709 // Size greater than total size
9710 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9711 VK_PIPELINE_STAGE_HOST_BIT,
9712 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9713 &buf_barrier, 0, nullptr);
9714 m_errorMonitor->VerifyFound();
9715 buf_barrier.size = VK_WHOLE_SIZE;
9716
9717 m_errorMonitor->SetDesiredFailureMsg(
9718 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9719 "Image is a depth and stencil format and thus must "
9720 "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
9721 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
9722 VkDepthStencilObj ds_image(m_device);
9723 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
9724 ASSERT_TRUE(ds_image.initialized());
9725 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9726 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9727 img_barrier.image = ds_image.handle();
9728 // Leave aspectMask at COLOR on purpose
9729 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9730 VK_PIPELINE_STAGE_HOST_BIT,
9731 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9732 nullptr, 1, &img_barrier);
9733 m_errorMonitor->VerifyFound();
9734}
9735
Karl Schultz6addd812016-02-02 17:17:23 -07009736TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009737 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009738 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009739
Karl Schultz6addd812016-02-02 17:17:23 -07009740 m_errorMonitor->SetDesiredFailureMsg(
9741 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009742 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
9743
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009744 ASSERT_NO_FATAL_FAILURE(InitState());
9745 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009746 uint32_t qfi = 0;
9747 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009748 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9749 buffCI.size = 1024;
9750 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9751 buffCI.queueFamilyIndexCount = 1;
9752 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009753
9754 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009755 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009756 ASSERT_VK_SUCCESS(err);
9757
9758 BeginCommandBuffer();
9759 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009760 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9761 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009762 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07009763 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
9764 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009765
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009766 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009767
Chia-I Wuf7458c52015-10-26 21:10:41 +08009768 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009769}
9770
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009771TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9772 // Create an out-of-range queueFamilyIndex
9773 m_errorMonitor->SetDesiredFailureMsg(
9774 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesde628532016-04-21 16:30:17 -06009775 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
9776 "of the indices specified when the device was created, via the "
9777 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009778
9779 ASSERT_NO_FATAL_FAILURE(InitState());
9780 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9781 VkBufferCreateInfo buffCI = {};
9782 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9783 buffCI.size = 1024;
9784 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9785 buffCI.queueFamilyIndexCount = 1;
9786 // Introduce failure by specifying invalid queue_family_index
9787 uint32_t qfi = 777;
9788 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06009789 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009790
9791 VkBuffer ib;
9792 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
9793
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009794 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009795 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009796}
9797
Karl Schultz6addd812016-02-02 17:17:23 -07009798TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
9799 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
9800 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009801
Karl Schultz6addd812016-02-02 17:17:23 -07009802 m_errorMonitor->SetDesiredFailureMsg(
9803 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009804 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009805
9806 ASSERT_NO_FATAL_FAILURE(InitState());
9807 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009808
9809 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009810 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009811 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
9812 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009813
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009814 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009815}
9816
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009817TEST_F(VkLayerTest, DSUsageBitsErrors) {
9818 TEST_DESCRIPTION("Attempt to update descriptor sets for images and buffers "
9819 "that do not have correct usage bits sets.");
9820 VkResult err;
9821
9822 ASSERT_NO_FATAL_FAILURE(InitState());
9823 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9824 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9825 ds_type_count[i].type = VkDescriptorType(i);
9826 ds_type_count[i].descriptorCount = 1;
9827 }
9828 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9829 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9830 ds_pool_ci.pNext = NULL;
9831 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9832 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9833 ds_pool_ci.pPoolSizes = ds_type_count;
9834
9835 VkDescriptorPool ds_pool;
9836 err =
9837 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9838 ASSERT_VK_SUCCESS(err);
9839
9840 // Create 10 layouts where each has a single descriptor of different type
9841 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] =
9842 {};
9843 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9844 dsl_binding[i].binding = 0;
9845 dsl_binding[i].descriptorType = VkDescriptorType(i);
9846 dsl_binding[i].descriptorCount = 1;
9847 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9848 dsl_binding[i].pImmutableSamplers = NULL;
9849 }
9850
9851 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9852 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9853 ds_layout_ci.pNext = NULL;
9854 ds_layout_ci.bindingCount = 1;
9855 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9856 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9857 ds_layout_ci.pBindings = dsl_binding + i;
9858 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
9859 NULL, ds_layouts + i);
9860 ASSERT_VK_SUCCESS(err);
9861 }
9862 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9863 VkDescriptorSetAllocateInfo alloc_info = {};
9864 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9865 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9866 alloc_info.descriptorPool = ds_pool;
9867 alloc_info.pSetLayouts = ds_layouts;
9868 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9869 descriptor_sets);
9870 ASSERT_VK_SUCCESS(err);
9871
9872 // Create a buffer & bufferView to be used for invalid updates
9873 VkBufferCreateInfo buff_ci = {};
9874 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9875 // This usage is not valid for any descriptor type
9876 buff_ci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
9877 buff_ci.size = 256;
9878 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9879 VkBuffer buffer;
9880 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9881 ASSERT_VK_SUCCESS(err);
9882
9883 VkBufferViewCreateInfo buff_view_ci = {};
9884 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9885 buff_view_ci.buffer = buffer;
9886 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9887 buff_view_ci.range = VK_WHOLE_SIZE;
9888 VkBufferView buff_view;
9889 err =
9890 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
9891 ASSERT_VK_SUCCESS(err);
9892
9893 // Create an image to be used for invalid updates
9894 VkImageCreateInfo image_ci = {};
9895 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9896 image_ci.imageType = VK_IMAGE_TYPE_2D;
9897 image_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
9898 image_ci.extent.width = 64;
9899 image_ci.extent.height = 64;
9900 image_ci.extent.depth = 1;
9901 image_ci.mipLevels = 1;
9902 image_ci.arrayLayers = 1;
9903 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
9904 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9905 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
9906 // This usage is not valid for any descriptor type
9907 image_ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9908 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9909 VkImage image;
9910 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9911 ASSERT_VK_SUCCESS(err);
9912 // Bind memory to image
9913 VkMemoryRequirements mem_reqs;
9914 VkDeviceMemory image_mem;
9915 bool pass;
9916 VkMemoryAllocateInfo mem_alloc = {};
9917 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9918 mem_alloc.pNext = NULL;
9919 mem_alloc.allocationSize = 0;
9920 mem_alloc.memoryTypeIndex = 0;
9921 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9922 mem_alloc.allocationSize = mem_reqs.size;
9923 pass =
9924 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
9925 ASSERT_TRUE(pass);
9926 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9927 ASSERT_VK_SUCCESS(err);
9928 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9929 ASSERT_VK_SUCCESS(err);
9930 // Now create view for image
9931 VkImageViewCreateInfo image_view_ci = {};
9932 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9933 image_view_ci.image = image;
9934 image_view_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
9935 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9936 image_view_ci.subresourceRange.layerCount = 1;
9937 image_view_ci.subresourceRange.baseArrayLayer = 0;
9938 image_view_ci.subresourceRange.levelCount = 1;
9939 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9940 VkImageView image_view;
9941 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
9942 &image_view);
9943 ASSERT_VK_SUCCESS(err);
9944
9945 VkDescriptorBufferInfo buff_info = {};
9946 buff_info.buffer = buffer;
9947 VkDescriptorImageInfo img_info = {};
9948 img_info.imageView = image_view;
9949 VkWriteDescriptorSet descriptor_write = {};
9950 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9951 descriptor_write.dstBinding = 0;
9952 descriptor_write.descriptorCount = 1;
9953 descriptor_write.pTexelBufferView = &buff_view;
9954 descriptor_write.pBufferInfo = &buff_info;
9955 descriptor_write.pImageInfo = &img_info;
9956
9957 // These error messages align with VkDescriptorType struct
9958 const char *error_msgs[] = {
9959 "", // placeholder, no error for SAMPLER descriptor
9960 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
9961 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
9962 " does not have VK_IMAGE_USAGE_STORAGE_BIT set.",
9963 " does not have VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT set.",
9964 " does not have VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set.",
9965 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
9966 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
9967 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
9968 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
9969 " does not have VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set."};
9970 // Start loop at 1 as SAMPLER desc type has no usage bit error
9971 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9972 descriptor_write.descriptorType = VkDescriptorType(i);
9973 descriptor_write.dstSet = descriptor_sets[i];
9974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9975 error_msgs[i]);
9976
9977 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
9978 NULL);
9979
9980 m_errorMonitor->VerifyFound();
9981 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
9982 }
9983 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9984 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009985 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009986 vkDestroyImageView(m_device->device(), image_view, NULL);
9987 vkDestroyBuffer(m_device->device(), buffer, NULL);
9988 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9989 vkFreeDescriptorSets(m_device->device(), ds_pool,
9990 VK_DESCRIPTOR_TYPE_RANGE_SIZE, descriptor_sets);
9991 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9992}
9993
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009994TEST_F(VkLayerTest, DSBufferInfoErrors) {
9995 TEST_DESCRIPTION(
9996 "Attempt to update buffer descriptor set that has incorrect "
9997 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
9998 "1. offset value greater than buffer size\n"
9999 "2. range value of 0\n"
10000 "3. range value greater than buffer (size - offset)");
10001 VkResult err;
10002
10003 ASSERT_NO_FATAL_FAILURE(InitState());
10004 VkDescriptorPoolSize ds_type_count = {};
10005 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10006 ds_type_count.descriptorCount = 1;
10007
10008 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10009 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10010 ds_pool_ci.pNext = NULL;
10011 ds_pool_ci.maxSets = 1;
10012 ds_pool_ci.poolSizeCount = 1;
10013 ds_pool_ci.pPoolSizes = &ds_type_count;
10014
10015 VkDescriptorPool ds_pool;
10016 err =
10017 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10018 ASSERT_VK_SUCCESS(err);
10019
10020 // Create layout with single uniform buffer descriptor
10021 VkDescriptorSetLayoutBinding dsl_binding = {};
10022 dsl_binding.binding = 0;
10023 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10024 dsl_binding.descriptorCount = 1;
10025 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10026 dsl_binding.pImmutableSamplers = NULL;
10027
10028 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10029 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10030 ds_layout_ci.pNext = NULL;
10031 ds_layout_ci.bindingCount = 1;
10032 ds_layout_ci.pBindings = &dsl_binding;
10033 VkDescriptorSetLayout ds_layout;
10034 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10035 &ds_layout);
10036 ASSERT_VK_SUCCESS(err);
10037
10038 VkDescriptorSet descriptor_set = {};
10039 VkDescriptorSetAllocateInfo alloc_info = {};
10040 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10041 alloc_info.descriptorSetCount = 1;
10042 alloc_info.descriptorPool = ds_pool;
10043 alloc_info.pSetLayouts = &ds_layout;
10044 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10045 &descriptor_set);
10046 ASSERT_VK_SUCCESS(err);
10047
10048 // Create a buffer to be used for invalid updates
10049 VkBufferCreateInfo buff_ci = {};
10050 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10051 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
10052 buff_ci.size = 256;
10053 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10054 VkBuffer buffer;
10055 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10056 ASSERT_VK_SUCCESS(err);
10057 // Have to bind memory to buffer before descriptor update
10058 VkMemoryAllocateInfo mem_alloc = {};
10059 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10060 mem_alloc.pNext = NULL;
10061 mem_alloc.allocationSize = 256;
10062 mem_alloc.memoryTypeIndex = 0;
10063
10064 VkMemoryRequirements mem_reqs;
10065 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
10066 bool pass =
10067 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10068 if (!pass) {
10069 vkDestroyBuffer(m_device->device(), buffer, NULL);
10070 return;
10071 }
10072
10073 VkDeviceMemory mem;
10074 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
10075 ASSERT_VK_SUCCESS(err);
10076 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
10077 ASSERT_VK_SUCCESS(err);
10078
10079 VkDescriptorBufferInfo buff_info = {};
10080 buff_info.buffer = buffer;
10081 // First make offset 1 larger than buffer size
10082 buff_info.offset = 257;
10083 buff_info.range = VK_WHOLE_SIZE;
10084 VkWriteDescriptorSet descriptor_write = {};
10085 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10086 descriptor_write.dstBinding = 0;
10087 descriptor_write.descriptorCount = 1;
10088 descriptor_write.pTexelBufferView = nullptr;
10089 descriptor_write.pBufferInfo = &buff_info;
10090 descriptor_write.pImageInfo = nullptr;
10091
10092 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10093 descriptor_write.dstSet = descriptor_set;
10094 m_errorMonitor->SetDesiredFailureMsg(
10095 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10096 " offset of 257 is greater than buffer ");
10097
10098 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10099
10100 m_errorMonitor->VerifyFound();
10101 // Now cause error due to range of 0
10102 buff_info.offset = 0;
10103 buff_info.range = 0;
10104 m_errorMonitor->SetDesiredFailureMsg(
10105 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10106 " range is not VK_WHOLE_SIZE and is zero, which is not allowed.");
10107
10108 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10109
10110 m_errorMonitor->VerifyFound();
10111 // Now cause error due to range exceeding buffer size - offset
10112 buff_info.offset = 128;
10113 buff_info.range = 200;
10114 m_errorMonitor->SetDesiredFailureMsg(
10115 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10116 " range is 200 which is greater than buffer size ");
10117
10118 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10119
10120 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -060010121 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010122 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10123 vkDestroyBuffer(m_device->device(), buffer, NULL);
10124 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10125 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10126}
10127
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010128TEST_F(VkLayerTest, DSAspectBitsErrors) {
10129 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
10130 // are set, but could expand this test to hit more cases.
10131 TEST_DESCRIPTION("Attempt to update descriptor sets for images "
10132 "that do not have correct aspect bits sets.");
10133 VkResult err;
10134
10135 ASSERT_NO_FATAL_FAILURE(InitState());
10136 VkDescriptorPoolSize ds_type_count = {};
10137 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10138 ds_type_count.descriptorCount = 1;
10139
10140 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10141 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10142 ds_pool_ci.pNext = NULL;
10143 ds_pool_ci.maxSets = 5;
10144 ds_pool_ci.poolSizeCount = 1;
10145 ds_pool_ci.pPoolSizes = &ds_type_count;
10146
10147 VkDescriptorPool ds_pool;
10148 err =
10149 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10150 ASSERT_VK_SUCCESS(err);
10151
10152 VkDescriptorSetLayoutBinding dsl_binding = {};
10153 dsl_binding.binding = 0;
10154 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10155 dsl_binding.descriptorCount = 1;
10156 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10157 dsl_binding.pImmutableSamplers = NULL;
10158
10159 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10160 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10161 ds_layout_ci.pNext = NULL;
10162 ds_layout_ci.bindingCount = 1;
10163 ds_layout_ci.pBindings = &dsl_binding;
10164 VkDescriptorSetLayout ds_layout;
10165 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10166 &ds_layout);
10167 ASSERT_VK_SUCCESS(err);
10168
10169 VkDescriptorSet descriptor_set = {};
10170 VkDescriptorSetAllocateInfo alloc_info = {};
10171 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10172 alloc_info.descriptorSetCount = 1;
10173 alloc_info.descriptorPool = ds_pool;
10174 alloc_info.pSetLayouts = &ds_layout;
10175 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10176 &descriptor_set);
10177 ASSERT_VK_SUCCESS(err);
10178
10179 // Create an image to be used for invalid updates
10180 VkImageCreateInfo image_ci = {};
10181 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10182 image_ci.imageType = VK_IMAGE_TYPE_2D;
10183 image_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
10184 image_ci.extent.width = 64;
10185 image_ci.extent.height = 64;
10186 image_ci.extent.depth = 1;
10187 image_ci.mipLevels = 1;
10188 image_ci.arrayLayers = 1;
10189 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
10190 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
10191 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10192 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10193 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10194 VkImage image;
10195 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10196 ASSERT_VK_SUCCESS(err);
10197 // Bind memory to image
10198 VkMemoryRequirements mem_reqs;
10199 VkDeviceMemory image_mem;
10200 bool pass;
10201 VkMemoryAllocateInfo mem_alloc = {};
10202 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10203 mem_alloc.pNext = NULL;
10204 mem_alloc.allocationSize = 0;
10205 mem_alloc.memoryTypeIndex = 0;
10206 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10207 mem_alloc.allocationSize = mem_reqs.size;
10208 pass =
10209 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10210 ASSERT_TRUE(pass);
10211 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10212 ASSERT_VK_SUCCESS(err);
10213 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10214 ASSERT_VK_SUCCESS(err);
10215 // Now create view for image
10216 VkImageViewCreateInfo image_view_ci = {};
10217 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10218 image_view_ci.image = image;
10219 image_view_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
10220 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10221 image_view_ci.subresourceRange.layerCount = 1;
10222 image_view_ci.subresourceRange.baseArrayLayer = 0;
10223 image_view_ci.subresourceRange.levelCount = 1;
10224 // Setting both depth & stencil aspect bits is illegal for descriptor
10225 image_view_ci.subresourceRange.aspectMask =
10226 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
10227
10228 VkImageView image_view;
10229 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
10230 &image_view);
10231 ASSERT_VK_SUCCESS(err);
10232
10233 VkDescriptorImageInfo img_info = {};
10234 img_info.imageView = image_view;
10235 VkWriteDescriptorSet descriptor_write = {};
10236 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10237 descriptor_write.dstBinding = 0;
10238 descriptor_write.descriptorCount = 1;
10239 descriptor_write.pTexelBufferView = NULL;
10240 descriptor_write.pBufferInfo = NULL;
10241 descriptor_write.pImageInfo = &img_info;
10242 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10243 descriptor_write.dstSet = descriptor_set;
10244 const char *error_msg = " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10245 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
10246 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10247 error_msg);
10248
10249 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10250
10251 m_errorMonitor->VerifyFound();
10252 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10253 vkDestroyImage(m_device->device(), image, NULL);
10254 vkFreeMemory(m_device->device(), image_mem, NULL);
10255 vkDestroyImageView(m_device->device(), image_view, NULL);
10256 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10257 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10258}
10259
Karl Schultz6addd812016-02-02 17:17:23 -070010260TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010261 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010262 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010263
Karl Schultz6addd812016-02-02 17:17:23 -070010264 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010265 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10266 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10267 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010268
Tobin Ehlis3b780662015-05-28 12:11:26 -060010269 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010270 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010271 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010272 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10273 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010274
10275 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010276 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10277 ds_pool_ci.pNext = NULL;
10278 ds_pool_ci.maxSets = 1;
10279 ds_pool_ci.poolSizeCount = 1;
10280 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010281
Tobin Ehlis3b780662015-05-28 12:11:26 -060010282 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010283 err =
10284 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010285 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010286 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010287 dsl_binding.binding = 0;
10288 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10289 dsl_binding.descriptorCount = 1;
10290 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10291 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010292
Tony Barboureb254902015-07-15 12:50:33 -060010293 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010294 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10295 ds_layout_ci.pNext = NULL;
10296 ds_layout_ci.bindingCount = 1;
10297 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010298
Tobin Ehlis3b780662015-05-28 12:11:26 -060010299 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010300 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10301 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010302 ASSERT_VK_SUCCESS(err);
10303
10304 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010305 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010306 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010307 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010308 alloc_info.descriptorPool = ds_pool;
10309 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010310 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10311 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010312 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010313
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010314 VkSamplerCreateInfo sampler_ci = {};
10315 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10316 sampler_ci.pNext = NULL;
10317 sampler_ci.magFilter = VK_FILTER_NEAREST;
10318 sampler_ci.minFilter = VK_FILTER_NEAREST;
10319 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10320 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10321 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10322 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10323 sampler_ci.mipLodBias = 1.0;
10324 sampler_ci.anisotropyEnable = VK_FALSE;
10325 sampler_ci.maxAnisotropy = 1;
10326 sampler_ci.compareEnable = VK_FALSE;
10327 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10328 sampler_ci.minLod = 1.0;
10329 sampler_ci.maxLod = 1.0;
10330 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10331 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10332 VkSampler sampler;
10333 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10334 ASSERT_VK_SUCCESS(err);
10335
10336 VkDescriptorImageInfo info = {};
10337 info.sampler = sampler;
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;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010343 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010344 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010345 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010346 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010347
10348 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10349
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010350 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010351
Chia-I Wuf7458c52015-10-26 21:10:41 +080010352 vkDestroySampler(m_device->device(), sampler, NULL);
10353 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, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010358 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010359 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010360
Karl Schultz6addd812016-02-02 17:17:23 -070010361 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010362 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10363 " binding #0 with 1 total descriptors but update of 1 descriptors "
10364 "starting at binding offset of 0 combined with update array element "
10365 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010366
Tobin Ehlis3b780662015-05-28 12:11:26 -060010367 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010368 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010369 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010370 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10371 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010372
10373 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010374 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10375 ds_pool_ci.pNext = NULL;
10376 ds_pool_ci.maxSets = 1;
10377 ds_pool_ci.poolSizeCount = 1;
10378 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010379
Tobin Ehlis3b780662015-05-28 12:11:26 -060010380 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010381 err =
10382 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010383 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010384
Tony Barboureb254902015-07-15 12:50:33 -060010385 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010386 dsl_binding.binding = 0;
10387 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10388 dsl_binding.descriptorCount = 1;
10389 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10390 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010391
10392 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010393 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10394 ds_layout_ci.pNext = NULL;
10395 ds_layout_ci.bindingCount = 1;
10396 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010397
Tobin Ehlis3b780662015-05-28 12:11:26 -060010398 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010399 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10400 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010401 ASSERT_VK_SUCCESS(err);
10402
10403 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010404 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010405 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010406 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010407 alloc_info.descriptorPool = ds_pool;
10408 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010409 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10410 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010411 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010412
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010413 // Correctly update descriptor to avoid "NOT_UPDATED" error
10414 VkDescriptorBufferInfo buff_info = {};
10415 buff_info.buffer =
10416 VkBuffer(0); // Don't care about buffer handle for this test
10417 buff_info.offset = 0;
10418 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010419
10420 VkWriteDescriptorSet descriptor_write;
10421 memset(&descriptor_write, 0, sizeof(descriptor_write));
10422 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010423 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070010424 descriptor_write.dstArrayElement =
10425 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010426 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010427 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10428 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010429
10430 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10431
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010432 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010433
Chia-I Wuf7458c52015-10-26 21:10:41 +080010434 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10435 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010436}
10437
Karl Schultz6addd812016-02-02 17:17:23 -070010438TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
10439 // Create layout w/ count of 1 and attempt update to that layout w/ binding
10440 // index 2
10441 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010442
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010443 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10444 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010445
Tobin Ehlis3b780662015-05-28 12:11:26 -060010446 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010447 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010448 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010449 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10450 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010451
10452 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010453 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10454 ds_pool_ci.pNext = NULL;
10455 ds_pool_ci.maxSets = 1;
10456 ds_pool_ci.poolSizeCount = 1;
10457 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010458
Tobin Ehlis3b780662015-05-28 12:11:26 -060010459 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010460 err =
10461 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010462 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010463
Tony Barboureb254902015-07-15 12:50:33 -060010464 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010465 dsl_binding.binding = 0;
10466 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10467 dsl_binding.descriptorCount = 1;
10468 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10469 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010470
10471 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010472 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10473 ds_layout_ci.pNext = NULL;
10474 ds_layout_ci.bindingCount = 1;
10475 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010476 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010477 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10478 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010479 ASSERT_VK_SUCCESS(err);
10480
10481 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010482 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010483 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010484 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010485 alloc_info.descriptorPool = ds_pool;
10486 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010487 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10488 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010489 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010490
Tony Barboureb254902015-07-15 12:50:33 -060010491 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010492 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10493 sampler_ci.pNext = NULL;
10494 sampler_ci.magFilter = VK_FILTER_NEAREST;
10495 sampler_ci.minFilter = VK_FILTER_NEAREST;
10496 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10497 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10498 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10499 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10500 sampler_ci.mipLodBias = 1.0;
10501 sampler_ci.anisotropyEnable = VK_FALSE;
10502 sampler_ci.maxAnisotropy = 1;
10503 sampler_ci.compareEnable = VK_FALSE;
10504 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10505 sampler_ci.minLod = 1.0;
10506 sampler_ci.maxLod = 1.0;
10507 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10508 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010509
Tobin Ehlis3b780662015-05-28 12:11:26 -060010510 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010511 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010512 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010513
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010514 VkDescriptorImageInfo info = {};
10515 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010516
10517 VkWriteDescriptorSet descriptor_write;
10518 memset(&descriptor_write, 0, sizeof(descriptor_write));
10519 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010520 descriptor_write.dstSet = descriptorSet;
10521 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010522 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010523 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010524 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010525 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010526
10527 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10528
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010529 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010530
Chia-I Wuf7458c52015-10-26 21:10:41 +080010531 vkDestroySampler(m_device->device(), sampler, NULL);
10532 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10533 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010534}
10535
Karl Schultz6addd812016-02-02 17:17:23 -070010536TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10537 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10538 // types
10539 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010540
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070010541 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis660bcdc2016-05-17 10:39:46 -060010542 ".sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010543
Tobin Ehlis3b780662015-05-28 12:11:26 -060010544 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010545
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010546 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010547 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10548 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010549
10550 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010551 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10552 ds_pool_ci.pNext = NULL;
10553 ds_pool_ci.maxSets = 1;
10554 ds_pool_ci.poolSizeCount = 1;
10555 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010556
Tobin Ehlis3b780662015-05-28 12:11:26 -060010557 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010558 err =
10559 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010560 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010561 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010562 dsl_binding.binding = 0;
10563 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10564 dsl_binding.descriptorCount = 1;
10565 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10566 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010567
Tony Barboureb254902015-07-15 12:50:33 -060010568 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010569 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10570 ds_layout_ci.pNext = NULL;
10571 ds_layout_ci.bindingCount = 1;
10572 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010573
Tobin Ehlis3b780662015-05-28 12:11:26 -060010574 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010575 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10576 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010577 ASSERT_VK_SUCCESS(err);
10578
10579 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010580 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010581 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010582 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010583 alloc_info.descriptorPool = ds_pool;
10584 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010585 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10586 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010587 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010588
Tony Barboureb254902015-07-15 12:50:33 -060010589 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010590 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10591 sampler_ci.pNext = NULL;
10592 sampler_ci.magFilter = VK_FILTER_NEAREST;
10593 sampler_ci.minFilter = VK_FILTER_NEAREST;
10594 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10595 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10596 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10597 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10598 sampler_ci.mipLodBias = 1.0;
10599 sampler_ci.anisotropyEnable = VK_FALSE;
10600 sampler_ci.maxAnisotropy = 1;
10601 sampler_ci.compareEnable = VK_FALSE;
10602 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10603 sampler_ci.minLod = 1.0;
10604 sampler_ci.maxLod = 1.0;
10605 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10606 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010607 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010608 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010609 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010610
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010611 VkDescriptorImageInfo info = {};
10612 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010613
10614 VkWriteDescriptorSet descriptor_write;
10615 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -070010616 descriptor_write.sType =
10617 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010618 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010619 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010620 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010621 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010622 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010623
10624 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10625
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010626 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010627
Chia-I Wuf7458c52015-10-26 21:10:41 +080010628 vkDestroySampler(m_device->device(), sampler, NULL);
10629 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10630 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010631}
10632
Karl Schultz6addd812016-02-02 17:17:23 -070010633TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010634 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010635 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010636
Karl Schultz6addd812016-02-02 17:17:23 -070010637 m_errorMonitor->SetDesiredFailureMsg(
10638 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010639 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010640
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010641 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010642 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10643 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010644 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010645 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10646 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010647
10648 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010649 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10650 ds_pool_ci.pNext = NULL;
10651 ds_pool_ci.maxSets = 1;
10652 ds_pool_ci.poolSizeCount = 1;
10653 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010654
10655 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010656 err =
10657 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010658 ASSERT_VK_SUCCESS(err);
10659
10660 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010661 dsl_binding.binding = 0;
10662 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10663 dsl_binding.descriptorCount = 1;
10664 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10665 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010666
10667 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010668 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10669 ds_layout_ci.pNext = NULL;
10670 ds_layout_ci.bindingCount = 1;
10671 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010672 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010673 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10674 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010675 ASSERT_VK_SUCCESS(err);
10676
10677 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010678 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010679 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010680 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010681 alloc_info.descriptorPool = ds_pool;
10682 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010683 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10684 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010685 ASSERT_VK_SUCCESS(err);
10686
Karl Schultz6addd812016-02-02 17:17:23 -070010687 VkSampler sampler =
10688 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010689
10690 VkDescriptorImageInfo descriptor_info;
10691 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10692 descriptor_info.sampler = sampler;
10693
10694 VkWriteDescriptorSet descriptor_write;
10695 memset(&descriptor_write, 0, sizeof(descriptor_write));
10696 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010697 descriptor_write.dstSet = descriptorSet;
10698 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010699 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010700 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10701 descriptor_write.pImageInfo = &descriptor_info;
10702
10703 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10704
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010705 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010706
Chia-I Wuf7458c52015-10-26 21:10:41 +080010707 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10708 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010709}
10710
Karl Schultz6addd812016-02-02 17:17:23 -070010711TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10712 // Create a single combined Image/Sampler descriptor and send it an invalid
10713 // imageView
10714 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010715
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010716 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10717 "Attempted write update to combined "
10718 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -060010719 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010720
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010721 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010722 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010723 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10724 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010725
10726 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010727 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10728 ds_pool_ci.pNext = NULL;
10729 ds_pool_ci.maxSets = 1;
10730 ds_pool_ci.poolSizeCount = 1;
10731 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010732
10733 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010734 err =
10735 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010736 ASSERT_VK_SUCCESS(err);
10737
10738 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010739 dsl_binding.binding = 0;
10740 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10741 dsl_binding.descriptorCount = 1;
10742 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10743 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010744
10745 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010746 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10747 ds_layout_ci.pNext = NULL;
10748 ds_layout_ci.bindingCount = 1;
10749 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010750 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010751 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10752 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010753 ASSERT_VK_SUCCESS(err);
10754
10755 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010756 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010757 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010758 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010759 alloc_info.descriptorPool = ds_pool;
10760 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010761 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10762 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010763 ASSERT_VK_SUCCESS(err);
10764
10765 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010766 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10767 sampler_ci.pNext = NULL;
10768 sampler_ci.magFilter = VK_FILTER_NEAREST;
10769 sampler_ci.minFilter = VK_FILTER_NEAREST;
10770 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10771 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10772 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10773 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10774 sampler_ci.mipLodBias = 1.0;
10775 sampler_ci.anisotropyEnable = VK_FALSE;
10776 sampler_ci.maxAnisotropy = 1;
10777 sampler_ci.compareEnable = VK_FALSE;
10778 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10779 sampler_ci.minLod = 1.0;
10780 sampler_ci.maxLod = 1.0;
10781 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10782 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010783
10784 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010785 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010786 ASSERT_VK_SUCCESS(err);
10787
Karl Schultz6addd812016-02-02 17:17:23 -070010788 VkImageView view =
10789 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010790
10791 VkDescriptorImageInfo descriptor_info;
10792 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10793 descriptor_info.sampler = sampler;
10794 descriptor_info.imageView = view;
10795
10796 VkWriteDescriptorSet descriptor_write;
10797 memset(&descriptor_write, 0, sizeof(descriptor_write));
10798 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010799 descriptor_write.dstSet = descriptorSet;
10800 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010801 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010802 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10803 descriptor_write.pImageInfo = &descriptor_info;
10804
10805 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10806
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010807 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010808
Chia-I Wuf7458c52015-10-26 21:10:41 +080010809 vkDestroySampler(m_device->device(), sampler, NULL);
10810 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10811 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010812}
10813
Karl Schultz6addd812016-02-02 17:17:23 -070010814TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10815 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10816 // into the other
10817 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010818
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10820 " binding #1 with type "
10821 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10822 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010823
Tobin Ehlis04356f92015-10-27 16:35:27 -060010824 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010825 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010826 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010827 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10828 ds_type_count[0].descriptorCount = 1;
10829 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10830 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010831
10832 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010833 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10834 ds_pool_ci.pNext = NULL;
10835 ds_pool_ci.maxSets = 1;
10836 ds_pool_ci.poolSizeCount = 2;
10837 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010838
10839 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010840 err =
10841 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010842 ASSERT_VK_SUCCESS(err);
10843 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010844 dsl_binding[0].binding = 0;
10845 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10846 dsl_binding[0].descriptorCount = 1;
10847 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10848 dsl_binding[0].pImmutableSamplers = NULL;
10849 dsl_binding[1].binding = 1;
10850 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10851 dsl_binding[1].descriptorCount = 1;
10852 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10853 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010854
10855 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010856 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10857 ds_layout_ci.pNext = NULL;
10858 ds_layout_ci.bindingCount = 2;
10859 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010860
10861 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010862 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10863 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010864 ASSERT_VK_SUCCESS(err);
10865
10866 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010867 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010868 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010869 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010870 alloc_info.descriptorPool = ds_pool;
10871 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010872 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10873 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010874 ASSERT_VK_SUCCESS(err);
10875
10876 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010877 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10878 sampler_ci.pNext = NULL;
10879 sampler_ci.magFilter = VK_FILTER_NEAREST;
10880 sampler_ci.minFilter = VK_FILTER_NEAREST;
10881 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10882 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10883 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10884 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10885 sampler_ci.mipLodBias = 1.0;
10886 sampler_ci.anisotropyEnable = VK_FALSE;
10887 sampler_ci.maxAnisotropy = 1;
10888 sampler_ci.compareEnable = VK_FALSE;
10889 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10890 sampler_ci.minLod = 1.0;
10891 sampler_ci.maxLod = 1.0;
10892 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10893 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010894
10895 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010896 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010897 ASSERT_VK_SUCCESS(err);
10898
10899 VkDescriptorImageInfo info = {};
10900 info.sampler = sampler;
10901
10902 VkWriteDescriptorSet descriptor_write;
10903 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
10904 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010905 descriptor_write.dstSet = descriptorSet;
10906 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080010907 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010908 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10909 descriptor_write.pImageInfo = &info;
10910 // This write update should succeed
10911 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10912 // Now perform a copy update that fails due to type mismatch
10913 VkCopyDescriptorSet copy_ds_update;
10914 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10915 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10916 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -060010917 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010918 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070010919 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +080010920 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010921 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10922
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010923 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010924 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070010925 m_errorMonitor->SetDesiredFailureMsg(
10926 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010927 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -060010928 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10929 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10930 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070010931 copy_ds_update.srcBinding =
10932 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010933 copy_ds_update.dstSet = descriptorSet;
10934 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -060010935 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010936 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10937
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010938 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010939
Tobin Ehlis04356f92015-10-27 16:35:27 -060010940 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070010941 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010942 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
10943 "update array offset of 0 and update of "
10944 "5 descriptors oversteps total number "
10945 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010946
Tobin Ehlis04356f92015-10-27 16:35:27 -060010947 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10948 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10949 copy_ds_update.srcSet = descriptorSet;
10950 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010951 copy_ds_update.dstSet = descriptorSet;
10952 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070010953 copy_ds_update.descriptorCount =
10954 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060010955 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10956
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010957 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010958
Chia-I Wuf7458c52015-10-26 21:10:41 +080010959 vkDestroySampler(m_device->device(), sampler, NULL);
10960 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10961 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010962}
10963
Karl Schultz6addd812016-02-02 17:17:23 -070010964TEST_F(VkLayerTest, NumSamplesMismatch) {
10965 // Create CommandBuffer where MSAA samples doesn't match RenderPass
10966 // sampleCount
10967 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010968
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070010969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070010970 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010971
Tobin Ehlis3b780662015-05-28 12:11:26 -060010972 ASSERT_NO_FATAL_FAILURE(InitState());
10973 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010974 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060010975 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010976 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010977
10978 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010979 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10980 ds_pool_ci.pNext = NULL;
10981 ds_pool_ci.maxSets = 1;
10982 ds_pool_ci.poolSizeCount = 1;
10983 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010984
Tobin Ehlis3b780662015-05-28 12:11:26 -060010985 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010986 err =
10987 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010988 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010989
Tony Barboureb254902015-07-15 12:50:33 -060010990 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080010991 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060010992 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080010993 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010994 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10995 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010996
Tony Barboureb254902015-07-15 12:50:33 -060010997 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10998 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10999 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011000 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070011001 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011002
Tobin Ehlis3b780662015-05-28 12:11:26 -060011003 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011004 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11005 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011006 ASSERT_VK_SUCCESS(err);
11007
11008 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011009 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011010 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011011 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011012 alloc_info.descriptorPool = ds_pool;
11013 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011014 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11015 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011016 ASSERT_VK_SUCCESS(err);
11017
Tony Barboureb254902015-07-15 12:50:33 -060011018 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011019 pipe_ms_state_ci.sType =
11020 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11021 pipe_ms_state_ci.pNext = NULL;
11022 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11023 pipe_ms_state_ci.sampleShadingEnable = 0;
11024 pipe_ms_state_ci.minSampleShading = 1.0;
11025 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011026
Tony Barboureb254902015-07-15 12:50:33 -060011027 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011028 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11029 pipeline_layout_ci.pNext = NULL;
11030 pipeline_layout_ci.setLayoutCount = 1;
11031 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011032
11033 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011034 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11035 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011036 ASSERT_VK_SUCCESS(err);
11037
Karl Schultz6addd812016-02-02 17:17:23 -070011038 VkShaderObj vs(m_device, bindStateVertShaderText,
11039 VK_SHADER_STAGE_VERTEX_BIT, this);
11040 VkShaderObj fs(m_device, bindStateFragShaderText,
11041 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011042 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070011043 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011044 VkPipelineObj pipe(m_device);
11045 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011046 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011047 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011048 pipe.SetMSAA(&pipe_ms_state_ci);
11049 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011050
Tony Barbourfe3351b2015-07-28 10:17:20 -060011051 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070011052 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11053 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011054
Mark Young29927482016-05-04 14:38:51 -060011055 // Render triangle (the error should trigger on the attempt to draw).
11056 Draw(3, 1, 0, 0);
11057
11058 // Finalize recording of the command buffer
11059 EndCommandBuffer();
11060
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011061 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011062
Chia-I Wuf7458c52015-10-26 21:10:41 +080011063 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11064 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11065 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011066}
Mark Young29927482016-05-04 14:38:51 -060011067
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011068TEST_F(VkLayerTest, RenderPassIncompatible) {
11069 TEST_DESCRIPTION("Hit RenderPass incompatible cases. "
11070 "Initial case is drawing with an active renderpass that's "
11071 "not compatible with the bound PSO's creation renderpass");
11072 VkResult err;
11073
11074 ASSERT_NO_FATAL_FAILURE(InitState());
11075 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11076
11077 VkDescriptorSetLayoutBinding dsl_binding = {};
11078 dsl_binding.binding = 0;
11079 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11080 dsl_binding.descriptorCount = 1;
11081 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11082 dsl_binding.pImmutableSamplers = NULL;
11083
11084 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11085 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11086 ds_layout_ci.pNext = NULL;
11087 ds_layout_ci.bindingCount = 1;
11088 ds_layout_ci.pBindings = &dsl_binding;
11089
11090 VkDescriptorSetLayout ds_layout;
11091 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11092 &ds_layout);
11093 ASSERT_VK_SUCCESS(err);
11094
11095 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11096 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11097 pipeline_layout_ci.pNext = NULL;
11098 pipeline_layout_ci.setLayoutCount = 1;
11099 pipeline_layout_ci.pSetLayouts = &ds_layout;
11100
11101 VkPipelineLayout pipeline_layout;
11102 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11103 &pipeline_layout);
11104 ASSERT_VK_SUCCESS(err);
11105
11106 VkShaderObj vs(m_device, bindStateVertShaderText,
11107 VK_SHADER_STAGE_VERTEX_BIT, this);
11108 VkShaderObj fs(m_device, bindStateFragShaderText,
11109 VK_SHADER_STAGE_FRAGMENT_BIT,
11110 this); // We shouldn't need a fragment shader
11111 // but add it to be able to run on more devices
11112 // Create a renderpass that will be incompatible with default renderpass
11113 VkAttachmentReference attach = {};
11114 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11115 VkAttachmentReference color_att = {};
11116 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11117 VkSubpassDescription subpass = {};
11118 subpass.inputAttachmentCount = 1;
11119 subpass.pInputAttachments = &attach;
11120 subpass.colorAttachmentCount = 1;
11121 subpass.pColorAttachments = &color_att;
11122 VkRenderPassCreateInfo rpci = {};
11123 rpci.subpassCount = 1;
11124 rpci.pSubpasses = &subpass;
11125 rpci.attachmentCount = 1;
11126 VkAttachmentDescription attach_desc = {};
11127 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011128 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11129 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011130 rpci.pAttachments = &attach_desc;
11131 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11132 VkRenderPass rp;
11133 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11134 VkPipelineObj pipe(m_device);
11135 pipe.AddShader(&vs);
11136 pipe.AddShader(&fs);
11137 pipe.AddColorAttachment();
11138 VkViewport view_port = {};
11139 m_viewports.push_back(view_port);
11140 pipe.SetViewport(m_viewports);
11141 VkRect2D rect = {};
11142 m_scissors.push_back(rect);
11143 pipe.SetScissor(m_scissors);
11144 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11145
11146 VkCommandBufferInheritanceInfo cbii = {};
11147 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11148 cbii.renderPass = rp;
11149 cbii.subpass = 0;
11150 VkCommandBufferBeginInfo cbbi = {};
11151 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11152 cbbi.pInheritanceInfo = &cbii;
11153 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11154 VkRenderPassBeginInfo rpbi = {};
11155 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11156 rpbi.framebuffer = m_framebuffer;
11157 rpbi.renderPass = rp;
11158 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi,
11159 VK_SUBPASS_CONTENTS_INLINE);
11160 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11161 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11162
11163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11164 " is incompatible w/ gfx pipeline ");
11165 // Render triangle (the error should trigger on the attempt to draw).
11166 Draw(3, 1, 0, 0);
11167
11168 // Finalize recording of the command buffer
11169 EndCommandBuffer();
11170
11171 m_errorMonitor->VerifyFound();
11172
11173 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11174 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11175 vkDestroyRenderPass(m_device->device(), rp, NULL);
11176}
11177
Mark Youngc89c6312016-03-31 16:03:20 -060011178TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11179 // Create Pipeline where the number of blend attachments doesn't match the
11180 // number of color attachments. In this case, we don't add any color
11181 // blend attachments even though we have a color attachment.
11182 VkResult err;
11183
11184 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -060011185 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -060011186
11187 ASSERT_NO_FATAL_FAILURE(InitState());
11188 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11189 VkDescriptorPoolSize ds_type_count = {};
11190 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11191 ds_type_count.descriptorCount = 1;
11192
11193 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11194 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11195 ds_pool_ci.pNext = NULL;
11196 ds_pool_ci.maxSets = 1;
11197 ds_pool_ci.poolSizeCount = 1;
11198 ds_pool_ci.pPoolSizes = &ds_type_count;
11199
11200 VkDescriptorPool ds_pool;
11201 err =
11202 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11203 ASSERT_VK_SUCCESS(err);
11204
11205 VkDescriptorSetLayoutBinding dsl_binding = {};
11206 dsl_binding.binding = 0;
11207 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11208 dsl_binding.descriptorCount = 1;
11209 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11210 dsl_binding.pImmutableSamplers = NULL;
11211
11212 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11213 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11214 ds_layout_ci.pNext = NULL;
11215 ds_layout_ci.bindingCount = 1;
11216 ds_layout_ci.pBindings = &dsl_binding;
11217
11218 VkDescriptorSetLayout ds_layout;
11219 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11220 &ds_layout);
11221 ASSERT_VK_SUCCESS(err);
11222
11223 VkDescriptorSet descriptorSet;
11224 VkDescriptorSetAllocateInfo alloc_info = {};
11225 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11226 alloc_info.descriptorSetCount = 1;
11227 alloc_info.descriptorPool = ds_pool;
11228 alloc_info.pSetLayouts = &ds_layout;
11229 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11230 &descriptorSet);
11231 ASSERT_VK_SUCCESS(err);
11232
11233 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
11234 pipe_ms_state_ci.sType =
11235 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11236 pipe_ms_state_ci.pNext = NULL;
11237 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11238 pipe_ms_state_ci.sampleShadingEnable = 0;
11239 pipe_ms_state_ci.minSampleShading = 1.0;
11240 pipe_ms_state_ci.pSampleMask = NULL;
11241
11242 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11243 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11244 pipeline_layout_ci.pNext = NULL;
11245 pipeline_layout_ci.setLayoutCount = 1;
11246 pipeline_layout_ci.pSetLayouts = &ds_layout;
11247
11248 VkPipelineLayout pipeline_layout;
11249 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11250 &pipeline_layout);
11251 ASSERT_VK_SUCCESS(err);
11252
11253 VkShaderObj vs(m_device, bindStateVertShaderText,
11254 VK_SHADER_STAGE_VERTEX_BIT, this);
11255 VkShaderObj fs(m_device, bindStateFragShaderText,
11256 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011257 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -060011258 // but add it to be able to run on more devices
11259 VkPipelineObj pipe(m_device);
11260 pipe.AddShader(&vs);
11261 pipe.AddShader(&fs);
11262 pipe.SetMSAA(&pipe_ms_state_ci);
11263 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11264
11265 BeginCommandBuffer();
11266 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11267 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11268
Mark Young29927482016-05-04 14:38:51 -060011269 // Render triangle (the error should trigger on the attempt to draw).
11270 Draw(3, 1, 0, 0);
11271
11272 // Finalize recording of the command buffer
11273 EndCommandBuffer();
11274
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011275 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011276
11277 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11278 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11279 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11280}
Mark Young29927482016-05-04 14:38:51 -060011281
Mark Muellerd4914412016-06-13 17:52:06 -060011282TEST_F(VkLayerTest, MissingClearAttachment) {
11283 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment "
11284 "structure passed to vkCmdClearAttachments");
11285 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11286 "vkCmdClearAttachments() attachment index 1 not found in attachment "
11287 "reference array of active subpass 0");
11288
11289 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11290 m_errorMonitor->VerifyFound();
11291}
11292
Karl Schultz6addd812016-02-02 17:17:23 -070011293TEST_F(VkLayerTest, ClearCmdNoDraw) {
11294 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
11295 // to issuing a Draw
11296 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011297
Karl Schultz6addd812016-02-02 17:17:23 -070011298 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -070011299 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011300 "vkCmdClearAttachments() issued on CB object ");
11301
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011302 ASSERT_NO_FATAL_FAILURE(InitState());
11303 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011304
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011305 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011306 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11307 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011308
11309 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011310 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11311 ds_pool_ci.pNext = NULL;
11312 ds_pool_ci.maxSets = 1;
11313 ds_pool_ci.poolSizeCount = 1;
11314 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011315
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011316 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011317 err =
11318 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011319 ASSERT_VK_SUCCESS(err);
11320
Tony Barboureb254902015-07-15 12:50:33 -060011321 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011322 dsl_binding.binding = 0;
11323 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11324 dsl_binding.descriptorCount = 1;
11325 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11326 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011327
Tony Barboureb254902015-07-15 12:50:33 -060011328 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011329 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11330 ds_layout_ci.pNext = NULL;
11331 ds_layout_ci.bindingCount = 1;
11332 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011333
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011334 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011335 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11336 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011337 ASSERT_VK_SUCCESS(err);
11338
11339 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011340 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011341 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011342 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011343 alloc_info.descriptorPool = ds_pool;
11344 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011345 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11346 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011347 ASSERT_VK_SUCCESS(err);
11348
Tony Barboureb254902015-07-15 12:50:33 -060011349 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011350 pipe_ms_state_ci.sType =
11351 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11352 pipe_ms_state_ci.pNext = NULL;
11353 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11354 pipe_ms_state_ci.sampleShadingEnable = 0;
11355 pipe_ms_state_ci.minSampleShading = 1.0;
11356 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011357
Tony Barboureb254902015-07-15 12:50:33 -060011358 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011359 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11360 pipeline_layout_ci.pNext = NULL;
11361 pipeline_layout_ci.setLayoutCount = 1;
11362 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011363
11364 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011365 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11366 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011367 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011368
Karl Schultz6addd812016-02-02 17:17:23 -070011369 VkShaderObj vs(m_device, bindStateVertShaderText,
11370 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011371 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011372 // on more devices
11373 VkShaderObj fs(m_device, bindStateFragShaderText,
11374 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011375
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011376 VkPipelineObj pipe(m_device);
11377 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011378 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011379 pipe.SetMSAA(&pipe_ms_state_ci);
11380 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011381
11382 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011383
Karl Schultz6addd812016-02-02 17:17:23 -070011384 // Main thing we care about for this test is that the VkImage obj we're
11385 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011386 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011387 VkClearAttachment color_attachment;
11388 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11389 color_attachment.clearValue.color.float32[0] = 1.0;
11390 color_attachment.clearValue.color.float32[1] = 1.0;
11391 color_attachment.clearValue.color.float32[2] = 1.0;
11392 color_attachment.clearValue.color.float32[3] = 1.0;
11393 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070011394 VkClearRect clear_rect = {
11395 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011396
Karl Schultz6addd812016-02-02 17:17:23 -070011397 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
11398 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011399
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011400 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011401
Chia-I Wuf7458c52015-10-26 21:10:41 +080011402 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11403 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11404 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011405}
11406
Karl Schultz6addd812016-02-02 17:17:23 -070011407TEST_F(VkLayerTest, VtxBufferBadIndex) {
11408 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011409
Karl Schultz6addd812016-02-02 17:17:23 -070011410 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070011411 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -070011412 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011413
Tobin Ehlis502480b2015-06-24 15:53:07 -060011414 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011415 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011416 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011417
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011418 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011419 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11420 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011421
11422 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011423 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11424 ds_pool_ci.pNext = NULL;
11425 ds_pool_ci.maxSets = 1;
11426 ds_pool_ci.poolSizeCount = 1;
11427 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011428
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011429 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011430 err =
11431 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011432 ASSERT_VK_SUCCESS(err);
11433
Tony Barboureb254902015-07-15 12:50:33 -060011434 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011435 dsl_binding.binding = 0;
11436 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11437 dsl_binding.descriptorCount = 1;
11438 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11439 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011440
Tony Barboureb254902015-07-15 12:50:33 -060011441 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011442 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11443 ds_layout_ci.pNext = NULL;
11444 ds_layout_ci.bindingCount = 1;
11445 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011446
Tobin Ehlis502480b2015-06-24 15:53:07 -060011447 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011448 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11449 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011450 ASSERT_VK_SUCCESS(err);
11451
11452 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011453 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011454 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011455 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011456 alloc_info.descriptorPool = ds_pool;
11457 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011458 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11459 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011460 ASSERT_VK_SUCCESS(err);
11461
Tony Barboureb254902015-07-15 12:50:33 -060011462 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011463 pipe_ms_state_ci.sType =
11464 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11465 pipe_ms_state_ci.pNext = NULL;
11466 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11467 pipe_ms_state_ci.sampleShadingEnable = 0;
11468 pipe_ms_state_ci.minSampleShading = 1.0;
11469 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011470
Tony Barboureb254902015-07-15 12:50:33 -060011471 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011472 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11473 pipeline_layout_ci.pNext = NULL;
11474 pipeline_layout_ci.setLayoutCount = 1;
11475 pipeline_layout_ci.pSetLayouts = &ds_layout;
11476 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011477
Karl Schultz6addd812016-02-02 17:17:23 -070011478 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11479 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011480 ASSERT_VK_SUCCESS(err);
11481
Karl Schultz6addd812016-02-02 17:17:23 -070011482 VkShaderObj vs(m_device, bindStateVertShaderText,
11483 VK_SHADER_STAGE_VERTEX_BIT, this);
11484 VkShaderObj fs(m_device, bindStateFragShaderText,
11485 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011486 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070011487 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011488 VkPipelineObj pipe(m_device);
11489 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011490 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011491 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011492 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011493 pipe.SetViewport(m_viewports);
11494 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011495 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011496
11497 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070011498 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11499 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011500 // Don't care about actual data, just need to get to draw to flag error
11501 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -070011502 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
11503 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011504 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011505 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011506
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011507 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011508
Chia-I Wuf7458c52015-10-26 21:10:41 +080011509 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11510 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11511 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011512}
Mark Muellerdfe37552016-07-07 14:47:42 -060011513
11514TEST_F(VkLayerTest, VertexBufferInvalid) {
11515 TEST_DESCRIPTION("Submit a command buffer using deleted vertex buffer, "
11516 "delete a buffer twice, use an invalid offset for each "
11517 "buffer type, and attempt to bind a null buffer");
11518
11519 const char *deleted_buffer_in_command_buffer = "Cannot submit cmd buffer "
11520 "using deleted buffer ";
11521 const char *double_destroy_message = "Cannot free buffer 0x";
11522 const char *invalid_offset_message = "vkBindBufferMemory(): "
11523 "memoryOffset is 0x";
11524 const char *invalid_storage_buffer_offset_message = "vkBindBufferMemory(): "
11525 "storage memoryOffset "
11526 "is 0x";
11527 const char *invalid_texel_buffer_offset_message = "vkBindBufferMemory(): "
11528 "texel memoryOffset "
11529 "is 0x";
11530 const char *invalid_uniform_buffer_offset_message = "vkBindBufferMemory(): "
11531 "uniform memoryOffset "
11532 "is 0x";
11533 const char *bind_null_buffer_message = "In vkBindBufferMemory, attempting"
11534 " to Bind Obj(0x";
11535 const char *free_invalid_buffer_message = "Request to delete memory "
11536 "object 0x";
11537
11538 ASSERT_NO_FATAL_FAILURE(InitState());
11539 ASSERT_NO_FATAL_FAILURE(InitViewport());
11540 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11541
11542 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
11543 pipe_ms_state_ci.sType =
11544 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11545 pipe_ms_state_ci.pNext = NULL;
11546 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11547 pipe_ms_state_ci.sampleShadingEnable = 0;
11548 pipe_ms_state_ci.minSampleShading = 1.0;
11549 pipe_ms_state_ci.pSampleMask = nullptr;
11550
11551 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11552 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11553 VkPipelineLayout pipeline_layout;
11554
11555 VkResult err = vkCreatePipelineLayout(m_device->device(),
11556 &pipeline_layout_ci, nullptr,
11557 &pipeline_layout);
11558 ASSERT_VK_SUCCESS(err);
11559
11560 VkShaderObj vs(m_device, bindStateVertShaderText,
11561 VK_SHADER_STAGE_VERTEX_BIT, this);
11562 VkShaderObj fs(m_device, bindStateFragShaderText,
11563 VK_SHADER_STAGE_FRAGMENT_BIT,
11564 this);
11565 VkPipelineObj pipe(m_device);
11566 pipe.AddShader(&vs);
11567 pipe.AddShader(&fs);
11568 pipe.AddColorAttachment();
11569 pipe.SetMSAA(&pipe_ms_state_ci);
11570 pipe.SetViewport(m_viewports);
11571 pipe.SetScissor(m_scissors);
11572 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11573
11574 BeginCommandBuffer();
11575 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11576 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11577
11578 {
11579 // Create and bind a vertex buffer in a reduced scope, which will cause
11580 // it to be deleted upon leaving this scope
11581 const float vbo_data[3] = {1.f, 0.f, 1.f};
11582 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data),
11583 3, vbo_data);
11584 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11585 draw_verticies.AddVertexInputToPipe(pipe);
11586 }
11587
11588 Draw(1, 0, 0, 0);
11589
11590 EndCommandBuffer();
11591
11592 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11593 deleted_buffer_in_command_buffer);
11594 QueueCommandBuffer(false);
11595 m_errorMonitor->VerifyFound();
11596
11597 {
11598 // Create and bind a vertex buffer in a reduced scope, and delete it
11599 // twice, the second through the destructor
11600 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11601 VkBufferTest::eDoubleDelete);
11602 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11603 double_destroy_message);
11604 buffer_test.TestDoubleDestroy();
11605 }
11606 m_errorMonitor->VerifyFound();
11607
11608 if (VkBufferTest::
11609 GetTestConditionValid(m_device,
11610 VkBufferTest::eInvalidMemoryOffset)) {
11611 // Create and bind a memory buffer with an invalid offset.
11612 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11613 invalid_offset_message);
11614 VkBufferTest buffer_test(m_device,
11615 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
11616 VkBufferTest::eInvalidMemoryOffset);
11617 (void) buffer_test;
11618 m_errorMonitor->VerifyFound();
11619 }
11620
11621 if (VkBufferTest::
11622 GetTestConditionValid(m_device,
11623 VkBufferTest::eInvalidDeviceOffset,
11624 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
11625 // Create and bind a memory buffer with an invalid offset again,
11626 // but look for a texel buffer message.
11627 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11628 invalid_texel_buffer_offset_message);
11629 VkBufferTest buffer_test(m_device,
11630 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
11631 VkBufferTest::eInvalidDeviceOffset);
11632 (void) buffer_test;
11633 m_errorMonitor->VerifyFound();
11634 }
11635
11636 if (VkBufferTest::
11637 GetTestConditionValid(m_device,
11638 VkBufferTest::eInvalidDeviceOffset,
11639 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
11640 // Create and bind a memory buffer with an invalid offset again, but
11641 // look for a uniform buffer message.
11642 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11643 invalid_uniform_buffer_offset_message);
11644 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
11645 VkBufferTest::eInvalidDeviceOffset);
11646 (void) buffer_test;
11647 m_errorMonitor->VerifyFound();
11648 }
11649
11650 if (VkBufferTest::
11651 GetTestConditionValid(m_device,
11652 VkBufferTest::eInvalidDeviceOffset,
11653 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
11654 // Create and bind a memory buffer with an invalid offset again, but
11655 // look for a storage buffer message.
11656 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11657 invalid_storage_buffer_offset_message);
11658 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11659 VkBufferTest::eInvalidDeviceOffset);
11660 (void) buffer_test;
11661 m_errorMonitor->VerifyFound();
11662 }
11663
11664 {
11665 // Attempt to bind a null buffer.
11666 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11667 bind_null_buffer_message);
11668 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11669 VkBufferTest::eBindNullBuffer);
11670 (void) buffer_test;
11671 m_errorMonitor->VerifyFound();
11672 }
11673
11674 {
11675 // Attempt to use an invalid handle to delete a buffer.
11676 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11677 free_invalid_buffer_message);
11678 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11679 VkBufferTest::eFreeInvalidHandle);
11680 (void) buffer_test;
11681 }
11682 m_errorMonitor->VerifyFound();
11683
11684 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11685}
11686
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011687// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11688TEST_F(VkLayerTest, InvalidImageLayout) {
11689 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
11690 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11691 "images in the wrong layout when they're copied or transitioned.");
11692 // 3 in ValidateCmdBufImageLayouts
11693 // * -1 Attempt to submit cmd buf w/ deleted image
11694 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11695 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
11696 m_errorMonitor->SetDesiredFailureMsg(
11697 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11698 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11699
11700 ASSERT_NO_FATAL_FAILURE(InitState());
11701 // Create src & dst images to use for copy operations
11702 VkImage src_image;
11703 VkImage dst_image;
11704
11705 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11706 const int32_t tex_width = 32;
11707 const int32_t tex_height = 32;
11708
11709 VkImageCreateInfo image_create_info = {};
11710 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11711 image_create_info.pNext = NULL;
11712 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11713 image_create_info.format = tex_format;
11714 image_create_info.extent.width = tex_width;
11715 image_create_info.extent.height = tex_height;
11716 image_create_info.extent.depth = 1;
11717 image_create_info.mipLevels = 1;
11718 image_create_info.arrayLayers = 4;
11719 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11720 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11721 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
11722 image_create_info.flags = 0;
11723
11724 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11725 ASSERT_VK_SUCCESS(err);
11726 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11727 ASSERT_VK_SUCCESS(err);
11728
11729 BeginCommandBuffer();
11730 VkImageCopy copyRegion;
11731 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11732 copyRegion.srcSubresource.mipLevel = 0;
11733 copyRegion.srcSubresource.baseArrayLayer = 0;
11734 copyRegion.srcSubresource.layerCount = 1;
11735 copyRegion.srcOffset.x = 0;
11736 copyRegion.srcOffset.y = 0;
11737 copyRegion.srcOffset.z = 0;
11738 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11739 copyRegion.dstSubresource.mipLevel = 0;
11740 copyRegion.dstSubresource.baseArrayLayer = 0;
11741 copyRegion.dstSubresource.layerCount = 1;
11742 copyRegion.dstOffset.x = 0;
11743 copyRegion.dstOffset.y = 0;
11744 copyRegion.dstOffset.z = 0;
11745 copyRegion.extent.width = 1;
11746 copyRegion.extent.height = 1;
11747 copyRegion.extent.depth = 1;
11748 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11749 m_errorMonitor->VerifyFound();
11750 // Now cause error due to src image layout changing
11751 m_errorMonitor->SetDesiredFailureMsg(
11752 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11753 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
11754 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11755 m_errorMonitor->VerifyFound();
11756 // Final src error is due to bad layout type
11757 m_errorMonitor->SetDesiredFailureMsg(
11758 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11759 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
11760 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11761 m_errorMonitor->VerifyFound();
11762 // Now verify same checks for dst
11763 m_errorMonitor->SetDesiredFailureMsg(
11764 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11765 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
11766 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11767 m_errorMonitor->VerifyFound();
11768 // Now cause error due to src image layout changing
11769 m_errorMonitor->SetDesiredFailureMsg(
11770 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11771 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
11772 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
11773 m_errorMonitor->VerifyFound();
11774 m_errorMonitor->SetDesiredFailureMsg(
11775 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11776 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
11777 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
11778 m_errorMonitor->VerifyFound();
11779 // Now cause error due to bad image layout transition in PipelineBarrier
11780 VkImageMemoryBarrier image_barrier[1] = {};
11781 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11782 image_barrier[0].image = src_image;
11783 image_barrier[0].subresourceRange.layerCount = 2;
11784 image_barrier[0].subresourceRange.levelCount = 2;
11785 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11786 m_errorMonitor->SetDesiredFailureMsg(
11787 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11788 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
11789 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
11790 m_errorMonitor->VerifyFound();
11791
11792 // Finally some layout errors at RenderPass create time
11793 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
11794 VkAttachmentReference attach = {};
11795 // perf warning for GENERAL layout w/ non-DS input attachment
11796 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11797 VkSubpassDescription subpass = {};
11798 subpass.inputAttachmentCount = 1;
11799 subpass.pInputAttachments = &attach;
11800 VkRenderPassCreateInfo rpci = {};
11801 rpci.subpassCount = 1;
11802 rpci.pSubpasses = &subpass;
11803 rpci.attachmentCount = 1;
11804 VkAttachmentDescription attach_desc = {};
11805 attach_desc.format = VK_FORMAT_UNDEFINED;
11806 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011807 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011808 VkRenderPass rp;
11809 m_errorMonitor->SetDesiredFailureMsg(
11810 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11811 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
11812 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11813 m_errorMonitor->VerifyFound();
11814 // error w/ non-general layout
11815 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11816
11817 m_errorMonitor->SetDesiredFailureMsg(
11818 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11819 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
11820 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11821 m_errorMonitor->VerifyFound();
11822 subpass.inputAttachmentCount = 0;
11823 subpass.colorAttachmentCount = 1;
11824 subpass.pColorAttachments = &attach;
11825 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11826 // perf warning for GENERAL layout on color attachment
11827 m_errorMonitor->SetDesiredFailureMsg(
11828 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11829 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
11830 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11831 m_errorMonitor->VerifyFound();
11832 // error w/ non-color opt or GENERAL layout for color attachment
11833 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11834 m_errorMonitor->SetDesiredFailureMsg(
11835 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11836 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
11837 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11838 m_errorMonitor->VerifyFound();
11839 subpass.colorAttachmentCount = 0;
11840 subpass.pDepthStencilAttachment = &attach;
11841 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11842 // perf warning for GENERAL layout on DS attachment
11843 m_errorMonitor->SetDesiredFailureMsg(
11844 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11845 "Layout for depth attachment is GENERAL but should be DEPTH_STENCIL_ATTACHMENT_OPTIMAL.");
11846 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11847 m_errorMonitor->VerifyFound();
11848 // error w/ non-ds opt or GENERAL layout for color attachment
11849 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11850 m_errorMonitor->SetDesiredFailureMsg(
11851 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11852 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be DEPTH_STENCIL_ATTACHMENT_OPTIMAL or GENERAL.");
11853 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11854 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060011855 // For this error we need a valid renderpass so create default one
11856 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11857 attach.attachment = 0;
11858 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
11859 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
11860 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
11861 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
11862 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
11863 // Can't do a CLEAR load on READ_ONLY initialLayout
11864 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
11865 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11866 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11868 " with invalid first layout "
11869 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
11870 "ONLY_OPTIMAL");
11871 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11872 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011873
11874 vkDestroyImage(m_device->device(), src_image, NULL);
11875 vkDestroyImage(m_device->device(), dst_image, NULL);
11876}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011877#endif // DRAW_STATE_TESTS
11878
Tobin Ehlis0788f522015-05-26 16:11:58 -060011879#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -060011880#if GTEST_IS_THREADSAFE
11881struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011882 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011883 VkEvent event;
11884 bool bailout;
11885};
11886
Karl Schultz6addd812016-02-02 17:17:23 -070011887extern "C" void *AddToCommandBuffer(void *arg) {
11888 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011889
Mike Stroyana6d14942016-07-13 15:10:05 -060011890 for (int i = 0; i < 80000; i++) {
Karl Schultz6addd812016-02-02 17:17:23 -070011891 vkCmdSetEvent(data->commandBuffer, data->event,
11892 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011893 if (data->bailout) {
11894 break;
11895 }
11896 }
11897 return NULL;
11898}
11899
Karl Schultz6addd812016-02-02 17:17:23 -070011900TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060011901 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011902
Karl Schultz6addd812016-02-02 17:17:23 -070011903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11904 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011905
Mike Stroyanaccf7692015-05-12 16:00:45 -060011906 ASSERT_NO_FATAL_FAILURE(InitState());
11907 ASSERT_NO_FATAL_FAILURE(InitViewport());
11908 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11909
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011910 // Calls AllocateCommandBuffers
11911 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060011912
11913 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011914 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060011915
11916 VkEventCreateInfo event_info;
11917 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011918 VkResult err;
11919
11920 memset(&event_info, 0, sizeof(event_info));
11921 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11922
Chia-I Wuf7458c52015-10-26 21:10:41 +080011923 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011924 ASSERT_VK_SUCCESS(err);
11925
Mike Stroyanaccf7692015-05-12 16:00:45 -060011926 err = vkResetEvent(device(), event);
11927 ASSERT_VK_SUCCESS(err);
11928
11929 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011930 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060011931 data.event = event;
11932 data.bailout = false;
11933 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060011934
11935 // First do some correct operations using multiple threads.
11936 // Add many entries to command buffer from another thread.
11937 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
11938 // Make non-conflicting calls from this thread at the same time.
11939 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060011940 uint32_t count;
11941 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060011942 }
11943 test_platform_thread_join(thread, NULL);
11944
11945 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060011946 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060011947 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011948 // Add many entries to command buffer from this thread at the same time.
11949 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060011950
Mike Stroyan4268d1f2015-07-13 14:45:35 -060011951 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011952 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060011953
Mike Stroyan10b8cb72016-01-22 15:22:03 -070011954 m_errorMonitor->SetBailout(NULL);
11955
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011956 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060011957
Chia-I Wuf7458c52015-10-26 21:10:41 +080011958 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011959}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011960#endif // GTEST_IS_THREADSAFE
11961#endif // THREADING_TESTS
11962
Chris Forbes9f7ff632015-05-25 11:13:08 +120011963#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070011964TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011965 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120011966 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011967
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011968 ASSERT_NO_FATAL_FAILURE(InitState());
11969 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11970
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011971 VkShaderModule module;
11972 VkShaderModuleCreateInfo moduleCreateInfo;
11973 struct icd_spv_header spv;
11974
11975 spv.magic = ICD_SPV_MAGIC;
11976 spv.version = ICD_SPV_VERSION;
11977 spv.gen_magic = 0;
11978
11979 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
11980 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070011981 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011982 moduleCreateInfo.codeSize = 4;
11983 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011984 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011985
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011986 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011987}
11988
Karl Schultz6addd812016-02-02 17:17:23 -070011989TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011990 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120011991 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011992
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011993 ASSERT_NO_FATAL_FAILURE(InitState());
11994 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11995
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011996 VkShaderModule module;
11997 VkShaderModuleCreateInfo moduleCreateInfo;
11998 struct icd_spv_header spv;
11999
12000 spv.magic = ~ICD_SPV_MAGIC;
12001 spv.version = ICD_SPV_VERSION;
12002 spv.gen_magic = 0;
12003
12004 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12005 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070012006 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012007 moduleCreateInfo.codeSize = sizeof(spv) + 10;
12008 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012009 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012010
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012011 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012012}
12013
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012014#if 0
12015// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070012016TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012017 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012018 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012019
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012020 ASSERT_NO_FATAL_FAILURE(InitState());
12021 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12022
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012023 VkShaderModule module;
12024 VkShaderModuleCreateInfo moduleCreateInfo;
12025 struct icd_spv_header spv;
12026
12027 spv.magic = ICD_SPV_MAGIC;
12028 spv.version = ~ICD_SPV_VERSION;
12029 spv.gen_magic = 0;
12030
12031 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12032 moduleCreateInfo.pNext = NULL;
12033
Karl Schultz6addd812016-02-02 17:17:23 -070012034 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012035 moduleCreateInfo.codeSize = sizeof(spv) + 10;
12036 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012037 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012038
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012039 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012040}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012041#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012042
Karl Schultz6addd812016-02-02 17:17:23 -070012043TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012044 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012045 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012046
Chris Forbes9f7ff632015-05-25 11:13:08 +120012047 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012048 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120012049
12050 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012051 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120012052 "\n"
12053 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070012054 "out gl_PerVertex {\n"
12055 " vec4 gl_Position;\n"
12056 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120012057 "void main(){\n"
12058 " gl_Position = vec4(1);\n"
12059 " x = 0;\n"
12060 "}\n";
12061 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012062 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120012063 "\n"
12064 "layout(location=0) out vec4 color;\n"
12065 "void main(){\n"
12066 " color = vec4(1);\n"
12067 "}\n";
12068
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012069 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12070 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120012071
12072 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012073 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120012074 pipe.AddShader(&vs);
12075 pipe.AddShader(&fs);
12076
Chris Forbes9f7ff632015-05-25 11:13:08 +120012077 VkDescriptorSetObj descriptorSet(m_device);
12078 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012079 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120012080
Tony Barbour5781e8f2015-08-04 16:23:11 -060012081 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120012082
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012083 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120012084}
Chris Forbes9f7ff632015-05-25 11:13:08 +120012085
Karl Schultz6addd812016-02-02 17:17:23 -070012086TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012087 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012088 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012089
Chris Forbes59cb88d2015-05-25 11:13:13 +120012090 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012091 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120012092
12093 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012094 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120012095 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070012096 "out gl_PerVertex {\n"
12097 " vec4 gl_Position;\n"
12098 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120012099 "void main(){\n"
12100 " gl_Position = vec4(1);\n"
12101 "}\n";
12102 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012103 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120012104 "\n"
12105 "layout(location=0) in float x;\n"
12106 "layout(location=0) out vec4 color;\n"
12107 "void main(){\n"
12108 " color = vec4(x);\n"
12109 "}\n";
12110
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012111 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12112 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120012113
12114 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012115 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120012116 pipe.AddShader(&vs);
12117 pipe.AddShader(&fs);
12118
Chris Forbes59cb88d2015-05-25 11:13:13 +120012119 VkDescriptorSetObj descriptorSet(m_device);
12120 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012121 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120012122
Tony Barbour5781e8f2015-08-04 16:23:11 -060012123 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120012124
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012125 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120012126}
12127
Karl Schultz6addd812016-02-02 17:17:23 -070012128TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +130012129 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012130 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012131
12132 ASSERT_NO_FATAL_FAILURE(InitState());
12133 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12134
12135 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012136 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130012137 "\n"
12138 "out gl_PerVertex {\n"
12139 " vec4 gl_Position;\n"
12140 "};\n"
12141 "void main(){\n"
12142 " gl_Position = vec4(1);\n"
12143 "}\n";
12144 char const *fsSource =
12145 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130012146 "\n"
12147 "in block { layout(location=0) float x; } ins;\n"
12148 "layout(location=0) out vec4 color;\n"
12149 "void main(){\n"
12150 " color = vec4(ins.x);\n"
12151 "}\n";
12152
12153 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12154 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12155
12156 VkPipelineObj pipe(m_device);
12157 pipe.AddColorAttachment();
12158 pipe.AddShader(&vs);
12159 pipe.AddShader(&fs);
12160
12161 VkDescriptorSetObj descriptorSet(m_device);
12162 descriptorSet.AppendDummy();
12163 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12164
12165 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12166
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012167 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130012168}
12169
Karl Schultz6addd812016-02-02 17:17:23 -070012170TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +130012171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +130012172 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -070012173 "output arr[2] of float32' vs 'ptr to "
12174 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130012175
12176 ASSERT_NO_FATAL_FAILURE(InitState());
12177 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12178
12179 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012180 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130012181 "\n"
12182 "layout(location=0) out float x[2];\n"
12183 "out gl_PerVertex {\n"
12184 " vec4 gl_Position;\n"
12185 "};\n"
12186 "void main(){\n"
12187 " x[0] = 0; x[1] = 0;\n"
12188 " gl_Position = vec4(1);\n"
12189 "}\n";
12190 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012191 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130012192 "\n"
12193 "layout(location=0) in float x[3];\n"
12194 "layout(location=0) out vec4 color;\n"
12195 "void main(){\n"
12196 " color = vec4(x[0] + x[1] + x[2]);\n"
12197 "}\n";
12198
12199 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12200 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12201
12202 VkPipelineObj pipe(m_device);
12203 pipe.AddColorAttachment();
12204 pipe.AddShader(&vs);
12205 pipe.AddShader(&fs);
12206
12207 VkDescriptorSetObj descriptorSet(m_device);
12208 descriptorSet.AppendDummy();
12209 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12210
12211 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12212
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012213 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130012214}
12215
Karl Schultz6addd812016-02-02 17:17:23 -070012216TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012217 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012218 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012219
Chris Forbesb56af562015-05-25 11:13:17 +120012220 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012221 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120012222
12223 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012224 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120012225 "\n"
12226 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070012227 "out gl_PerVertex {\n"
12228 " vec4 gl_Position;\n"
12229 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +120012230 "void main(){\n"
12231 " x = 0;\n"
12232 " gl_Position = vec4(1);\n"
12233 "}\n";
12234 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012235 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120012236 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012237 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +120012238 "layout(location=0) out vec4 color;\n"
12239 "void main(){\n"
12240 " color = vec4(x);\n"
12241 "}\n";
12242
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012243 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12244 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120012245
12246 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012247 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120012248 pipe.AddShader(&vs);
12249 pipe.AddShader(&fs);
12250
Chris Forbesb56af562015-05-25 11:13:17 +120012251 VkDescriptorSetObj descriptorSet(m_device);
12252 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012253 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120012254
Tony Barbour5781e8f2015-08-04 16:23:11 -060012255 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120012256
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012257 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120012258}
12259
Karl Schultz6addd812016-02-02 17:17:23 -070012260TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +130012261 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012262 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012263
12264 ASSERT_NO_FATAL_FAILURE(InitState());
12265 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12266
12267 char const *vsSource =
12268 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130012269 "\n"
12270 "out block { layout(location=0) int x; } outs;\n"
12271 "out gl_PerVertex {\n"
12272 " vec4 gl_Position;\n"
12273 "};\n"
12274 "void main(){\n"
12275 " outs.x = 0;\n"
12276 " gl_Position = vec4(1);\n"
12277 "}\n";
12278 char const *fsSource =
12279 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130012280 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012281 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +130012282 "layout(location=0) out vec4 color;\n"
12283 "void main(){\n"
12284 " color = vec4(ins.x);\n"
12285 "}\n";
12286
12287 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12288 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12289
12290 VkPipelineObj pipe(m_device);
12291 pipe.AddColorAttachment();
12292 pipe.AddShader(&vs);
12293 pipe.AddShader(&fs);
12294
12295 VkDescriptorSetObj descriptorSet(m_device);
12296 descriptorSet.AppendDummy();
12297 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12298
12299 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12300
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012301 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130012302}
12303
12304TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
12305 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12306 "location 0.0 which is not written by vertex shader");
12307
12308 ASSERT_NO_FATAL_FAILURE(InitState());
12309 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12310
12311 char const *vsSource =
12312 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130012313 "\n"
12314 "out block { layout(location=1) float x; } outs;\n"
12315 "out gl_PerVertex {\n"
12316 " vec4 gl_Position;\n"
12317 "};\n"
12318 "void main(){\n"
12319 " outs.x = 0;\n"
12320 " gl_Position = vec4(1);\n"
12321 "}\n";
12322 char const *fsSource =
12323 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130012324 "\n"
12325 "in block { layout(location=0) float x; } ins;\n"
12326 "layout(location=0) out vec4 color;\n"
12327 "void main(){\n"
12328 " color = vec4(ins.x);\n"
12329 "}\n";
12330
12331 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12332 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12333
12334 VkPipelineObj pipe(m_device);
12335 pipe.AddColorAttachment();
12336 pipe.AddShader(&vs);
12337 pipe.AddShader(&fs);
12338
12339 VkDescriptorSetObj descriptorSet(m_device);
12340 descriptorSet.AppendDummy();
12341 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12342
12343 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12344
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012345 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130012346}
12347
12348TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
12349 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12350 "location 0.1 which is not written by vertex shader");
12351
12352 ASSERT_NO_FATAL_FAILURE(InitState());
12353 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12354
12355 char const *vsSource =
12356 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130012357 "\n"
12358 "out block { layout(location=0, component=0) float x; } outs;\n"
12359 "out gl_PerVertex {\n"
12360 " vec4 gl_Position;\n"
12361 "};\n"
12362 "void main(){\n"
12363 " outs.x = 0;\n"
12364 " gl_Position = vec4(1);\n"
12365 "}\n";
12366 char const *fsSource =
12367 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130012368 "\n"
12369 "in block { layout(location=0, component=1) float x; } ins;\n"
12370 "layout(location=0) out vec4 color;\n"
12371 "void main(){\n"
12372 " color = vec4(ins.x);\n"
12373 "}\n";
12374
12375 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12376 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12377
12378 VkPipelineObj pipe(m_device);
12379 pipe.AddColorAttachment();
12380 pipe.AddShader(&vs);
12381 pipe.AddShader(&fs);
12382
12383 VkDescriptorSetObj descriptorSet(m_device);
12384 descriptorSet.AppendDummy();
12385 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12386
12387 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12388
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012389 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130012390}
12391
Karl Schultz6addd812016-02-02 17:17:23 -070012392TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012393 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012394 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012395
Chris Forbesde136e02015-05-25 11:13:28 +120012396 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012397 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120012398
12399 VkVertexInputBindingDescription input_binding;
12400 memset(&input_binding, 0, sizeof(input_binding));
12401
12402 VkVertexInputAttributeDescription input_attrib;
12403 memset(&input_attrib, 0, sizeof(input_attrib));
12404 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12405
12406 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012407 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120012408 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070012409 "out gl_PerVertex {\n"
12410 " vec4 gl_Position;\n"
12411 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +120012412 "void main(){\n"
12413 " gl_Position = vec4(1);\n"
12414 "}\n";
12415 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012416 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120012417 "\n"
12418 "layout(location=0) out vec4 color;\n"
12419 "void main(){\n"
12420 " color = vec4(1);\n"
12421 "}\n";
12422
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012423 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12424 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120012425
12426 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012427 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120012428 pipe.AddShader(&vs);
12429 pipe.AddShader(&fs);
12430
12431 pipe.AddVertexInputBindings(&input_binding, 1);
12432 pipe.AddVertexInputAttribs(&input_attrib, 1);
12433
Chris Forbesde136e02015-05-25 11:13:28 +120012434 VkDescriptorSetObj descriptorSet(m_device);
12435 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012436 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120012437
Tony Barbour5781e8f2015-08-04 16:23:11 -060012438 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120012439
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012440 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120012441}
12442
Karl Schultz6addd812016-02-02 17:17:23 -070012443TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012444 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012445 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +130012446
12447 ASSERT_NO_FATAL_FAILURE(InitState());
12448 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12449
12450 VkVertexInputBindingDescription input_binding;
12451 memset(&input_binding, 0, sizeof(input_binding));
12452
12453 VkVertexInputAttributeDescription input_attrib;
12454 memset(&input_attrib, 0, sizeof(input_attrib));
12455 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12456
12457 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012458 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130012459 "\n"
12460 "layout(location=1) in float x;\n"
12461 "out gl_PerVertex {\n"
12462 " vec4 gl_Position;\n"
12463 "};\n"
12464 "void main(){\n"
12465 " gl_Position = vec4(x);\n"
12466 "}\n";
12467 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012468 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130012469 "\n"
12470 "layout(location=0) out vec4 color;\n"
12471 "void main(){\n"
12472 " color = vec4(1);\n"
12473 "}\n";
12474
12475 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12476 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12477
12478 VkPipelineObj pipe(m_device);
12479 pipe.AddColorAttachment();
12480 pipe.AddShader(&vs);
12481 pipe.AddShader(&fs);
12482
12483 pipe.AddVertexInputBindings(&input_binding, 1);
12484 pipe.AddVertexInputAttribs(&input_attrib, 1);
12485
12486 VkDescriptorSetObj descriptorSet(m_device);
12487 descriptorSet.AppendDummy();
12488 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12489
12490 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12491
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012492 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130012493}
12494
Karl Schultz6addd812016-02-02 17:17:23 -070012495TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
12496 m_errorMonitor->SetDesiredFailureMsg(
12497 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012498 "VS consumes input at location 0 but not provided");
12499
Chris Forbes62e8e502015-05-25 11:13:29 +120012500 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012501 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120012502
12503 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012504 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120012505 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012506 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -070012507 "out gl_PerVertex {\n"
12508 " vec4 gl_Position;\n"
12509 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120012510 "void main(){\n"
12511 " gl_Position = x;\n"
12512 "}\n";
12513 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012514 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120012515 "\n"
12516 "layout(location=0) out vec4 color;\n"
12517 "void main(){\n"
12518 " color = vec4(1);\n"
12519 "}\n";
12520
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012521 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12522 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120012523
12524 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012525 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120012526 pipe.AddShader(&vs);
12527 pipe.AddShader(&fs);
12528
Chris Forbes62e8e502015-05-25 11:13:29 +120012529 VkDescriptorSetObj descriptorSet(m_device);
12530 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012531 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120012532
Tony Barbour5781e8f2015-08-04 16:23:11 -060012533 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120012534
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012535 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120012536}
12537
Karl Schultz6addd812016-02-02 17:17:23 -070012538TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
12539 m_errorMonitor->SetDesiredFailureMsg(
12540 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012541 "location 0 does not match VS input type");
12542
Chris Forbesc97d98e2015-05-25 11:13:31 +120012543 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012544 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120012545
12546 VkVertexInputBindingDescription input_binding;
12547 memset(&input_binding, 0, sizeof(input_binding));
12548
12549 VkVertexInputAttributeDescription input_attrib;
12550 memset(&input_attrib, 0, sizeof(input_attrib));
12551 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12552
12553 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012554 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120012555 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012556 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070012557 "out gl_PerVertex {\n"
12558 " vec4 gl_Position;\n"
12559 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120012560 "void main(){\n"
12561 " gl_Position = vec4(x);\n"
12562 "}\n";
12563 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012564 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120012565 "\n"
12566 "layout(location=0) out vec4 color;\n"
12567 "void main(){\n"
12568 " color = vec4(1);\n"
12569 "}\n";
12570
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012571 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12572 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120012573
12574 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012575 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120012576 pipe.AddShader(&vs);
12577 pipe.AddShader(&fs);
12578
12579 pipe.AddVertexInputBindings(&input_binding, 1);
12580 pipe.AddVertexInputAttribs(&input_attrib, 1);
12581
Chris Forbesc97d98e2015-05-25 11:13:31 +120012582 VkDescriptorSetObj descriptorSet(m_device);
12583 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012584 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120012585
Tony Barbour5781e8f2015-08-04 16:23:11 -060012586 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120012587
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012588 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120012589}
12590
Chris Forbesc68b43c2016-04-06 11:18:47 +120012591TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
12592 m_errorMonitor->SetDesiredFailureMsg(
12593 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12594 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
12595
12596 ASSERT_NO_FATAL_FAILURE(InitState());
12597 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12598
12599 char const *vsSource =
12600 "#version 450\n"
12601 "\n"
12602 "out gl_PerVertex {\n"
12603 " vec4 gl_Position;\n"
12604 "};\n"
12605 "void main(){\n"
12606 " gl_Position = vec4(1);\n"
12607 "}\n";
12608 char const *fsSource =
12609 "#version 450\n"
12610 "\n"
12611 "layout(location=0) out vec4 color;\n"
12612 "void main(){\n"
12613 " color = vec4(1);\n"
12614 "}\n";
12615
12616 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12617 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12618
12619 VkPipelineObj pipe(m_device);
12620 pipe.AddColorAttachment();
12621 pipe.AddShader(&vs);
12622 pipe.AddShader(&vs);
12623 pipe.AddShader(&fs);
12624
12625 VkDescriptorSetObj descriptorSet(m_device);
12626 descriptorSet.AppendDummy();
12627 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12628
12629 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12630
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012631 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120012632}
12633
Karl Schultz6addd812016-02-02 17:17:23 -070012634TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012635 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130012636
12637 ASSERT_NO_FATAL_FAILURE(InitState());
12638 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12639
12640 VkVertexInputBindingDescription input_binding;
12641 memset(&input_binding, 0, sizeof(input_binding));
12642
12643 VkVertexInputAttributeDescription input_attribs[2];
12644 memset(input_attribs, 0, sizeof(input_attribs));
12645
12646 for (int i = 0; i < 2; i++) {
12647 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
12648 input_attribs[i].location = i;
12649 }
12650
12651 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012652 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012653 "\n"
12654 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070012655 "out gl_PerVertex {\n"
12656 " vec4 gl_Position;\n"
12657 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012658 "void main(){\n"
12659 " gl_Position = x[0] + x[1];\n"
12660 "}\n";
12661 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012662 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012663 "\n"
12664 "layout(location=0) out vec4 color;\n"
12665 "void main(){\n"
12666 " color = vec4(1);\n"
12667 "}\n";
12668
12669 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12670 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12671
12672 VkPipelineObj pipe(m_device);
12673 pipe.AddColorAttachment();
12674 pipe.AddShader(&vs);
12675 pipe.AddShader(&fs);
12676
12677 pipe.AddVertexInputBindings(&input_binding, 1);
12678 pipe.AddVertexInputAttribs(input_attribs, 2);
12679
12680 VkDescriptorSetObj descriptorSet(m_device);
12681 descriptorSet.AppendDummy();
12682 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12683
12684 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12685
12686 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012687 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130012688}
12689
Chris Forbes2682b242015-11-24 11:13:14 +130012690TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
12691{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012692 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130012693
12694 ASSERT_NO_FATAL_FAILURE(InitState());
12695 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12696
12697 VkVertexInputBindingDescription input_binding;
12698 memset(&input_binding, 0, sizeof(input_binding));
12699
12700 VkVertexInputAttributeDescription input_attribs[2];
12701 memset(input_attribs, 0, sizeof(input_attribs));
12702
12703 for (int i = 0; i < 2; i++) {
12704 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
12705 input_attribs[i].location = i;
12706 }
12707
12708 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012709 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012710 "\n"
12711 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -070012712 "out gl_PerVertex {\n"
12713 " vec4 gl_Position;\n"
12714 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012715 "void main(){\n"
12716 " gl_Position = x[0] + x[1];\n"
12717 "}\n";
12718 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012719 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012720 "\n"
12721 "layout(location=0) out vec4 color;\n"
12722 "void main(){\n"
12723 " color = vec4(1);\n"
12724 "}\n";
12725
12726 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12727 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12728
12729 VkPipelineObj pipe(m_device);
12730 pipe.AddColorAttachment();
12731 pipe.AddShader(&vs);
12732 pipe.AddShader(&fs);
12733
12734 pipe.AddVertexInputBindings(&input_binding, 1);
12735 pipe.AddVertexInputAttribs(input_attribs, 2);
12736
12737 VkDescriptorSetObj descriptorSet(m_device);
12738 descriptorSet.AppendDummy();
12739 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12740
12741 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12742
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012743 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130012744}
Chris Forbes2682b242015-11-24 11:13:14 +130012745
Chris Forbesbc290ce2016-07-06 12:01:49 +120012746TEST_F(VkLayerTest, CreatePipelineAttribComponents)
12747{
12748 m_errorMonitor->ExpectSuccess();
12749
12750 ASSERT_NO_FATAL_FAILURE(InitState());
12751 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12752
12753 VkVertexInputBindingDescription input_binding;
12754 memset(&input_binding, 0, sizeof(input_binding));
12755
12756 VkVertexInputAttributeDescription input_attribs[3];
12757 memset(input_attribs, 0, sizeof(input_attribs));
12758
12759 for (int i = 0; i < 3; i++) {
12760 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
12761 input_attribs[i].location = i;
12762 }
12763
12764 char const *vsSource =
12765 "#version 450\n"
12766 "\n"
12767 "layout(location=0) in vec4 x;\n"
12768 "layout(location=1) in vec3 y1;\n"
12769 "layout(location=1, component=3) in float y2;\n"
12770 "layout(location=2) in vec4 z;\n"
12771 "out gl_PerVertex {\n"
12772 " vec4 gl_Position;\n"
12773 "};\n"
12774 "void main(){\n"
12775 " gl_Position = x + vec4(y1, y2) + z;\n"
12776 "}\n";
12777 char const *fsSource =
12778 "#version 450\n"
12779 "\n"
12780 "layout(location=0) out vec4 color;\n"
12781 "void main(){\n"
12782 " color = vec4(1);\n"
12783 "}\n";
12784
12785 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12786 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12787
12788 VkPipelineObj pipe(m_device);
12789 pipe.AddColorAttachment();
12790 pipe.AddShader(&vs);
12791 pipe.AddShader(&fs);
12792
12793 pipe.AddVertexInputBindings(&input_binding, 1);
12794 pipe.AddVertexInputAttribs(input_attribs, 3);
12795
12796 VkDescriptorSetObj descriptorSet(m_device);
12797 descriptorSet.AppendDummy();
12798 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12799
12800 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12801
12802 m_errorMonitor->VerifyNotFound();
12803}
12804
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012805TEST_F(VkLayerTest, CreatePipelineSimplePositive)
12806{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012807 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012808
12809 ASSERT_NO_FATAL_FAILURE(InitState());
12810 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12811
12812 char const *vsSource =
12813 "#version 450\n"
12814 "out gl_PerVertex {\n"
12815 " vec4 gl_Position;\n"
12816 "};\n"
12817 "void main(){\n"
12818 " gl_Position = vec4(0);\n"
12819 "}\n";
12820 char const *fsSource =
12821 "#version 450\n"
12822 "\n"
12823 "layout(location=0) out vec4 color;\n"
12824 "void main(){\n"
12825 " color = vec4(1);\n"
12826 "}\n";
12827
12828 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12829 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12830
12831 VkPipelineObj pipe(m_device);
12832 pipe.AddColorAttachment();
12833 pipe.AddShader(&vs);
12834 pipe.AddShader(&fs);
12835
12836 VkDescriptorSetObj descriptorSet(m_device);
12837 descriptorSet.AppendDummy();
12838 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12839
12840 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12841
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012842 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012843}
12844
Chris Forbes912c9192016-04-05 17:50:35 +120012845TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
12846{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012847 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +120012848
12849 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
12850
12851 ASSERT_NO_FATAL_FAILURE(InitState());
12852 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12853
12854 char const *vsSource =
12855 "#version 450\n"
12856 "out gl_PerVertex {\n"
12857 " vec4 gl_Position;\n"
12858 "};\n"
12859 "layout(location=0) out vec3 x;\n"
12860 "layout(location=1) out ivec3 y;\n"
12861 "layout(location=2) out vec3 z;\n"
12862 "void main(){\n"
12863 " gl_Position = vec4(0);\n"
12864 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
12865 "}\n";
12866 char const *fsSource =
12867 "#version 450\n"
12868 "\n"
12869 "layout(location=0) out vec4 color;\n"
12870 "layout(location=0) in float x;\n"
12871 "layout(location=1) flat in int y;\n"
12872 "layout(location=2) in vec2 z;\n"
12873 "void main(){\n"
12874 " color = vec4(1 + x + y + z.x);\n"
12875 "}\n";
12876
12877 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12878 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12879
12880 VkPipelineObj pipe(m_device);
12881 pipe.AddColorAttachment();
12882 pipe.AddShader(&vs);
12883 pipe.AddShader(&fs);
12884
12885 VkDescriptorSetObj descriptorSet(m_device);
12886 descriptorSet.AppendDummy();
12887 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12888
Mike Stroyan255e9582016-06-24 09:49:32 -060012889 VkResult err = VK_SUCCESS;
12890 err =
12891 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12892 ASSERT_VK_SUCCESS(err);
12893
Chris Forbes912c9192016-04-05 17:50:35 +120012894
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012895 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +120012896}
12897
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012898TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
12899{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012900 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012901
12902 ASSERT_NO_FATAL_FAILURE(InitState());
12903 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12904
Chris Forbesc1e852d2016-04-04 19:26:42 +120012905 if (!m_device->phy().features().tessellationShader) {
12906 printf("Device does not support tessellation shaders; skipped.\n");
12907 return;
12908 }
12909
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012910 char const *vsSource =
12911 "#version 450\n"
12912 "void main(){}\n";
12913 char const *tcsSource =
12914 "#version 450\n"
12915 "layout(location=0) out int x[];\n"
12916 "layout(vertices=3) out;\n"
12917 "void main(){\n"
12918 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
12919 " gl_TessLevelInner[0] = 1;\n"
12920 " x[gl_InvocationID] = gl_InvocationID;\n"
12921 "}\n";
12922 char const *tesSource =
12923 "#version 450\n"
12924 "layout(triangles, equal_spacing, cw) in;\n"
12925 "layout(location=0) in int x[];\n"
12926 "out gl_PerVertex { vec4 gl_Position; };\n"
12927 "void main(){\n"
12928 " gl_Position.xyz = gl_TessCoord;\n"
12929 " gl_Position.w = x[0] + x[1] + x[2];\n"
12930 "}\n";
12931 char const *fsSource =
12932 "#version 450\n"
12933 "layout(location=0) out vec4 color;\n"
12934 "void main(){\n"
12935 " color = vec4(1);\n"
12936 "}\n";
12937
12938 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12939 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
12940 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
12941 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12942
12943 VkPipelineInputAssemblyStateCreateInfo iasci{
12944 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
12945 nullptr,
12946 0,
12947 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
12948 VK_FALSE};
12949
Chris Forbesb4cacb62016-04-04 19:15:00 +120012950 VkPipelineTessellationStateCreateInfo tsci{
12951 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
12952 nullptr,
12953 0,
12954 3};
12955
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012956 VkPipelineObj pipe(m_device);
12957 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +120012958 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012959 pipe.AddColorAttachment();
12960 pipe.AddShader(&vs);
12961 pipe.AddShader(&tcs);
12962 pipe.AddShader(&tes);
12963 pipe.AddShader(&fs);
12964
12965 VkDescriptorSetObj descriptorSet(m_device);
12966 descriptorSet.AppendDummy();
12967 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12968
12969 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12970
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012971 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012972}
12973
Chris Forbesa0ab8152016-04-20 13:34:27 +120012974TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
12975{
12976 m_errorMonitor->ExpectSuccess();
12977
12978 ASSERT_NO_FATAL_FAILURE(InitState());
12979 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12980
12981 if (!m_device->phy().features().geometryShader) {
12982 printf("Device does not support geometry shaders; skipped.\n");
12983 return;
12984 }
12985
12986 char const *vsSource =
12987 "#version 450\n"
12988 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
12989 "void main(){\n"
12990 " vs_out.x = vec4(1);\n"
12991 "}\n";
12992 char const *gsSource =
12993 "#version 450\n"
12994 "layout(triangles) in;\n"
12995 "layout(triangle_strip, max_vertices=3) out;\n"
12996 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
12997 "out gl_PerVertex { vec4 gl_Position; };\n"
12998 "void main() {\n"
12999 " gl_Position = gs_in[0].x;\n"
13000 " EmitVertex();\n"
13001 "}\n";
13002 char const *fsSource =
13003 "#version 450\n"
13004 "layout(location=0) out vec4 color;\n"
13005 "void main(){\n"
13006 " color = vec4(1);\n"
13007 "}\n";
13008
13009 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13010 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
13011 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13012
13013 VkPipelineObj pipe(m_device);
13014 pipe.AddColorAttachment();
13015 pipe.AddShader(&vs);
13016 pipe.AddShader(&gs);
13017 pipe.AddShader(&fs);
13018
13019 VkDescriptorSetObj descriptorSet(m_device);
13020 descriptorSet.AppendDummy();
13021 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13022
13023 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13024
13025 m_errorMonitor->VerifyNotFound();
13026}
13027
Chris Forbesa0193bc2016-04-04 19:19:47 +120013028TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
13029{
13030 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13031 "is per-vertex in tessellation control shader stage "
13032 "but per-patch in tessellation evaluation shader stage");
13033
13034 ASSERT_NO_FATAL_FAILURE(InitState());
13035 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13036
Chris Forbesc1e852d2016-04-04 19:26:42 +120013037 if (!m_device->phy().features().tessellationShader) {
13038 printf("Device does not support tessellation shaders; skipped.\n");
13039 return;
13040 }
13041
Chris Forbesa0193bc2016-04-04 19:19:47 +120013042 char const *vsSource =
13043 "#version 450\n"
13044 "void main(){}\n";
13045 char const *tcsSource =
13046 "#version 450\n"
13047 "layout(location=0) out int x[];\n"
13048 "layout(vertices=3) out;\n"
13049 "void main(){\n"
13050 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
13051 " gl_TessLevelInner[0] = 1;\n"
13052 " x[gl_InvocationID] = gl_InvocationID;\n"
13053 "}\n";
13054 char const *tesSource =
13055 "#version 450\n"
13056 "layout(triangles, equal_spacing, cw) in;\n"
13057 "layout(location=0) patch in int x;\n"
13058 "out gl_PerVertex { vec4 gl_Position; };\n"
13059 "void main(){\n"
13060 " gl_Position.xyz = gl_TessCoord;\n"
13061 " gl_Position.w = x;\n"
13062 "}\n";
13063 char const *fsSource =
13064 "#version 450\n"
13065 "layout(location=0) out vec4 color;\n"
13066 "void main(){\n"
13067 " color = vec4(1);\n"
13068 "}\n";
13069
13070 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13071 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
13072 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
13073 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13074
13075 VkPipelineInputAssemblyStateCreateInfo iasci{
13076 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
13077 nullptr,
13078 0,
13079 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
13080 VK_FALSE};
13081
13082 VkPipelineTessellationStateCreateInfo tsci{
13083 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
13084 nullptr,
13085 0,
13086 3};
13087
13088 VkPipelineObj pipe(m_device);
13089 pipe.SetInputAssembly(&iasci);
13090 pipe.SetTessellation(&tsci);
13091 pipe.AddColorAttachment();
13092 pipe.AddShader(&vs);
13093 pipe.AddShader(&tcs);
13094 pipe.AddShader(&tes);
13095 pipe.AddShader(&fs);
13096
13097 VkDescriptorSetObj descriptorSet(m_device);
13098 descriptorSet.AppendDummy();
13099 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13100
13101 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13102
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013103 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120013104}
13105
Karl Schultz6addd812016-02-02 17:17:23 -070013106TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
13107 m_errorMonitor->SetDesiredFailureMsg(
13108 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013109 "Duplicate vertex input binding descriptions for binding 0");
13110
Chris Forbes280ba2c2015-06-12 11:16:41 +120013111 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013112 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120013113
13114 /* Two binding descriptions for binding 0 */
13115 VkVertexInputBindingDescription input_bindings[2];
13116 memset(input_bindings, 0, sizeof(input_bindings));
13117
13118 VkVertexInputAttributeDescription input_attrib;
13119 memset(&input_attrib, 0, sizeof(input_attrib));
13120 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13121
13122 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013123 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120013124 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013125 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070013126 "out gl_PerVertex {\n"
13127 " vec4 gl_Position;\n"
13128 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120013129 "void main(){\n"
13130 " gl_Position = vec4(x);\n"
13131 "}\n";
13132 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013133 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120013134 "\n"
13135 "layout(location=0) out vec4 color;\n"
13136 "void main(){\n"
13137 " color = vec4(1);\n"
13138 "}\n";
13139
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013140 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13141 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120013142
13143 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013144 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120013145 pipe.AddShader(&vs);
13146 pipe.AddShader(&fs);
13147
13148 pipe.AddVertexInputBindings(input_bindings, 2);
13149 pipe.AddVertexInputAttribs(&input_attrib, 1);
13150
Chris Forbes280ba2c2015-06-12 11:16:41 +120013151 VkDescriptorSetObj descriptorSet(m_device);
13152 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013153 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120013154
Tony Barbour5781e8f2015-08-04 16:23:11 -060013155 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120013156
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013157 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120013158}
Chris Forbes8f68b562015-05-25 11:13:32 +120013159
Chris Forbes35efec72016-04-21 14:32:08 +120013160TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
13161 m_errorMonitor->ExpectSuccess();
13162
13163 ASSERT_NO_FATAL_FAILURE(InitState());
13164 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13165
Chris Forbes91cf3a82016-06-28 17:51:35 +120013166 if (!m_device->phy().features().shaderFloat64) {
Chris Forbes35efec72016-04-21 14:32:08 +120013167 printf("Device does not support 64bit vertex attributes; skipped.\n");
13168 return;
13169 }
13170
13171 VkVertexInputBindingDescription input_bindings[1];
13172 memset(input_bindings, 0, sizeof(input_bindings));
13173
13174 VkVertexInputAttributeDescription input_attribs[4];
13175 memset(input_attribs, 0, sizeof(input_attribs));
13176 input_attribs[0].location = 0;
13177 input_attribs[0].offset = 0;
13178 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
13179 input_attribs[1].location = 2;
13180 input_attribs[1].offset = 32;
13181 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
13182 input_attribs[2].location = 4;
13183 input_attribs[2].offset = 64;
13184 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
13185 input_attribs[3].location = 6;
13186 input_attribs[3].offset = 96;
13187 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
13188
13189 char const *vsSource =
13190 "#version 450\n"
13191 "\n"
13192 "layout(location=0) in dmat4 x;\n"
13193 "out gl_PerVertex {\n"
13194 " vec4 gl_Position;\n"
13195 "};\n"
13196 "void main(){\n"
13197 " gl_Position = vec4(x[0][0]);\n"
13198 "}\n";
13199 char const *fsSource =
13200 "#version 450\n"
13201 "\n"
13202 "layout(location=0) out vec4 color;\n"
13203 "void main(){\n"
13204 " color = vec4(1);\n"
13205 "}\n";
13206
13207 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13208 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13209
13210 VkPipelineObj pipe(m_device);
13211 pipe.AddColorAttachment();
13212 pipe.AddShader(&vs);
13213 pipe.AddShader(&fs);
13214
13215 pipe.AddVertexInputBindings(input_bindings, 1);
13216 pipe.AddVertexInputAttribs(input_attribs, 4);
13217
13218 VkDescriptorSetObj descriptorSet(m_device);
13219 descriptorSet.AppendDummy();
13220 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13221
13222 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13223
13224 m_errorMonitor->VerifyNotFound();
13225}
13226
Karl Schultz6addd812016-02-02 17:17:23 -070013227TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013228 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013229 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013230
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013231 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013232
13233 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013234 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013235 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013236 "out gl_PerVertex {\n"
13237 " vec4 gl_Position;\n"
13238 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013239 "void main(){\n"
13240 " gl_Position = vec4(1);\n"
13241 "}\n";
13242 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013243 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013244 "\n"
13245 "void main(){\n"
13246 "}\n";
13247
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013248 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13249 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013250
13251 VkPipelineObj pipe(m_device);
13252 pipe.AddShader(&vs);
13253 pipe.AddShader(&fs);
13254
Chia-I Wu08accc62015-07-07 11:50:03 +080013255 /* set up CB 0, not written */
13256 pipe.AddColorAttachment();
13257 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013258
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013259 VkDescriptorSetObj descriptorSet(m_device);
13260 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013261 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013262
Tony Barbour5781e8f2015-08-04 16:23:11 -060013263 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013264
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013265 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013266}
13267
Karl Schultz6addd812016-02-02 17:17:23 -070013268TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -070013269 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070013270 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013271 "FS writes to output location 1 with no matching attachment");
13272
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013273 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013274
13275 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013276 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013277 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013278 "out gl_PerVertex {\n"
13279 " vec4 gl_Position;\n"
13280 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013281 "void main(){\n"
13282 " gl_Position = vec4(1);\n"
13283 "}\n";
13284 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013285 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013286 "\n"
13287 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013288 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013289 "void main(){\n"
13290 " x = vec4(1);\n"
13291 " y = vec4(1);\n"
13292 "}\n";
13293
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013294 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13295 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013296
13297 VkPipelineObj pipe(m_device);
13298 pipe.AddShader(&vs);
13299 pipe.AddShader(&fs);
13300
Chia-I Wu08accc62015-07-07 11:50:03 +080013301 /* set up CB 0, not written */
13302 pipe.AddColorAttachment();
13303 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013304 /* FS writes CB 1, but we don't configure it */
13305
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013306 VkDescriptorSetObj descriptorSet(m_device);
13307 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013308 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013309
Tony Barbour5781e8f2015-08-04 16:23:11 -060013310 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013311
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013312 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013313}
13314
Karl Schultz6addd812016-02-02 17:17:23 -070013315TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013316 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013317 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013318
Chris Forbesa36d69e2015-05-25 11:13:44 +120013319 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013320
13321 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013322 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120013323 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013324 "out gl_PerVertex {\n"
13325 " vec4 gl_Position;\n"
13326 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120013327 "void main(){\n"
13328 " gl_Position = vec4(1);\n"
13329 "}\n";
13330 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013331 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120013332 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013333 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +120013334 "void main(){\n"
13335 " x = ivec4(1);\n"
13336 "}\n";
13337
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013338 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13339 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120013340
13341 VkPipelineObj pipe(m_device);
13342 pipe.AddShader(&vs);
13343 pipe.AddShader(&fs);
13344
Chia-I Wu08accc62015-07-07 11:50:03 +080013345 /* set up CB 0; type is UNORM by default */
13346 pipe.AddColorAttachment();
13347 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013348
Chris Forbesa36d69e2015-05-25 11:13:44 +120013349 VkDescriptorSetObj descriptorSet(m_device);
13350 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013351 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120013352
Tony Barbour5781e8f2015-08-04 16:23:11 -060013353 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013354
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013355 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120013356}
Chris Forbes7b1b8932015-06-05 14:43:36 +120013357
Karl Schultz6addd812016-02-02 17:17:23 -070013358TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013359 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013360 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013361
Chris Forbes556c76c2015-08-14 12:04:59 +120013362 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120013363
13364 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013365 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120013366 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013367 "out gl_PerVertex {\n"
13368 " vec4 gl_Position;\n"
13369 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120013370 "void main(){\n"
13371 " gl_Position = vec4(1);\n"
13372 "}\n";
13373 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013374 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120013375 "\n"
13376 "layout(location=0) out vec4 x;\n"
13377 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
13378 "void main(){\n"
13379 " x = vec4(bar.y);\n"
13380 "}\n";
13381
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013382 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13383 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120013384
Chris Forbes556c76c2015-08-14 12:04:59 +120013385 VkPipelineObj pipe(m_device);
13386 pipe.AddShader(&vs);
13387 pipe.AddShader(&fs);
13388
13389 /* set up CB 0; type is UNORM by default */
13390 pipe.AddColorAttachment();
13391 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13392
13393 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013394 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120013395
13396 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13397
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013398 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120013399}
13400
Chris Forbes5c59e902016-02-26 16:56:09 +130013401TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
13402 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13403 "not declared in layout");
13404
13405 ASSERT_NO_FATAL_FAILURE(InitState());
13406
13407 char const *vsSource =
13408 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130013409 "\n"
13410 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13411 "out gl_PerVertex {\n"
13412 " vec4 gl_Position;\n"
13413 "};\n"
13414 "void main(){\n"
13415 " gl_Position = vec4(consts.x);\n"
13416 "}\n";
13417 char const *fsSource =
13418 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130013419 "\n"
13420 "layout(location=0) out vec4 x;\n"
13421 "void main(){\n"
13422 " x = vec4(1);\n"
13423 "}\n";
13424
13425 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13426 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13427
13428 VkPipelineObj pipe(m_device);
13429 pipe.AddShader(&vs);
13430 pipe.AddShader(&fs);
13431
13432 /* set up CB 0; type is UNORM by default */
13433 pipe.AddColorAttachment();
13434 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13435
13436 VkDescriptorSetObj descriptorSet(m_device);
13437 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13438
13439 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13440
13441 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013442 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130013443}
13444
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013445TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
13446 m_errorMonitor->SetDesiredFailureMsg(
13447 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13448 "Shader uses descriptor slot 0.0");
13449
13450 ASSERT_NO_FATAL_FAILURE(InitState());
13451
13452 char const *csSource =
13453 "#version 450\n"
13454 "\n"
13455 "layout(local_size_x=1) in;\n"
13456 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13457 "void main(){\n"
13458 " x = vec4(1);\n"
13459 "}\n";
13460
13461 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13462
13463 VkDescriptorSetObj descriptorSet(m_device);
13464 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13465
13466 VkComputePipelineCreateInfo cpci = {
13467 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
13468 nullptr, 0, {
13469 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
13470 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
13471 cs.handle(), "main", nullptr
13472 },
13473 descriptorSet.GetPipelineLayout(),
13474 VK_NULL_HANDLE, -1
13475 };
13476
13477 VkPipeline pipe;
13478 VkResult err = vkCreateComputePipelines(
13479 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
13480
13481 m_errorMonitor->VerifyFound();
13482
13483 if (err == VK_SUCCESS) {
13484 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13485 }
13486}
13487
13488TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
13489 m_errorMonitor->ExpectSuccess();
13490
13491 ASSERT_NO_FATAL_FAILURE(InitState());
13492
13493 char const *csSource =
13494 "#version 450\n"
13495 "\n"
13496 "layout(local_size_x=1) in;\n"
13497 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13498 "void main(){\n"
13499 " // x is not used.\n"
13500 "}\n";
13501
13502 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13503
13504 VkDescriptorSetObj descriptorSet(m_device);
13505 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13506
13507 VkComputePipelineCreateInfo cpci = {
13508 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
13509 nullptr, 0, {
13510 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
13511 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
13512 cs.handle(), "main", nullptr
13513 },
13514 descriptorSet.GetPipelineLayout(),
13515 VK_NULL_HANDLE, -1
13516 };
13517
13518 VkPipeline pipe;
13519 VkResult err = vkCreateComputePipelines(
13520 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
13521
13522 m_errorMonitor->VerifyNotFound();
13523
13524 if (err == VK_SUCCESS) {
13525 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13526 }
13527}
13528
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013529#endif // SHADER_CHECKER_TESTS
13530
13531#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -060013532TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -070013533 m_errorMonitor->SetDesiredFailureMsg(
13534 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013535 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013536
13537 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013538
13539 // Create an image
13540 VkImage image;
13541
Karl Schultz6addd812016-02-02 17:17:23 -070013542 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
13543 const int32_t tex_width = 32;
13544 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013545
13546 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013547 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13548 image_create_info.pNext = NULL;
13549 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13550 image_create_info.format = tex_format;
13551 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013552 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070013553 image_create_info.extent.depth = 1;
13554 image_create_info.mipLevels = 1;
13555 image_create_info.arrayLayers = 1;
13556 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13557 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13558 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
13559 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013560
13561 // Introduce error by sending down a bogus width extent
13562 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013563 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013564
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013565 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013566}
13567
Mark Youngc48c4c12016-04-11 14:26:49 -060013568TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
13569 m_errorMonitor->SetDesiredFailureMsg(
13570 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13571 "CreateImage extents is 0 for at least one required dimension");
13572
13573 ASSERT_NO_FATAL_FAILURE(InitState());
13574
13575 // Create an image
13576 VkImage image;
13577
13578 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
13579 const int32_t tex_width = 32;
13580 const int32_t tex_height = 32;
13581
13582 VkImageCreateInfo image_create_info = {};
13583 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13584 image_create_info.pNext = NULL;
13585 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13586 image_create_info.format = tex_format;
13587 image_create_info.extent.width = tex_width;
13588 image_create_info.extent.height = tex_height;
13589 image_create_info.extent.depth = 1;
13590 image_create_info.mipLevels = 1;
13591 image_create_info.arrayLayers = 1;
13592 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13593 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13594 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
13595 image_create_info.flags = 0;
13596
13597 // Introduce error by sending down a bogus width extent
13598 image_create_info.extent.width = 0;
13599 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
13600
13601 m_errorMonitor->VerifyFound();
13602}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013603#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +120013604
Tobin Ehliscde08892015-09-22 10:11:37 -060013605#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070013606TEST_F(VkLayerTest, InvalidImageView) {
13607 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060013608
Karl Schultz6addd812016-02-02 17:17:23 -070013609 m_errorMonitor->SetDesiredFailureMsg(
13610 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013611 "vkCreateImageView called with baseMipLevel 10 ");
13612
Tobin Ehliscde08892015-09-22 10:11:37 -060013613 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060013614
Mike Stroyana3082432015-09-25 13:39:21 -060013615 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070013616 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060013617
Karl Schultz6addd812016-02-02 17:17:23 -070013618 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
13619 const int32_t tex_width = 32;
13620 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060013621
13622 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013623 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13624 image_create_info.pNext = NULL;
13625 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13626 image_create_info.format = tex_format;
13627 image_create_info.extent.width = tex_width;
13628 image_create_info.extent.height = tex_height;
13629 image_create_info.extent.depth = 1;
13630 image_create_info.mipLevels = 1;
13631 image_create_info.arrayLayers = 1;
13632 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13633 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13634 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
13635 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060013636
Chia-I Wuf7458c52015-10-26 21:10:41 +080013637 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060013638 ASSERT_VK_SUCCESS(err);
13639
13640 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013641 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13642 image_view_create_info.image = image;
13643 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
13644 image_view_create_info.format = tex_format;
13645 image_view_create_info.subresourceRange.layerCount = 1;
13646 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
13647 image_view_create_info.subresourceRange.levelCount = 1;
13648 image_view_create_info.subresourceRange.aspectMask =
13649 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060013650
13651 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070013652 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
13653 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060013654
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013655 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060013656 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060013657}
Mike Stroyana3082432015-09-25 13:39:21 -060013658
Mark Youngd339ba32016-05-30 13:28:35 -060013659TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
13660 VkResult err;
13661
13662 m_errorMonitor->SetDesiredFailureMsg(
13663 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -060013664 "used without first calling vkBindImageMemory");
Mark Youngd339ba32016-05-30 13:28:35 -060013665
13666 ASSERT_NO_FATAL_FAILURE(InitState());
13667
13668 // Create an image and try to create a view with no memory backing the image
13669 VkImage image;
13670
13671 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
13672 const int32_t tex_width = 32;
13673 const int32_t tex_height = 32;
13674
13675 VkImageCreateInfo image_create_info = {};
13676 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13677 image_create_info.pNext = NULL;
13678 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13679 image_create_info.format = tex_format;
13680 image_create_info.extent.width = tex_width;
13681 image_create_info.extent.height = tex_height;
13682 image_create_info.extent.depth = 1;
13683 image_create_info.mipLevels = 1;
13684 image_create_info.arrayLayers = 1;
13685 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13686 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13687 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
13688 image_create_info.flags = 0;
13689
13690 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
13691 ASSERT_VK_SUCCESS(err);
13692
13693 VkImageViewCreateInfo image_view_create_info = {};
13694 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13695 image_view_create_info.image = image;
13696 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
13697 image_view_create_info.format = tex_format;
13698 image_view_create_info.subresourceRange.layerCount = 1;
13699 image_view_create_info.subresourceRange.baseMipLevel = 0;
13700 image_view_create_info.subresourceRange.levelCount = 1;
13701 image_view_create_info.subresourceRange.aspectMask =
13702 VK_IMAGE_ASPECT_COLOR_BIT;
13703
13704 VkImageView view;
13705 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
13706 &view);
13707
13708 m_errorMonitor->VerifyFound();
13709 vkDestroyImage(m_device->device(), image, NULL);
13710 // If last error is success, it still created the view, so delete it.
13711 if (err == VK_SUCCESS) {
13712 vkDestroyImageView(m_device->device(), view, NULL);
13713 }
13714
13715}
13716
Karl Schultz6addd812016-02-02 17:17:23 -070013717TEST_F(VkLayerTest, InvalidImageViewAspect) {
Tobin Ehlis1f567a22016-05-25 16:15:18 -060013718 TEST_DESCRIPTION(
13719 "Create an image and try to create a view with an invalid aspectMask");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013720 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013721 "vkCreateImageView: Color image "
13722 "formats must have ONLY the "
13723 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013724
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013725 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013726
Karl Schultz6addd812016-02-02 17:17:23 -070013727 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060013728 VkImageObj image(m_device);
13729 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT,
13730 VK_IMAGE_TILING_LINEAR, 0);
13731 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013732
13733 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013734 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060013735 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070013736 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
13737 image_view_create_info.format = tex_format;
13738 image_view_create_info.subresourceRange.baseMipLevel = 0;
13739 image_view_create_info.subresourceRange.levelCount = 1;
13740 // Cause an error by setting an invalid image aspect
13741 image_view_create_info.subresourceRange.aspectMask =
13742 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013743
13744 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060013745 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013746
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013747 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013748}
13749
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013750TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070013751 VkResult err;
13752 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060013753
Karl Schultz6addd812016-02-02 17:17:23 -070013754 m_errorMonitor->SetDesiredFailureMsg(
13755 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013756 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013757
Mike Stroyana3082432015-09-25 13:39:21 -060013758 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060013759
13760 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070013761 VkImage srcImage;
13762 VkImage dstImage;
13763 VkDeviceMemory srcMem;
13764 VkDeviceMemory destMem;
13765 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060013766
13767 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013768 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13769 image_create_info.pNext = NULL;
13770 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13771 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
13772 image_create_info.extent.width = 32;
13773 image_create_info.extent.height = 32;
13774 image_create_info.extent.depth = 1;
13775 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013776 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070013777 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13778 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
13779 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
13780 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013781
Karl Schultz6addd812016-02-02 17:17:23 -070013782 err =
13783 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060013784 ASSERT_VK_SUCCESS(err);
13785
Karl Schultz6addd812016-02-02 17:17:23 -070013786 err =
13787 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060013788 ASSERT_VK_SUCCESS(err);
13789
13790 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013791 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013792 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
13793 memAlloc.pNext = NULL;
13794 memAlloc.allocationSize = 0;
13795 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013796
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060013797 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060013798 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070013799 pass =
13800 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060013801 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013802 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060013803 ASSERT_VK_SUCCESS(err);
13804
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013805 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060013806 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070013807 pass =
13808 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060013809 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013810 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060013811 ASSERT_VK_SUCCESS(err);
13812
13813 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
13814 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013815 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060013816 ASSERT_VK_SUCCESS(err);
13817
13818 BeginCommandBuffer();
13819 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080013820 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060013821 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060013822 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013823 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060013824 copyRegion.srcOffset.x = 0;
13825 copyRegion.srcOffset.y = 0;
13826 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080013827 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013828 copyRegion.dstSubresource.mipLevel = 0;
13829 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013830 // Introduce failure by forcing the dst layerCount to differ from src
13831 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013832 copyRegion.dstOffset.x = 0;
13833 copyRegion.dstOffset.y = 0;
13834 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013835 copyRegion.extent.width = 1;
13836 copyRegion.extent.height = 1;
13837 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070013838 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
13839 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060013840 EndCommandBuffer();
13841
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013842 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060013843
Chia-I Wuf7458c52015-10-26 21:10:41 +080013844 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013845 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080013846 vkFreeMemory(m_device->device(), srcMem, NULL);
13847 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060013848}
13849
Tony Barbourd6673642016-05-05 14:46:39 -060013850TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
13851
13852 TEST_DESCRIPTION("Creating images with unsuported formats ");
13853
13854 ASSERT_NO_FATAL_FAILURE(InitState());
13855 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13856 VkImageObj image(m_device);
13857 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
13858 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
13859 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
13860 VK_IMAGE_TILING_OPTIMAL, 0);
13861 ASSERT_TRUE(image.initialized());
13862
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013863 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
13864 VkImageCreateInfo image_create_info;
13865 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13866 image_create_info.pNext = NULL;
13867 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13868 image_create_info.format = VK_FORMAT_UNDEFINED;
13869 image_create_info.extent.width = 32;
13870 image_create_info.extent.height = 32;
13871 image_create_info.extent.depth = 1;
13872 image_create_info.mipLevels = 1;
13873 image_create_info.arrayLayers = 1;
13874 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13875 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
13876 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
13877 image_create_info.flags = 0;
13878
13879 m_errorMonitor->SetDesiredFailureMsg(
13880 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13881 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
13882
13883 VkImage localImage;
13884 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
13885 m_errorMonitor->VerifyFound();
13886
Tony Barbourd6673642016-05-05 14:46:39 -060013887 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013888 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060013889 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
13890 VkFormat format = static_cast<VkFormat>(f);
13891 VkFormatProperties fProps = m_device->format_properties(format);
13892 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
13893 fProps.optimalTilingFeatures == 0) {
13894 unsupported = format;
13895 break;
13896 }
13897 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013898
Tony Barbourd6673642016-05-05 14:46:39 -060013899 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060013900 image_create_info.format = unsupported;
Tony Barbourd6673642016-05-05 14:46:39 -060013901 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013902 "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060013903
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013904 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060013905 m_errorMonitor->VerifyFound();
13906 }
13907}
13908
13909TEST_F(VkLayerTest, ImageLayerViewTests) {
13910 VkResult ret;
13911 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
13912
13913 ASSERT_NO_FATAL_FAILURE(InitState());
13914
13915 VkImageObj image(m_device);
13916 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
13917 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
13918 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
13919 VK_IMAGE_TILING_OPTIMAL, 0);
13920 ASSERT_TRUE(image.initialized());
13921
13922 VkImageView imgView;
13923 VkImageViewCreateInfo imgViewInfo = {};
13924 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13925 imgViewInfo.image = image.handle();
13926 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
13927 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
13928 imgViewInfo.subresourceRange.layerCount = 1;
13929 imgViewInfo.subresourceRange.baseMipLevel = 0;
13930 imgViewInfo.subresourceRange.levelCount = 1;
13931 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13932
13933 m_errorMonitor->SetDesiredFailureMsg(
13934 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13935 "vkCreateImageView called with baseMipLevel");
13936 // View can't have baseMipLevel >= image's mipLevels - Expect
13937 // VIEW_CREATE_ERROR
13938 imgViewInfo.subresourceRange.baseMipLevel = 1;
13939 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13940 m_errorMonitor->VerifyFound();
13941 imgViewInfo.subresourceRange.baseMipLevel = 0;
13942
13943 m_errorMonitor->SetDesiredFailureMsg(
13944 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13945 "vkCreateImageView called with baseArrayLayer");
13946 // View can't have baseArrayLayer >= image's arraySize - Expect
13947 // VIEW_CREATE_ERROR
13948 imgViewInfo.subresourceRange.baseArrayLayer = 1;
13949 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13950 m_errorMonitor->VerifyFound();
13951 imgViewInfo.subresourceRange.baseArrayLayer = 0;
13952
13953 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13954 "vkCreateImageView called with 0 in "
13955 "pCreateInfo->subresourceRange."
13956 "levelCount");
13957 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
13958 imgViewInfo.subresourceRange.levelCount = 0;
13959 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13960 m_errorMonitor->VerifyFound();
13961 imgViewInfo.subresourceRange.levelCount = 1;
13962
13963 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13964 "vkCreateImageView called with 0 in "
13965 "pCreateInfo->subresourceRange."
13966 "layerCount");
13967 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
13968 imgViewInfo.subresourceRange.layerCount = 0;
13969 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13970 m_errorMonitor->VerifyFound();
13971 imgViewInfo.subresourceRange.layerCount = 1;
13972
13973 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13974 "but both must be color formats");
13975 // Can't use depth format for view into color image - Expect INVALID_FORMAT
13976 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
13977 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13978 m_errorMonitor->VerifyFound();
13979 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
13980
13981 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13982 "Formats MUST be IDENTICAL unless "
13983 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
13984 "was set on image creation.");
13985 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
13986 // VIEW_CREATE_ERROR
13987 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
13988 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13989 m_errorMonitor->VerifyFound();
13990 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
13991
13992 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13993 "can support ImageViews with "
13994 "differing formats but they must be "
13995 "in the same compatibility class.");
13996 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
13997 // VIEW_CREATE_ERROR
13998 VkImageCreateInfo mutImgInfo = image.create_info();
13999 VkImage mutImage;
14000 mutImgInfo.format = VK_FORMAT_R8_UINT;
14001 assert(
14002 m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures &
14003 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
14004 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
14005 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14006 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
14007 ASSERT_VK_SUCCESS(ret);
14008 imgViewInfo.image = mutImage;
14009 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14010 m_errorMonitor->VerifyFound();
14011 imgViewInfo.image = image.handle();
14012 vkDestroyImage(m_device->handle(), mutImage, NULL);
14013}
14014
14015TEST_F(VkLayerTest, MiscImageLayerTests) {
14016
14017 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
14018
14019 ASSERT_NO_FATAL_FAILURE(InitState());
14020
14021 VkImageObj image(m_device);
14022 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
14023 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
14024 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
14025 VK_IMAGE_TILING_OPTIMAL, 0);
14026 ASSERT_TRUE(image.initialized());
14027
14028 m_errorMonitor->SetDesiredFailureMsg(
14029 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14030 "number of layers in image subresource is zero");
14031 vk_testing::Buffer buffer;
14032 VkMemoryPropertyFlags reqs = 0;
14033 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
14034 VkBufferImageCopy region = {};
14035 region.bufferRowLength = 128;
14036 region.bufferImageHeight = 128;
14037 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14038 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
14039 region.imageSubresource.layerCount = 0;
14040 region.imageExtent.height = 4;
14041 region.imageExtent.width = 4;
14042 region.imageExtent.depth = 1;
14043 m_commandBuffer->BeginCommandBuffer();
14044 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
14045 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
14046 1, &region);
14047 m_errorMonitor->VerifyFound();
14048 region.imageSubresource.layerCount = 1;
14049
14050 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14051 "aspectMasks for each region must "
14052 "specify only COLOR or DEPTH or "
14053 "STENCIL");
14054 // Expect MISMATCHED_IMAGE_ASPECT
14055 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
14056 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
14057 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
14058 1, &region);
14059 m_errorMonitor->VerifyFound();
14060 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14061
14062 m_errorMonitor->SetDesiredFailureMsg(
14063 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14064 "If the format of srcImage is a depth, stencil, depth stencil or "
14065 "integer-based format then filter must be VK_FILTER_NEAREST");
14066 // Expect INVALID_FILTER
14067 VkImageObj intImage1(m_device);
14068 intImage1.init(128, 128, VK_FORMAT_R8_UINT,
14069 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
14070 0);
14071 VkImageObj intImage2(m_device);
14072 intImage2.init(128, 128, VK_FORMAT_R8_UINT,
14073 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
14074 0);
14075 VkImageBlit blitRegion = {};
14076 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14077 blitRegion.srcSubresource.baseArrayLayer = 0;
14078 blitRegion.srcSubresource.layerCount = 1;
14079 blitRegion.srcSubresource.mipLevel = 0;
14080 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14081 blitRegion.dstSubresource.baseArrayLayer = 0;
14082 blitRegion.dstSubresource.layerCount = 1;
14083 blitRegion.dstSubresource.mipLevel = 0;
14084
14085 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
14086 intImage1.layout(), intImage2.handle(), intImage2.layout(),
14087 16, &blitRegion, VK_FILTER_LINEAR);
14088 m_errorMonitor->VerifyFound();
14089
14090 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14091 "called with 0 in ppMemoryBarriers");
14092 VkImageMemoryBarrier img_barrier;
14093 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
14094 img_barrier.pNext = NULL;
14095 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
14096 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
14097 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14098 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14099 img_barrier.image = image.handle();
14100 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
14101 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
14102 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14103 img_barrier.subresourceRange.baseArrayLayer = 0;
14104 img_barrier.subresourceRange.baseMipLevel = 0;
14105 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
14106 img_barrier.subresourceRange.layerCount = 0;
14107 img_barrier.subresourceRange.levelCount = 1;
14108 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
14109 VK_PIPELINE_STAGE_HOST_BIT,
14110 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
14111 nullptr, 1, &img_barrier);
14112 m_errorMonitor->VerifyFound();
14113 img_barrier.subresourceRange.layerCount = 1;
14114}
14115
14116TEST_F(VkLayerTest, ImageFormatLimits) {
14117
14118 TEST_DESCRIPTION("Exceed the limits of image format ");
14119
14120 m_errorMonitor->SetDesiredFailureMsg(
14121 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14122 "CreateImage extents exceed allowable limits for format");
14123 VkImageCreateInfo image_create_info = {};
14124 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14125 image_create_info.pNext = NULL;
14126 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14127 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14128 image_create_info.extent.width = 32;
14129 image_create_info.extent.height = 32;
14130 image_create_info.extent.depth = 1;
14131 image_create_info.mipLevels = 1;
14132 image_create_info.arrayLayers = 1;
14133 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14134 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14135 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14136 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
14137 image_create_info.flags = 0;
14138
14139 VkImage nullImg;
14140 VkImageFormatProperties imgFmtProps;
14141 vkGetPhysicalDeviceImageFormatProperties(
14142 gpu(), image_create_info.format, image_create_info.imageType,
14143 image_create_info.tiling, image_create_info.usage,
14144 image_create_info.flags, &imgFmtProps);
14145 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
14146 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14147 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14148 m_errorMonitor->VerifyFound();
14149 image_create_info.extent.depth = 1;
14150
14151 m_errorMonitor->SetDesiredFailureMsg(
14152 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14153 "exceeds allowable maximum supported by format of");
14154 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
14155 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14156 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14157 m_errorMonitor->VerifyFound();
14158 image_create_info.mipLevels = 1;
14159
14160 m_errorMonitor->SetDesiredFailureMsg(
14161 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14162 "exceeds allowable maximum supported by format of");
14163 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
14164 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14165 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14166 m_errorMonitor->VerifyFound();
14167 image_create_info.arrayLayers = 1;
14168
14169 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14170 "is not supported by format");
14171 int samples = imgFmtProps.sampleCounts >> 1;
14172 image_create_info.samples = (VkSampleCountFlagBits)samples;
14173 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14174 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14175 m_errorMonitor->VerifyFound();
14176 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14177
14178 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14179 "pCreateInfo->initialLayout, must be "
14180 "VK_IMAGE_LAYOUT_UNDEFINED or "
14181 "VK_IMAGE_LAYOUT_PREINITIALIZED");
14182 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14183 // Expect INVALID_LAYOUT
14184 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14185 m_errorMonitor->VerifyFound();
14186 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
14187}
14188
Karl Schultz6addd812016-02-02 17:17:23 -070014189TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060014190 VkResult err;
14191 bool pass;
14192
14193 // Create color images with different format sizes and try to copy between them
14194 m_errorMonitor->SetDesiredFailureMsg(
14195 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14196 "vkCmdCopyImage called with unmatched source and dest image format sizes");
14197
14198 ASSERT_NO_FATAL_FAILURE(InitState());
14199
14200 // Create two images of different types and try to copy between them
14201 VkImage srcImage;
14202 VkImage dstImage;
14203 VkDeviceMemory srcMem;
14204 VkDeviceMemory destMem;
14205 VkMemoryRequirements memReqs;
14206
14207 VkImageCreateInfo image_create_info = {};
14208 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14209 image_create_info.pNext = NULL;
14210 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14211 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14212 image_create_info.extent.width = 32;
14213 image_create_info.extent.height = 32;
14214 image_create_info.extent.depth = 1;
14215 image_create_info.mipLevels = 1;
14216 image_create_info.arrayLayers = 1;
14217 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14218 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14219 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14220 image_create_info.flags = 0;
14221
14222 err =
14223 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
14224 ASSERT_VK_SUCCESS(err);
14225
14226 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
14227 // Introduce failure by creating second image with a different-sized format.
14228 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
14229
14230 err =
14231 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
14232 ASSERT_VK_SUCCESS(err);
14233
14234 // Allocate memory
14235 VkMemoryAllocateInfo memAlloc = {};
14236 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14237 memAlloc.pNext = NULL;
14238 memAlloc.allocationSize = 0;
14239 memAlloc.memoryTypeIndex = 0;
14240
14241 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
14242 memAlloc.allocationSize = memReqs.size;
14243 pass =
14244 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
14245 ASSERT_TRUE(pass);
14246 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
14247 ASSERT_VK_SUCCESS(err);
14248
14249 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
14250 memAlloc.allocationSize = memReqs.size;
14251 pass =
14252 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
14253 ASSERT_TRUE(pass);
14254 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
14255 ASSERT_VK_SUCCESS(err);
14256
14257 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14258 ASSERT_VK_SUCCESS(err);
14259 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
14260 ASSERT_VK_SUCCESS(err);
14261
14262 BeginCommandBuffer();
14263 VkImageCopy copyRegion;
14264 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14265 copyRegion.srcSubresource.mipLevel = 0;
14266 copyRegion.srcSubresource.baseArrayLayer = 0;
14267 copyRegion.srcSubresource.layerCount = 0;
14268 copyRegion.srcOffset.x = 0;
14269 copyRegion.srcOffset.y = 0;
14270 copyRegion.srcOffset.z = 0;
14271 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14272 copyRegion.dstSubresource.mipLevel = 0;
14273 copyRegion.dstSubresource.baseArrayLayer = 0;
14274 copyRegion.dstSubresource.layerCount = 0;
14275 copyRegion.dstOffset.x = 0;
14276 copyRegion.dstOffset.y = 0;
14277 copyRegion.dstOffset.z = 0;
14278 copyRegion.extent.width = 1;
14279 copyRegion.extent.height = 1;
14280 copyRegion.extent.depth = 1;
14281 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14282 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
14283 EndCommandBuffer();
14284
14285 m_errorMonitor->VerifyFound();
14286
14287 vkDestroyImage(m_device->device(), srcImage, NULL);
14288 vkDestroyImage(m_device->device(), dstImage, NULL);
14289 vkFreeMemory(m_device->device(), srcMem, NULL);
14290 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014291}
14292
Karl Schultz6addd812016-02-02 17:17:23 -070014293TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
14294 VkResult err;
14295 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014296
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014297 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014298 m_errorMonitor->SetDesiredFailureMsg(
14299 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014300 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014301
Mike Stroyana3082432015-09-25 13:39:21 -060014302 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014303
14304 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014305 VkImage srcImage;
14306 VkImage dstImage;
14307 VkDeviceMemory srcMem;
14308 VkDeviceMemory destMem;
14309 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014310
14311 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014312 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14313 image_create_info.pNext = NULL;
14314 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14315 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14316 image_create_info.extent.width = 32;
14317 image_create_info.extent.height = 32;
14318 image_create_info.extent.depth = 1;
14319 image_create_info.mipLevels = 1;
14320 image_create_info.arrayLayers = 1;
14321 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14322 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14323 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14324 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014325
Karl Schultz6addd812016-02-02 17:17:23 -070014326 err =
14327 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014328 ASSERT_VK_SUCCESS(err);
14329
Karl Schultzbdb75952016-04-19 11:36:49 -060014330 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
14331
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014332 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070014333 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014334 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
14335 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014336
Karl Schultz6addd812016-02-02 17:17:23 -070014337 err =
14338 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014339 ASSERT_VK_SUCCESS(err);
14340
14341 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014342 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014343 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14344 memAlloc.pNext = NULL;
14345 memAlloc.allocationSize = 0;
14346 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014347
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014348 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014349 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014350 pass =
14351 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014352 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014353 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014354 ASSERT_VK_SUCCESS(err);
14355
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014356 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014357 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014358 pass =
14359 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014360 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014361 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014362 ASSERT_VK_SUCCESS(err);
14363
14364 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14365 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014366 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014367 ASSERT_VK_SUCCESS(err);
14368
14369 BeginCommandBuffer();
14370 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014371 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014372 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014373 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014374 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014375 copyRegion.srcOffset.x = 0;
14376 copyRegion.srcOffset.y = 0;
14377 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014378 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014379 copyRegion.dstSubresource.mipLevel = 0;
14380 copyRegion.dstSubresource.baseArrayLayer = 0;
14381 copyRegion.dstSubresource.layerCount = 0;
14382 copyRegion.dstOffset.x = 0;
14383 copyRegion.dstOffset.y = 0;
14384 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014385 copyRegion.extent.width = 1;
14386 copyRegion.extent.height = 1;
14387 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014388 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14389 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014390 EndCommandBuffer();
14391
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014392 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014393
Chia-I Wuf7458c52015-10-26 21:10:41 +080014394 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014395 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014396 vkFreeMemory(m_device->device(), srcMem, NULL);
14397 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014398}
14399
Karl Schultz6addd812016-02-02 17:17:23 -070014400TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
14401 VkResult err;
14402 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014403
Karl Schultz6addd812016-02-02 17:17:23 -070014404 m_errorMonitor->SetDesiredFailureMsg(
14405 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014406 "vkCmdResolveImage called with source sample count less than 2.");
14407
Mike Stroyana3082432015-09-25 13:39:21 -060014408 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014409
14410 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070014411 VkImage srcImage;
14412 VkImage dstImage;
14413 VkDeviceMemory srcMem;
14414 VkDeviceMemory destMem;
14415 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014416
14417 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014418 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14419 image_create_info.pNext = NULL;
14420 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14421 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14422 image_create_info.extent.width = 32;
14423 image_create_info.extent.height = 1;
14424 image_create_info.extent.depth = 1;
14425 image_create_info.mipLevels = 1;
14426 image_create_info.arrayLayers = 1;
14427 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14428 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14429 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14430 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014431
Karl Schultz6addd812016-02-02 17:17:23 -070014432 err =
14433 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014434 ASSERT_VK_SUCCESS(err);
14435
Karl Schultz6addd812016-02-02 17:17:23 -070014436 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014437
Karl Schultz6addd812016-02-02 17:17:23 -070014438 err =
14439 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014440 ASSERT_VK_SUCCESS(err);
14441
14442 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014443 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014444 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14445 memAlloc.pNext = NULL;
14446 memAlloc.allocationSize = 0;
14447 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014448
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014449 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014450 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014451 pass =
14452 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014453 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014454 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014455 ASSERT_VK_SUCCESS(err);
14456
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014457 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014458 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014459 pass =
14460 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014461 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014462 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014463 ASSERT_VK_SUCCESS(err);
14464
14465 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14466 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014467 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014468 ASSERT_VK_SUCCESS(err);
14469
14470 BeginCommandBuffer();
14471 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070014472 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
14473 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060014474 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014475 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014476 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014477 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014478 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014479 resolveRegion.srcOffset.x = 0;
14480 resolveRegion.srcOffset.y = 0;
14481 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014482 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014483 resolveRegion.dstSubresource.mipLevel = 0;
14484 resolveRegion.dstSubresource.baseArrayLayer = 0;
14485 resolveRegion.dstSubresource.layerCount = 0;
14486 resolveRegion.dstOffset.x = 0;
14487 resolveRegion.dstOffset.y = 0;
14488 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014489 resolveRegion.extent.width = 1;
14490 resolveRegion.extent.height = 1;
14491 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014492 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14493 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014494 EndCommandBuffer();
14495
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014496 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014497
Chia-I Wuf7458c52015-10-26 21:10:41 +080014498 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014499 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014500 vkFreeMemory(m_device->device(), srcMem, NULL);
14501 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014502}
14503
Karl Schultz6addd812016-02-02 17:17:23 -070014504TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
14505 VkResult err;
14506 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014507
Karl Schultz6addd812016-02-02 17:17:23 -070014508 m_errorMonitor->SetDesiredFailureMsg(
14509 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014510 "vkCmdResolveImage called with dest sample count greater than 1.");
14511
Mike Stroyana3082432015-09-25 13:39:21 -060014512 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014513
Chris Forbesa7530692016-05-08 12:35:39 +120014514 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070014515 VkImage srcImage;
14516 VkImage dstImage;
14517 VkDeviceMemory srcMem;
14518 VkDeviceMemory destMem;
14519 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014520
14521 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014522 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14523 image_create_info.pNext = NULL;
14524 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14525 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14526 image_create_info.extent.width = 32;
14527 image_create_info.extent.height = 1;
14528 image_create_info.extent.depth = 1;
14529 image_create_info.mipLevels = 1;
14530 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120014531 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070014532 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14533 // Note: Some implementations expect color attachment usage for any
14534 // multisample surface
14535 image_create_info.usage =
14536 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14537 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014538
Karl Schultz6addd812016-02-02 17:17:23 -070014539 err =
14540 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014541 ASSERT_VK_SUCCESS(err);
14542
Karl Schultz6addd812016-02-02 17:17:23 -070014543 // Note: Some implementations expect color attachment usage for any
14544 // multisample surface
14545 image_create_info.usage =
14546 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014547
Karl Schultz6addd812016-02-02 17:17:23 -070014548 err =
14549 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014550 ASSERT_VK_SUCCESS(err);
14551
14552 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014553 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014554 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14555 memAlloc.pNext = NULL;
14556 memAlloc.allocationSize = 0;
14557 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014558
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014559 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014560 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014561 pass =
14562 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014563 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014564 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014565 ASSERT_VK_SUCCESS(err);
14566
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014567 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014568 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014569 pass =
14570 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014571 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014572 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014573 ASSERT_VK_SUCCESS(err);
14574
14575 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14576 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014577 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014578 ASSERT_VK_SUCCESS(err);
14579
14580 BeginCommandBuffer();
14581 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070014582 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
14583 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060014584 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014585 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014586 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014587 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014588 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014589 resolveRegion.srcOffset.x = 0;
14590 resolveRegion.srcOffset.y = 0;
14591 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014592 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014593 resolveRegion.dstSubresource.mipLevel = 0;
14594 resolveRegion.dstSubresource.baseArrayLayer = 0;
14595 resolveRegion.dstSubresource.layerCount = 0;
14596 resolveRegion.dstOffset.x = 0;
14597 resolveRegion.dstOffset.y = 0;
14598 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014599 resolveRegion.extent.width = 1;
14600 resolveRegion.extent.height = 1;
14601 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014602 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14603 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014604 EndCommandBuffer();
14605
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014606 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014607
Chia-I Wuf7458c52015-10-26 21:10:41 +080014608 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014609 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014610 vkFreeMemory(m_device->device(), srcMem, NULL);
14611 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014612}
14613
Karl Schultz6addd812016-02-02 17:17:23 -070014614TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
14615 VkResult err;
14616 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014617
Karl Schultz6addd812016-02-02 17:17:23 -070014618 m_errorMonitor->SetDesiredFailureMsg(
14619 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014620 "vkCmdResolveImage called with unmatched source and dest formats.");
14621
Mike Stroyana3082432015-09-25 13:39:21 -060014622 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014623
14624 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014625 VkImage srcImage;
14626 VkImage dstImage;
14627 VkDeviceMemory srcMem;
14628 VkDeviceMemory destMem;
14629 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014630
14631 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014632 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14633 image_create_info.pNext = NULL;
14634 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14635 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14636 image_create_info.extent.width = 32;
14637 image_create_info.extent.height = 1;
14638 image_create_info.extent.depth = 1;
14639 image_create_info.mipLevels = 1;
14640 image_create_info.arrayLayers = 1;
14641 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
14642 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14643 // Note: Some implementations expect color attachment usage for any
14644 // multisample surface
14645 image_create_info.usage =
14646 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14647 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014648
Karl Schultz6addd812016-02-02 17:17:23 -070014649 err =
14650 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014651 ASSERT_VK_SUCCESS(err);
14652
Karl Schultz6addd812016-02-02 17:17:23 -070014653 // Set format to something other than source image
14654 image_create_info.format = VK_FORMAT_R32_SFLOAT;
14655 // Note: Some implementations expect color attachment usage for any
14656 // multisample surface
14657 image_create_info.usage =
14658 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14659 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014660
Karl Schultz6addd812016-02-02 17:17:23 -070014661 err =
14662 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014663 ASSERT_VK_SUCCESS(err);
14664
14665 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014666 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014667 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14668 memAlloc.pNext = NULL;
14669 memAlloc.allocationSize = 0;
14670 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014671
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014672 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014673 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014674 pass =
14675 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014676 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014677 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014678 ASSERT_VK_SUCCESS(err);
14679
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014680 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014681 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014682 pass =
14683 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014684 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014685 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014686 ASSERT_VK_SUCCESS(err);
14687
14688 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14689 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014690 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014691 ASSERT_VK_SUCCESS(err);
14692
14693 BeginCommandBuffer();
14694 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070014695 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
14696 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060014697 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014698 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014699 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014700 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014701 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014702 resolveRegion.srcOffset.x = 0;
14703 resolveRegion.srcOffset.y = 0;
14704 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014705 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014706 resolveRegion.dstSubresource.mipLevel = 0;
14707 resolveRegion.dstSubresource.baseArrayLayer = 0;
14708 resolveRegion.dstSubresource.layerCount = 0;
14709 resolveRegion.dstOffset.x = 0;
14710 resolveRegion.dstOffset.y = 0;
14711 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014712 resolveRegion.extent.width = 1;
14713 resolveRegion.extent.height = 1;
14714 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014715 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14716 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014717 EndCommandBuffer();
14718
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014719 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014720
Chia-I Wuf7458c52015-10-26 21:10:41 +080014721 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014722 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014723 vkFreeMemory(m_device->device(), srcMem, NULL);
14724 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014725}
14726
Karl Schultz6addd812016-02-02 17:17:23 -070014727TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
14728 VkResult err;
14729 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014730
Karl Schultz6addd812016-02-02 17:17:23 -070014731 m_errorMonitor->SetDesiredFailureMsg(
14732 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014733 "vkCmdResolveImage called with unmatched source and dest image types.");
14734
Mike Stroyana3082432015-09-25 13:39:21 -060014735 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014736
14737 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014738 VkImage srcImage;
14739 VkImage dstImage;
14740 VkDeviceMemory srcMem;
14741 VkDeviceMemory destMem;
14742 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014743
14744 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014745 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14746 image_create_info.pNext = NULL;
14747 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14748 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14749 image_create_info.extent.width = 32;
14750 image_create_info.extent.height = 1;
14751 image_create_info.extent.depth = 1;
14752 image_create_info.mipLevels = 1;
14753 image_create_info.arrayLayers = 1;
14754 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
14755 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14756 // Note: Some implementations expect color attachment usage for any
14757 // multisample surface
14758 image_create_info.usage =
14759 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14760 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014761
Karl Schultz6addd812016-02-02 17:17:23 -070014762 err =
14763 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014764 ASSERT_VK_SUCCESS(err);
14765
Karl Schultz6addd812016-02-02 17:17:23 -070014766 image_create_info.imageType = VK_IMAGE_TYPE_1D;
14767 // Note: Some implementations expect color attachment usage for any
14768 // multisample surface
14769 image_create_info.usage =
14770 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14771 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014772
Karl Schultz6addd812016-02-02 17:17:23 -070014773 err =
14774 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014775 ASSERT_VK_SUCCESS(err);
14776
14777 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014778 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014779 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14780 memAlloc.pNext = NULL;
14781 memAlloc.allocationSize = 0;
14782 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014783
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014784 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014785 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014786 pass =
14787 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014788 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014789 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014790 ASSERT_VK_SUCCESS(err);
14791
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014792 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014793 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014794 pass =
14795 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014796 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014797 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014798 ASSERT_VK_SUCCESS(err);
14799
14800 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14801 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014802 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014803 ASSERT_VK_SUCCESS(err);
14804
14805 BeginCommandBuffer();
14806 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070014807 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
14808 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060014809 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014810 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014811 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014812 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014813 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014814 resolveRegion.srcOffset.x = 0;
14815 resolveRegion.srcOffset.y = 0;
14816 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014817 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014818 resolveRegion.dstSubresource.mipLevel = 0;
14819 resolveRegion.dstSubresource.baseArrayLayer = 0;
14820 resolveRegion.dstSubresource.layerCount = 0;
14821 resolveRegion.dstOffset.x = 0;
14822 resolveRegion.dstOffset.y = 0;
14823 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014824 resolveRegion.extent.width = 1;
14825 resolveRegion.extent.height = 1;
14826 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014827 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14828 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014829 EndCommandBuffer();
14830
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014831 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014832
Chia-I Wuf7458c52015-10-26 21:10:41 +080014833 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014834 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014835 vkFreeMemory(m_device->device(), srcMem, NULL);
14836 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014837}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014838
Karl Schultz6addd812016-02-02 17:17:23 -070014839TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014840 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070014841 // to using a DS format, then cause it to hit error due to COLOR_BIT not
14842 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014843 // The image format check comes 2nd in validation so we trigger it first,
14844 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070014845 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014846
Karl Schultz6addd812016-02-02 17:17:23 -070014847 m_errorMonitor->SetDesiredFailureMsg(
14848 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014849 "Combination depth/stencil image formats can have only the ");
14850
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014851 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014852
Chia-I Wu1b99bb22015-10-27 19:25:11 +080014853 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014854 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
14855 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014856
14857 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014858 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
14859 ds_pool_ci.pNext = NULL;
14860 ds_pool_ci.maxSets = 1;
14861 ds_pool_ci.poolSizeCount = 1;
14862 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014863
14864 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070014865 err =
14866 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014867 ASSERT_VK_SUCCESS(err);
14868
14869 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014870 dsl_binding.binding = 0;
14871 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
14872 dsl_binding.descriptorCount = 1;
14873 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
14874 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014875
14876 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014877 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
14878 ds_layout_ci.pNext = NULL;
14879 ds_layout_ci.bindingCount = 1;
14880 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014881 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070014882 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
14883 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014884 ASSERT_VK_SUCCESS(err);
14885
14886 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014887 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080014888 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070014889 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014890 alloc_info.descriptorPool = ds_pool;
14891 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070014892 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
14893 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014894 ASSERT_VK_SUCCESS(err);
14895
Karl Schultz6addd812016-02-02 17:17:23 -070014896 VkImage image_bad;
14897 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014898 // One bad format and one good format for Color attachment
Tobin Ehlis269f0322016-05-25 16:24:21 -060014899 const VkFormat tex_format_bad = VK_FORMAT_D24_UNORM_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014900 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070014901 const int32_t tex_width = 32;
14902 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014903
14904 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014905 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14906 image_create_info.pNext = NULL;
14907 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14908 image_create_info.format = tex_format_bad;
14909 image_create_info.extent.width = tex_width;
14910 image_create_info.extent.height = tex_height;
14911 image_create_info.extent.depth = 1;
14912 image_create_info.mipLevels = 1;
14913 image_create_info.arrayLayers = 1;
14914 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14915 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14916 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
14917 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
14918 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014919
Karl Schultz6addd812016-02-02 17:17:23 -070014920 err =
14921 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014922 ASSERT_VK_SUCCESS(err);
14923 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -070014924 image_create_info.usage =
14925 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14926 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
14927 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014928 ASSERT_VK_SUCCESS(err);
14929
14930 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014931 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14932 image_view_create_info.image = image_bad;
14933 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14934 image_view_create_info.format = tex_format_bad;
14935 image_view_create_info.subresourceRange.baseArrayLayer = 0;
14936 image_view_create_info.subresourceRange.baseMipLevel = 0;
14937 image_view_create_info.subresourceRange.layerCount = 1;
14938 image_view_create_info.subresourceRange.levelCount = 1;
14939 image_view_create_info.subresourceRange.aspectMask =
14940 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014941
14942 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070014943 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
14944 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014945
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014946 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014947
Chia-I Wuf7458c52015-10-26 21:10:41 +080014948 vkDestroyImage(m_device->device(), image_bad, NULL);
14949 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014950 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
14951 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014952}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060014953
14954TEST_F(VkLayerTest, ClearImageErrors) {
14955 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and "
14956 "ClearDepthStencilImage with a color image.");
14957
14958 ASSERT_NO_FATAL_FAILURE(InitState());
14959 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14960
14961 // Renderpass is started here so end it as Clear cmds can't be in renderpass
14962 BeginCommandBuffer();
14963 m_commandBuffer->EndRenderPass();
14964
14965 // Color image
14966 VkClearColorValue clear_color;
14967 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
14968 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
14969 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
14970 const int32_t img_width = 32;
14971 const int32_t img_height = 32;
14972 VkImageCreateInfo image_create_info = {};
14973 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14974 image_create_info.pNext = NULL;
14975 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14976 image_create_info.format = color_format;
14977 image_create_info.extent.width = img_width;
14978 image_create_info.extent.height = img_height;
14979 image_create_info.extent.depth = 1;
14980 image_create_info.mipLevels = 1;
14981 image_create_info.arrayLayers = 1;
14982 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14983 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14984 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14985
14986 vk_testing::Image color_image;
14987 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info,
14988 reqs);
14989
14990 const VkImageSubresourceRange color_range =
14991 vk_testing::Image::subresource_range(image_create_info,
14992 VK_IMAGE_ASPECT_COLOR_BIT);
14993
14994 // Depth/Stencil image
14995 VkClearDepthStencilValue clear_value = {0};
14996 reqs = 0; // don't need HOST_VISIBLE DS image
14997 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
14998 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
14999 ds_image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
15000 ds_image_create_info.extent.width = 64;
15001 ds_image_create_info.extent.height = 64;
15002 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15003 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
15004
15005 vk_testing::Image ds_image;
15006 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info,
15007 reqs);
15008
15009 const VkImageSubresourceRange ds_range =
15010 vk_testing::Image::subresource_range(ds_image_create_info,
15011 VK_IMAGE_ASPECT_DEPTH_BIT);
15012
15013 m_errorMonitor->SetDesiredFailureMsg(
15014 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15015 "vkCmdClearColorImage called with depth/stencil image.");
15016
15017 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
15018 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
15019 &color_range);
15020
15021 m_errorMonitor->VerifyFound();
15022
Tony Barbour26434b92016-06-02 09:43:50 -060015023 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15024 "vkCmdClearColorImage called with "
15025 "image created without "
15026 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
15027
15028 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
15029 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
15030 &color_range);
15031
15032 m_errorMonitor->VerifyFound();
15033
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015034 // Call CmdClearDepthStencilImage with color image
15035 m_errorMonitor->SetDesiredFailureMsg(
15036 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15037 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
15038
15039 vkCmdClearDepthStencilImage(
15040 m_commandBuffer->GetBufferHandle(), color_image.handle(),
15041 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
15042 &ds_range);
15043
15044 m_errorMonitor->VerifyFound();
15045}
Tobin Ehliscde08892015-09-22 10:11:37 -060015046#endif // IMAGE_TESTS
15047
Tony Barbour300a6082015-04-07 13:44:53 -060015048int main(int argc, char **argv) {
15049 int result;
15050
Cody Northrop8e54a402016-03-08 22:25:52 -070015051#ifdef ANDROID
15052 int vulkanSupport = InitVulkan();
15053 if (vulkanSupport == 0)
15054 return 1;
15055#endif
15056
Tony Barbour300a6082015-04-07 13:44:53 -060015057 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060015058 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060015059
15060 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
15061
15062 result = RUN_ALL_TESTS();
15063
Tony Barbour6918cd52015-04-09 12:58:51 -060015064 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060015065 return result;
15066}