blob: 4bbf675d07d8e90671ff174a199e335c44b0a88b [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
2 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
Michael Lentine0a369f62016-02-03 16:51:46 -06005 * Copyright (c) 2015-2016 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
20 */
Tony Barbour65c48b32015-11-17 10:02:56 -070021
Cody Northrop8e54a402016-03-08 22:25:52 -070022#ifdef ANDROID
23#include "vulkan_wrapper.h"
24#else
David Pinedo9316d3b2015-11-06 12:54:48 -070025#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070026#endif
Courtney Goeltzenleuchter58f3eff2015-10-07 13:28:58 -060027#include "test_common.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060028#include "vkrenderframework.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060029#include "vk_layer_config.h"
Jon Ashburn7fa7e222016-02-02 12:08:10 -070030#include "icd-spv.h"
Tony Barbour300a6082015-04-07 13:44:53 -060031
Mark Lobodzinski3780e142015-05-14 15:08:13 -050032#define GLM_FORCE_RADIANS
33#include "glm/glm.hpp"
34#include <glm/gtc/matrix_transform.hpp>
35
Dustin Gravesffa90fa2016-05-06 11:20:38 -060036#define PARAMETER_VALIDATION_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060037#define MEM_TRACKER_TESTS 1
38#define OBJ_TRACKER_TESTS 1
39#define DRAW_STATE_TESTS 1
40#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120041#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060042#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060043#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060044
Mark Lobodzinski3780e142015-05-14 15:08:13 -050045//--------------------------------------------------------------------------------------
46// Mesh and VertexFormat Data
47//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070048struct Vertex {
49 float posX, posY, posZ, posW; // Position data
50 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050051};
52
Karl Schultz6addd812016-02-02 17:17:23 -070053#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050054
55typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070056 BsoFailNone = 0x00000000,
57 BsoFailLineWidth = 0x00000001,
58 BsoFailDepthBias = 0x00000002,
59 BsoFailViewport = 0x00000004,
60 BsoFailScissor = 0x00000008,
61 BsoFailBlend = 0x00000010,
62 BsoFailDepthBounds = 0x00000020,
63 BsoFailStencilReadMask = 0x00000040,
64 BsoFailStencilWriteMask = 0x00000080,
65 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060066 BsoFailCmdClearAttachments = 0x00000200,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050067} BsoFailSelect;
68
69struct vktriangle_vs_uniform {
70 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070071 float mvp[4][4];
72 float position[3][4];
73 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050074};
75
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050076static const char bindStateVertShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120077 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070078 "vec2 vertices[3];\n"
79 "out gl_PerVertex {\n"
80 " vec4 gl_Position;\n"
81 "};\n"
82 "void main() {\n"
83 " vertices[0] = vec2(-1.0, -1.0);\n"
84 " vertices[1] = vec2( 1.0, -1.0);\n"
85 " vertices[2] = vec2( 0.0, 1.0);\n"
86 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
87 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050088
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050089static const char bindStateFragShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120090 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070091 "\n"
92 "layout(location = 0) out vec4 uFragColor;\n"
93 "void main(){\n"
94 " uFragColor = vec4(0,1,0,1);\n"
95 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050096
Karl Schultz6addd812016-02-02 17:17:23 -070097static VKAPI_ATTR VkBool32 VKAPI_CALL
98myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
99 uint64_t srcObject, size_t location, int32_t msgCode,
100 const char *pLayerPrefix, const char *pMsg, void *pUserData);
Tony Barbour300a6082015-04-07 13:44:53 -0600101
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600102// ********************************************************
103// ErrorMonitor Usage:
104//
105// Call SetDesiredFailureMsg with a string to be compared against all
106// encountered log messages. Passing NULL will match all log messages.
107// logMsg will return true for skipCall only if msg is matched or NULL.
108//
109// Call DesiredMsgFound to determine if the desired failure message
110// was encountered.
111
Tony Barbour300a6082015-04-07 13:44:53 -0600112class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700113 public:
114 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600115 test_platform_thread_create_mutex(&m_mutex);
116 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700117 m_msgFlags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700118 m_bailout = NULL;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600119 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600120 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600121
Dustin Graves48458142016-04-29 16:11:55 -0600122 ~ErrorMonitor() { test_platform_thread_delete_mutex(&m_mutex); }
123
Karl Schultz6addd812016-02-02 17:17:23 -0700124 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200125 // also discard all collected messages to this point
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600126 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600127 m_failureMsg.clear();
128 m_otherMsgs.clear();
129 m_desiredMsg = msgString;
Karl Schultz6addd812016-02-02 17:17:23 -0700130 m_msgFound = VK_FALSE;
131 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600132 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600133 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600134
Karl Schultz6addd812016-02-02 17:17:23 -0700135 VkBool32 CheckForDesiredMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600136 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600137 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600138 if (m_bailout != NULL) {
139 *m_bailout = true;
140 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600141 string errorString(msgString);
142 if (msgFlags & m_msgFlags) {
143 if (errorString.find(m_desiredMsg) != string::npos) {
Chris Forbesc7b8ad72016-04-04 18:50:38 +1200144 if (m_msgFound) { /* if multiple matches, don't lose all but the last! */
145 m_otherMsgs.push_back(m_failureMsg);
146 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600147 m_failureMsg = errorString;
Karl Schultz6addd812016-02-02 17:17:23 -0700148 m_msgFound = VK_TRUE;
149 result = VK_TRUE;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600150 } else {
151 m_otherMsgs.push_back(errorString);
152 }
153 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600154 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600155 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600156 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600157
Karl Schultz6addd812016-02-02 17:17:23 -0700158 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600159
Karl Schultz6addd812016-02-02 17:17:23 -0700160 string GetFailureMsg(void) { return m_failureMsg; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600161
Karl Schultz6addd812016-02-02 17:17:23 -0700162 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600163
Karl Schultz6addd812016-02-02 17:17:23 -0700164 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600165
Karl Schultz6addd812016-02-02 17:17:23 -0700166 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600167 vector<string> otherMsgs = GetOtherFailureMsgs();
168 cout << "Other error messages logged for this test were:" << endl;
169 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
170 cout << " " << *iter << endl;
171 }
172 }
173
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200174 /* helpers */
175
176 void ExpectSuccess() {
177 // match anything
178 SetDesiredFailureMsg(~0u, "");
179 }
180
181 void VerifyFound() {
182 // Not seeing the desired message is a failure. /Before/ throwing, dump
183 // any other messages.
184 if (!DesiredMsgFound()) {
185 DumpFailureMsgs();
186 FAIL() << "Did not receive expected error '" << m_desiredMsg << "'";
187 }
188 }
189
190 void VerifyNotFound() {
191 // ExpectSuccess() configured us to match anything. Any error is a
192 // failure.
193 if (DesiredMsgFound()) {
194 DumpFailureMsgs();
195 FAIL() << "Expected to succeed but got error: " << GetFailureMsg();
196 }
197 }
198
Karl Schultz6addd812016-02-02 17:17:23 -0700199 private:
200 VkFlags m_msgFlags;
201 string m_desiredMsg;
202 string m_failureMsg;
203 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600204 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700205 bool *m_bailout;
206 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600207};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500208
Karl Schultz6addd812016-02-02 17:17:23 -0700209static VKAPI_ATTR VkBool32 VKAPI_CALL
210myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
211 uint64_t srcObject, size_t location, int32_t msgCode,
212 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
213 if (msgFlags &
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700214 (VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT |
Karl Schultz6addd812016-02-02 17:17:23 -0700215 VK_DEBUG_REPORT_ERROR_BIT_EXT)) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600216 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600217 return errMonitor->CheckForDesiredMsg(msgFlags, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600218 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600219 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600220}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500221
Karl Schultz6addd812016-02-02 17:17:23 -0700222class VkLayerTest : public VkRenderFramework {
223 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800224 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
225 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700226 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText,
227 BsoFailSelect failMask);
228 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
229 VkPipelineObj &pipelineobj,
230 VkDescriptorSetObj &descriptorSet,
231 BsoFailSelect failMask);
232 void GenericDrawPreparation(VkPipelineObj &pipelineobj,
233 VkDescriptorSetObj &descriptorSet,
234 BsoFailSelect failMask) {
235 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet,
236 failMask);
237 }
Tony Barbour300a6082015-04-07 13:44:53 -0600238
Tony Barbourfe3351b2015-07-28 10:17:20 -0600239 /* Convenience functions that use built-in command buffer */
Karl Schultz6addd812016-02-02 17:17:23 -0700240 VkResult BeginCommandBuffer() {
241 return BeginCommandBuffer(*m_commandBuffer);
242 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800243 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Karl Schultz6addd812016-02-02 17:17:23 -0700244 void Draw(uint32_t vertexCount, uint32_t instanceCount,
245 uint32_t firstVertex, uint32_t firstInstance) {
246 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex,
247 firstInstance);
248 }
249 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
250 uint32_t firstIndex, int32_t vertexOffset,
251 uint32_t firstInstance) {
252 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex,
253 vertexOffset, firstInstance);
254 }
Mark Muellerdfe37552016-07-07 14:47:42 -0600255 void QueueCommandBuffer(bool checkSuccess = true) {
256 m_commandBuffer->QueueCommandBuffer(checkSuccess); }
Karl Schultz6addd812016-02-02 17:17:23 -0700257 void QueueCommandBuffer(const VkFence &fence) {
258 m_commandBuffer->QueueCommandBuffer(fence);
259 }
260 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
261 VkDeviceSize offset, uint32_t binding) {
262 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
263 }
264 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
265 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
266 }
267
268 protected:
269 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600270 bool m_enableWSI;
Tony Barbour300a6082015-04-07 13:44:53 -0600271
272 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600273 std::vector<const char *> instance_layer_names;
274 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600275 std::vector<const char *> instance_extension_names;
276 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600277
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700278 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600279 /*
280 * Since CreateDbgMsgCallback is an instance level extension call
281 * any extension / layer that utilizes that feature also needs
282 * to be enabled at create instance time.
283 */
Karl Schultz6addd812016-02-02 17:17:23 -0700284 // Use Threading layer first to protect others from
285 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700286 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600287 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800288 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700289 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800290 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600291 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700292 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600293
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700294 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600295 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800296 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700297 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800298 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600299 device_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700300 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour300a6082015-04-07 13:44:53 -0600301
Ian Elliott2c1daf52016-05-12 09:41:46 -0600302 if (m_enableWSI) {
303 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
304 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
305#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
306#if defined(VK_USE_PLATFORM_ANDROID_KHR)
307 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
308#endif // VK_USE_PLATFORM_ANDROID_KHR
309#if defined(VK_USE_PLATFORM_MIR_KHR)
310 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
311#endif // VK_USE_PLATFORM_MIR_KHR
312#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
313 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
314#endif // VK_USE_PLATFORM_WAYLAND_KHR
315#if defined(VK_USE_PLATFORM_WIN32_KHR)
316 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
317#endif // VK_USE_PLATFORM_WIN32_KHR
318#endif // NEED_TO_TEST_THIS_ON_PLATFORM
319#if defined(VK_USE_PLATFORM_XCB_KHR)
320 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
321#elif defined(VK_USE_PLATFORM_XLIB_KHR)
322 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
323#endif // VK_USE_PLATFORM_XLIB_KHR
324 }
325
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600326 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600327 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800328 this->app_info.pApplicationName = "layer_tests";
329 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600330 this->app_info.pEngineName = "unittest";
331 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600332 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600333
Tony Barbour15524c32015-04-29 17:34:29 -0600334 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600335 InitFramework(instance_layer_names, device_layer_names,
336 instance_extension_names, device_extension_names,
337 myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600338 }
339
340 virtual void TearDown() {
341 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600342 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600343 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600344 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600345
346 VkLayerTest() {
347 m_enableWSI = false;
348 }
Tony Barbour300a6082015-04-07 13:44:53 -0600349};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500350
Karl Schultz6addd812016-02-02 17:17:23 -0700351VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600352 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600353
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800354 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600355
356 /*
357 * For render test all drawing happens in a single render pass
358 * on a single command buffer.
359 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200360 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800361 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600362 }
363
364 return result;
365}
366
Karl Schultz6addd812016-02-02 17:17:23 -0700367VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600368 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600369
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200370 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800371 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200372 }
Tony Barbour300a6082015-04-07 13:44:53 -0600373
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800374 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600375
376 return result;
377}
378
Karl Schultz6addd812016-02-02 17:17:23 -0700379void VkLayerTest::VKTriangleTest(const char *vertShaderText,
380 const char *fragShaderText,
381 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500382 // Create identity matrix
383 int i;
384 struct vktriangle_vs_uniform data;
385
386 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700387 glm::mat4 View = glm::mat4(1.0f);
388 glm::mat4 Model = glm::mat4(1.0f);
389 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500390 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700391 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500392
393 memcpy(&data.mvp, &MVP[0][0], matrixSize);
394
Karl Schultz6addd812016-02-02 17:17:23 -0700395 static const Vertex tri_data[] = {
396 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
397 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
398 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500399 };
400
Karl Schultz6addd812016-02-02 17:17:23 -0700401 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500402 data.position[i][0] = tri_data[i].posX;
403 data.position[i][1] = tri_data[i].posY;
404 data.position[i][2] = tri_data[i].posZ;
405 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700406 data.color[i][0] = tri_data[i].r;
407 data.color[i][1] = tri_data[i].g;
408 data.color[i][2] = tri_data[i].b;
409 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500410 }
411
412 ASSERT_NO_FATAL_FAILURE(InitState());
413 ASSERT_NO_FATAL_FAILURE(InitViewport());
414
Karl Schultz6addd812016-02-02 17:17:23 -0700415 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
416 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500417
Karl Schultz6addd812016-02-02 17:17:23 -0700418 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
419 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
420 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500421
422 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800423 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500424 pipelineobj.AddShader(&vs);
425 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600426 if (failMask & BsoFailLineWidth) {
427 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600428 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
429 ia_state.sType =
430 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
431 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
432 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600433 }
434 if (failMask & BsoFailDepthBias) {
435 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600436 VkPipelineRasterizationStateCreateInfo rs_state = {};
437 rs_state.sType =
438 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
439 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600440 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600441 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600442 }
Karl Schultz6addd812016-02-02 17:17:23 -0700443 // Viewport and scissors must stay in synch or other errors will occur than
444 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600445 if (failMask & BsoFailViewport) {
446 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600447 m_viewports.clear();
448 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600449 }
450 if (failMask & BsoFailScissor) {
451 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600452 m_scissors.clear();
453 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600454 }
455 if (failMask & BsoFailBlend) {
456 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600457 VkPipelineColorBlendAttachmentState att_state = {};
458 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
459 att_state.blendEnable = VK_TRUE;
460 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600461 }
462 if (failMask & BsoFailDepthBounds) {
463 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
464 }
465 if (failMask & BsoFailStencilReadMask) {
466 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
467 }
468 if (failMask & BsoFailStencilWriteMask) {
469 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
470 }
471 if (failMask & BsoFailStencilReference) {
472 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
473 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500474
475 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700476 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
477 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500478
479 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600480 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500481
Tony Barbourfe3351b2015-07-28 10:17:20 -0600482 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500483
484 // render triangle
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -0600485 Draw(3, 1, 0, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500486
Mark Muellerd4914412016-06-13 17:52:06 -0600487 if (failMask & BsoFailCmdClearAttachments) {
488 VkClearAttachment color_attachment = {};
489 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
490 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
491 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
492
493 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
494 &color_attachment, 1, &clear_rect);
495 }
496
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500497 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600498 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500499
Tony Barbourfe3351b2015-07-28 10:17:20 -0600500 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500501}
502
Karl Schultz6addd812016-02-02 17:17:23 -0700503void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
504 VkPipelineObj &pipelineobj,
505 VkDescriptorSetObj &descriptorSet,
506 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500507 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700508 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
509 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500510 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700511 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
512 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500513 }
514
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800515 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700516 // Make sure depthWriteEnable is set so that Depth fail test will work
517 // correctly
518 // Make sure stencilTestEnable is set so that Stencil fail test will work
519 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600520 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800521 stencil.failOp = VK_STENCIL_OP_KEEP;
522 stencil.passOp = VK_STENCIL_OP_KEEP;
523 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
524 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600525
526 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
527 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600528 ds_ci.pNext = NULL;
529 ds_ci.depthTestEnable = VK_FALSE;
530 ds_ci.depthWriteEnable = VK_TRUE;
531 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
532 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600533 if (failMask & BsoFailDepthBounds) {
534 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600535 ds_ci.maxDepthBounds = 0.0f;
536 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600537 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600538 ds_ci.stencilTestEnable = VK_TRUE;
539 ds_ci.front = stencil;
540 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600541
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600542 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600543 pipelineobj.SetViewport(m_viewports);
544 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800545 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700546 VkResult err = pipelineobj.CreateVKPipeline(
547 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600548 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800549 commandBuffer->BindPipeline(pipelineobj);
550 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500551}
552
Ian Elliott2c1daf52016-05-12 09:41:46 -0600553class VkWsiEnabledLayerTest : public VkLayerTest {
554 public:
555protected:
556 VkWsiEnabledLayerTest() {
557 m_enableWSI = true;
558 }
559};
560
Mark Muellerdfe37552016-07-07 14:47:42 -0600561class VkBufferTest {
562public:
563 enum eTestEnFlags {
564 eDoubleDelete,
565 eInvalidDeviceOffset,
566 eInvalidMemoryOffset,
567 eBindNullBuffer,
568 eFreeInvalidHandle,
569 };
570
571 enum eTestConditions {
572 eOffsetAlignment = 1
573 };
574
575 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice,
576 eTestEnFlags aTestFlag,
577 VkBufferUsageFlags aBufferUsage = 0) {
578 if (eInvalidDeviceOffset != aTestFlag &&
579 eInvalidMemoryOffset != aTestFlag) {
580 return true;
581 }
582 VkDeviceSize offset_limit = 0;
583 if (eInvalidMemoryOffset == aTestFlag) {
584 VkBuffer vulkanBuffer;
585 VkBufferCreateInfo buffer_create_info = {};
586 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
587 buffer_create_info.size = 32;
588 buffer_create_info.usage = aBufferUsage;
589
590 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr,
591 &vulkanBuffer);
592 VkMemoryRequirements memory_reqs = {0};
593
594 vkGetBufferMemoryRequirements(aVulkanDevice->device(),
595 vulkanBuffer, &memory_reqs);
596 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
597 offset_limit = memory_reqs.alignment;
598 }
599 else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT |
600 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
601 offset_limit =
602 aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
603 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
604 offset_limit =
605 aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
606 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
607 offset_limit =
608 aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
609 }
610 if (eOffsetAlignment < offset_limit) {
611 return true;
612 }
613 return false;
614 }
615
616 // A constructor which performs validation tests within construction.
617 VkBufferTest(VkDeviceObj *aVulkanDevice,
618 VkBufferUsageFlags aBufferUsage,
619 eTestEnFlags aTestFlag)
620 : AllocateCurrent(false), BoundCurrent(false),
621 CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
622
623 if (eBindNullBuffer == aTestFlag) {
624 VulkanMemory = 0;
625 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
626 } else {
627 VkBufferCreateInfo buffer_create_info = {};
628 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
629 buffer_create_info.size = 32;
630 buffer_create_info.usage = aBufferUsage;
631
632 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr,
633 &VulkanBuffer);
634
635 CreateCurrent = true;
636
637 VkMemoryRequirements memory_requirements;
638 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer,
639 &memory_requirements);
640
641 VkMemoryAllocateInfo memory_allocate_info = {};
642 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
643 memory_allocate_info.allocationSize = memory_requirements.size;
644 bool pass = aVulkanDevice->phy().
645 set_memory_type(memory_requirements.memoryTypeBits,
646 &memory_allocate_info,
647 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
648 if (!pass) {
649 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
650 return;
651 }
652
653 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL,
654 &VulkanMemory);
655 AllocateCurrent = true;
656 // NB: 1 is intentionally an invalid offset value
657 const bool offset_en = eInvalidDeviceOffset == aTestFlag ||
658 eInvalidMemoryOffset == aTestFlag;
659 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory,
660 offset_en ? eOffsetAlignment : 0);
661 BoundCurrent = true;
662
663 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
664 }
665 }
666
667 ~VkBufferTest() {
668 if (CreateCurrent) {
669 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
670 }
671 if (AllocateCurrent) {
672 if (InvalidDeleteEn) {
673 union {
674 VkDeviceMemory device_memory;
675 unsigned long long index_access;
676 } bad_index;
677
678 bad_index.device_memory = VulkanMemory;
679 bad_index.index_access++;
680
681 vkFreeMemory(VulkanDevice,
682 bad_index.device_memory,
683 nullptr);
684 }
685 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
686 }
687 }
688
689 bool GetBufferCurrent() {
690 return AllocateCurrent && BoundCurrent && CreateCurrent;
691 }
692
693 const VkBuffer &GetBuffer() {
694 return VulkanBuffer;
695 }
696
697 void TestDoubleDestroy() {
698 // Destroy the buffer but leave the flag set, which will cause
699 // the buffer to be destroyed again in the destructor.
700 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
701 }
702
703protected:
704 bool AllocateCurrent;
705 bool BoundCurrent;
706 bool CreateCurrent;
707 bool InvalidDeleteEn;
708
709 VkBuffer VulkanBuffer;
710 VkDevice VulkanDevice;
711 VkDeviceMemory VulkanMemory;
712
713};
714
715class VkVerticesObj {
716public:
717 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount,
718 unsigned aBindingCount, unsigned aByteStride,
719 VkDeviceSize aVertexCount, const float *aVerticies)
720 : BoundCurrent(false),
721 AttributeCount(aAttributeCount),
722 BindingCount(aBindingCount),
723 BindId(BindIdGenerator),
724 PipelineVertexInputStateCreateInfo(),
725 VulkanMemoryBuffer(aVulkanDevice, 1,
726 static_cast<int>(aByteStride * aVertexCount),
727 reinterpret_cast<const void *>(aVerticies),
728 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
729 BindIdGenerator++; // NB: This can wrap w/misuse
730
731 VertexInputAttributeDescription =
732 new VkVertexInputAttributeDescription[AttributeCount];
733 VertexInputBindingDescription =
734 new VkVertexInputBindingDescription[BindingCount];
735
736 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions =
737 VertexInputAttributeDescription;
738 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount =
739 AttributeCount;
740 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions =
741 VertexInputBindingDescription;
742 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount =
743 BindingCount;
744 PipelineVertexInputStateCreateInfo.sType =
745 VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
746
747 unsigned i = 0;
748 do {
749 VertexInputAttributeDescription[i].binding = BindId;
750 VertexInputAttributeDescription[i].location = i;
751 VertexInputAttributeDescription[i].format =
752 VK_FORMAT_R32G32B32_SFLOAT;
753 VertexInputAttributeDescription[i].offset =
754 sizeof(float) * aByteStride;
755 i++;
756 } while (AttributeCount < i);
757
758 i = 0;
759 do {
760 VertexInputBindingDescription[i].binding = BindId;
761 VertexInputBindingDescription[i].stride = aByteStride;
762 VertexInputBindingDescription[i].inputRate =
763 VK_VERTEX_INPUT_RATE_VERTEX;
764 i++;
765 } while (BindingCount < i);
766 }
767
768 ~VkVerticesObj() {
769 if (VertexInputAttributeDescription) {
770 delete[] VertexInputAttributeDescription;
771 }
772 if (VertexInputBindingDescription) {
773 delete[] VertexInputBindingDescription;
774 }
775 }
776
777 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
778 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription,
779 AttributeCount);
780 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription,
781 BindingCount);
782 return true;
783 }
784
785 void BindVertexBuffers(VkCommandBuffer aCommandBuffer,
786 unsigned aOffsetCount = 0,
787 VkDeviceSize *aOffsetList = nullptr) {
788 VkDeviceSize *offsetList;
789 unsigned offsetCount;
790
791 if (aOffsetCount) {
792 offsetList = aOffsetList;
793 offsetCount = aOffsetCount;
794 } else {
795 offsetList = new VkDeviceSize[1]();
796 offsetCount = 1;
797 }
798
799 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount,
800 &VulkanMemoryBuffer.handle(), offsetList);
801 BoundCurrent = true;
802
803 if (!aOffsetCount) {
804 delete [] offsetList;
805 }
806 }
807
808protected:
809 static uint32_t BindIdGenerator;
810
811 bool BoundCurrent;
812 unsigned AttributeCount;
813 unsigned BindingCount;
814 uint32_t BindId;
815
816 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
817 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
818 VkVertexInputBindingDescription *VertexInputBindingDescription;
819 VkConstantBufferObj VulkanMemoryBuffer;
820};
821
822uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500823// ********************************************************************************************************************
824// ********************************************************************************************************************
825// ********************************************************************************************************************
826// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600827#if PARAMETER_VALIDATION_TESTS
828TEST_F(VkLayerTest, RequiredParameter) {
829 TEST_DESCRIPTION("Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
830 "pointer, array, and array count parameters");
831
832 ASSERT_NO_FATAL_FAILURE(InitState());
833
834 m_errorMonitor->SetDesiredFailureMsg(
835 VK_DEBUG_REPORT_ERROR_BIT_EXT,
836 "required parameter pFeatures specified as NULL");
837 // Specify NULL for a pointer to a handle
838 // Expected to trigger an error with
839 // parameter_validation::validate_required_pointer
840 vkGetPhysicalDeviceFeatures(gpu(), NULL);
841 m_errorMonitor->VerifyFound();
842
843 m_errorMonitor->SetDesiredFailureMsg(
844 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600845 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600846 // Specify NULL for pointer to array count
847 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600848 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600849 m_errorMonitor->VerifyFound();
850
851 m_errorMonitor->SetDesiredFailureMsg(
852 VK_DEBUG_REPORT_ERROR_BIT_EXT,
853 "parameter viewportCount must be greater than 0");
854 // Specify 0 for a required array count
855 // Expected to trigger an error with parameter_validation::validate_array
856 VkViewport view_port = {};
857 m_commandBuffer->SetViewport(0, 0, &view_port);
858 m_errorMonitor->VerifyFound();
859
860 m_errorMonitor->SetDesiredFailureMsg(
861 VK_DEBUG_REPORT_ERROR_BIT_EXT,
862 "required parameter pViewports specified as NULL");
863 // Specify NULL for a required array
864 // Expected to trigger an error with parameter_validation::validate_array
865 m_commandBuffer->SetViewport(0, 1, NULL);
866 m_errorMonitor->VerifyFound();
867
868 m_errorMonitor->SetDesiredFailureMsg(
869 VK_DEBUG_REPORT_ERROR_BIT_EXT,
870 "required parameter memory specified as VK_NULL_HANDLE");
871 // Specify VK_NULL_HANDLE for a required handle
872 // Expected to trigger an error with
873 // parameter_validation::validate_required_handle
874 vkUnmapMemory(device(), VK_NULL_HANDLE);
875 m_errorMonitor->VerifyFound();
876
877 m_errorMonitor->SetDesiredFailureMsg(
878 VK_DEBUG_REPORT_ERROR_BIT_EXT,
879 "required parameter pFences[0] specified as VK_NULL_HANDLE");
880 // Specify VK_NULL_HANDLE for a required handle array entry
881 // Expected to trigger an error with
882 // parameter_validation::validate_required_handle_array
883 VkFence fence = VK_NULL_HANDLE;
884 vkResetFences(device(), 1, &fence);
885 m_errorMonitor->VerifyFound();
886
887 m_errorMonitor->SetDesiredFailureMsg(
888 VK_DEBUG_REPORT_ERROR_BIT_EXT,
889 "required parameter pAllocateInfo specified as NULL");
890 // Specify NULL for a required struct pointer
891 // Expected to trigger an error with
892 // parameter_validation::validate_struct_type
893 VkDeviceMemory memory = VK_NULL_HANDLE;
894 vkAllocateMemory(device(), NULL, NULL, &memory);
895 m_errorMonitor->VerifyFound();
896
897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
898 "value of faceMask must not be 0");
899 // Specify 0 for a required VkFlags parameter
900 // Expected to trigger an error with parameter_validation::validate_flags
901 m_commandBuffer->SetStencilReference(0, 0);
902 m_errorMonitor->VerifyFound();
903
904 m_errorMonitor->SetDesiredFailureMsg(
905 VK_DEBUG_REPORT_ERROR_BIT_EXT,
906 "value of pSubmits[i].pWaitDstStageMask[0] must not be 0");
907 // Specify 0 for a required VkFlags array entry
908 // Expected to trigger an error with
909 // parameter_validation::validate_flags_array
910 VkSemaphore semaphore = VK_NULL_HANDLE;
911 VkPipelineStageFlags stageFlags = 0;
912 VkSubmitInfo submitInfo = {};
913 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
914 submitInfo.waitSemaphoreCount = 1;
915 submitInfo.pWaitSemaphores = &semaphore;
916 submitInfo.pWaitDstStageMask = &stageFlags;
917 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
918 m_errorMonitor->VerifyFound();
919}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600920
Dustin Gravesfce74c02016-05-10 11:42:58 -0600921TEST_F(VkLayerTest, ReservedParameter) {
922 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
923
924 ASSERT_NO_FATAL_FAILURE(InitState());
925
926 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
927 " must be 0");
928 // Specify 0 for a reserved VkFlags parameter
929 // Expected to trigger an error with
930 // parameter_validation::validate_reserved_flags
931 VkEvent event_handle = VK_NULL_HANDLE;
932 VkEventCreateInfo event_info = {};
933 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
934 event_info.flags = 1;
935 vkCreateEvent(device(), &event_info, NULL, &event_handle);
936 m_errorMonitor->VerifyFound();
937}
938
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600939TEST_F(VkLayerTest, InvalidStructSType) {
940 TEST_DESCRIPTION("Specify an invalid VkStructureType for a Vulkan "
941 "structure's sType field");
942
943 ASSERT_NO_FATAL_FAILURE(InitState());
944
945 m_errorMonitor->SetDesiredFailureMsg(
946 VK_DEBUG_REPORT_ERROR_BIT_EXT,
947 "parameter pAllocateInfo->sType must be");
948 // Zero struct memory, effectively setting sType to
949 // VK_STRUCTURE_TYPE_APPLICATION_INFO
950 // Expected to trigger an error with
951 // parameter_validation::validate_struct_type
952 VkMemoryAllocateInfo alloc_info = {};
953 VkDeviceMemory memory = VK_NULL_HANDLE;
954 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
955 m_errorMonitor->VerifyFound();
956
957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
958 "parameter pSubmits[0].sType must be");
959 // Zero struct memory, effectively setting sType to
960 // VK_STRUCTURE_TYPE_APPLICATION_INFO
961 // Expected to trigger an error with
962 // parameter_validation::validate_struct_type_array
963 VkSubmitInfo submit_info = {};
964 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
965 m_errorMonitor->VerifyFound();
966}
967
968TEST_F(VkLayerTest, InvalidStructPNext) {
969 TEST_DESCRIPTION(
970 "Specify an invalid value for a Vulkan structure's pNext field");
971
972 ASSERT_NO_FATAL_FAILURE(InitState());
973
974 m_errorMonitor->SetDesiredFailureMsg(
Dustin Gravesaf5c0292016-07-19 13:43:53 -0600975 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz38b50992016-07-11 16:09:09 -0600976 "value of pCreateInfo->pNext must be NULL");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600977 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be
Karl Schultz38b50992016-07-11 16:09:09 -0600978 // NULL.
979 // Need to pick a function that has no allowed pNext structure types.
980 // Expected to trigger an error with
981 // parameter_validation::validate_struct_pnext
982 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600983 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600984 // Zero-initialization will provide the correct sType
985 VkApplicationInfo app_info = {};
986 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
987 event_alloc_info.pNext = &app_info;
988 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
989 m_errorMonitor->VerifyFound();
990
991 m_errorMonitor->SetDesiredFailureMsg(
Dustin Gravesaf5c0292016-07-19 13:43:53 -0600992 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz38b50992016-07-11 16:09:09 -0600993 " chain includes a structure with unexpected VkStructureType ");
994 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
995 // a function that has allowed pNext structure types and specify
996 // a structure type that is not allowed.
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600997 // Expected to trigger an error with
998 // parameter_validation::validate_struct_pnext
999 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -06001000 VkMemoryAllocateInfo memory_alloc_info = {};
1001 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1002 memory_alloc_info.pNext = &app_info;
1003 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -06001004 m_errorMonitor->VerifyFound();
1005
Dustin Graves47b6cba2016-05-10 17:34:38 -06001006 m_errorMonitor->SetDesiredFailureMsg(
Dustin Gravesaf5c0292016-07-19 13:43:53 -06001007 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Dustin Graves47b6cba2016-05-10 17:34:38 -06001008 " chain includes a structure with unexpected VkStructureType ");
1009 // Set VkGraphicsPipelineCreateInfo::VkPipelineRasterizationStateCreateInfo::pNext to an invalid structure, when pNext is allowed to be a non-NULL value
1010 // Expected to trigger an error with
1011 // parameter_validation::validate_struct_pnext
1012 VkDescriptorPoolSize ds_type_count = {};
1013 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1014 ds_type_count.descriptorCount = 1;
1015
1016 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1017 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1018 ds_pool_ci.pNext = NULL;
1019 ds_pool_ci.maxSets = 1;
1020 ds_pool_ci.poolSizeCount = 1;
1021 ds_pool_ci.pPoolSizes = &ds_type_count;
1022
1023 VkDescriptorPool ds_pool;
1024 VkResult err =
1025 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
1026 ASSERT_VK_SUCCESS(err);
1027
1028 VkDescriptorSetLayoutBinding dsl_binding = {};
1029 dsl_binding.binding = 0;
1030 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1031 dsl_binding.descriptorCount = 1;
1032 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1033 dsl_binding.pImmutableSamplers = NULL;
1034
1035 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1036 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1037 ds_layout_ci.pNext = NULL;
1038 ds_layout_ci.bindingCount = 1;
1039 ds_layout_ci.pBindings = &dsl_binding;
1040
1041 VkDescriptorSetLayout ds_layout;
1042 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1043 &ds_layout);
1044 ASSERT_VK_SUCCESS(err);
1045
1046 VkDescriptorSet descriptorSet;
1047 VkDescriptorSetAllocateInfo ds_alloc_info = {};
1048 ds_alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1049 ds_alloc_info.descriptorSetCount = 1;
1050 ds_alloc_info.descriptorPool = ds_pool;
1051 ds_alloc_info.pSetLayouts = &ds_layout;
1052 err = vkAllocateDescriptorSets(m_device->device(), &ds_alloc_info,
1053 &descriptorSet);
1054 ASSERT_VK_SUCCESS(err);
1055
1056 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1057 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1058 pipeline_layout_ci.setLayoutCount = 1;
1059 pipeline_layout_ci.pSetLayouts = &ds_layout;
1060
1061 VkPipelineLayout pipeline_layout;
1062 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1063 &pipeline_layout);
1064 ASSERT_VK_SUCCESS(err);
1065
1066 VkViewport vp = {}; // Just need dummy vp to point to
1067 VkRect2D sc = {}; // dummy scissor to point to
1068
1069 VkPipelineViewportStateCreateInfo vp_state_ci = {};
1070 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
1071 vp_state_ci.scissorCount = 1;
1072 vp_state_ci.pScissors = &sc;
1073 vp_state_ci.viewportCount = 1;
1074 vp_state_ci.pViewports = &vp;
1075
1076 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
1077 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1078 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
1079 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
1080 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
1081 rs_state_ci.depthClampEnable = VK_FALSE;
1082 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
1083 rs_state_ci.depthBiasEnable = VK_FALSE;
1084
1085 VkGraphicsPipelineCreateInfo gp_ci = {};
1086 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
1087 gp_ci.pViewportState = &vp_state_ci;
1088 gp_ci.pRasterizationState = &rs_state_ci;
1089 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
1090 gp_ci.layout = pipeline_layout;
1091 gp_ci.renderPass = renderPass();
1092
1093 VkPipelineCacheCreateInfo pc_ci = {};
1094 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
1095 pc_ci.initialDataSize = 0;
1096 pc_ci.pInitialData = 0;
1097
1098 VkPipeline pipeline;
1099 VkPipelineCache pipelineCache;
1100
1101 err =
1102 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
1103 ASSERT_VK_SUCCESS(err);
1104
1105 // Set VkPipelineRasterizationStateCreateInfo::pNext to an invalid value
1106 VkApplicationInfo invalid_pnext_struct = {};
1107 rs_state_ci.pNext = &invalid_pnext_struct;
1108
1109 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
1110 &gp_ci, NULL, &pipeline);
1111 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06001112 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
1113 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1114 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1115 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1116
Dustin Gravesfd1c8fe2016-07-15 11:40:20 -06001117 // Positive test to check parameter_validation and unique_objects support
1118 // for NV_dedicated_allocation
1119 uint32_t extension_count = 0;
1120 bool supports_nv_dedicated_allocation = false;
1121 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count,
1122 nullptr);
1123 ASSERT_VK_SUCCESS(err);
1124
1125 if (extension_count > 0) {
1126 std::vector<VkExtensionProperties> available_extensions(
1127 extension_count);
1128
1129 err = vkEnumerateDeviceExtensionProperties(
1130 gpu(), nullptr, &extension_count, &available_extensions[0]);
1131 ASSERT_VK_SUCCESS(err);
1132
1133 for (const auto &extension_props : available_extensions) {
1134 if (strcmp(extension_props.extensionName,
1135 VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
1136 supports_nv_dedicated_allocation = true;
1137 }
1138 }
1139 }
1140
1141 if (supports_nv_dedicated_allocation) {
1142 m_errorMonitor->ExpectSuccess();
1143
1144 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info =
1145 {};
1146 dedicated_buffer_create_info.sType =
1147 VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
1148 dedicated_buffer_create_info.pNext = nullptr;
1149 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
1150
1151 uint32_t queue_family_index = 0;
1152 VkBufferCreateInfo buffer_create_info = {};
1153 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1154 buffer_create_info.pNext = &dedicated_buffer_create_info;
1155 buffer_create_info.size = 1024;
1156 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1157 buffer_create_info.queueFamilyIndexCount = 1;
1158 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1159
1160 VkBuffer buffer;
1161 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info,
1162 NULL, &buffer);
1163 ASSERT_VK_SUCCESS(err);
1164
1165 VkMemoryRequirements memory_reqs;
1166 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1167
1168 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
1169 dedicated_memory_info.sType =
1170 VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
1171 dedicated_memory_info.pNext = nullptr;
1172 dedicated_memory_info.buffer = buffer;
1173 dedicated_memory_info.image = VK_NULL_HANDLE;
1174
1175 VkMemoryAllocateInfo memory_info = {};
1176 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1177 memory_info.pNext = &dedicated_memory_info;
1178 memory_info.allocationSize = memory_reqs.size;
1179
1180 bool pass;
1181 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1182 &memory_info, 0);
1183 ASSERT_TRUE(pass);
1184
1185 VkDeviceMemory buffer_memory;
1186 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1187 &buffer_memory);
1188 ASSERT_VK_SUCCESS(err);
1189
1190 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1191 ASSERT_VK_SUCCESS(err);
1192
1193 vkDestroyBuffer(m_device->device(), buffer, NULL);
1194 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1195
1196 m_errorMonitor->VerifyNotFound();
1197 }
Dustin Gravesc99cf5a2016-05-09 14:40:29 -06001198}
Dustin Graves5d33d532016-05-09 16:21:12 -06001199
1200TEST_F(VkLayerTest, UnrecognizedValue) {
1201 TEST_DESCRIPTION(
1202 "Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
1203
1204 ASSERT_NO_FATAL_FAILURE(InitState());
1205
1206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1207 "does not fall within the begin..end "
1208 "range of the core VkFormat "
1209 "enumeration tokens");
1210 // Specify an invalid VkFormat value
1211 // Expected to trigger an error with
1212 // parameter_validation::validate_ranged_enum
1213 VkFormatProperties format_properties;
1214 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000),
1215 &format_properties);
1216 m_errorMonitor->VerifyFound();
1217
1218 m_errorMonitor->SetDesiredFailureMsg(
1219 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1220 "contains flag bits that are not recognized members of");
1221 // Specify an invalid VkFlags bitmask value
1222 // Expected to trigger an error with parameter_validation::validate_flags
1223 VkImageFormatProperties image_format_properties;
1224 vkGetPhysicalDeviceImageFormatProperties(
1225 gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D,
1226 VK_IMAGE_TILING_OPTIMAL, static_cast<VkImageUsageFlags>(1 << 25), 0,
1227 &image_format_properties);
1228 m_errorMonitor->VerifyFound();
1229
1230 m_errorMonitor->SetDesiredFailureMsg(
1231 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1232 "contains flag bits that are not recognized members of");
1233 // Specify an invalid VkFlags array entry
1234 // Expected to trigger an error with
1235 // parameter_validation::validate_flags_array
1236 VkSemaphore semaphore = VK_NULL_HANDLE;
1237 VkPipelineStageFlags stage_flags =
1238 static_cast<VkPipelineStageFlags>(1 << 25);
1239 VkSubmitInfo submit_info = {};
1240 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1241 submit_info.waitSemaphoreCount = 1;
1242 submit_info.pWaitSemaphores = &semaphore;
1243 submit_info.pWaitDstStageMask = &stage_flags;
1244 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1245 m_errorMonitor->VerifyFound();
1246
1247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1248 "is neither VK_TRUE nor VK_FALSE");
1249 // Specify an invalid VkBool32 value
1250 // Expected to trigger a warning with
1251 // parameter_validation::validate_bool32
1252 VkSampler sampler = VK_NULL_HANDLE;
1253 VkSamplerCreateInfo sampler_info = {};
1254 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1255 sampler_info.pNext = NULL;
1256 sampler_info.magFilter = VK_FILTER_NEAREST;
1257 sampler_info.minFilter = VK_FILTER_NEAREST;
1258 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1259 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1260 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1261 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1262 sampler_info.mipLodBias = 1.0;
1263 sampler_info.maxAnisotropy = 1;
1264 sampler_info.compareEnable = VK_FALSE;
1265 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1266 sampler_info.minLod = 1.0;
1267 sampler_info.maxLod = 1.0;
1268 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1269 sampler_info.unnormalizedCoordinates = VK_FALSE;
1270 // Not VK_TRUE or VK_FALSE
1271 sampler_info.anisotropyEnable = 3;
1272 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1273 m_errorMonitor->VerifyFound();
1274}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001275
1276TEST_F(VkLayerTest, FailedReturnValue) {
1277 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1278
1279 ASSERT_NO_FATAL_FAILURE(InitState());
1280
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001281 // Find an unsupported image format
1282 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1283 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1284 VkFormat format = static_cast<VkFormat>(f);
1285 VkFormatProperties fProps = m_device->format_properties(format);
1286 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
1287 fProps.optimalTilingFeatures == 0) {
1288 unsupported = format;
1289 break;
1290 }
1291 }
1292
1293 if (unsupported != VK_FORMAT_UNDEFINED) {
1294 m_errorMonitor->SetDesiredFailureMsg(
1295 VK_DEBUG_REPORT_WARNING_BIT_EXT,
1296 "the requested format is not supported on this device");
1297 // Specify an unsupported VkFormat value to generate a
1298 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1299 // Expected to trigger a warning from
1300 // parameter_validation::validate_result
1301 VkImageFormatProperties image_format_properties;
1302 VkResult err = vkGetPhysicalDeviceImageFormatProperties(
1303 gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1304 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
1305 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1306 m_errorMonitor->VerifyFound();
1307 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001308}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001309
1310TEST_F(VkLayerTest, UpdateBufferAlignment) {
1311 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
1312 uint32_t updateData[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
1313
1314 ASSERT_NO_FATAL_FAILURE(InitState());
1315
1316 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1317 vk_testing::Buffer buffer;
1318 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1319
1320 BeginCommandBuffer();
1321 // Introduce failure by using dstOffset that is not multiple of 4
1322 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1323 " is not a multiple of 4");
1324 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1325 m_errorMonitor->VerifyFound();
1326
1327 // Introduce failure by using dataSize that is not multiple of 4
1328 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1329 " is not a multiple of 4");
1330 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1331 m_errorMonitor->VerifyFound();
1332
1333 // Introduce failure by using dataSize that is < 0
1334 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1335 "must be greater than zero and less than or equal to 65536");
1336 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1337 m_errorMonitor->VerifyFound();
1338
1339 // Introduce failure by using dataSize that is > 65536
1340 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1341 "must be greater than zero and less than or equal to 65536");
1342 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1343 m_errorMonitor->VerifyFound();
1344
1345 EndCommandBuffer();
1346}
1347
1348TEST_F(VkLayerTest, FillBufferAlignment) {
1349 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1350
1351 ASSERT_NO_FATAL_FAILURE(InitState());
1352
1353 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1354 vk_testing::Buffer buffer;
1355 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1356
1357 BeginCommandBuffer();
1358
1359 // Introduce failure by using dstOffset that is not multiple of 4
1360 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1361 " is not a multiple of 4");
1362 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1363 m_errorMonitor->VerifyFound();
1364
1365 // Introduce failure by using size that is not multiple of 4
1366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1367 " is not a multiple of 4");
1368 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1369 m_errorMonitor->VerifyFound();
1370
1371 // Introduce failure by using size that is zero
1372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1373 "must be greater than zero");
1374 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1375 m_errorMonitor->VerifyFound();
1376
1377 EndCommandBuffer();
1378}
Dustin Graves40f35822016-06-23 11:12:53 -06001379
1380// This is a positive test. No failures are expected.
1381TEST_F(VkLayerTest, IgnoreUnrelatedDescriptor) {
1382 TEST_DESCRIPTION("Ensure that the vkUpdateDescriptorSet validation code "
1383 "is ignoring VkWriteDescriptorSet members that are not "
1384 "related to the descriptor type specified by "
1385 "VkWriteDescriptorSet::descriptorType. Correct "
1386 "validation behavior will result in the test running to "
1387 "completion without validation errors.");
1388
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001389 const uintptr_t invalid_ptr = 0xcdcdcdcd;
1390
Dustin Graves40f35822016-06-23 11:12:53 -06001391 ASSERT_NO_FATAL_FAILURE(InitState());
1392
1393 // Image Case
1394 {
1395 m_errorMonitor->ExpectSuccess();
1396
1397 VkImage image;
1398 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1399 const int32_t tex_width = 32;
1400 const int32_t tex_height = 32;
1401 VkImageCreateInfo image_create_info = {};
1402 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1403 image_create_info.pNext = NULL;
1404 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1405 image_create_info.format = tex_format;
1406 image_create_info.extent.width = tex_width;
1407 image_create_info.extent.height = tex_height;
1408 image_create_info.extent.depth = 1;
1409 image_create_info.mipLevels = 1;
1410 image_create_info.arrayLayers = 1;
1411 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis51cde412016-07-11 16:08:30 -06001412 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Dustin Graves40f35822016-06-23 11:12:53 -06001413 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1414 image_create_info.flags = 0;
1415 VkResult err =
1416 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1417 ASSERT_VK_SUCCESS(err);
1418
1419 VkMemoryRequirements memory_reqs;
1420 VkDeviceMemory image_memory;
1421 bool pass;
1422 VkMemoryAllocateInfo memory_info = {};
1423 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1424 memory_info.pNext = NULL;
1425 memory_info.allocationSize = 0;
1426 memory_info.memoryTypeIndex = 0;
1427 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
1428 memory_info.allocationSize = memory_reqs.size;
1429 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1430 &memory_info, 0);
1431 ASSERT_TRUE(pass);
1432 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1433 &image_memory);
1434 ASSERT_VK_SUCCESS(err);
1435 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
1436 ASSERT_VK_SUCCESS(err);
1437
1438 VkImageViewCreateInfo image_view_create_info = {};
1439 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
1440 image_view_create_info.image = image;
1441 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
1442 image_view_create_info.format = tex_format;
1443 image_view_create_info.subresourceRange.layerCount = 1;
1444 image_view_create_info.subresourceRange.baseMipLevel = 0;
1445 image_view_create_info.subresourceRange.levelCount = 1;
1446 image_view_create_info.subresourceRange.aspectMask =
1447 VK_IMAGE_ASPECT_COLOR_BIT;
1448
1449 VkImageView view;
1450 err = vkCreateImageView(m_device->device(), &image_view_create_info,
1451 NULL, &view);
1452 ASSERT_VK_SUCCESS(err);
1453
1454 VkDescriptorPoolSize ds_type_count = {};
1455 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1456 ds_type_count.descriptorCount = 1;
1457
1458 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1459 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1460 ds_pool_ci.pNext = NULL;
1461 ds_pool_ci.maxSets = 1;
1462 ds_pool_ci.poolSizeCount = 1;
1463 ds_pool_ci.pPoolSizes = &ds_type_count;
1464
1465 VkDescriptorPool ds_pool;
1466 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL,
1467 &ds_pool);
1468 ASSERT_VK_SUCCESS(err);
1469
1470 VkDescriptorSetLayoutBinding dsl_binding = {};
1471 dsl_binding.binding = 0;
1472 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1473 dsl_binding.descriptorCount = 1;
1474 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1475 dsl_binding.pImmutableSamplers = NULL;
1476
1477 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1478 ds_layout_ci.sType =
1479 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1480 ds_layout_ci.pNext = NULL;
1481 ds_layout_ci.bindingCount = 1;
1482 ds_layout_ci.pBindings = &dsl_binding;
1483 VkDescriptorSetLayout ds_layout;
1484 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
1485 NULL, &ds_layout);
1486 ASSERT_VK_SUCCESS(err);
1487
1488 VkDescriptorSet descriptor_set;
1489 VkDescriptorSetAllocateInfo alloc_info = {};
1490 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1491 alloc_info.descriptorSetCount = 1;
1492 alloc_info.descriptorPool = ds_pool;
1493 alloc_info.pSetLayouts = &ds_layout;
1494 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1495 &descriptor_set);
1496 ASSERT_VK_SUCCESS(err);
1497
1498 VkDescriptorImageInfo image_info = {};
1499 image_info.imageView = view;
1500 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
1501
1502 VkWriteDescriptorSet descriptor_write;
1503 memset(&descriptor_write, 0, sizeof(descriptor_write));
1504 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1505 descriptor_write.dstSet = descriptor_set;
1506 descriptor_write.dstBinding = 0;
1507 descriptor_write.descriptorCount = 1;
1508 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1509 descriptor_write.pImageInfo = &image_info;
1510
1511 // Set pBufferInfo and pTexelBufferView to invalid values, which should
1512 // be
1513 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
1514 // This will most likely produce a crash if the parameter_validation
1515 // layer
1516 // does not correctly ignore pBufferInfo.
1517 descriptor_write.pBufferInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001518 reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001519 descriptor_write.pTexelBufferView =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001520 reinterpret_cast<const VkBufferView *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001521
1522 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
1523 NULL);
1524
1525 m_errorMonitor->VerifyNotFound();
1526
Dustin Graves40f35822016-06-23 11:12:53 -06001527 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1528 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1529 vkDestroyImageView(m_device->device(), view, NULL);
1530 vkDestroyImage(m_device->device(), image, NULL);
1531 vkFreeMemory(m_device->device(), image_memory, NULL);
1532 }
1533
1534 // Buffer Case
1535 {
1536 m_errorMonitor->ExpectSuccess();
1537
1538 VkBuffer buffer;
1539 uint32_t queue_family_index = 0;
1540 VkBufferCreateInfo buffer_create_info = {};
1541 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1542 buffer_create_info.size = 1024;
1543 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1544 buffer_create_info.queueFamilyIndexCount = 1;
1545 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1546
1547 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info,
1548 NULL, &buffer);
1549 ASSERT_VK_SUCCESS(err);
1550
1551 VkMemoryRequirements memory_reqs;
1552 VkDeviceMemory buffer_memory;
1553 bool pass;
1554 VkMemoryAllocateInfo memory_info = {};
1555 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1556 memory_info.pNext = NULL;
1557 memory_info.allocationSize = 0;
1558 memory_info.memoryTypeIndex = 0;
1559
1560 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1561 memory_info.allocationSize = memory_reqs.size;
1562 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1563 &memory_info, 0);
1564 ASSERT_TRUE(pass);
1565
1566 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1567 &buffer_memory);
1568 ASSERT_VK_SUCCESS(err);
1569 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1570 ASSERT_VK_SUCCESS(err);
1571
1572 VkDescriptorPoolSize ds_type_count = {};
1573 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1574 ds_type_count.descriptorCount = 1;
1575
1576 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1577 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1578 ds_pool_ci.pNext = NULL;
1579 ds_pool_ci.maxSets = 1;
1580 ds_pool_ci.poolSizeCount = 1;
1581 ds_pool_ci.pPoolSizes = &ds_type_count;
1582
1583 VkDescriptorPool ds_pool;
1584 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL,
1585 &ds_pool);
1586 ASSERT_VK_SUCCESS(err);
1587
1588 VkDescriptorSetLayoutBinding dsl_binding = {};
1589 dsl_binding.binding = 0;
1590 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1591 dsl_binding.descriptorCount = 1;
1592 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1593 dsl_binding.pImmutableSamplers = NULL;
1594
1595 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1596 ds_layout_ci.sType =
1597 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1598 ds_layout_ci.pNext = NULL;
1599 ds_layout_ci.bindingCount = 1;
1600 ds_layout_ci.pBindings = &dsl_binding;
1601 VkDescriptorSetLayout ds_layout;
1602 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
1603 NULL, &ds_layout);
1604 ASSERT_VK_SUCCESS(err);
1605
1606 VkDescriptorSet descriptor_set;
1607 VkDescriptorSetAllocateInfo alloc_info = {};
1608 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1609 alloc_info.descriptorSetCount = 1;
1610 alloc_info.descriptorPool = ds_pool;
1611 alloc_info.pSetLayouts = &ds_layout;
1612 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1613 &descriptor_set);
1614 ASSERT_VK_SUCCESS(err);
1615
1616 VkDescriptorBufferInfo buffer_info = {};
1617 buffer_info.buffer = buffer;
1618 buffer_info.offset = 0;
1619 buffer_info.range = 1024;
1620
1621 VkWriteDescriptorSet descriptor_write;
1622 memset(&descriptor_write, 0, sizeof(descriptor_write));
1623 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1624 descriptor_write.dstSet = descriptor_set;
1625 descriptor_write.dstBinding = 0;
1626 descriptor_write.descriptorCount = 1;
1627 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1628 descriptor_write.pBufferInfo = &buffer_info;
1629
1630 // Set pImageInfo and pTexelBufferView to invalid values, which should
1631 // be
1632 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
1633 // This will most likely produce a crash if the parameter_validation
1634 // layer
1635 // does not correctly ignore pImageInfo.
1636 descriptor_write.pImageInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001637 reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001638 descriptor_write.pTexelBufferView =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001639 reinterpret_cast<const VkBufferView *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001640
1641 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
1642 NULL);
1643
1644 m_errorMonitor->VerifyNotFound();
1645
1646 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
1647 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1648 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1649 vkDestroyBuffer(m_device->device(), buffer, NULL);
1650 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1651 }
1652
1653 // Texel Buffer Case
1654 {
1655 m_errorMonitor->ExpectSuccess();
1656
1657 VkBuffer buffer;
1658 uint32_t queue_family_index = 0;
1659 VkBufferCreateInfo buffer_create_info = {};
1660 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1661 buffer_create_info.size = 1024;
1662 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
1663 buffer_create_info.queueFamilyIndexCount = 1;
1664 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1665
1666 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info,
1667 NULL, &buffer);
1668 ASSERT_VK_SUCCESS(err);
1669
1670 VkMemoryRequirements memory_reqs;
1671 VkDeviceMemory buffer_memory;
1672 bool pass;
1673 VkMemoryAllocateInfo memory_info = {};
1674 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1675 memory_info.pNext = NULL;
1676 memory_info.allocationSize = 0;
1677 memory_info.memoryTypeIndex = 0;
1678
1679 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1680 memory_info.allocationSize = memory_reqs.size;
1681 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1682 &memory_info, 0);
1683 ASSERT_TRUE(pass);
1684
1685 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1686 &buffer_memory);
1687 ASSERT_VK_SUCCESS(err);
1688 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1689 ASSERT_VK_SUCCESS(err);
1690
1691 VkBufferViewCreateInfo buff_view_ci = {};
1692 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
1693 buff_view_ci.buffer = buffer;
1694 buff_view_ci.format = VK_FORMAT_R8_UNORM;
1695 buff_view_ci.range = VK_WHOLE_SIZE;
1696 VkBufferView buffer_view;
1697 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL,
1698 &buffer_view);
1699
1700 VkDescriptorPoolSize ds_type_count = {};
1701 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1702 ds_type_count.descriptorCount = 1;
1703
1704 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1705 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1706 ds_pool_ci.pNext = NULL;
1707 ds_pool_ci.maxSets = 1;
1708 ds_pool_ci.poolSizeCount = 1;
1709 ds_pool_ci.pPoolSizes = &ds_type_count;
1710
1711 VkDescriptorPool ds_pool;
1712 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL,
1713 &ds_pool);
1714 ASSERT_VK_SUCCESS(err);
1715
1716 VkDescriptorSetLayoutBinding dsl_binding = {};
1717 dsl_binding.binding = 0;
1718 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1719 dsl_binding.descriptorCount = 1;
1720 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1721 dsl_binding.pImmutableSamplers = NULL;
1722
1723 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1724 ds_layout_ci.sType =
1725 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1726 ds_layout_ci.pNext = NULL;
1727 ds_layout_ci.bindingCount = 1;
1728 ds_layout_ci.pBindings = &dsl_binding;
1729 VkDescriptorSetLayout ds_layout;
1730 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
1731 NULL, &ds_layout);
1732 ASSERT_VK_SUCCESS(err);
1733
1734 VkDescriptorSet descriptor_set;
1735 VkDescriptorSetAllocateInfo alloc_info = {};
1736 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1737 alloc_info.descriptorSetCount = 1;
1738 alloc_info.descriptorPool = ds_pool;
1739 alloc_info.pSetLayouts = &ds_layout;
1740 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1741 &descriptor_set);
1742 ASSERT_VK_SUCCESS(err);
1743
1744 VkWriteDescriptorSet descriptor_write;
1745 memset(&descriptor_write, 0, sizeof(descriptor_write));
1746 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1747 descriptor_write.dstSet = descriptor_set;
1748 descriptor_write.dstBinding = 0;
1749 descriptor_write.descriptorCount = 1;
1750 descriptor_write.descriptorType =
1751 VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1752 descriptor_write.pTexelBufferView = &buffer_view;
1753
1754 // Set pImageInfo and pBufferInfo to invalid values, which should be
1755 // ignored for descriptorType ==
1756 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
1757 // This will most likely produce a crash if the parameter_validation
1758 // layer
1759 // does not correctly ignore pImageInfo and pBufferInfo.
1760 descriptor_write.pImageInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001761 reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001762 descriptor_write.pBufferInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001763 reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001764
1765 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
1766 NULL);
1767
1768 m_errorMonitor->VerifyNotFound();
1769
1770 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
1771 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1772 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1773 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
1774 vkDestroyBuffer(m_device->device(), buffer, NULL);
1775 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1776 }
1777}
Dustin Gravesffa90fa2016-05-06 11:20:38 -06001778#endif // PARAMETER_VALIDATION_TESTS
1779
Tobin Ehlis0788f522015-05-26 16:11:58 -06001780#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001781#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001782TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001783{
1784 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001785 VkFenceCreateInfo fenceInfo = {};
1786 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1787 fenceInfo.pNext = NULL;
1788 fenceInfo.flags = 0;
1789
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001790 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001791
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001792 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001793
1794 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1795 vk_testing::Buffer buffer;
1796 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001797
Tony Barbourfe3351b2015-07-28 10:17:20 -06001798 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001799 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001800 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001801
1802 testFence.init(*m_device, fenceInfo);
1803
1804 // Bypass framework since it does the waits automatically
1805 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001806 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001807 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1808 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001809 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001810 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001811 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001812 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001813 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001814 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001815 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001816
1817 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001818 ASSERT_VK_SUCCESS( err );
1819
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001820 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001821 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001822
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001823 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001824}
1825
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001826TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001827{
1828 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001829 VkFenceCreateInfo fenceInfo = {};
1830 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1831 fenceInfo.pNext = NULL;
1832 fenceInfo.flags = 0;
1833
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001834 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001835
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001836 ASSERT_NO_FATAL_FAILURE(InitState());
1837 ASSERT_NO_FATAL_FAILURE(InitViewport());
1838 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1839
Tony Barbourfe3351b2015-07-28 10:17:20 -06001840 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001841 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001842 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001843
1844 testFence.init(*m_device, fenceInfo);
1845
1846 // Bypass framework since it does the waits automatically
1847 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001848 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001849 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1850 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001851 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001852 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001853 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001854 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001855 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001856 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001857 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001858
1859 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001860 ASSERT_VK_SUCCESS( err );
1861
Jon Ashburnf19916e2016-01-11 13:12:43 -07001862 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001863 VkCommandBufferBeginInfo info = {};
1864 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1865 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001866 info.renderPass = VK_NULL_HANDLE;
1867 info.subpass = 0;
1868 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001869 info.occlusionQueryEnable = VK_FALSE;
1870 info.queryFlags = 0;
1871 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001872
1873 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001874 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001875
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001876 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001877}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001878#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001879
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001880// This is a positive test. No failures are expected.
1881TEST_F(VkLayerTest, TestAliasedMemoryTracking) {
1882 VkResult err;
1883 bool pass;
1884
1885 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
1886 "the buffer, create an image, and bind the same memory to "
1887 "it");
1888
1889 m_errorMonitor->ExpectSuccess();
1890
1891 ASSERT_NO_FATAL_FAILURE(InitState());
1892
1893 VkBuffer buffer;
1894 VkImage image;
1895 VkDeviceMemory mem;
1896 VkMemoryRequirements mem_reqs;
1897
1898 VkBufferCreateInfo buf_info = {};
1899 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1900 buf_info.pNext = NULL;
1901 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1902 buf_info.size = 256;
1903 buf_info.queueFamilyIndexCount = 0;
1904 buf_info.pQueueFamilyIndices = NULL;
1905 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1906 buf_info.flags = 0;
1907 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1908 ASSERT_VK_SUCCESS(err);
1909
1910 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1911
1912 VkMemoryAllocateInfo alloc_info = {};
1913 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1914 alloc_info.pNext = NULL;
1915 alloc_info.memoryTypeIndex = 0;
1916
1917 // Ensure memory is big enough for both bindings
1918 alloc_info.allocationSize = 0x10000;
1919
1920 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
1921 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1922 if (!pass) {
1923 vkDestroyBuffer(m_device->device(), buffer, NULL);
1924 return;
1925 }
1926
1927 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1928 ASSERT_VK_SUCCESS(err);
1929
1930 uint8_t *pData;
1931 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
1932 (void **)&pData);
1933 ASSERT_VK_SUCCESS(err);
1934
Mark Lobodzinski2abefa92016-05-05 11:45:57 -06001935 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001936
1937 vkUnmapMemory(m_device->device(), mem);
1938
1939 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1940 ASSERT_VK_SUCCESS(err);
1941
1942 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
1943 // memory. In fact, it was never used by the GPU.
1944 // Just be be sure, wait for idle.
1945 vkDestroyBuffer(m_device->device(), buffer, NULL);
1946 vkDeviceWaitIdle(m_device->device());
1947
1948 VkImageCreateInfo image_create_info = {};
1949 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1950 image_create_info.pNext = NULL;
1951 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1952 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1953 image_create_info.extent.width = 64;
1954 image_create_info.extent.height = 64;
1955 image_create_info.extent.depth = 1;
1956 image_create_info.mipLevels = 1;
1957 image_create_info.arrayLayers = 1;
1958 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1959 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1960 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1961 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1962 image_create_info.queueFamilyIndexCount = 0;
1963 image_create_info.pQueueFamilyIndices = NULL;
1964 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1965 image_create_info.flags = 0;
1966
1967 VkMemoryAllocateInfo mem_alloc = {};
1968 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1969 mem_alloc.pNext = NULL;
1970 mem_alloc.allocationSize = 0;
1971 mem_alloc.memoryTypeIndex = 0;
1972
1973 /* Create a mappable image. It will be the texture if linear images are ok
1974 * to be textures or it will be the staging image if they are not.
1975 */
1976 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1977 ASSERT_VK_SUCCESS(err);
1978
1979 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
1980
1981 mem_alloc.allocationSize = mem_reqs.size;
1982
1983 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
1984 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1985 if (!pass) {
1986 vkDestroyImage(m_device->device(), image, NULL);
1987 return;
1988 }
1989
Tobin Ehlis077ded32016-05-12 17:39:13 -06001990 // VALIDATION FAILURE:
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001991 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1992 ASSERT_VK_SUCCESS(err);
1993
1994 m_errorMonitor->VerifyNotFound();
1995
Tony Barbourdf4c0042016-06-01 15:55:43 -06001996 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001997 vkDestroyBuffer(m_device->device(), buffer, NULL);
1998 vkDestroyImage(m_device->device(), image, NULL);
1999}
2000
Tobin Ehlisf11be982016-05-11 13:52:53 -06002001TEST_F(VkLayerTest, InvalidMemoryAliasing) {
2002 TEST_DESCRIPTION("Create a buffer and image, allocate memory, and bind the "
2003 "buffer and image to memory such that they will alias.");
2004 VkResult err;
2005 bool pass;
2006 ASSERT_NO_FATAL_FAILURE(InitState());
2007
Tobin Ehlis077ded32016-05-12 17:39:13 -06002008 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06002009 VkImage image;
2010 VkDeviceMemory mem; // buffer will be bound first
2011 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06002012 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Tobin Ehlisf11be982016-05-11 13:52:53 -06002013
2014 VkBufferCreateInfo buf_info = {};
2015 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2016 buf_info.pNext = NULL;
2017 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2018 buf_info.size = 256;
2019 buf_info.queueFamilyIndexCount = 0;
2020 buf_info.pQueueFamilyIndices = NULL;
2021 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2022 buf_info.flags = 0;
2023 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
2024 ASSERT_VK_SUCCESS(err);
2025
Tobin Ehlis077ded32016-05-12 17:39:13 -06002026 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002027
2028 VkImageCreateInfo image_create_info = {};
2029 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2030 image_create_info.pNext = NULL;
2031 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2032 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
2033 image_create_info.extent.width = 64;
2034 image_create_info.extent.height = 64;
2035 image_create_info.extent.depth = 1;
2036 image_create_info.mipLevels = 1;
2037 image_create_info.arrayLayers = 1;
2038 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2039 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2040 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
2041 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
2042 image_create_info.queueFamilyIndexCount = 0;
2043 image_create_info.pQueueFamilyIndices = NULL;
2044 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2045 image_create_info.flags = 0;
2046
Tobin Ehlisf11be982016-05-11 13:52:53 -06002047 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2048 ASSERT_VK_SUCCESS(err);
2049
Tobin Ehlis077ded32016-05-12 17:39:13 -06002050 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
2051
2052 VkMemoryAllocateInfo alloc_info = {};
2053 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2054 alloc_info.pNext = NULL;
2055 alloc_info.memoryTypeIndex = 0;
2056 // Ensure memory is big enough for both bindings
2057 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
2058 pass = m_device->phy().set_memory_type(
2059 buff_mem_reqs.memoryTypeBits | img_mem_reqs.memoryTypeBits, &alloc_info,
2060 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002061 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06002062 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002063 vkDestroyImage(m_device->device(), image, NULL);
2064 return;
2065 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06002066 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
2067 ASSERT_VK_SUCCESS(err);
2068 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
2069 ASSERT_VK_SUCCESS(err);
2070
Tobin Ehlisf11be982016-05-11 13:52:53 -06002071 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2072 " is aliased with buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06002073 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06002074 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2075 m_errorMonitor->VerifyFound();
2076
2077 // Now correctly bind image to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06002078 // aliasing buffer2
2079 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
2080 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002081 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
2082 ASSERT_VK_SUCCESS(err);
2083 err = vkBindImageMemory(m_device->device(), image, mem_img, 0);
2084 ASSERT_VK_SUCCESS(err);
2085 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2086 " is aliased with image 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06002087 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002088 m_errorMonitor->VerifyFound();
2089
2090 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06002091 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002092 vkDestroyImage(m_device->device(), image, NULL);
2093 vkFreeMemory(m_device->device(), mem, NULL);
2094 vkFreeMemory(m_device->device(), mem_img, NULL);
2095}
2096
Tobin Ehlis35372522016-05-12 08:32:31 -06002097TEST_F(VkLayerTest, InvalidMemoryMapping) {
2098 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
2099 VkResult err;
2100 bool pass;
2101 ASSERT_NO_FATAL_FAILURE(InitState());
2102
2103 VkBuffer buffer;
2104 VkDeviceMemory mem;
2105 VkMemoryRequirements mem_reqs;
2106
2107 VkBufferCreateInfo buf_info = {};
2108 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2109 buf_info.pNext = NULL;
2110 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2111 buf_info.size = 256;
2112 buf_info.queueFamilyIndexCount = 0;
2113 buf_info.pQueueFamilyIndices = NULL;
2114 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2115 buf_info.flags = 0;
2116 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
2117 ASSERT_VK_SUCCESS(err);
2118
2119 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
2120 VkMemoryAllocateInfo alloc_info = {};
2121 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2122 alloc_info.pNext = NULL;
2123 alloc_info.memoryTypeIndex = 0;
2124
2125 // Ensure memory is big enough for both bindings
2126 static const VkDeviceSize allocation_size = 0x10000;
2127 alloc_info.allocationSize = allocation_size;
2128 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
2129 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
2130 if (!pass) {
2131 vkDestroyBuffer(m_device->device(), buffer, NULL);
2132 return;
2133 }
2134 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
2135 ASSERT_VK_SUCCESS(err);
2136
2137 uint8_t *pData;
2138 // Attempt to map memory size 0 is invalid
2139 m_errorMonitor->SetDesiredFailureMsg(
2140 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2141 "VkMapMemory: Attempting to map memory range of size zero");
2142 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
2143 m_errorMonitor->VerifyFound();
2144 // Map memory twice
2145 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
2146 (void **)&pData);
2147 ASSERT_VK_SUCCESS(err);
2148 m_errorMonitor->SetDesiredFailureMsg(
2149 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2150 "VkMapMemory: Attempting to map memory on an already-mapped object ");
2151 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
2152 (void **)&pData);
2153 m_errorMonitor->VerifyFound();
2154
2155 // Unmap the memory to avoid re-map error
2156 vkUnmapMemory(m_device->device(), mem);
2157 // overstep allocation with VK_WHOLE_SIZE
2158 m_errorMonitor->SetDesiredFailureMsg(
2159 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2160 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
2161 err = vkMapMemory(m_device->device(), mem, allocation_size + 1,
2162 VK_WHOLE_SIZE, 0, (void **)&pData);
2163 m_errorMonitor->VerifyFound();
2164 // overstep allocation w/o VK_WHOLE_SIZE
2165 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2166 " oversteps total array size 0x");
2167 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0,
2168 (void **)&pData);
2169 m_errorMonitor->VerifyFound();
2170 // Now error due to unmapping memory that's not mapped
2171 m_errorMonitor->SetDesiredFailureMsg(
2172 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2173 "Unmapping Memory without memory being mapped: ");
2174 vkUnmapMemory(m_device->device(), mem);
2175 m_errorMonitor->VerifyFound();
2176 // Now map memory and cause errors due to flushing invalid ranges
2177 err = vkMapMemory(m_device->device(), mem, 16, VK_WHOLE_SIZE, 0,
2178 (void **)&pData);
2179 ASSERT_VK_SUCCESS(err);
2180 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12002181 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06002182 mmr.memory = mem;
2183 mmr.offset = 15; // Error b/c offset less than offset of mapped mem
2184 m_errorMonitor->SetDesiredFailureMsg(
2185 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2186 ") is less than Memory Object's offset (");
2187 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2188 m_errorMonitor->VerifyFound();
2189 // Now flush range that oversteps mapped range
2190 vkUnmapMemory(m_device->device(), mem);
2191 err = vkMapMemory(m_device->device(), mem, 0, 256, 0, (void **)&pData);
2192 ASSERT_VK_SUCCESS(err);
2193 mmr.offset = 16;
2194 mmr.size = 256; // flushing bounds (272) exceed mapped bounds (256)
2195 m_errorMonitor->SetDesiredFailureMsg(
2196 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2197 ") exceeds the Memory Object's upper-bound (");
2198 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2199 m_errorMonitor->VerifyFound();
2200
2201 pass =
2202 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
2203 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
2204 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
2205 if (!pass) {
2206 vkFreeMemory(m_device->device(), mem, NULL);
2207 vkDestroyBuffer(m_device->device(), buffer, NULL);
2208 return;
2209 }
2210 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
2211 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
2212
2213 vkDestroyBuffer(m_device->device(), buffer, NULL);
2214 vkFreeMemory(m_device->device(), mem, NULL);
2215}
2216
Ian Elliott1c32c772016-04-28 14:47:13 -06002217TEST_F(VkLayerTest, EnableWsiBeforeUse) {
2218 VkResult err;
2219 bool pass;
2220
Ian Elliott489eec02016-05-05 14:12:44 -06002221// FIXME: After we turn on this code for non-Linux platforms, uncomment the
2222// following declaration (which is temporarily being moved below):
2223// VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002224 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2225 VkSwapchainCreateInfoKHR swapchain_create_info = {};
2226 uint32_t swapchain_image_count = 0;
2227// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
2228 uint32_t image_index = 0;
2229// VkPresentInfoKHR present_info = {};
2230
2231 ASSERT_NO_FATAL_FAILURE(InitState());
2232
Ian Elliott3f06ce52016-04-29 14:46:21 -06002233#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
2234#if defined(VK_USE_PLATFORM_ANDROID_KHR)
2235 // Use the functions from the VK_KHR_android_surface extension without
2236 // enabling that extension:
2237
2238 // Create a surface:
2239 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002240 m_errorMonitor->SetDesiredFailureMsg(
2241 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2242 "extension was not enabled for this");
2243 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
2244 &surface);
2245 pass = (err != VK_SUCCESS);
2246 ASSERT_TRUE(pass);
2247 m_errorMonitor->VerifyFound();
2248#endif // VK_USE_PLATFORM_ANDROID_KHR
2249
2250
2251#if defined(VK_USE_PLATFORM_MIR_KHR)
2252 // Use the functions from the VK_KHR_mir_surface extension without enabling
2253 // that extension:
2254
2255 // Create a surface:
2256 VkMirSurfaceCreateInfoKHR mir_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002257 m_errorMonitor->SetDesiredFailureMsg(
2258 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2259 "extension was not enabled for this");
2260 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
2261 pass = (err != VK_SUCCESS);
2262 ASSERT_TRUE(pass);
2263 m_errorMonitor->VerifyFound();
2264
2265 // Tell whether an mir_connection supports presentation:
2266 MirConnection *mir_connection = NULL;
2267 m_errorMonitor->SetDesiredFailureMsg(
2268 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2269 "extension was not enabled for this");
2270 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
2271 visual_id);
2272 m_errorMonitor->VerifyFound();
2273#endif // VK_USE_PLATFORM_MIR_KHR
2274
2275
2276#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
2277 // Use the functions from the VK_KHR_wayland_surface extension without
2278 // enabling that extension:
2279
2280 // Create a surface:
2281 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002282 m_errorMonitor->SetDesiredFailureMsg(
2283 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2284 "extension was not enabled for this");
2285 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
2286 &surface);
2287 pass = (err != VK_SUCCESS);
2288 ASSERT_TRUE(pass);
2289 m_errorMonitor->VerifyFound();
2290
2291 // Tell whether an wayland_display supports presentation:
2292 struct wl_display wayland_display = {};
2293 m_errorMonitor->SetDesiredFailureMsg(
2294 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2295 "extension was not enabled for this");
2296 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
2297 &wayland_display);
2298 m_errorMonitor->VerifyFound();
2299#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -06002300#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06002301
2302
2303#if defined(VK_USE_PLATFORM_WIN32_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06002304// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2305// TO NON-LINUX PLATFORMS:
2306VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06002307 // Use the functions from the VK_KHR_win32_surface extension without
2308 // enabling that extension:
2309
2310 // Create a surface:
2311 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002312 m_errorMonitor->SetDesiredFailureMsg(
2313 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2314 "extension was not enabled for this");
2315 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
2316 &surface);
2317 pass = (err != VK_SUCCESS);
2318 ASSERT_TRUE(pass);
2319 m_errorMonitor->VerifyFound();
2320
2321 // Tell whether win32 supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06002322 m_errorMonitor->SetDesiredFailureMsg(
2323 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2324 "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06002325 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06002326 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002327// Set this (for now, until all platforms are supported and tested):
2328#define NEED_TO_TEST_THIS_ON_PLATFORM
2329#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06002330
2331
Ian Elliott1c32c772016-04-28 14:47:13 -06002332#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06002333// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2334// TO NON-LINUX PLATFORMS:
2335VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002336 // Use the functions from the VK_KHR_xcb_surface extension without enabling
2337 // that extension:
2338
2339 // Create a surface:
2340 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06002341 m_errorMonitor->SetDesiredFailureMsg(
2342 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2343 "extension was not enabled for this");
2344 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2345 pass = (err != VK_SUCCESS);
2346 ASSERT_TRUE(pass);
2347 m_errorMonitor->VerifyFound();
2348
2349 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06002350 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06002351 xcb_visualid_t visual_id = 0;
2352 m_errorMonitor->SetDesiredFailureMsg(
2353 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2354 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06002355 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -06002356 visual_id);
2357 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002358// Set this (for now, until all platforms are supported and tested):
2359#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002360#endif // VK_USE_PLATFORM_XCB_KHR
2361
2362
Ian Elliott12630812016-04-29 14:35:43 -06002363#if defined(VK_USE_PLATFORM_XLIB_KHR)
2364 // Use the functions from the VK_KHR_xlib_surface extension without enabling
2365 // that extension:
2366
2367 // Create a surface:
2368 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
Ian Elliott12630812016-04-29 14:35:43 -06002369 m_errorMonitor->SetDesiredFailureMsg(
2370 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2371 "extension was not enabled for this");
2372 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
2373 pass = (err != VK_SUCCESS);
2374 ASSERT_TRUE(pass);
2375 m_errorMonitor->VerifyFound();
2376
2377 // Tell whether an Xlib VisualID supports presentation:
2378 Display *dpy = NULL;
2379 VisualID visual = 0;
2380 m_errorMonitor->SetDesiredFailureMsg(
2381 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2382 "extension was not enabled for this");
2383 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
2384 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002385// Set this (for now, until all platforms are supported and tested):
2386#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06002387#endif // VK_USE_PLATFORM_XLIB_KHR
2388
2389
Ian Elliott1c32c772016-04-28 14:47:13 -06002390 // Use the functions from the VK_KHR_surface extension without enabling
2391 // that extension:
2392
Ian Elliott489eec02016-05-05 14:12:44 -06002393#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002394 // Destroy a surface:
2395 m_errorMonitor->SetDesiredFailureMsg(
2396 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2397 "extension was not enabled for this");
2398 vkDestroySurfaceKHR(instance(), surface, NULL);
2399 m_errorMonitor->VerifyFound();
2400
2401 // Check if surface supports presentation:
2402 VkBool32 supported = false;
2403 m_errorMonitor->SetDesiredFailureMsg(
2404 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2405 "extension was not enabled for this");
2406 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2407 pass = (err != VK_SUCCESS);
2408 ASSERT_TRUE(pass);
2409 m_errorMonitor->VerifyFound();
2410
2411 // Check surface capabilities:
2412 VkSurfaceCapabilitiesKHR capabilities = {};
2413 m_errorMonitor->SetDesiredFailureMsg(
2414 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2415 "extension was not enabled for this");
2416 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
2417 &capabilities);
2418 pass = (err != VK_SUCCESS);
2419 ASSERT_TRUE(pass);
2420 m_errorMonitor->VerifyFound();
2421
2422 // Check surface formats:
2423 uint32_t format_count = 0;
2424 VkSurfaceFormatKHR *formats = NULL;
2425 m_errorMonitor->SetDesiredFailureMsg(
2426 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2427 "extension was not enabled for this");
2428 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
2429 &format_count, formats);
2430 pass = (err != VK_SUCCESS);
2431 ASSERT_TRUE(pass);
2432 m_errorMonitor->VerifyFound();
2433
2434 // Check surface present modes:
2435 uint32_t present_mode_count = 0;
2436 VkSurfaceFormatKHR *present_modes = NULL;
2437 m_errorMonitor->SetDesiredFailureMsg(
2438 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2439 "extension was not enabled for this");
2440 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
2441 &present_mode_count, present_modes);
2442 pass = (err != VK_SUCCESS);
2443 ASSERT_TRUE(pass);
2444 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002445#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002446
2447
2448 // Use the functions from the VK_KHR_swapchain extension without enabling
2449 // that extension:
2450
2451 // Create a swapchain:
2452 m_errorMonitor->SetDesiredFailureMsg(
2453 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2454 "extension was not enabled for this");
2455 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2456 swapchain_create_info.pNext = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06002457 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
2458 NULL, &swapchain);
2459 pass = (err != VK_SUCCESS);
2460 ASSERT_TRUE(pass);
2461 m_errorMonitor->VerifyFound();
2462
2463 // Get the images from the swapchain:
2464 m_errorMonitor->SetDesiredFailureMsg(
2465 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2466 "extension was not enabled for this");
2467 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
2468 &swapchain_image_count, NULL);
2469 pass = (err != VK_SUCCESS);
2470 ASSERT_TRUE(pass);
2471 m_errorMonitor->VerifyFound();
2472
2473 // Try to acquire an image:
2474 m_errorMonitor->SetDesiredFailureMsg(
2475 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2476 "extension was not enabled for this");
2477 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
2478 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
2479 pass = (err != VK_SUCCESS);
2480 ASSERT_TRUE(pass);
2481 m_errorMonitor->VerifyFound();
2482
2483 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002484 //
2485 // NOTE: Currently can't test this because a real swapchain is needed (as
2486 // opposed to the fake one we created) in order for the layer to lookup the
2487 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06002488
2489 // Destroy the swapchain:
2490 m_errorMonitor->SetDesiredFailureMsg(
2491 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2492 "extension was not enabled for this");
2493 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
2494 m_errorMonitor->VerifyFound();
2495}
2496
Ian Elliott2c1daf52016-05-12 09:41:46 -06002497TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
Ian Elliott2c1daf52016-05-12 09:41:46 -06002498
Dustin Graves6c6d8982016-05-17 10:09:21 -06002499#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott2c1daf52016-05-12 09:41:46 -06002500 VkSurfaceKHR surface = VK_NULL_HANDLE;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002501
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002502 VkResult err;
2503 bool pass;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002504 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2505 VkSwapchainCreateInfoKHR swapchain_create_info = {};
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002506 // uint32_t swapchain_image_count = 0;
2507 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
2508 // uint32_t image_index = 0;
2509 // VkPresentInfoKHR present_info = {};
Ian Elliott2c1daf52016-05-12 09:41:46 -06002510
2511 ASSERT_NO_FATAL_FAILURE(InitState());
2512
2513 // Use the create function from one of the VK_KHR_*_surface extension in
2514 // order to create a surface, testing all known errors in the process,
2515 // before successfully creating a surface:
2516 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002517 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2518 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002519 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
2520 pass = (err != VK_SUCCESS);
2521 ASSERT_TRUE(pass);
2522 m_errorMonitor->VerifyFound();
2523
2524 // Next, try to create a surface with the wrong
2525 // VkXcbSurfaceCreateInfoKHR::sType:
2526 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
2527 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002528 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2529 "called with the wrong value for");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002530 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2531 pass = (err != VK_SUCCESS);
2532 ASSERT_TRUE(pass);
2533 m_errorMonitor->VerifyFound();
2534
Ian Elliott2c1daf52016-05-12 09:41:46 -06002535 // Create a native window, and then correctly create a surface:
2536 xcb_connection_t *connection;
2537 xcb_screen_t *screen;
2538 xcb_window_t xcb_window;
2539 xcb_intern_atom_reply_t *atom_wm_delete_window;
2540
2541 const xcb_setup_t *setup;
2542 xcb_screen_iterator_t iter;
2543 int scr;
2544 uint32_t value_mask, value_list[32];
2545 int width = 1;
2546 int height = 1;
2547
2548 connection = xcb_connect(NULL, &scr);
2549 ASSERT_TRUE(connection != NULL);
2550 setup = xcb_get_setup(connection);
2551 iter = xcb_setup_roots_iterator(setup);
2552 while (scr-- > 0)
2553 xcb_screen_next(&iter);
2554 screen = iter.data;
2555
2556 xcb_window = xcb_generate_id(connection);
2557
2558 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
2559 value_list[0] = screen->black_pixel;
2560 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE |
2561 XCB_EVENT_MASK_STRUCTURE_NOTIFY;
2562
2563 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window,
2564 screen->root, 0, 0, width, height, 0,
2565 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual,
2566 value_mask, value_list);
2567
2568 /* Magic code that will send notification when window is destroyed */
2569 xcb_intern_atom_cookie_t cookie =
2570 xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
2571 xcb_intern_atom_reply_t *reply =
2572 xcb_intern_atom_reply(connection, cookie, 0);
2573
2574 xcb_intern_atom_cookie_t cookie2 =
2575 xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002576 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002577 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window,
2578 (*reply).atom, 4, 32, 1,
2579 &(*atom_wm_delete_window).atom);
2580 free(reply);
2581
2582 xcb_map_window(connection, xcb_window);
2583
2584 // Force the x/y coordinates to 100,100 results are identical in consecutive
2585 // runs
2586 const uint32_t coords[] = {100, 100};
2587 xcb_configure_window(connection, xcb_window,
2588 XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
2589
Ian Elliott2c1daf52016-05-12 09:41:46 -06002590 // Finally, try to correctly create a surface:
2591 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
2592 xcb_create_info.pNext = NULL;
2593 xcb_create_info.flags = 0;
2594 xcb_create_info.connection = connection;
2595 xcb_create_info.window = xcb_window;
2596 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2597 pass = (err == VK_SUCCESS);
2598 ASSERT_TRUE(pass);
2599
Ian Elliott2c1daf52016-05-12 09:41:46 -06002600 // Check if surface supports presentation:
2601
2602 // 1st, do so without having queried the queue families:
2603 VkBool32 supported = false;
2604 // TODO: Get the following error to come out:
2605 m_errorMonitor->SetDesiredFailureMsg(
2606 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2607 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
2608 "function");
2609 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2610 pass = (err != VK_SUCCESS);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002611 // ASSERT_TRUE(pass);
2612 // m_errorMonitor->VerifyFound();
Ian Elliott2c1daf52016-05-12 09:41:46 -06002613
2614 // Next, query a queue family index that's too large:
2615 m_errorMonitor->SetDesiredFailureMsg(
2616 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2617 "called with a queueFamilyIndex that is too large");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002618 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface,
2619 &supported);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002620 pass = (err != VK_SUCCESS);
2621 ASSERT_TRUE(pass);
2622 m_errorMonitor->VerifyFound();
2623
2624 // Finally, do so correctly:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002625 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2626 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002627 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2628 pass = (err == VK_SUCCESS);
2629 ASSERT_TRUE(pass);
2630
Ian Elliott2c1daf52016-05-12 09:41:46 -06002631 // Before proceeding, try to create a swapchain without having called
2632 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
2633 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2634 swapchain_create_info.pNext = NULL;
2635 swapchain_create_info.flags = 0;
2636 m_errorMonitor->SetDesiredFailureMsg(
2637 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2638 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002639 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2640 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002641 pass = (err != VK_SUCCESS);
2642 ASSERT_TRUE(pass);
2643 m_errorMonitor->VerifyFound();
2644
Ian Elliott2c1daf52016-05-12 09:41:46 -06002645 // Get the surface capabilities:
2646 VkSurfaceCapabilitiesKHR surface_capabilities;
2647
2648 // Do so correctly (only error logged by this entrypoint is if the
2649 // extension isn't enabled):
2650 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
2651 &surface_capabilities);
2652 pass = (err == VK_SUCCESS);
2653 ASSERT_TRUE(pass);
2654
Ian Elliott2c1daf52016-05-12 09:41:46 -06002655 // Get the surface formats:
2656 uint32_t surface_format_count;
2657
2658 // First, try without a pointer to surface_format_count:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002659 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2660 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002661 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
2662 pass = (err == VK_SUCCESS);
2663 ASSERT_TRUE(pass);
2664 m_errorMonitor->VerifyFound();
2665
2666 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
2667 // correctly done a 1st try (to get the count):
2668 m_errorMonitor->SetDesiredFailureMsg(
2669 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2670 "but no prior positive value has been seen for");
2671 surface_format_count = 0;
2672 vkGetPhysicalDeviceSurfaceFormatsKHR(
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002673 gpu(), surface, &surface_format_count,
2674 (VkSurfaceFormatKHR *)&surface_format_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002675 pass = (err == VK_SUCCESS);
2676 ASSERT_TRUE(pass);
2677 m_errorMonitor->VerifyFound();
2678
2679 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002680 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
2681 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002682 pass = (err == VK_SUCCESS);
2683 ASSERT_TRUE(pass);
2684
2685 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002686 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(
2687 surface_format_count * sizeof(VkSurfaceFormatKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002688
2689 // Next, do a 2nd try with surface_format_count being set too high:
2690 surface_format_count += 5;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002691 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2692 "that is greater than the value");
2693 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002694 surface_formats);
2695 pass = (err == VK_SUCCESS);
2696 ASSERT_TRUE(pass);
2697 m_errorMonitor->VerifyFound();
2698
2699 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002700 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
2701 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002702 pass = (err == VK_SUCCESS);
2703 ASSERT_TRUE(pass);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002704 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002705 surface_formats);
2706 pass = (err == VK_SUCCESS);
2707 ASSERT_TRUE(pass);
2708
Ian Elliott2c1daf52016-05-12 09:41:46 -06002709 // Get the surface present modes:
2710 uint32_t surface_present_mode_count;
2711
2712 // First, try without a pointer to surface_format_count:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002713 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2714 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002715 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
2716 pass = (err == VK_SUCCESS);
2717 ASSERT_TRUE(pass);
2718 m_errorMonitor->VerifyFound();
2719
2720 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
2721 // correctly done a 1st try (to get the count):
2722 m_errorMonitor->SetDesiredFailureMsg(
2723 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2724 "but no prior positive value has been seen for");
2725 surface_present_mode_count = 0;
2726 vkGetPhysicalDeviceSurfacePresentModesKHR(
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002727 gpu(), surface, &surface_present_mode_count,
2728 (VkPresentModeKHR *)&surface_present_mode_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002729 pass = (err == VK_SUCCESS);
2730 ASSERT_TRUE(pass);
2731 m_errorMonitor->VerifyFound();
2732
2733 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002734 vkGetPhysicalDeviceSurfacePresentModesKHR(
2735 gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002736 pass = (err == VK_SUCCESS);
2737 ASSERT_TRUE(pass);
2738
2739 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002740 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(
2741 surface_present_mode_count * sizeof(VkPresentModeKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002742
2743 // Next, do a 2nd try with surface_format_count being set too high:
2744 surface_present_mode_count += 5;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002745 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2746 "that is greater than the value");
2747 vkGetPhysicalDeviceSurfacePresentModesKHR(
2748 gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002749 pass = (err == VK_SUCCESS);
2750 ASSERT_TRUE(pass);
2751 m_errorMonitor->VerifyFound();
2752
2753 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002754 vkGetPhysicalDeviceSurfacePresentModesKHR(
2755 gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002756 pass = (err == VK_SUCCESS);
2757 ASSERT_TRUE(pass);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002758 vkGetPhysicalDeviceSurfacePresentModesKHR(
2759 gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002760 pass = (err == VK_SUCCESS);
2761 ASSERT_TRUE(pass);
2762
Ian Elliott2c1daf52016-05-12 09:41:46 -06002763 // Create a swapchain:
2764
2765 // First, try without a pointer to swapchain_create_info:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002766 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2767 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002768 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
2769 pass = (err != VK_SUCCESS);
2770 ASSERT_TRUE(pass);
2771 m_errorMonitor->VerifyFound();
2772
2773 // Next, call with a non-NULL swapchain_create_info, that has the wrong
2774 // sType:
2775 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002776 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2777 "called with the wrong value for");
2778 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2779 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002780 pass = (err != VK_SUCCESS);
2781 ASSERT_TRUE(pass);
2782 m_errorMonitor->VerifyFound();
2783
2784 // Next, call with a NULL swapchain pointer:
2785 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2786 swapchain_create_info.pNext = NULL;
2787 swapchain_create_info.flags = 0;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002788 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2789 "called with NULL pointer");
2790 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2791 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002792 pass = (err != VK_SUCCESS);
2793 ASSERT_TRUE(pass);
2794 m_errorMonitor->VerifyFound();
2795
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002796 // TODO: Enhance swapchain layer so that
2797 // swapchain_create_info.queueFamilyIndexCount is checked against something?
Ian Elliott2c1daf52016-05-12 09:41:46 -06002798
2799 // Next, call with a queue family index that's too large:
2800 uint32_t queueFamilyIndex[2] = {100000, 0};
2801 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2802 swapchain_create_info.queueFamilyIndexCount = 2;
2803 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
2804 m_errorMonitor->SetDesiredFailureMsg(
2805 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2806 "called with a queueFamilyIndex that is too large");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002807 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2808 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002809 pass = (err != VK_SUCCESS);
2810 ASSERT_TRUE(pass);
2811 m_errorMonitor->VerifyFound();
2812
2813 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
2814 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2815 swapchain_create_info.queueFamilyIndexCount = 1;
2816 m_errorMonitor->SetDesiredFailureMsg(
2817 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2818 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
2819 "pCreateInfo->pQueueFamilyIndices).");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002820 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2821 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002822 pass = (err != VK_SUCCESS);
2823 ASSERT_TRUE(pass);
2824 m_errorMonitor->VerifyFound();
2825
2826 // Next, call with an invalid imageSharingMode:
2827 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
2828 swapchain_create_info.queueFamilyIndexCount = 1;
2829 m_errorMonitor->SetDesiredFailureMsg(
2830 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2831 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002832 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2833 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002834 pass = (err != VK_SUCCESS);
2835 ASSERT_TRUE(pass);
2836 m_errorMonitor->VerifyFound();
2837 // Fix for the future:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002838 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2839 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002840 swapchain_create_info.queueFamilyIndexCount = 0;
2841 queueFamilyIndex[0] = 0;
2842 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
2843
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002844 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
Ian Elliott2c1daf52016-05-12 09:41:46 -06002845 // Get the images from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002846 // Acquire an image from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002847 // Present an image to a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002848 // Destroy the swapchain:
2849
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002850 // TODOs:
2851 //
2852 // - Try destroying the device without first destroying the swapchain
2853 //
2854 // - Try destroying the device without first destroying the surface
2855 //
2856 // - Try destroying the surface without first destroying the swapchain
Ian Elliott2c1daf52016-05-12 09:41:46 -06002857
2858 // Destroy the surface:
2859 vkDestroySurfaceKHR(instance(), surface, NULL);
2860
Ian Elliott2c1daf52016-05-12 09:41:46 -06002861 // Tear down the window:
2862 xcb_destroy_window(connection, xcb_window);
2863 xcb_disconnect(connection);
2864
2865#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002866 return;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002867#endif // VK_USE_PLATFORM_XCB_KHR
2868}
2869
Karl Schultz6addd812016-02-02 17:17:23 -07002870TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
2871 VkResult err;
2872 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002873
Karl Schultz6addd812016-02-02 17:17:23 -07002874 m_errorMonitor->SetDesiredFailureMsg(
2875 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002876 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
2877
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002878 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002879
2880 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002881 VkImage image;
2882 VkDeviceMemory mem;
2883 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002884
Karl Schultz6addd812016-02-02 17:17:23 -07002885 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2886 const int32_t tex_width = 32;
2887 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002888
Tony Barboureb254902015-07-15 12:50:33 -06002889 VkImageCreateInfo image_create_info = {};
2890 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002891 image_create_info.pNext = NULL;
2892 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2893 image_create_info.format = tex_format;
2894 image_create_info.extent.width = tex_width;
2895 image_create_info.extent.height = tex_height;
2896 image_create_info.extent.depth = 1;
2897 image_create_info.mipLevels = 1;
2898 image_create_info.arrayLayers = 1;
2899 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2900 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2901 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2902 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002903
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002904 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002905 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002906 mem_alloc.pNext = NULL;
2907 mem_alloc.allocationSize = 0;
2908 // Introduce failure, do NOT set memProps to
2909 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
2910 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002911
Chia-I Wuf7458c52015-10-26 21:10:41 +08002912 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002913 ASSERT_VK_SUCCESS(err);
2914
Karl Schultz6addd812016-02-02 17:17:23 -07002915 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002916
Mark Lobodzinski23065352015-05-29 09:32:35 -05002917 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002918
Karl Schultz6addd812016-02-02 17:17:23 -07002919 pass =
2920 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
2921 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
2922 if (!pass) { // If we can't find any unmappable memory this test doesn't
2923 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002924 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002925 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002926 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002927
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002928 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002929 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002930 ASSERT_VK_SUCCESS(err);
2931
2932 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002933 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002934 ASSERT_VK_SUCCESS(err);
2935
2936 // Map memory as if to initialize the image
2937 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07002938 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
2939 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002940
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002941 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002942
Chia-I Wuf7458c52015-10-26 21:10:41 +08002943 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002944 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002945}
2946
Karl Schultz6addd812016-02-02 17:17:23 -07002947TEST_F(VkLayerTest, RebindMemory) {
2948 VkResult err;
2949 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002950
Karl Schultz6addd812016-02-02 17:17:23 -07002951 m_errorMonitor->SetDesiredFailureMsg(
2952 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002953 "which has already been bound to mem object");
2954
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002955 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002956
2957 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002958 VkImage image;
2959 VkDeviceMemory mem1;
2960 VkDeviceMemory mem2;
2961 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002962
Karl Schultz6addd812016-02-02 17:17:23 -07002963 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2964 const int32_t tex_width = 32;
2965 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002966
Tony Barboureb254902015-07-15 12:50:33 -06002967 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002968 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2969 image_create_info.pNext = NULL;
2970 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2971 image_create_info.format = tex_format;
2972 image_create_info.extent.width = tex_width;
2973 image_create_info.extent.height = tex_height;
2974 image_create_info.extent.depth = 1;
2975 image_create_info.mipLevels = 1;
2976 image_create_info.arrayLayers = 1;
2977 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2978 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2979 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2980 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002981
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002982 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002983 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2984 mem_alloc.pNext = NULL;
2985 mem_alloc.allocationSize = 0;
2986 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002987
Karl Schultz6addd812016-02-02 17:17:23 -07002988 // Introduce failure, do NOT set memProps to
2989 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002990 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002991 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002992 ASSERT_VK_SUCCESS(err);
2993
Karl Schultz6addd812016-02-02 17:17:23 -07002994 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002995
2996 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002997 pass =
2998 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002999 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003000
3001 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003002 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003003 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003004 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003005 ASSERT_VK_SUCCESS(err);
3006
3007 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06003008 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003009 ASSERT_VK_SUCCESS(err);
3010
Karl Schultz6addd812016-02-02 17:17:23 -07003011 // Introduce validation failure, try to bind a different memory object to
3012 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06003013 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003014
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003015 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003016
Chia-I Wuf7458c52015-10-26 21:10:41 +08003017 vkDestroyImage(m_device->device(), image, NULL);
3018 vkFreeMemory(m_device->device(), mem1, NULL);
3019 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003020}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05003021
Karl Schultz6addd812016-02-02 17:17:23 -07003022TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003023 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003024
Karl Schultz6addd812016-02-02 17:17:23 -07003025 m_errorMonitor->SetDesiredFailureMsg(
3026 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
3027 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06003028
3029 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06003030 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3031 fenceInfo.pNext = NULL;
3032 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06003033
Tony Barbour300a6082015-04-07 13:44:53 -06003034 ASSERT_NO_FATAL_FAILURE(InitState());
3035 ASSERT_NO_FATAL_FAILURE(InitViewport());
3036 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3037
Tony Barbourfe3351b2015-07-28 10:17:20 -06003038 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003039 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
3040 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06003041 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06003042
3043 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06003044
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003045 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08003046 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3047 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003048 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003049 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07003050 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003051 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003052 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08003053 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003054 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06003055
3056 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07003057 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06003058
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003059 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06003060}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003061// This is a positive test. We used to expect error in this case but spec now
3062// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07003063TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003064 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06003065 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06003066 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06003067 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3068 fenceInfo.pNext = NULL;
3069
Tony Barbour0b4d9562015-04-09 10:48:04 -06003070 ASSERT_NO_FATAL_FAILURE(InitState());
3071 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08003072 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003073 VkResult result = vkResetFences(m_device->device(), 1, fences);
3074 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06003075
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003076 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06003077}
Tobin Ehlis41376e12015-07-03 08:45:14 -06003078
Chris Forbese70b7d32016-06-15 15:49:12 +12003079#if 0
3080TEST_F(VkLayerTest, LongFenceChain)
3081{
3082 m_errorMonitor->ExpectSuccess();
3083
3084 ASSERT_NO_FATAL_FAILURE(InitState());
3085 VkResult err;
3086
3087 std::vector<VkFence> fences;
3088
3089 const int chainLength = 32768;
3090
3091 for (int i = 0; i < chainLength; i++) {
3092 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3093 VkFence fence;
3094 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
3095 ASSERT_VK_SUCCESS(err);
3096
3097 fences.push_back(fence);
3098
3099 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3100 0, nullptr, 0, nullptr };
3101 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
3102 ASSERT_VK_SUCCESS(err);
3103
3104 }
3105
3106 // BOOM, stack overflow.
3107 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
3108
3109 for (auto fence : fences)
3110 vkDestroyFence(m_device->device(), fence, nullptr);
3111
3112 m_errorMonitor->VerifyNotFound();
3113}
3114#endif
3115
Chris Forbes18127d12016-06-08 16:52:28 +12003116TEST_F(VkLayerTest, CommandBufferSimultaneousUseSync)
3117{
3118 m_errorMonitor->ExpectSuccess();
3119
3120 ASSERT_NO_FATAL_FAILURE(InitState());
3121 VkResult err;
3122
3123 // Record (empty!) command buffer that can be submitted multiple times
3124 // simultaneously.
3125 VkCommandBufferBeginInfo cbbi = {
3126 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
3127 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr
3128 };
3129 m_commandBuffer->BeginCommandBuffer(&cbbi);
3130 m_commandBuffer->EndCommandBuffer();
3131
3132 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3133 VkFence fence;
3134 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
3135 ASSERT_VK_SUCCESS(err);
3136
3137 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
3138 VkSemaphore s1, s2;
3139 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
3140 ASSERT_VK_SUCCESS(err);
3141 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
3142 ASSERT_VK_SUCCESS(err);
3143
3144 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
3145 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3146 1, &m_commandBuffer->handle(), 1, &s1 };
3147 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
3148 ASSERT_VK_SUCCESS(err);
3149
3150 // Submit CB again, signaling s2.
3151 si.pSignalSemaphores = &s2;
3152 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
3153 ASSERT_VK_SUCCESS(err);
3154
3155 // Wait for fence.
3156 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3157 ASSERT_VK_SUCCESS(err);
3158
3159 // CB is still in flight from second submission, but semaphore s1 is no
3160 // longer in flight. delete it.
3161 vkDestroySemaphore(m_device->device(), s1, nullptr);
3162
3163 m_errorMonitor->VerifyNotFound();
3164
3165 // Force device idle and clean up remaining objects
3166 vkDeviceWaitIdle(m_device->device());
3167 vkDestroySemaphore(m_device->device(), s2, nullptr);
3168 vkDestroyFence(m_device->device(), fence, nullptr);
3169}
3170
Chris Forbes4e44c912016-06-16 10:20:00 +12003171TEST_F(VkLayerTest, FenceCreateSignaledWaitHandling)
3172{
3173 m_errorMonitor->ExpectSuccess();
3174
3175 ASSERT_NO_FATAL_FAILURE(InitState());
3176 VkResult err;
3177
3178 // A fence created signaled
3179 VkFenceCreateInfo fci1 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT };
3180 VkFence f1;
3181 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
3182 ASSERT_VK_SUCCESS(err);
3183
3184 // A fence created not
3185 VkFenceCreateInfo fci2 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3186 VkFence f2;
3187 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
3188 ASSERT_VK_SUCCESS(err);
3189
3190 // Submit the unsignaled fence
3191 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3192 0, nullptr, 0, nullptr };
3193 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
3194
3195 // Wait on both fences, with signaled first.
3196 VkFence fences[] = { f1, f2 };
3197 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
3198
3199 // Should have both retired!
3200 vkDestroyFence(m_device->device(), f1, nullptr);
3201 vkDestroyFence(m_device->device(), f2, nullptr);
3202
3203 m_errorMonitor->VerifyNotFound();
3204}
3205
Tobin Ehlis41376e12015-07-03 08:45:14 -06003206TEST_F(VkLayerTest, InvalidUsageBits)
3207{
Tony Barbourf92621a2016-05-02 14:28:12 -06003208 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06003209 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06003210 "Initialize buffer with wrong usage then perform copy expecting errors "
3211 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003212 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003213 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06003214
3215 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06003216 VkImageObj image(m_device);
3217 // Initialize image with USAGE_INPUT_ATTACHMENT
Tobin Ehlis8b313c02016-05-25 15:01:52 -06003218 image.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06003219 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
3220 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06003221
Tony Barbourf92621a2016-05-02 14:28:12 -06003222 VkImageView dsv;
3223 VkImageViewCreateInfo dsvci = {};
3224 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3225 dsvci.image = image.handle();
3226 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3227 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
3228 dsvci.subresourceRange.layerCount = 1;
3229 dsvci.subresourceRange.baseMipLevel = 0;
3230 dsvci.subresourceRange.levelCount = 1;
3231 dsvci.subresourceRange.aspectMask =
3232 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06003233
Tony Barbourf92621a2016-05-02 14:28:12 -06003234 // Create a view with depth / stencil aspect for image with different usage
3235 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003236
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003237 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06003238
3239 // Initialize buffer with TRANSFER_DST usage
3240 vk_testing::Buffer buffer;
3241 VkMemoryPropertyFlags reqs = 0;
3242 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3243 VkBufferImageCopy region = {};
3244 region.bufferRowLength = 128;
3245 region.bufferImageHeight = 128;
3246 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3247 region.imageSubresource.layerCount = 1;
3248 region.imageExtent.height = 16;
3249 region.imageExtent.width = 16;
3250 region.imageExtent.depth = 1;
3251
3252 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3253 "Invalid usage flag for buffer ");
3254 // Buffer usage not set to TRANSFER_SRC and image usage not set to
3255 // TRANSFER_DST
3256 BeginCommandBuffer();
3257 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
3258 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
3259 1, &region);
3260 m_errorMonitor->VerifyFound();
3261
3262 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3263 "Invalid usage flag for image ");
3264 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
3265 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
3266 1, &region);
3267 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06003268}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003269#endif // MEM_TRACKER_TESTS
3270
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06003271#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003272
3273TEST_F(VkLayerTest, LeakAnObject) {
3274 VkResult err;
3275
3276 TEST_DESCRIPTION(
3277 "Create a fence and destroy its device without first destroying the fence.");
3278
3279 // Note that we have to create a new device since destroying the
3280 // framework's device causes Teardown() to fail and just calling Teardown
3281 // will destroy the errorMonitor.
3282
3283 m_errorMonitor->SetDesiredFailureMsg(
3284 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003285 "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003286
3287 ASSERT_NO_FATAL_FAILURE(InitState());
3288
3289 const std::vector<VkQueueFamilyProperties> queue_props =
3290 m_device->queue_props;
3291 std::vector<VkDeviceQueueCreateInfo> queue_info;
3292 queue_info.reserve(queue_props.size());
3293 std::vector<std::vector<float>> queue_priorities;
3294 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
3295 VkDeviceQueueCreateInfo qi = {};
3296 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
3297 qi.pNext = NULL;
3298 qi.queueFamilyIndex = i;
3299 qi.queueCount = queue_props[i].queueCount;
3300 queue_priorities.emplace_back(qi.queueCount, 0.0f);
3301 qi.pQueuePriorities = queue_priorities[i].data();
3302 queue_info.push_back(qi);
3303 }
3304
3305 std::vector<const char *> device_layer_names;
3306 std::vector<const char *> device_extension_names;
3307 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
3308 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
3309 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
3310 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003311 device_layer_names.push_back("VK_LAYER_LUNARG_image");
3312 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
3313
3314 // The sacrificial device object
3315 VkDevice testDevice;
3316 VkDeviceCreateInfo device_create_info = {};
3317 auto features = m_device->phy().features();
3318 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
3319 device_create_info.pNext = NULL;
3320 device_create_info.queueCreateInfoCount = queue_info.size();
3321 device_create_info.pQueueCreateInfos = queue_info.data();
3322 device_create_info.enabledLayerCount = device_layer_names.size();
3323 device_create_info.ppEnabledLayerNames = device_layer_names.data();
3324 device_create_info.pEnabledFeatures = &features;
3325 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
3326 ASSERT_VK_SUCCESS(err);
3327
3328 VkFence fence;
3329 VkFenceCreateInfo fence_create_info = {};
3330 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3331 fence_create_info.pNext = NULL;
3332 fence_create_info.flags = 0;
3333 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
3334 ASSERT_VK_SUCCESS(err);
3335
3336 // Induce failure by not calling vkDestroyFence
3337 vkDestroyDevice(testDevice, NULL);
3338 m_errorMonitor->VerifyFound();
3339}
3340
3341TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
3342
3343 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
3344 "attempt to delete them from another.");
3345
3346 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3347 "FreeCommandBuffers is attempting to free Command Buffer");
3348
3349 VkCommandPool command_pool_one;
3350 VkCommandPool command_pool_two;
3351
3352 VkCommandPoolCreateInfo pool_create_info{};
3353 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3354 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3355 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3356
3357 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3358 &command_pool_one);
3359
3360 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3361 &command_pool_two);
3362
3363 VkCommandBuffer command_buffer[9];
3364 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3365 command_buffer_allocate_info.sType =
3366 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3367 command_buffer_allocate_info.commandPool = command_pool_one;
3368 command_buffer_allocate_info.commandBufferCount = 9;
3369 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3370 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3371 command_buffer);
3372
3373 vkFreeCommandBuffers(m_device->device(), command_pool_two, 4,
3374 &command_buffer[3]);
3375
3376 m_errorMonitor->VerifyFound();
3377
3378 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
3379 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
3380}
3381
3382TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
3383 VkResult err;
3384
3385 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
3386 "attempt to delete them from another.");
3387
3388 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3389 "FreeDescriptorSets is attempting to free descriptorSet");
3390
3391 ASSERT_NO_FATAL_FAILURE(InitState());
3392 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3393
3394 VkDescriptorPoolSize ds_type_count = {};
3395 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
3396 ds_type_count.descriptorCount = 1;
3397
3398 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3399 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3400 ds_pool_ci.pNext = NULL;
3401 ds_pool_ci.flags = 0;
3402 ds_pool_ci.maxSets = 1;
3403 ds_pool_ci.poolSizeCount = 1;
3404 ds_pool_ci.pPoolSizes = &ds_type_count;
3405
3406 VkDescriptorPool ds_pool_one;
3407 err =
3408 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
3409 ASSERT_VK_SUCCESS(err);
3410
3411 // Create a second descriptor pool
3412 VkDescriptorPool ds_pool_two;
3413 err =
3414 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
3415 ASSERT_VK_SUCCESS(err);
3416
3417 VkDescriptorSetLayoutBinding dsl_binding = {};
3418 dsl_binding.binding = 0;
3419 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3420 dsl_binding.descriptorCount = 1;
3421 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3422 dsl_binding.pImmutableSamplers = NULL;
3423
3424 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3425 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3426 ds_layout_ci.pNext = NULL;
3427 ds_layout_ci.bindingCount = 1;
3428 ds_layout_ci.pBindings = &dsl_binding;
3429
3430 VkDescriptorSetLayout ds_layout;
3431 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3432 &ds_layout);
3433 ASSERT_VK_SUCCESS(err);
3434
3435 VkDescriptorSet descriptorSet;
3436 VkDescriptorSetAllocateInfo alloc_info = {};
3437 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3438 alloc_info.descriptorSetCount = 1;
3439 alloc_info.descriptorPool = ds_pool_one;
3440 alloc_info.pSetLayouts = &ds_layout;
3441 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3442 &descriptorSet);
3443 ASSERT_VK_SUCCESS(err);
3444
3445 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
3446
3447 m_errorMonitor->VerifyFound();
3448
3449 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3450 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
3451 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
3452}
3453
3454TEST_F(VkLayerTest, CreateUnknownObject) {
3455 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003456 "Invalid Image Object ");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003457
3458 TEST_DESCRIPTION(
3459 "Pass an invalid image object handle into a Vulkan API call.");
3460
3461 ASSERT_NO_FATAL_FAILURE(InitState());
3462
3463 // Pass bogus handle into GetImageMemoryRequirements
3464 VkMemoryRequirements mem_reqs;
3465 uint64_t fakeImageHandle = 0xCADECADE;
3466 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
3467
3468 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
3469
3470 m_errorMonitor->VerifyFound();
3471}
3472
Karl Schultz6addd812016-02-02 17:17:23 -07003473TEST_F(VkLayerTest, PipelineNotBound) {
3474 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003475
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003476 TEST_DESCRIPTION(
3477 "Pass in an invalid pipeline object handle into a Vulkan API call.");
3478
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003480 "Invalid Pipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003481
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003482 ASSERT_NO_FATAL_FAILURE(InitState());
3483 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003484
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003485 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003486 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3487 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003488
3489 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003490 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3491 ds_pool_ci.pNext = NULL;
3492 ds_pool_ci.maxSets = 1;
3493 ds_pool_ci.poolSizeCount = 1;
3494 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003495
3496 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003497 err =
3498 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003499 ASSERT_VK_SUCCESS(err);
3500
3501 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003502 dsl_binding.binding = 0;
3503 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3504 dsl_binding.descriptorCount = 1;
3505 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3506 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003507
3508 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003509 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3510 ds_layout_ci.pNext = NULL;
3511 ds_layout_ci.bindingCount = 1;
3512 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003513
3514 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003515 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3516 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003517 ASSERT_VK_SUCCESS(err);
3518
3519 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003520 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003521 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003522 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003523 alloc_info.descriptorPool = ds_pool;
3524 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003525 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3526 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003527 ASSERT_VK_SUCCESS(err);
3528
3529 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003530 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3531 pipeline_layout_ci.pNext = NULL;
3532 pipeline_layout_ci.setLayoutCount = 1;
3533 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003534
3535 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003536 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3537 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003538 ASSERT_VK_SUCCESS(err);
3539
Mark Youngad779052016-01-06 14:26:04 -07003540 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003541
3542 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003543 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3544 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003545
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003546 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003547
Chia-I Wuf7458c52015-10-26 21:10:41 +08003548 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3549 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3550 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003551}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003552
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003553TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
3554 VkResult err;
3555
3556 TEST_DESCRIPTION("Test validation check for an invalid memory type index "
3557 "during bind[Buffer|Image]Memory time");
3558
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003559 ASSERT_NO_FATAL_FAILURE(InitState());
3560
3561 // Create an image, allocate memory, set a bad typeIndex and then try to
3562 // bind it
3563 VkImage image;
3564 VkDeviceMemory mem;
3565 VkMemoryRequirements mem_reqs;
3566 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3567 const int32_t tex_width = 32;
3568 const int32_t tex_height = 32;
3569
3570 VkImageCreateInfo image_create_info = {};
3571 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3572 image_create_info.pNext = NULL;
3573 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3574 image_create_info.format = tex_format;
3575 image_create_info.extent.width = tex_width;
3576 image_create_info.extent.height = tex_height;
3577 image_create_info.extent.depth = 1;
3578 image_create_info.mipLevels = 1;
3579 image_create_info.arrayLayers = 1;
3580 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3581 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3582 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3583 image_create_info.flags = 0;
3584
3585 VkMemoryAllocateInfo mem_alloc = {};
3586 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3587 mem_alloc.pNext = NULL;
3588 mem_alloc.allocationSize = 0;
3589 mem_alloc.memoryTypeIndex = 0;
3590
3591 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3592 ASSERT_VK_SUCCESS(err);
3593
3594 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
3595 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003596
3597 // Introduce Failure, select invalid TypeIndex
3598 VkPhysicalDeviceMemoryProperties memory_info;
3599
3600 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
3601 unsigned int i;
3602 for (i = 0; i < memory_info.memoryTypeCount; i++) {
3603 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
3604 mem_alloc.memoryTypeIndex = i;
3605 break;
3606 }
3607 }
3608 if (i >= memory_info.memoryTypeCount) {
3609 printf("No invalid memory type index could be found; skipped.\n");
3610 vkDestroyImage(m_device->device(), image, NULL);
3611 return;
3612 }
3613
3614 m_errorMonitor->SetDesiredFailureMsg(
3615 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3616 "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003617
3618 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
3619 ASSERT_VK_SUCCESS(err);
3620
3621 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3622 (void)err;
3623
3624 m_errorMonitor->VerifyFound();
3625
3626 vkDestroyImage(m_device->device(), image, NULL);
3627 vkFreeMemory(m_device->device(), mem, NULL);
3628}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003629
Karl Schultz6addd812016-02-02 17:17:23 -07003630TEST_F(VkLayerTest, BindInvalidMemory) {
3631 VkResult err;
3632 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003633
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003634 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003635 "Invalid Device Memory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003636
Tobin Ehlisec598302015-09-15 15:02:17 -06003637 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003638
3639 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07003640 VkImage image;
3641 VkDeviceMemory mem;
3642 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003643
Karl Schultz6addd812016-02-02 17:17:23 -07003644 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3645 const int32_t tex_width = 32;
3646 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003647
3648 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003649 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3650 image_create_info.pNext = NULL;
3651 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3652 image_create_info.format = tex_format;
3653 image_create_info.extent.width = tex_width;
3654 image_create_info.extent.height = tex_height;
3655 image_create_info.extent.depth = 1;
3656 image_create_info.mipLevels = 1;
3657 image_create_info.arrayLayers = 1;
3658 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3659 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3660 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3661 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003662
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003663 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003664 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3665 mem_alloc.pNext = NULL;
3666 mem_alloc.allocationSize = 0;
3667 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003668
Chia-I Wuf7458c52015-10-26 21:10:41 +08003669 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003670 ASSERT_VK_SUCCESS(err);
3671
Karl Schultz6addd812016-02-02 17:17:23 -07003672 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003673
3674 mem_alloc.allocationSize = mem_reqs.size;
3675
Karl Schultz6addd812016-02-02 17:17:23 -07003676 pass =
3677 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003678 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003679
3680 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003681 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003682 ASSERT_VK_SUCCESS(err);
3683
3684 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003685 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003686
3687 // Try to bind free memory that has been freed
3688 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3689 // This may very well return an error.
3690 (void)err;
3691
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003692 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003693
Chia-I Wuf7458c52015-10-26 21:10:41 +08003694 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003695}
3696
Karl Schultz6addd812016-02-02 17:17:23 -07003697TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
3698 VkResult err;
3699 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003700
Karl Schultz6addd812016-02-02 17:17:23 -07003701 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06003702 "Invalid Image Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003703
Tobin Ehlisec598302015-09-15 15:02:17 -06003704 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003705
Karl Schultz6addd812016-02-02 17:17:23 -07003706 // Create an image object, allocate memory, destroy the object and then try
3707 // to bind it
3708 VkImage image;
3709 VkDeviceMemory mem;
3710 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003711
Karl Schultz6addd812016-02-02 17:17:23 -07003712 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3713 const int32_t tex_width = 32;
3714 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003715
3716 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003717 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3718 image_create_info.pNext = NULL;
3719 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3720 image_create_info.format = tex_format;
3721 image_create_info.extent.width = tex_width;
3722 image_create_info.extent.height = tex_height;
3723 image_create_info.extent.depth = 1;
3724 image_create_info.mipLevels = 1;
3725 image_create_info.arrayLayers = 1;
3726 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3727 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3728 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3729 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003730
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003731 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003732 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3733 mem_alloc.pNext = NULL;
3734 mem_alloc.allocationSize = 0;
3735 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003736
Chia-I Wuf7458c52015-10-26 21:10:41 +08003737 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003738 ASSERT_VK_SUCCESS(err);
3739
Karl Schultz6addd812016-02-02 17:17:23 -07003740 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003741
3742 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003743 pass =
3744 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003745 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003746
3747 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003748 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003749 ASSERT_VK_SUCCESS(err);
3750
3751 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003752 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003753 ASSERT_VK_SUCCESS(err);
3754
3755 // Now Try to bind memory to this destroyed object
3756 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3757 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07003758 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06003759
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003760 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003761
Chia-I Wuf7458c52015-10-26 21:10:41 +08003762 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003763}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003764
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003765#endif // OBJ_TRACKER_TESTS
3766
Tobin Ehlis0788f522015-05-26 16:11:58 -06003767#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06003768
Chris Forbes48a53902016-06-30 11:46:27 +12003769TEST_F(VkLayerTest, RenderPassInitialLayoutUndefined) {
3770 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass with an attachment's "
3771 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
3772 "the command buffer has prior knowledge of that "
3773 "attachment's layout.");
3774
3775 m_errorMonitor->ExpectSuccess();
3776
3777 ASSERT_NO_FATAL_FAILURE(InitState());
3778
3779 // A renderpass with one color attachment.
3780 VkAttachmentDescription attachment = {
3781 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3782 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3783 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3784 VK_IMAGE_LAYOUT_UNDEFINED,
3785 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3786 };
3787
3788 VkAttachmentReference att_ref = {
3789 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3790 };
3791
3792 VkSubpassDescription subpass = {
3793 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3794 1, &att_ref, nullptr, nullptr, 0, nullptr
3795 };
3796
3797 VkRenderPassCreateInfo rpci = {
3798 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3799 0, 1, &attachment, 1, &subpass, 0, nullptr
3800 };
3801
3802 VkRenderPass rp;
3803 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3804 ASSERT_VK_SUCCESS(err);
3805
3806 // A compatible framebuffer.
3807 VkImageObj image(m_device);
3808 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3809 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3810 VK_IMAGE_TILING_OPTIMAL, 0);
3811 ASSERT_TRUE(image.initialized());
3812
3813 VkImageViewCreateInfo ivci = {
3814 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3815 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3816 {
3817 VK_COMPONENT_SWIZZLE_IDENTITY,
3818 VK_COMPONENT_SWIZZLE_IDENTITY,
3819 VK_COMPONENT_SWIZZLE_IDENTITY,
3820 VK_COMPONENT_SWIZZLE_IDENTITY
3821 },
3822 {
3823 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3824 },
3825 };
3826 VkImageView view;
3827 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3828 ASSERT_VK_SUCCESS(err);
3829
3830 VkFramebufferCreateInfo fci = {
3831 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3832 0, rp, 1, &view,
3833 32, 32, 1
3834 };
3835 VkFramebuffer fb;
3836 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3837 ASSERT_VK_SUCCESS(err);
3838
3839 // Record a single command buffer which uses this renderpass twice. The
3840 // bug is triggered at the beginning of the second renderpass, when the
3841 // command buffer already has a layout recorded for the attachment.
3842 VkRenderPassBeginInfo rpbi = {
3843 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06003844 rp, fb, { { 0, 0 } , { 32, 32 } },
Chris Forbes48a53902016-06-30 11:46:27 +12003845 0, nullptr
3846 };
3847 BeginCommandBuffer();
3848 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3849 VK_SUBPASS_CONTENTS_INLINE);
3850 vkCmdEndRenderPass(m_commandBuffer->handle());
3851 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3852 VK_SUBPASS_CONTENTS_INLINE);
3853
3854 m_errorMonitor->VerifyNotFound();
3855
3856 vkCmdEndRenderPass(m_commandBuffer->handle());
3857 EndCommandBuffer();
3858
3859 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3860 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3861 vkDestroyImageView(m_device->device(), view, nullptr);
3862}
3863
Chris Forbes51bf7c92016-06-30 15:22:08 +12003864TEST_F(VkLayerTest, RenderPassSubpassZeroTransitionsApplied) {
3865 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass applies the layout "
3866 "transitions for the first subpass");
3867
3868 m_errorMonitor->ExpectSuccess();
3869
3870 ASSERT_NO_FATAL_FAILURE(InitState());
3871
3872 // A renderpass with one color attachment.
3873 VkAttachmentDescription attachment = {
3874 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3875 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3876 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3877 VK_IMAGE_LAYOUT_UNDEFINED,
3878 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3879 };
3880
3881 VkAttachmentReference att_ref = {
3882 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3883 };
3884
3885 VkSubpassDescription subpass = {
3886 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3887 1, &att_ref, nullptr, nullptr, 0, nullptr
3888 };
3889
3890 VkSubpassDependency dep = {
Chris Forbescb4c7ad2016-07-06 10:28:18 +12003891 0, 0, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3892 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Chris Forbes51bf7c92016-06-30 15:22:08 +12003893 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3894 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3895 VK_DEPENDENCY_BY_REGION_BIT
3896 };
3897
3898 VkRenderPassCreateInfo rpci = {
3899 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3900 0, 1, &attachment, 1, &subpass, 1, &dep
3901 };
3902
3903 VkResult err;
3904 VkRenderPass rp;
3905 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3906 ASSERT_VK_SUCCESS(err);
3907
3908 // A compatible framebuffer.
3909 VkImageObj image(m_device);
3910 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3911 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3912 VK_IMAGE_TILING_OPTIMAL, 0);
3913 ASSERT_TRUE(image.initialized());
3914
3915 VkImageViewCreateInfo ivci = {
3916 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3917 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3918 {
3919 VK_COMPONENT_SWIZZLE_IDENTITY,
3920 VK_COMPONENT_SWIZZLE_IDENTITY,
3921 VK_COMPONENT_SWIZZLE_IDENTITY,
3922 VK_COMPONENT_SWIZZLE_IDENTITY
3923 },
3924 {
3925 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3926 },
3927 };
3928 VkImageView view;
3929 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3930 ASSERT_VK_SUCCESS(err);
3931
3932 VkFramebufferCreateInfo fci = {
3933 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3934 0, rp, 1, &view,
3935 32, 32, 1
3936 };
3937 VkFramebuffer fb;
3938 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3939 ASSERT_VK_SUCCESS(err);
3940
3941 // Record a single command buffer which issues a pipeline barrier w/
3942 // image memory barrier for the attachment. This detects the previously
3943 // missing tracking of the subpass layout by throwing a validation error
3944 // if it doesn't occur.
3945 VkRenderPassBeginInfo rpbi = {
3946 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06003947 rp, fb, { { 0, 0 }, { 32, 32 } },
Chris Forbes51bf7c92016-06-30 15:22:08 +12003948 0, nullptr
3949 };
3950 BeginCommandBuffer();
3951 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3952 VK_SUBPASS_CONTENTS_INLINE);
3953
3954 VkImageMemoryBarrier imb = {
3955 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, nullptr,
3956 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3957 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3958 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3959 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3960 VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
3961 image.handle(),
3962 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
3963 };
3964 vkCmdPipelineBarrier(m_commandBuffer->handle(),
Chris Forbescb4c7ad2016-07-06 10:28:18 +12003965 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3966 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Chris Forbes51bf7c92016-06-30 15:22:08 +12003967 VK_DEPENDENCY_BY_REGION_BIT,
3968 0, nullptr, 0, nullptr, 1, &imb);
3969
3970 vkCmdEndRenderPass(m_commandBuffer->handle());
3971 m_errorMonitor->VerifyNotFound();
3972 EndCommandBuffer();
3973
3974 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3975 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3976 vkDestroyImageView(m_device->device(), view, nullptr);
3977}
3978
Chris Forbes6b3d3f42016-06-30 16:09:47 +12003979TEST_F(VkLayerTest, RenderPassTransitionsAttachmentUnused) {
3980 TEST_DESCRIPTION("Ensure that layout transitions work correctly without "
3981 "errors, when an attachment reference is "
3982 "VK_ATTACHMENT_UNUSED");
3983
3984 m_errorMonitor->ExpectSuccess();
3985
3986 ASSERT_NO_FATAL_FAILURE(InitState());
3987
3988 // A renderpass with no attachments
3989 VkAttachmentReference att_ref = {
3990 VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3991 };
3992
3993 VkSubpassDescription subpass = {
3994 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3995 1, &att_ref, nullptr, nullptr, 0, nullptr
3996 };
3997
3998 VkRenderPassCreateInfo rpci = {
3999 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4000 0, 0, nullptr, 1, &subpass, 0, nullptr
4001 };
4002
4003 VkRenderPass rp;
4004 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4005 ASSERT_VK_SUCCESS(err);
4006
4007 // A compatible framebuffer.
4008 VkFramebufferCreateInfo fci = {
4009 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
4010 0, rp, 0, nullptr,
4011 32, 32, 1
4012 };
4013 VkFramebuffer fb;
4014 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4015 ASSERT_VK_SUCCESS(err);
4016
4017 // Record a command buffer which just begins and ends the renderpass. The
4018 // bug manifests in BeginRenderPass.
4019 VkRenderPassBeginInfo rpbi = {
4020 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06004021 rp, fb, { { 0, 0 }, { 32, 32 } },
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004022 0, nullptr
4023 };
4024 BeginCommandBuffer();
4025 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
4026 VK_SUBPASS_CONTENTS_INLINE);
4027 vkCmdEndRenderPass(m_commandBuffer->handle());
4028 m_errorMonitor->VerifyNotFound();
4029 EndCommandBuffer();
4030
4031 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4032 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4033}
4034
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004035// This is a positive test. No errors are expected.
4036TEST_F(VkLayerTest, StencilLoadOp) {
4037 TEST_DESCRIPTION("Create a stencil-only attachment with a LOAD_OP set to "
4038 "CLEAR. stencil[Load|Store]Op used to be ignored.");
4039 VkResult result = VK_SUCCESS;
4040 VkImageFormatProperties formatProps;
4041 vkGetPhysicalDeviceImageFormatProperties(
4042 gpu(), VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_TYPE_2D,
4043 VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4044 VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
4045 0, &formatProps);
4046 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
4047 return;
4048 }
4049
4050 ASSERT_NO_FATAL_FAILURE(InitState());
4051 VkFormat depth_stencil_fmt = VK_FORMAT_D24_UNORM_S8_UINT;
4052 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
4053 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4054 VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
4055 VkAttachmentDescription att = {};
4056 VkAttachmentReference ref = {};
4057 att.format = depth_stencil_fmt;
4058 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
4059 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
4060 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
4061 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
4062 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4063 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4064
4065 VkClearValue clear;
4066 clear.depthStencil.depth = 1.0;
4067 clear.depthStencil.stencil = 0;
4068 ref.attachment = 0;
4069 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4070
4071 VkSubpassDescription subpass = {};
4072 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
4073 subpass.flags = 0;
4074 subpass.inputAttachmentCount = 0;
4075 subpass.pInputAttachments = NULL;
4076 subpass.colorAttachmentCount = 0;
4077 subpass.pColorAttachments = NULL;
4078 subpass.pResolveAttachments = NULL;
4079 subpass.pDepthStencilAttachment = &ref;
4080 subpass.preserveAttachmentCount = 0;
4081 subpass.pPreserveAttachments = NULL;
4082
4083 VkRenderPass rp;
4084 VkRenderPassCreateInfo rp_info = {};
4085 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4086 rp_info.attachmentCount = 1;
4087 rp_info.pAttachments = &att;
4088 rp_info.subpassCount = 1;
4089 rp_info.pSubpasses = &subpass;
4090 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
4091 ASSERT_VK_SUCCESS(result);
4092
4093 VkImageView *depthView = m_depthStencil->BindInfo();
4094 VkFramebufferCreateInfo fb_info = {};
4095 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4096 fb_info.pNext = NULL;
4097 fb_info.renderPass = rp;
4098 fb_info.attachmentCount = 1;
4099 fb_info.pAttachments = depthView;
4100 fb_info.width = 100;
4101 fb_info.height = 100;
4102 fb_info.layers = 1;
4103 VkFramebuffer fb;
4104 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4105 ASSERT_VK_SUCCESS(result);
4106
4107
4108 VkRenderPassBeginInfo rpbinfo = {};
4109 rpbinfo.clearValueCount = 1;
4110 rpbinfo.pClearValues = &clear;
4111 rpbinfo.pNext = NULL;
4112 rpbinfo.renderPass = rp;
4113 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4114 rpbinfo.renderArea.extent.width = 100;
4115 rpbinfo.renderArea.extent.height = 100;
4116 rpbinfo.renderArea.offset.x = 0;
4117 rpbinfo.renderArea.offset.y = 0;
4118 rpbinfo.framebuffer = fb;
4119
4120 VkFence fence = {};
4121 VkFenceCreateInfo fence_ci = {};
4122 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4123 fence_ci.pNext = nullptr;
4124 fence_ci.flags = 0;
4125 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
4126 ASSERT_VK_SUCCESS(result);
4127
4128
4129 m_commandBuffer->BeginCommandBuffer();
4130 m_commandBuffer->BeginRenderPass(rpbinfo);
4131 m_commandBuffer->EndRenderPass();
4132 m_commandBuffer->EndCommandBuffer();
4133 m_commandBuffer->QueueCommandBuffer(fence);
4134
4135 VkImageObj destImage(m_device);
4136 destImage.init(100, 100, depth_stencil_fmt,
4137 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4138 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4139 VK_IMAGE_TILING_OPTIMAL, 0);
4140 VkImageMemoryBarrier barrier = {};
4141 VkImageSubresourceRange range;
4142 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
4143 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
4144 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4145 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT |
4146 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
4147 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4148 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
4149 barrier.image = m_depthStencil->handle();
4150 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4151 range.baseMipLevel = 0;
4152 range.levelCount = 1;
4153 range.baseArrayLayer = 0;
4154 range.layerCount = 1;
4155 barrier.subresourceRange = range;
4156 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
4157 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
4158 cmdbuf.BeginCommandBuffer();
4159 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4160 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
4161 nullptr, 1, &barrier);
4162 barrier.srcAccessMask = 0;
4163 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4164 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
4165 barrier.image = destImage.handle();
4166 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
4167 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4168 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4169 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
4170 nullptr, 1, &barrier);
4171 VkImageCopy cregion;
4172 cregion.srcSubresource.aspectMask =
4173 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4174 cregion.srcSubresource.mipLevel = 0;
4175 cregion.srcSubresource.baseArrayLayer = 0;
4176 cregion.srcSubresource.layerCount = 1;
4177 cregion.srcOffset.x = 0;
4178 cregion.srcOffset.y = 0;
4179 cregion.srcOffset.z = 0;
4180 cregion.dstSubresource.aspectMask =
4181 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4182 cregion.dstSubresource.mipLevel = 0;
4183 cregion.dstSubresource.baseArrayLayer = 0;
4184 cregion.dstSubresource.layerCount = 1;
4185 cregion.dstOffset.x = 0;
4186 cregion.dstOffset.y = 0;
4187 cregion.dstOffset.z = 0;
4188 cregion.extent.width = 100;
4189 cregion.extent.height = 100;
4190 cregion.extent.depth = 1;
4191 cmdbuf.CopyImage(m_depthStencil->handle(),
4192 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
4193 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
4194 cmdbuf.EndCommandBuffer();
4195
4196 VkSubmitInfo submit_info;
4197 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4198 submit_info.pNext = NULL;
4199 submit_info.waitSemaphoreCount = 0;
4200 submit_info.pWaitSemaphores = NULL;
4201 submit_info.pWaitDstStageMask = NULL;
4202 submit_info.commandBufferCount = 1;
4203 submit_info.pCommandBuffers = &cmdbuf.handle();
4204 submit_info.signalSemaphoreCount = 0;
4205 submit_info.pSignalSemaphores = NULL;
4206
4207 m_errorMonitor->ExpectSuccess();
4208 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4209 m_errorMonitor->VerifyNotFound();
4210
Mark Lobodzinskid0440da2016-06-17 15:10:03 -06004211 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004212 vkDestroyFence(m_device->device(), fence, nullptr);
4213 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4214 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4215}
4216
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004217TEST_F(VkLayerTest, UnusedPreserveAttachment) {
4218 TEST_DESCRIPTION("Create a framebuffer where a subpass has a preserve "
4219 "attachment reference of VK_ATTACHMENT_UNUSED");
4220
4221 ASSERT_NO_FATAL_FAILURE(InitState());
4222 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4223
4224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4225 "must not be VK_ATTACHMENT_UNUSED");
4226
4227 VkAttachmentReference color_attach = {};
4228 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4229 color_attach.attachment = 0;
4230 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
4231 VkSubpassDescription subpass = {};
4232 subpass.colorAttachmentCount = 1;
4233 subpass.pColorAttachments = &color_attach;
4234 subpass.preserveAttachmentCount = 1;
4235 subpass.pPreserveAttachments = &preserve_attachment;
4236
4237 VkRenderPassCreateInfo rpci = {};
4238 rpci.subpassCount = 1;
4239 rpci.pSubpasses = &subpass;
4240 rpci.attachmentCount = 1;
4241 VkAttachmentDescription attach_desc = {};
4242 attach_desc.format = VK_FORMAT_UNDEFINED;
4243 rpci.pAttachments = &attach_desc;
4244 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4245 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004246 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004247
4248 m_errorMonitor->VerifyFound();
4249
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004250 if (result == VK_SUCCESS) {
4251 vkDestroyRenderPass(m_device->device(), rp, NULL);
4252 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004253}
4254
Chris Forbesc5389742016-06-29 11:49:23 +12004255TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004256 TEST_DESCRIPTION("Ensure that CreateRenderPass produces a validation error "
4257 "when the source of a subpass multisample resolve "
4258 "does not have multiple samples.");
4259
Chris Forbesc5389742016-06-29 11:49:23 +12004260 ASSERT_NO_FATAL_FAILURE(InitState());
4261
4262 m_errorMonitor->SetDesiredFailureMsg(
4263 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbes6655bb32016-07-01 18:27:30 +12004264 "Subpass 0 requests multisample resolve from attachment 0 which has "
4265 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12004266
4267 VkAttachmentDescription attachments[] = {
4268 {
4269 0, VK_FORMAT_R8G8B8A8_UNORM,
4270 VK_SAMPLE_COUNT_1_BIT,
4271 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4272 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4273 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4274 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4275 },
4276 {
4277 0, VK_FORMAT_R8G8B8A8_UNORM,
4278 VK_SAMPLE_COUNT_1_BIT,
4279 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4280 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4281 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4282 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4283 },
4284 };
4285
4286 VkAttachmentReference color = {
4287 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4288 };
4289
4290 VkAttachmentReference resolve = {
4291 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4292 };
4293
4294 VkSubpassDescription subpass = {
4295 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4296 0, nullptr,
4297 1, &color,
4298 &resolve,
4299 nullptr,
4300 0, nullptr
4301 };
4302
4303 VkRenderPassCreateInfo rpci = {
4304 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4305 0, 2, attachments, 1, &subpass, 0, nullptr
4306 };
4307
4308 VkRenderPass rp;
4309 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4310
4311 m_errorMonitor->VerifyFound();
4312
4313 if (err == VK_SUCCESS)
4314 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4315}
4316
4317TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004318 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4319 "when a subpass multisample resolve operation is "
4320 "requested, and the destination of that resolve has "
4321 "multiple samples.");
4322
Chris Forbesc5389742016-06-29 11:49:23 +12004323 ASSERT_NO_FATAL_FAILURE(InitState());
4324
4325 m_errorMonitor->SetDesiredFailureMsg(
4326 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4327 "Subpass 0 requests multisample resolve into attachment 1, which "
4328 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
4329
4330 VkAttachmentDescription attachments[] = {
4331 {
4332 0, VK_FORMAT_R8G8B8A8_UNORM,
4333 VK_SAMPLE_COUNT_4_BIT,
4334 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4335 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4336 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4337 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4338 },
4339 {
4340 0, VK_FORMAT_R8G8B8A8_UNORM,
4341 VK_SAMPLE_COUNT_4_BIT,
4342 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4343 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4344 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4345 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4346 },
4347 };
4348
4349 VkAttachmentReference color = {
4350 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4351 };
4352
4353 VkAttachmentReference resolve = {
4354 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4355 };
4356
4357 VkSubpassDescription subpass = {
4358 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4359 0, nullptr,
4360 1, &color,
4361 &resolve,
4362 nullptr,
4363 0, nullptr
4364 };
4365
4366 VkRenderPassCreateInfo rpci = {
4367 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4368 0, 2, attachments, 1, &subpass, 0, nullptr
4369 };
4370
4371 VkRenderPass rp;
4372 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4373
4374 m_errorMonitor->VerifyFound();
4375
4376 if (err == VK_SUCCESS)
4377 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4378}
4379
Chris Forbes3f128ef2016-06-29 14:58:53 +12004380TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004381 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4382 "when the color and depth attachments used by a subpass "
4383 "have inconsistent sample counts");
4384
Chris Forbes3f128ef2016-06-29 14:58:53 +12004385 ASSERT_NO_FATAL_FAILURE(InitState());
4386
4387 m_errorMonitor->SetDesiredFailureMsg(
4388 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4389 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
4390
4391 VkAttachmentDescription attachments[] = {
4392 {
4393 0, VK_FORMAT_R8G8B8A8_UNORM,
4394 VK_SAMPLE_COUNT_1_BIT,
4395 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4396 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4397 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4398 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4399 },
4400 {
4401 0, VK_FORMAT_R8G8B8A8_UNORM,
4402 VK_SAMPLE_COUNT_4_BIT,
4403 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4404 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4405 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4406 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4407 },
4408 };
4409
4410 VkAttachmentReference color[] = {
4411 {
4412 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4413 },
4414 {
4415 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4416 },
4417 };
4418
4419 VkSubpassDescription subpass = {
4420 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4421 0, nullptr,
4422 2, color,
4423 nullptr,
4424 nullptr,
4425 0, nullptr
4426 };
4427
4428 VkRenderPassCreateInfo rpci = {
4429 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4430 0, 2, attachments, 1, &subpass, 0, nullptr
4431 };
4432
4433 VkRenderPass rp;
4434 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4435
4436 m_errorMonitor->VerifyFound();
4437
4438 if (err == VK_SUCCESS)
4439 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4440}
4441
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004442TEST_F(VkLayerTest, FramebufferCreateErrors) {
4443 TEST_DESCRIPTION("Hit errors when attempting to create a framebuffer :\n"
4444 " 1. Mismatch between fb & renderPass attachmentCount\n"
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004445 " 2. Use a color image as depthStencil attachment\n"
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004446 " 3. Mismatch fb & renderPass attachment formats\n"
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004447 " 4. Mismatch fb & renderPass attachment #samples\n"
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004448 " 5. FB attachment w/ non-1 mip-levels\n"
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004449 " 6. FB attachment where dimensions don't match\n"
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004450 " 7. FB attachment w/o identity swizzle\n"
4451 " 8. FB dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004452
4453 ASSERT_NO_FATAL_FAILURE(InitState());
4454 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4455
4456 m_errorMonitor->SetDesiredFailureMsg(
4457 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004458 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 "
4459 "does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004460
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004461 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004462 VkAttachmentReference attach = {};
4463 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4464 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004465 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004466 VkRenderPassCreateInfo rpci = {};
4467 rpci.subpassCount = 1;
4468 rpci.pSubpasses = &subpass;
4469 rpci.attachmentCount = 1;
4470 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004471 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004472 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004473 rpci.pAttachments = &attach_desc;
4474 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4475 VkRenderPass rp;
4476 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4477 ASSERT_VK_SUCCESS(err);
4478
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004479 VkImageView ivs[2];
4480 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
4481 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004482 VkFramebufferCreateInfo fb_info = {};
4483 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4484 fb_info.pNext = NULL;
4485 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004486 // Set mis-matching attachmentCount
4487 fb_info.attachmentCount = 2;
4488 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004489 fb_info.width = 100;
4490 fb_info.height = 100;
4491 fb_info.layers = 1;
4492
4493 VkFramebuffer fb;
4494 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4495
4496 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004497 if (err == VK_SUCCESS) {
4498 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4499 }
4500 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004501
4502 // Create a renderPass with a depth-stencil attachment created with
4503 // IMAGE_USAGE_COLOR_ATTACHMENT
4504 // Add our color attachment to pDepthStencilAttachment
4505 subpass.pDepthStencilAttachment = &attach;
4506 subpass.pColorAttachments = NULL;
4507 VkRenderPass rp_ds;
4508 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
4509 ASSERT_VK_SUCCESS(err);
4510 // Set correct attachment count, but attachment has COLOR usage bit set
4511 fb_info.attachmentCount = 1;
4512 fb_info.renderPass = rp_ds;
4513
4514 m_errorMonitor->SetDesiredFailureMsg(
4515 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4516 " conflicts with the image's IMAGE_USAGE flags ");
4517 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4518
4519 m_errorMonitor->VerifyFound();
4520 if (err == VK_SUCCESS) {
4521 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4522 }
4523 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004524
4525 // Create new renderpass with alternate attachment format from fb
4526 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
4527 subpass.pDepthStencilAttachment = NULL;
4528 subpass.pColorAttachments = &attach;
4529 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4530 ASSERT_VK_SUCCESS(err);
4531
4532 // Cause error due to mis-matched formats between rp & fb
4533 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
4534 fb_info.renderPass = rp;
4535 m_errorMonitor->SetDesiredFailureMsg(
4536 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4537 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
4538 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4539
4540 m_errorMonitor->VerifyFound();
4541 if (err == VK_SUCCESS) {
4542 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4543 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004544 vkDestroyRenderPass(m_device->device(), rp, NULL);
4545
4546 // Create new renderpass with alternate sample count from fb
4547 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
4548 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
4549 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4550 ASSERT_VK_SUCCESS(err);
4551
4552 // Cause error due to mis-matched sample count between rp & fb
4553 fb_info.renderPass = rp;
4554 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4555 " has VK_SAMPLE_COUNT_1_BIT samples "
4556 "that do not match the "
4557 "VK_SAMPLE_COUNT_4_BIT ");
4558 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4559
4560 m_errorMonitor->VerifyFound();
4561 if (err == VK_SUCCESS) {
4562 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4563 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004564
4565 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004566
4567 // Create a custom imageView with non-1 mip levels
4568 VkImageObj image(m_device);
4569 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
4570 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4571 ASSERT_TRUE(image.initialized());
4572
4573 VkImageView view;
4574 VkImageViewCreateInfo ivci = {};
4575 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4576 ivci.image = image.handle();
4577 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4578 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4579 ivci.subresourceRange.layerCount = 1;
4580 ivci.subresourceRange.baseMipLevel = 0;
4581 // Set level count 2 (only 1 is allowed for FB attachment)
4582 ivci.subresourceRange.levelCount = 2;
4583 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4584 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4585 ASSERT_VK_SUCCESS(err);
4586 // Re-create renderpass to have matching sample count
4587 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4588 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4589 ASSERT_VK_SUCCESS(err);
4590
4591 fb_info.renderPass = rp;
4592 fb_info.pAttachments = &view;
4593 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4594 " has mip levelCount of 2 but only ");
4595 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4596
4597 m_errorMonitor->VerifyFound();
4598 if (err == VK_SUCCESS) {
4599 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4600 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004601 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004602 // Update view to original color buffer and grow FB dimensions too big
4603 fb_info.pAttachments = ivs;
4604 fb_info.height = 1024;
4605 fb_info.width = 1024;
4606 fb_info.layers = 2;
4607 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4608 " Attachment dimensions must be at "
4609 "least as large. ");
4610 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4611
4612 m_errorMonitor->VerifyFound();
4613 if (err == VK_SUCCESS) {
4614 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4615 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004616 // Create view attachment with non-identity swizzle
4617 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4618 ivci.image = image.handle();
4619 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4620 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4621 ivci.subresourceRange.layerCount = 1;
4622 ivci.subresourceRange.baseMipLevel = 0;
4623 ivci.subresourceRange.levelCount = 1;
4624 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4625 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4626 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4627 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4628 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4629 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4630 ASSERT_VK_SUCCESS(err);
4631
4632 fb_info.pAttachments = &view;
4633 fb_info.height = 100;
4634 fb_info.width = 100;
4635 fb_info.layers = 1;
4636 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4637 " has non-identy swizzle. All "
4638 "framebuffer attachments must have "
4639 "been created with the identity "
4640 "swizzle. ");
4641 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4642
4643 m_errorMonitor->VerifyFound();
4644 if (err == VK_SUCCESS) {
4645 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4646 }
4647 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004648 // Request fb that exceeds max dimensions
4649 // reset attachment to color attachment
4650 fb_info.pAttachments = ivs;
4651 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
4652 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
4653 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
4654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4655 " Requested VkFramebufferCreateInfo "
4656 "dimensions exceed physical device "
4657 "limits. ");
4658 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4659
4660 m_errorMonitor->VerifyFound();
4661 if (err == VK_SUCCESS) {
4662 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4663 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004664
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004665 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004666}
4667
Mark Lobodzinskic808d442016-04-14 10:57:23 -06004668// This is a positive test. No errors should be generated.
Michael Lentine860b0fe2016-05-20 10:14:00 -05004669TEST_F(VkLayerTest, WaitEventThenSet) {
4670 TEST_DESCRIPTION(
4671 "Wait on a event then set it after the wait has been submitted.");
4672
Michael Lentine860b0fe2016-05-20 10:14:00 -05004673 m_errorMonitor->ExpectSuccess();
4674
4675 VkEvent event;
4676 VkEventCreateInfo event_create_info{};
4677 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4678 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
4679
4680 VkCommandPool command_pool;
4681 VkCommandPoolCreateInfo pool_create_info{};
4682 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4683 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4684 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4685 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4686 &command_pool);
4687
4688 VkCommandBuffer command_buffer;
4689 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4690 command_buffer_allocate_info.sType =
4691 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4692 command_buffer_allocate_info.commandPool = command_pool;
4693 command_buffer_allocate_info.commandBufferCount = 1;
4694 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4695 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4696 &command_buffer);
4697
4698 VkQueue queue = VK_NULL_HANDLE;
4699 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06004700 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05004701
4702 {
4703 VkCommandBufferBeginInfo begin_info{};
4704 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4705 vkBeginCommandBuffer(command_buffer, &begin_info);
4706
4707 vkCmdWaitEvents(command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT,
4708 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
4709 nullptr, 0, nullptr);
4710 vkCmdResetEvent(command_buffer, event,
4711 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
4712 vkEndCommandBuffer(command_buffer);
4713 }
4714 {
4715 VkSubmitInfo submit_info{};
4716 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4717 submit_info.commandBufferCount = 1;
4718 submit_info.pCommandBuffers = &command_buffer;
4719 submit_info.signalSemaphoreCount = 0;
4720 submit_info.pSignalSemaphores = nullptr;
4721 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4722 }
4723 { vkSetEvent(m_device->device(), event); }
4724
4725 vkQueueWaitIdle(queue);
4726
4727 vkDestroyEvent(m_device->device(), event, nullptr);
4728 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
4729 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
4730
4731 m_errorMonitor->VerifyNotFound();
4732}
Michael Lentine5627e692016-05-20 17:45:02 -05004733// This is a positive test. No errors should be generated.
4734TEST_F(VkLayerTest, QueryAndCopyMultipleCommandBuffers) {
4735 TEST_DESCRIPTION(
4736 "Issue a query and copy from it on a second command buffer.");
4737
4738 if ((m_device->queue_props.empty()) ||
4739 (m_device->queue_props[0].queueCount < 2))
4740 return;
4741
4742 m_errorMonitor->ExpectSuccess();
4743
4744 VkQueryPool query_pool;
4745 VkQueryPoolCreateInfo query_pool_create_info{};
4746 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
4747 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
4748 query_pool_create_info.queryCount = 1;
4749 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr,
4750 &query_pool);
4751
4752 VkCommandPool command_pool;
4753 VkCommandPoolCreateInfo pool_create_info{};
4754 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4755 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4756 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4757 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4758 &command_pool);
4759
4760 VkCommandBuffer command_buffer[2];
4761 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4762 command_buffer_allocate_info.sType =
4763 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4764 command_buffer_allocate_info.commandPool = command_pool;
4765 command_buffer_allocate_info.commandBufferCount = 2;
4766 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4767 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4768 command_buffer);
4769
4770 VkQueue queue = VK_NULL_HANDLE;
4771 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
4772 1, &queue);
4773
4774 uint32_t qfi = 0;
4775 VkBufferCreateInfo buff_create_info = {};
4776 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4777 buff_create_info.size = 1024;
4778 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
4779 buff_create_info.queueFamilyIndexCount = 1;
4780 buff_create_info.pQueueFamilyIndices = &qfi;
4781
4782 VkResult err;
4783 VkBuffer buffer;
4784 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
4785 ASSERT_VK_SUCCESS(err);
4786 VkMemoryAllocateInfo mem_alloc = {};
4787 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4788 mem_alloc.pNext = NULL;
4789 mem_alloc.allocationSize = 1024;
4790 mem_alloc.memoryTypeIndex = 0;
4791
4792 VkMemoryRequirements memReqs;
4793 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
4794 bool pass =
4795 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
4796 if (!pass) {
4797 vkDestroyBuffer(m_device->device(), buffer, NULL);
4798 return;
4799 }
4800
4801 VkDeviceMemory mem;
4802 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
4803 ASSERT_VK_SUCCESS(err);
4804 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4805 ASSERT_VK_SUCCESS(err);
4806
4807 {
4808 VkCommandBufferBeginInfo begin_info{};
4809 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4810 vkBeginCommandBuffer(command_buffer[0], &begin_info);
4811
4812 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
4813 vkCmdWriteTimestamp(command_buffer[0],
4814 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
4815
4816 vkEndCommandBuffer(command_buffer[0]);
4817
4818 vkBeginCommandBuffer(command_buffer[1], &begin_info);
4819
4820 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer,
4821 0, 0, 0);
4822
4823 vkEndCommandBuffer(command_buffer[1]);
4824 }
4825 {
4826 VkSubmitInfo submit_info{};
4827 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4828 submit_info.commandBufferCount = 2;
4829 submit_info.pCommandBuffers = command_buffer;
4830 submit_info.signalSemaphoreCount = 0;
4831 submit_info.pSignalSemaphores = nullptr;
4832 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4833 }
4834
4835 vkQueueWaitIdle(queue);
4836
4837 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
4838 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
4839 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06004840 vkDestroyBuffer(m_device->device(), buffer, NULL);
4841 vkFreeMemory(m_device->device(), mem, NULL);
Michael Lentine5627e692016-05-20 17:45:02 -05004842
4843 m_errorMonitor->VerifyNotFound();
4844}
Michael Lentine860b0fe2016-05-20 10:14:00 -05004845
4846TEST_F(VkLayerTest, ResetEventThenSet) {
4847 TEST_DESCRIPTION(
4848 "Reset an event then set it after the reset has been submitted.");
4849
Michael Lentine860b0fe2016-05-20 10:14:00 -05004850 m_errorMonitor->ExpectSuccess();
4851
4852 VkEvent event;
4853 VkEventCreateInfo event_create_info{};
4854 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4855 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
4856
4857 VkCommandPool command_pool;
4858 VkCommandPoolCreateInfo pool_create_info{};
4859 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4860 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4861 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4862 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4863 &command_pool);
4864
4865 VkCommandBuffer command_buffer;
4866 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4867 command_buffer_allocate_info.sType =
4868 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4869 command_buffer_allocate_info.commandPool = command_pool;
4870 command_buffer_allocate_info.commandBufferCount = 1;
4871 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4872 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4873 &command_buffer);
4874
4875 VkQueue queue = VK_NULL_HANDLE;
4876 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06004877 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05004878
4879 {
4880 VkCommandBufferBeginInfo begin_info{};
4881 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4882 vkBeginCommandBuffer(command_buffer, &begin_info);
4883
4884 vkCmdResetEvent(command_buffer, event,
4885 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
4886 vkCmdWaitEvents(command_buffer, 1, &event,
4887 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4888 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
4889 nullptr, 0, nullptr);
4890 vkEndCommandBuffer(command_buffer);
4891 }
4892 {
4893 VkSubmitInfo submit_info{};
4894 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4895 submit_info.commandBufferCount = 1;
4896 submit_info.pCommandBuffers = &command_buffer;
4897 submit_info.signalSemaphoreCount = 0;
4898 submit_info.pSignalSemaphores = nullptr;
4899 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4900 }
4901 {
4902 m_errorMonitor->SetDesiredFailureMsg(
4903 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkSetEvent() on event "
4904 "0x1 that is already in use by a "
4905 "command buffer.");
4906 vkSetEvent(m_device->device(), event);
4907 m_errorMonitor->VerifyFound();
4908 }
4909
4910 vkQueueWaitIdle(queue);
4911
4912 vkDestroyEvent(m_device->device(), event, nullptr);
4913 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
4914 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
4915}
4916
4917// This is a positive test. No errors should be generated.
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004918TEST_F(VkLayerTest, TwoFencesThreeFrames) {
4919 TEST_DESCRIPTION("Two command buffers with two separate fences are each "
4920 "run through a Submit & WaitForFences cycle 3 times. This "
4921 "previously revealed a bug so running this positive test "
4922 "to prevent a regression.");
4923 m_errorMonitor->ExpectSuccess();
4924
4925 ASSERT_NO_FATAL_FAILURE(InitState());
4926 VkQueue queue = VK_NULL_HANDLE;
4927 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
4928 0, &queue);
4929
4930 static const uint32_t NUM_OBJECTS = 2;
4931 static const uint32_t NUM_FRAMES = 3;
4932 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
4933 VkFence fences[NUM_OBJECTS] = {};
4934
4935 VkCommandPool cmd_pool;
4936 VkCommandPoolCreateInfo cmd_pool_ci = {};
4937 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4938 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
4939 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4940 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci,
4941 nullptr, &cmd_pool);
4942 ASSERT_VK_SUCCESS(err);
4943
4944 VkCommandBufferAllocateInfo cmd_buf_info = {};
4945 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4946 cmd_buf_info.commandPool = cmd_pool;
4947 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4948 cmd_buf_info.commandBufferCount = 1;
4949
4950 VkFenceCreateInfo fence_ci = {};
4951 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4952 fence_ci.pNext = nullptr;
4953 fence_ci.flags = 0;
4954
4955 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
4956 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info,
4957 &cmd_buffers[i]);
4958 ASSERT_VK_SUCCESS(err);
4959 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
4960 ASSERT_VK_SUCCESS(err);
4961 }
4962
4963 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
Tobin Ehlisf9025162016-05-26 06:55:21 -06004964 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
4965 // Create empty cmd buffer
4966 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
4967 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004968
Tobin Ehlisf9025162016-05-26 06:55:21 -06004969 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
4970 ASSERT_VK_SUCCESS(err);
4971 err = vkEndCommandBuffer(cmd_buffers[obj]);
4972 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004973
Tobin Ehlisf9025162016-05-26 06:55:21 -06004974 VkSubmitInfo submit_info = {};
4975 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4976 submit_info.commandBufferCount = 1;
4977 submit_info.pCommandBuffers = &cmd_buffers[obj];
4978 // Submit cmd buffer and wait for fence
4979 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
4980 ASSERT_VK_SUCCESS(err);
4981 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE,
4982 UINT64_MAX);
4983 ASSERT_VK_SUCCESS(err);
4984 err = vkResetFences(m_device->device(), 1, &fences[obj]);
4985 ASSERT_VK_SUCCESS(err);
4986 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004987 }
4988 m_errorMonitor->VerifyNotFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06004989 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
4990 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
4991 vkDestroyFence(m_device->device(), fences[i], nullptr);
4992 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004993}
4994// This is a positive test. No errors should be generated.
Mark Lobodzinskic808d442016-04-14 10:57:23 -06004995TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
4996
4997 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
4998 "submitted on separate queues followed by a QueueWaitIdle.");
4999
Dustin Graves48458142016-04-29 16:11:55 -06005000 if ((m_device->queue_props.empty()) ||
5001 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005002 return;
5003
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005004 m_errorMonitor->ExpectSuccess();
5005
5006 VkSemaphore semaphore;
5007 VkSemaphoreCreateInfo semaphore_create_info{};
5008 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5009 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5010 &semaphore);
5011
5012 VkCommandPool command_pool;
5013 VkCommandPoolCreateInfo pool_create_info{};
5014 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5015 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5016 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5017 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5018 &command_pool);
5019
5020 VkCommandBuffer command_buffer[2];
5021 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5022 command_buffer_allocate_info.sType =
5023 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5024 command_buffer_allocate_info.commandPool = command_pool;
5025 command_buffer_allocate_info.commandBufferCount = 2;
5026 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5027 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5028 command_buffer);
5029
5030 VkQueue queue = VK_NULL_HANDLE;
5031 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5032 1, &queue);
5033
5034 {
5035 VkCommandBufferBeginInfo begin_info{};
5036 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5037 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5038
5039 vkCmdPipelineBarrier(command_buffer[0],
5040 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5041 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5042 0, nullptr, 0, nullptr);
5043
5044 VkViewport viewport{};
5045 viewport.maxDepth = 1.0f;
5046 viewport.minDepth = 0.0f;
5047 viewport.width = 512;
5048 viewport.height = 512;
5049 viewport.x = 0;
5050 viewport.y = 0;
5051 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5052 vkEndCommandBuffer(command_buffer[0]);
5053 }
5054 {
5055 VkCommandBufferBeginInfo begin_info{};
5056 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5057 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5058
5059 VkViewport viewport{};
5060 viewport.maxDepth = 1.0f;
5061 viewport.minDepth = 0.0f;
5062 viewport.width = 512;
5063 viewport.height = 512;
5064 viewport.x = 0;
5065 viewport.y = 0;
5066 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5067 vkEndCommandBuffer(command_buffer[1]);
5068 }
5069 {
5070 VkSubmitInfo submit_info{};
5071 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5072 submit_info.commandBufferCount = 1;
5073 submit_info.pCommandBuffers = &command_buffer[0];
5074 submit_info.signalSemaphoreCount = 1;
5075 submit_info.pSignalSemaphores = &semaphore;
5076 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5077 }
5078 {
5079 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5080 VkSubmitInfo submit_info{};
5081 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5082 submit_info.commandBufferCount = 1;
5083 submit_info.pCommandBuffers = &command_buffer[1];
5084 submit_info.waitSemaphoreCount = 1;
5085 submit_info.pWaitSemaphores = &semaphore;
5086 submit_info.pWaitDstStageMask = flags;
5087 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5088 }
5089
5090 vkQueueWaitIdle(m_device->m_queue);
5091
5092 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5093 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5094 &command_buffer[0]);
5095 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5096
5097 m_errorMonitor->VerifyNotFound();
5098}
5099
5100// This is a positive test. No errors should be generated.
5101TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
5102
5103 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5104 "submitted on separate queues, the second having a fence"
5105 "followed by a QueueWaitIdle.");
5106
Dustin Graves48458142016-04-29 16:11:55 -06005107 if ((m_device->queue_props.empty()) ||
5108 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005109 return;
5110
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005111 m_errorMonitor->ExpectSuccess();
5112
5113 VkFence fence;
5114 VkFenceCreateInfo fence_create_info{};
5115 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5116 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5117
5118 VkSemaphore semaphore;
5119 VkSemaphoreCreateInfo semaphore_create_info{};
5120 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5121 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5122 &semaphore);
5123
5124 VkCommandPool command_pool;
5125 VkCommandPoolCreateInfo pool_create_info{};
5126 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5127 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5128 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5129 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5130 &command_pool);
5131
5132 VkCommandBuffer command_buffer[2];
5133 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5134 command_buffer_allocate_info.sType =
5135 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5136 command_buffer_allocate_info.commandPool = command_pool;
5137 command_buffer_allocate_info.commandBufferCount = 2;
5138 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5139 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5140 command_buffer);
5141
5142 VkQueue queue = VK_NULL_HANDLE;
5143 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5144 1, &queue);
5145
5146 {
5147 VkCommandBufferBeginInfo begin_info{};
5148 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5149 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5150
5151 vkCmdPipelineBarrier(command_buffer[0],
5152 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5153 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5154 0, nullptr, 0, nullptr);
5155
5156 VkViewport viewport{};
5157 viewport.maxDepth = 1.0f;
5158 viewport.minDepth = 0.0f;
5159 viewport.width = 512;
5160 viewport.height = 512;
5161 viewport.x = 0;
5162 viewport.y = 0;
5163 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5164 vkEndCommandBuffer(command_buffer[0]);
5165 }
5166 {
5167 VkCommandBufferBeginInfo begin_info{};
5168 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5169 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5170
5171 VkViewport viewport{};
5172 viewport.maxDepth = 1.0f;
5173 viewport.minDepth = 0.0f;
5174 viewport.width = 512;
5175 viewport.height = 512;
5176 viewport.x = 0;
5177 viewport.y = 0;
5178 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5179 vkEndCommandBuffer(command_buffer[1]);
5180 }
5181 {
5182 VkSubmitInfo submit_info{};
5183 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5184 submit_info.commandBufferCount = 1;
5185 submit_info.pCommandBuffers = &command_buffer[0];
5186 submit_info.signalSemaphoreCount = 1;
5187 submit_info.pSignalSemaphores = &semaphore;
5188 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5189 }
5190 {
5191 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5192 VkSubmitInfo submit_info{};
5193 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5194 submit_info.commandBufferCount = 1;
5195 submit_info.pCommandBuffers = &command_buffer[1];
5196 submit_info.waitSemaphoreCount = 1;
5197 submit_info.pWaitSemaphores = &semaphore;
5198 submit_info.pWaitDstStageMask = flags;
5199 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5200 }
5201
5202 vkQueueWaitIdle(m_device->m_queue);
5203
5204 vkDestroyFence(m_device->device(), fence, nullptr);
5205 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5206 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5207 &command_buffer[0]);
5208 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5209
5210 m_errorMonitor->VerifyNotFound();
5211}
5212
5213// This is a positive test. No errors should be generated.
5214TEST_F(VkLayerTest,
5215 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
5216
5217 TEST_DESCRIPTION(
5218 "Two command buffers, each in a separate QueueSubmit call "
5219 "submitted on separate queues, the second having a fence"
5220 "followed by two consecutive WaitForFences calls on the same fence.");
5221
Dustin Graves48458142016-04-29 16:11:55 -06005222 if ((m_device->queue_props.empty()) ||
5223 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005224 return;
5225
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005226 m_errorMonitor->ExpectSuccess();
5227
5228 VkFence fence;
5229 VkFenceCreateInfo fence_create_info{};
5230 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5231 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5232
5233 VkSemaphore semaphore;
5234 VkSemaphoreCreateInfo semaphore_create_info{};
5235 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5236 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5237 &semaphore);
5238
5239 VkCommandPool command_pool;
5240 VkCommandPoolCreateInfo pool_create_info{};
5241 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5242 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5243 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5244 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5245 &command_pool);
5246
5247 VkCommandBuffer command_buffer[2];
5248 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5249 command_buffer_allocate_info.sType =
5250 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5251 command_buffer_allocate_info.commandPool = command_pool;
5252 command_buffer_allocate_info.commandBufferCount = 2;
5253 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5254 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5255 command_buffer);
5256
5257 VkQueue queue = VK_NULL_HANDLE;
5258 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5259 1, &queue);
5260
5261 {
5262 VkCommandBufferBeginInfo begin_info{};
5263 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5264 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5265
5266 vkCmdPipelineBarrier(command_buffer[0],
5267 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5268 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5269 0, nullptr, 0, nullptr);
5270
5271 VkViewport viewport{};
5272 viewport.maxDepth = 1.0f;
5273 viewport.minDepth = 0.0f;
5274 viewport.width = 512;
5275 viewport.height = 512;
5276 viewport.x = 0;
5277 viewport.y = 0;
5278 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5279 vkEndCommandBuffer(command_buffer[0]);
5280 }
5281 {
5282 VkCommandBufferBeginInfo begin_info{};
5283 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5284 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5285
5286 VkViewport viewport{};
5287 viewport.maxDepth = 1.0f;
5288 viewport.minDepth = 0.0f;
5289 viewport.width = 512;
5290 viewport.height = 512;
5291 viewport.x = 0;
5292 viewport.y = 0;
5293 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5294 vkEndCommandBuffer(command_buffer[1]);
5295 }
5296 {
5297 VkSubmitInfo submit_info{};
5298 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5299 submit_info.commandBufferCount = 1;
5300 submit_info.pCommandBuffers = &command_buffer[0];
5301 submit_info.signalSemaphoreCount = 1;
5302 submit_info.pSignalSemaphores = &semaphore;
5303 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5304 }
5305 {
5306 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5307 VkSubmitInfo submit_info{};
5308 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5309 submit_info.commandBufferCount = 1;
5310 submit_info.pCommandBuffers = &command_buffer[1];
5311 submit_info.waitSemaphoreCount = 1;
5312 submit_info.pWaitSemaphores = &semaphore;
5313 submit_info.pWaitDstStageMask = flags;
5314 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5315 }
5316
5317 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5318 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5319
5320 vkDestroyFence(m_device->device(), fence, nullptr);
5321 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5322 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5323 &command_buffer[0]);
5324 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5325
5326 m_errorMonitor->VerifyNotFound();
5327}
5328
Chris Forbes0f8126b2016-06-20 17:48:22 +12005329#if 0
5330TEST_F(VkLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
5331 if ((m_device->queue_props.empty()) ||
5332 (m_device->queue_props[0].queueCount < 2)) {
5333 printf("Test requires two queues, skipping\n");
5334 return;
5335 }
5336
5337 VkResult err;
5338
5339 m_errorMonitor->ExpectSuccess();
5340
5341 VkQueue q0 = m_device->m_queue;
5342 VkQueue q1 = nullptr;
5343 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
5344 ASSERT_NE(q1, nullptr);
5345
5346 // An (empty) command buffer. We must have work in the first submission --
5347 // the layer treats unfenced work differently from fenced work.
5348 VkCommandPoolCreateInfo cpci = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0 };
5349 VkCommandPool pool;
5350 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
5351 ASSERT_VK_SUCCESS(err);
5352 VkCommandBufferAllocateInfo cbai = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr,
5353 pool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1
5354 };
5355 VkCommandBuffer cb;
5356 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
5357 ASSERT_VK_SUCCESS(err);
5358 VkCommandBufferBeginInfo cbbi = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
5359 0, nullptr
5360 };
5361 err = vkBeginCommandBuffer(cb, &cbbi);
5362 ASSERT_VK_SUCCESS(err);
5363 err = vkEndCommandBuffer(cb);
5364 ASSERT_VK_SUCCESS(err);
5365
5366 // A semaphore
5367 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
5368 VkSemaphore s;
5369 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
5370 ASSERT_VK_SUCCESS(err);
5371
5372 // First submission, to q0
5373 VkSubmitInfo s0 = {
5374 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
5375 0, nullptr, nullptr,
5376 1, &cb,
5377 1, &s
5378 };
5379
5380 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
5381 ASSERT_VK_SUCCESS(err);
5382
5383 // Second submission, to q1, waiting on s
5384 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
5385 VkSubmitInfo s1 = {
5386 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
5387 1, &s, &waitmask,
5388 0, nullptr,
5389 0, nullptr
5390 };
5391
5392 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
5393 ASSERT_VK_SUCCESS(err);
5394
5395 // Wait for q0 idle
5396 err = vkQueueWaitIdle(q0);
5397 ASSERT_VK_SUCCESS(err);
5398
5399 // Command buffer should have been completed (it was on q0); reset the pool.
5400 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
5401
5402 m_errorMonitor->VerifyNotFound();
5403
5404 // Force device completely idle and clean up resources
5405 vkDeviceWaitIdle(m_device->device());
5406 vkDestroyCommandPool(m_device->device(), pool, nullptr);
5407 vkDestroySemaphore(m_device->device(), s, nullptr);
5408}
5409#endif
5410
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005411// This is a positive test. No errors should be generated.
5412TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
5413
5414 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5415 "submitted on separate queues, the second having a fence, "
5416 "followed by a WaitForFences call.");
5417
Dustin Graves48458142016-04-29 16:11:55 -06005418 if ((m_device->queue_props.empty()) ||
5419 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005420 return;
5421
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005422 m_errorMonitor->ExpectSuccess();
5423
5424 VkFence fence;
5425 VkFenceCreateInfo fence_create_info{};
5426 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5427 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5428
5429 VkSemaphore semaphore;
5430 VkSemaphoreCreateInfo semaphore_create_info{};
5431 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5432 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5433 &semaphore);
5434
5435 VkCommandPool command_pool;
5436 VkCommandPoolCreateInfo pool_create_info{};
5437 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5438 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5439 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5440 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5441 &command_pool);
5442
5443 VkCommandBuffer command_buffer[2];
5444 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5445 command_buffer_allocate_info.sType =
5446 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5447 command_buffer_allocate_info.commandPool = command_pool;
5448 command_buffer_allocate_info.commandBufferCount = 2;
5449 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5450 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5451 command_buffer);
5452
5453 VkQueue queue = VK_NULL_HANDLE;
5454 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5455 1, &queue);
5456
5457
5458 {
5459 VkCommandBufferBeginInfo begin_info{};
5460 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5461 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5462
5463 vkCmdPipelineBarrier(command_buffer[0],
5464 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5465 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5466 0, nullptr, 0, nullptr);
5467
5468 VkViewport viewport{};
5469 viewport.maxDepth = 1.0f;
5470 viewport.minDepth = 0.0f;
5471 viewport.width = 512;
5472 viewport.height = 512;
5473 viewport.x = 0;
5474 viewport.y = 0;
5475 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5476 vkEndCommandBuffer(command_buffer[0]);
5477 }
5478 {
5479 VkCommandBufferBeginInfo begin_info{};
5480 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5481 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5482
5483 VkViewport viewport{};
5484 viewport.maxDepth = 1.0f;
5485 viewport.minDepth = 0.0f;
5486 viewport.width = 512;
5487 viewport.height = 512;
5488 viewport.x = 0;
5489 viewport.y = 0;
5490 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5491 vkEndCommandBuffer(command_buffer[1]);
5492 }
5493 {
5494 VkSubmitInfo submit_info{};
5495 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5496 submit_info.commandBufferCount = 1;
5497 submit_info.pCommandBuffers = &command_buffer[0];
5498 submit_info.signalSemaphoreCount = 1;
5499 submit_info.pSignalSemaphores = &semaphore;
5500 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5501 }
5502 {
5503 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5504 VkSubmitInfo submit_info{};
5505 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5506 submit_info.commandBufferCount = 1;
5507 submit_info.pCommandBuffers = &command_buffer[1];
5508 submit_info.waitSemaphoreCount = 1;
5509 submit_info.pWaitSemaphores = &semaphore;
5510 submit_info.pWaitDstStageMask = flags;
5511 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5512 }
5513
5514 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5515
5516 vkDestroyFence(m_device->device(), fence, nullptr);
5517 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5518 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5519 &command_buffer[0]);
5520 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5521
5522 m_errorMonitor->VerifyNotFound();
5523}
5524
5525// This is a positive test. No errors should be generated.
5526TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
5527
5528 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5529 "on the same queue, sharing a signal/wait semaphore, the "
5530 "second having a fence, "
5531 "followed by a WaitForFences call.");
5532
5533 m_errorMonitor->ExpectSuccess();
5534
5535 VkFence fence;
5536 VkFenceCreateInfo fence_create_info{};
5537 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5538 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5539
5540 VkSemaphore semaphore;
5541 VkSemaphoreCreateInfo semaphore_create_info{};
5542 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5543 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5544 &semaphore);
5545
5546 VkCommandPool command_pool;
5547 VkCommandPoolCreateInfo pool_create_info{};
5548 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5549 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5550 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5551 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5552 &command_pool);
5553
5554 VkCommandBuffer command_buffer[2];
5555 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5556 command_buffer_allocate_info.sType =
5557 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5558 command_buffer_allocate_info.commandPool = command_pool;
5559 command_buffer_allocate_info.commandBufferCount = 2;
5560 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5561 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5562 command_buffer);
5563
5564 {
5565 VkCommandBufferBeginInfo begin_info{};
5566 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5567 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5568
5569 vkCmdPipelineBarrier(command_buffer[0],
5570 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5571 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5572 0, nullptr, 0, nullptr);
5573
5574 VkViewport viewport{};
5575 viewport.maxDepth = 1.0f;
5576 viewport.minDepth = 0.0f;
5577 viewport.width = 512;
5578 viewport.height = 512;
5579 viewport.x = 0;
5580 viewport.y = 0;
5581 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5582 vkEndCommandBuffer(command_buffer[0]);
5583 }
5584 {
5585 VkCommandBufferBeginInfo begin_info{};
5586 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5587 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5588
5589 VkViewport viewport{};
5590 viewport.maxDepth = 1.0f;
5591 viewport.minDepth = 0.0f;
5592 viewport.width = 512;
5593 viewport.height = 512;
5594 viewport.x = 0;
5595 viewport.y = 0;
5596 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5597 vkEndCommandBuffer(command_buffer[1]);
5598 }
5599 {
5600 VkSubmitInfo submit_info{};
5601 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5602 submit_info.commandBufferCount = 1;
5603 submit_info.pCommandBuffers = &command_buffer[0];
5604 submit_info.signalSemaphoreCount = 1;
5605 submit_info.pSignalSemaphores = &semaphore;
5606 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5607 }
5608 {
5609 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5610 VkSubmitInfo submit_info{};
5611 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5612 submit_info.commandBufferCount = 1;
5613 submit_info.pCommandBuffers = &command_buffer[1];
5614 submit_info.waitSemaphoreCount = 1;
5615 submit_info.pWaitSemaphores = &semaphore;
5616 submit_info.pWaitDstStageMask = flags;
5617 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5618 }
5619
5620 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5621
5622 vkDestroyFence(m_device->device(), fence, nullptr);
5623 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5624 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5625 &command_buffer[0]);
5626 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5627
5628 m_errorMonitor->VerifyNotFound();
5629}
5630
5631// This is a positive test. No errors should be generated.
5632TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
5633
5634 TEST_DESCRIPTION(
5635 "Two command buffers, each in a separate QueueSubmit call "
5636 "on the same queue, no fences, followed by a third QueueSubmit with NO "
5637 "SubmitInfos but with a fence, followed by a WaitForFences call.");
5638
5639 m_errorMonitor->ExpectSuccess();
5640
5641 VkFence fence;
5642 VkFenceCreateInfo fence_create_info{};
5643 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5644 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5645
5646 VkCommandPool command_pool;
5647 VkCommandPoolCreateInfo pool_create_info{};
5648 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5649 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5650 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5651 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5652 &command_pool);
5653
5654 VkCommandBuffer command_buffer[2];
5655 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5656 command_buffer_allocate_info.sType =
5657 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5658 command_buffer_allocate_info.commandPool = command_pool;
5659 command_buffer_allocate_info.commandBufferCount = 2;
5660 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5661 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5662 command_buffer);
5663
5664 {
5665 VkCommandBufferBeginInfo begin_info{};
5666 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5667 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5668
5669 vkCmdPipelineBarrier(command_buffer[0],
5670 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5671 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5672 0, nullptr, 0, nullptr);
5673
5674 VkViewport viewport{};
5675 viewport.maxDepth = 1.0f;
5676 viewport.minDepth = 0.0f;
5677 viewport.width = 512;
5678 viewport.height = 512;
5679 viewport.x = 0;
5680 viewport.y = 0;
5681 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5682 vkEndCommandBuffer(command_buffer[0]);
5683 }
5684 {
5685 VkCommandBufferBeginInfo begin_info{};
5686 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5687 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5688
5689 VkViewport viewport{};
5690 viewport.maxDepth = 1.0f;
5691 viewport.minDepth = 0.0f;
5692 viewport.width = 512;
5693 viewport.height = 512;
5694 viewport.x = 0;
5695 viewport.y = 0;
5696 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5697 vkEndCommandBuffer(command_buffer[1]);
5698 }
5699 {
5700 VkSubmitInfo submit_info{};
5701 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5702 submit_info.commandBufferCount = 1;
5703 submit_info.pCommandBuffers = &command_buffer[0];
5704 submit_info.signalSemaphoreCount = 0;
5705 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
5706 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5707 }
5708 {
5709 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5710 VkSubmitInfo submit_info{};
5711 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5712 submit_info.commandBufferCount = 1;
5713 submit_info.pCommandBuffers = &command_buffer[1];
5714 submit_info.waitSemaphoreCount = 0;
5715 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
5716 submit_info.pWaitDstStageMask = flags;
5717 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5718 }
5719
5720 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
5721
Mike Stroyancd1c3e52016-06-21 09:20:01 -06005722 VkResult err =
5723 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5724 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005725
5726 vkDestroyFence(m_device->device(), fence, nullptr);
5727 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5728 &command_buffer[0]);
5729 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5730
5731 m_errorMonitor->VerifyNotFound();
5732}
5733
5734// This is a positive test. No errors should be generated.
5735TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
5736
5737 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5738 "on the same queue, the second having a fence, followed "
5739 "by a WaitForFences call.");
5740
5741 m_errorMonitor->ExpectSuccess();
5742
5743 VkFence fence;
5744 VkFenceCreateInfo fence_create_info{};
5745 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5746 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5747
5748 VkCommandPool command_pool;
5749 VkCommandPoolCreateInfo pool_create_info{};
5750 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5751 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5752 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5753 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5754 &command_pool);
5755
5756 VkCommandBuffer command_buffer[2];
5757 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5758 command_buffer_allocate_info.sType =
5759 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5760 command_buffer_allocate_info.commandPool = command_pool;
5761 command_buffer_allocate_info.commandBufferCount = 2;
5762 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5763 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5764 command_buffer);
5765
5766 {
5767 VkCommandBufferBeginInfo begin_info{};
5768 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5769 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5770
5771 vkCmdPipelineBarrier(command_buffer[0],
5772 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5773 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5774 0, nullptr, 0, nullptr);
5775
5776 VkViewport viewport{};
5777 viewport.maxDepth = 1.0f;
5778 viewport.minDepth = 0.0f;
5779 viewport.width = 512;
5780 viewport.height = 512;
5781 viewport.x = 0;
5782 viewport.y = 0;
5783 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5784 vkEndCommandBuffer(command_buffer[0]);
5785 }
5786 {
5787 VkCommandBufferBeginInfo begin_info{};
5788 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5789 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5790
5791 VkViewport viewport{};
5792 viewport.maxDepth = 1.0f;
5793 viewport.minDepth = 0.0f;
5794 viewport.width = 512;
5795 viewport.height = 512;
5796 viewport.x = 0;
5797 viewport.y = 0;
5798 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5799 vkEndCommandBuffer(command_buffer[1]);
5800 }
5801 {
5802 VkSubmitInfo submit_info{};
5803 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5804 submit_info.commandBufferCount = 1;
5805 submit_info.pCommandBuffers = &command_buffer[0];
5806 submit_info.signalSemaphoreCount = 0;
5807 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
5808 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5809 }
5810 {
5811 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5812 VkSubmitInfo submit_info{};
5813 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5814 submit_info.commandBufferCount = 1;
5815 submit_info.pCommandBuffers = &command_buffer[1];
5816 submit_info.waitSemaphoreCount = 0;
5817 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
5818 submit_info.pWaitDstStageMask = flags;
5819 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5820 }
5821
5822 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5823
5824 vkDestroyFence(m_device->device(), fence, nullptr);
5825 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5826 &command_buffer[0]);
5827 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5828
5829 m_errorMonitor->VerifyNotFound();
5830}
5831
5832// This is a positive test. No errors should be generated.
5833TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
5834
5835 TEST_DESCRIPTION(
5836 "Two command buffers each in a separate SubmitInfo sent in a single "
5837 "QueueSubmit call followed by a WaitForFences call.");
5838
5839 m_errorMonitor->ExpectSuccess();
5840
5841 VkFence fence;
5842 VkFenceCreateInfo fence_create_info{};
5843 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5844 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5845
5846 VkSemaphore semaphore;
5847 VkSemaphoreCreateInfo semaphore_create_info{};
5848 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5849 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5850 &semaphore);
5851
5852 VkCommandPool command_pool;
5853 VkCommandPoolCreateInfo pool_create_info{};
5854 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5855 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5856 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5857 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5858 &command_pool);
5859
5860 VkCommandBuffer command_buffer[2];
5861 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5862 command_buffer_allocate_info.sType =
5863 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5864 command_buffer_allocate_info.commandPool = command_pool;
5865 command_buffer_allocate_info.commandBufferCount = 2;
5866 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5867 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5868 command_buffer);
5869
5870 {
5871 VkCommandBufferBeginInfo begin_info{};
5872 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5873 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5874
5875 vkCmdPipelineBarrier(command_buffer[0],
5876 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5877 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5878 0, nullptr, 0, nullptr);
5879
5880 VkViewport viewport{};
5881 viewport.maxDepth = 1.0f;
5882 viewport.minDepth = 0.0f;
5883 viewport.width = 512;
5884 viewport.height = 512;
5885 viewport.x = 0;
5886 viewport.y = 0;
5887 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5888 vkEndCommandBuffer(command_buffer[0]);
5889 }
5890 {
5891 VkCommandBufferBeginInfo begin_info{};
5892 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5893 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5894
5895 VkViewport viewport{};
5896 viewport.maxDepth = 1.0f;
5897 viewport.minDepth = 0.0f;
5898 viewport.width = 512;
5899 viewport.height = 512;
5900 viewport.x = 0;
5901 viewport.y = 0;
5902 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5903 vkEndCommandBuffer(command_buffer[1]);
5904 }
5905 {
5906 VkSubmitInfo submit_info[2];
5907 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5908
5909 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5910 submit_info[0].pNext = NULL;
5911 submit_info[0].commandBufferCount = 1;
5912 submit_info[0].pCommandBuffers = &command_buffer[0];
5913 submit_info[0].signalSemaphoreCount = 1;
5914 submit_info[0].pSignalSemaphores = &semaphore;
5915 submit_info[0].waitSemaphoreCount = 0;
5916 submit_info[0].pWaitSemaphores = NULL;
5917 submit_info[0].pWaitDstStageMask = 0;
5918
5919 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5920 submit_info[1].pNext = NULL;
5921 submit_info[1].commandBufferCount = 1;
5922 submit_info[1].pCommandBuffers = &command_buffer[1];
5923 submit_info[1].waitSemaphoreCount = 1;
5924 submit_info[1].pWaitSemaphores = &semaphore;
5925 submit_info[1].pWaitDstStageMask = flags;
5926 submit_info[1].signalSemaphoreCount = 0;
5927 submit_info[1].pSignalSemaphores = NULL;
5928 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
5929 }
5930
5931 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5932
5933 vkDestroyFence(m_device->device(), fence, nullptr);
5934 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5935 &command_buffer[0]);
5936 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06005937 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005938
5939 m_errorMonitor->VerifyNotFound();
5940}
5941
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005942TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005943 TEST_DESCRIPTION(
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005944 "Run a simple draw calls to validate failure when Depth Bias dynamic "
5945 "state is required but not correctly bound.");
5946
5947 // Dynamic depth bias
5948 m_errorMonitor->SetDesiredFailureMsg(
5949 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5950 "Dynamic depth bias state not set for this command buffer");
5951 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5952 BsoFailDepthBias);
5953 m_errorMonitor->VerifyFound();
5954}
5955
5956TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
5957 TEST_DESCRIPTION(
5958 "Run a simple draw calls to validate failure when Line Width dynamic "
5959 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005960
5961 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07005962 m_errorMonitor->SetDesiredFailureMsg(
5963 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005964 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005965 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5966 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005967 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005968}
5969
5970TEST_F(VkLayerTest, DynamicViewportNotBound) {
5971 TEST_DESCRIPTION(
5972 "Run a simple draw calls to validate failure when Viewport dynamic "
5973 "state is required but not correctly bound.");
5974
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005975 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07005976 m_errorMonitor->SetDesiredFailureMsg(
5977 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005978 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005979 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5980 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005981 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005982}
5983
5984TEST_F(VkLayerTest, DynamicScissorNotBound) {
5985 TEST_DESCRIPTION(
5986 "Run a simple draw calls to validate failure when Scissor dynamic "
5987 "state is required but not correctly bound.");
5988
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005989 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07005990 m_errorMonitor->SetDesiredFailureMsg(
5991 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005992 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005993 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5994 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005995 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005996}
5997
Tobin Ehlis21c88352016-05-26 06:15:45 -06005998TEST_F(VkLayerTest, DynamiBlendConstantsNotBound) {
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005999 TEST_DESCRIPTION(
Tobin Ehlis21c88352016-05-26 06:15:45 -06006000 "Run a simple draw calls to validate failure when Blend Constants "
6001 "dynamic state is required but not correctly bound.");
6002 // Dynamic blend constant state
6003 m_errorMonitor->SetDesiredFailureMsg(
6004 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6005 "Dynamic blend constants state not set for this command buffer");
6006 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6007 BsoFailBlend);
6008 m_errorMonitor->VerifyFound();
6009}
6010
6011TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
6012 TEST_DESCRIPTION(
6013 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006014 "state is required but not correctly bound.");
Tobin Ehlis21c88352016-05-26 06:15:45 -06006015 if (!m_device->phy().features().depthBounds) {
6016 printf("Device does not support depthBounds test; skipped.\n");
6017 return;
6018 }
6019 // Dynamic depth bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006020 m_errorMonitor->SetDesiredFailureMsg(
6021 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006022 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006023 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6024 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006025 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006026}
6027
6028TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
6029 TEST_DESCRIPTION(
6030 "Run a simple draw calls to validate failure when Stencil Read dynamic "
6031 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006032 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07006033 m_errorMonitor->SetDesiredFailureMsg(
6034 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006035 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006036 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6037 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006038 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006039}
6040
6041TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
6042 TEST_DESCRIPTION(
6043 "Run a simple draw calls to validate failure when Stencil Write dynamic"
6044 " state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006045 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07006046 m_errorMonitor->SetDesiredFailureMsg(
6047 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006048 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006049 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6050 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006051 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006052}
6053
6054TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
6055 TEST_DESCRIPTION(
6056 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
6057 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006058 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07006059 m_errorMonitor->SetDesiredFailureMsg(
6060 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006061 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006062 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6063 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006064 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06006065}
6066
Karl Schultz6addd812016-02-02 17:17:23 -07006067TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Karl Schultz6addd812016-02-02 17:17:23 -07006068 m_errorMonitor->SetDesiredFailureMsg(
6069 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6070 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
6071 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006072
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006073 ASSERT_NO_FATAL_FAILURE(InitState());
6074 ASSERT_NO_FATAL_FAILURE(InitViewport());
6075 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6076
Karl Schultz6addd812016-02-02 17:17:23 -07006077 // We luck out b/c by default the framework creates CB w/ the
6078 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006079 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006080 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
6081 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006082 EndCommandBuffer();
6083
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006084 // Bypass framework since it does the waits automatically
6085 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006086 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08006087 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6088 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006089 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006090 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07006091 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006092 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006093 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08006094 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006095 submit_info.pSignalSemaphores = NULL;
6096
Chris Forbes40028e22016-06-13 09:59:34 +12006097 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07006098 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006099
Karl Schultz6addd812016-02-02 17:17:23 -07006100 // Cause validation error by re-submitting cmd buffer that should only be
6101 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12006102 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006103
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006104 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006105}
6106
Karl Schultz6addd812016-02-02 17:17:23 -07006107TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006108 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07006109 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006110
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006111 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006112 "Unable to allocate 1 descriptors of "
6113 "type "
6114 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006115
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006116 ASSERT_NO_FATAL_FAILURE(InitState());
6117 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006118
Karl Schultz6addd812016-02-02 17:17:23 -07006119 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
6120 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006121 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006122 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
6123 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006124
6125 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006126 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6127 ds_pool_ci.pNext = NULL;
6128 ds_pool_ci.flags = 0;
6129 ds_pool_ci.maxSets = 1;
6130 ds_pool_ci.poolSizeCount = 1;
6131 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006132
6133 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006134 err =
6135 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006136 ASSERT_VK_SUCCESS(err);
6137
6138 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006139 dsl_binding.binding = 0;
6140 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6141 dsl_binding.descriptorCount = 1;
6142 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6143 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006144
6145 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006146 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6147 ds_layout_ci.pNext = NULL;
6148 ds_layout_ci.bindingCount = 1;
6149 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006150
6151 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006152 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6153 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006154 ASSERT_VK_SUCCESS(err);
6155
6156 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006157 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006158 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006159 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006160 alloc_info.descriptorPool = ds_pool;
6161 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006162 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6163 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006164
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006165 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006166
Chia-I Wuf7458c52015-10-26 21:10:41 +08006167 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6168 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006169}
6170
Karl Schultz6addd812016-02-02 17:17:23 -07006171TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
6172 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06006173
Karl Schultz6addd812016-02-02 17:17:23 -07006174 m_errorMonitor->SetDesiredFailureMsg(
6175 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6176 "It is invalid to call vkFreeDescriptorSets() with a pool created "
6177 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006178
Tobin Ehlise735c692015-10-08 13:13:50 -06006179 ASSERT_NO_FATAL_FAILURE(InitState());
6180 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06006181
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006182 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006183 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6184 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06006185
6186 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006187 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6188 ds_pool_ci.pNext = NULL;
6189 ds_pool_ci.maxSets = 1;
6190 ds_pool_ci.poolSizeCount = 1;
6191 ds_pool_ci.flags = 0;
6192 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
6193 // app can only call vkResetDescriptorPool on this pool.;
6194 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06006195
6196 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006197 err =
6198 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06006199 ASSERT_VK_SUCCESS(err);
6200
6201 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006202 dsl_binding.binding = 0;
6203 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6204 dsl_binding.descriptorCount = 1;
6205 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6206 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06006207
6208 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006209 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6210 ds_layout_ci.pNext = NULL;
6211 ds_layout_ci.bindingCount = 1;
6212 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06006213
6214 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006215 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6216 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06006217 ASSERT_VK_SUCCESS(err);
6218
6219 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006220 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006221 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006222 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006223 alloc_info.descriptorPool = ds_pool;
6224 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006225 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6226 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06006227 ASSERT_VK_SUCCESS(err);
6228
6229 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006230 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06006231
Chia-I Wuf7458c52015-10-26 21:10:41 +08006232 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6233 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06006234}
6235
Karl Schultz6addd812016-02-02 17:17:23 -07006236TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006237 // Attempt to clear Descriptor Pool with bad object.
6238 // ObjectTracker should catch this.
6239 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06006240 "Invalid Descriptor Pool Object 0xbaad6001");
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006241 uint64_t fake_pool_handle = 0xbaad6001;
6242 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
6243 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06006244 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006245}
6246
Karl Schultz6addd812016-02-02 17:17:23 -07006247TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006248 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
6249 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006250 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06006251 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006252
6253 uint64_t fake_set_handle = 0xbaad6001;
6254 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006255 VkResult err;
6256 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06006257 "Invalid Descriptor Set Object 0xbaad6001");
Karl Schultzbdb75952016-04-19 11:36:49 -06006258
6259 ASSERT_NO_FATAL_FAILURE(InitState());
6260
6261 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
6262 layout_bindings[0].binding = 0;
6263 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6264 layout_bindings[0].descriptorCount = 1;
6265 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
6266 layout_bindings[0].pImmutableSamplers = NULL;
6267
6268 VkDescriptorSetLayout descriptor_set_layout;
6269 VkDescriptorSetLayoutCreateInfo dslci = {};
6270 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6271 dslci.pNext = NULL;
6272 dslci.bindingCount = 1;
6273 dslci.pBindings = layout_bindings;
6274 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006275 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006276
6277 VkPipelineLayout pipeline_layout;
6278 VkPipelineLayoutCreateInfo plci = {};
6279 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6280 plci.pNext = NULL;
6281 plci.setLayoutCount = 1;
6282 plci.pSetLayouts = &descriptor_set_layout;
6283 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006284 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006285
6286 BeginCommandBuffer();
6287 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006288 pipeline_layout, 0, 1, &bad_set, 0, NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06006289 m_errorMonitor->VerifyFound();
6290 EndCommandBuffer();
6291 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
6292 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006293}
6294
Karl Schultz6addd812016-02-02 17:17:23 -07006295TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006296 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
6297 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006298 uint64_t fake_layout_handle = 0xbaad6001;
6299 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006300 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06006301 "Invalid Descriptor Set Layout Object 0xbaad6001");
Karl Schultzbdb75952016-04-19 11:36:49 -06006302
6303 VkPipelineLayout pipeline_layout;
6304 VkPipelineLayoutCreateInfo plci = {};
6305 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6306 plci.pNext = NULL;
6307 plci.setLayoutCount = 1;
6308 plci.pSetLayouts = &bad_layout;
6309 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
6310
6311 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006312}
6313
Mark Muellerd4914412016-06-13 17:52:06 -06006314TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
6315 TEST_DESCRIPTION("This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
6316 "1) A uniform buffer update must have a valid buffer index."
6317 "2) When using an array of descriptors in a single WriteDescriptor,"
6318 " the descriptor types and stageflags must all be the same."
6319 "3) Immutable Sampler state must match across descriptors");
6320
6321 const char *invalid_BufferInfo_ErrorMessage =
6322 "vkUpdateDescriptorSets: if pDescriptorWrites[0].descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, "
6323 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or "
6324 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pDescriptorWrites[0].pBufferInfo must not be NULL";
6325 const char *stateFlag_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06006326 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006327 const char *immutable_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06006328 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006329
Mark Muellerd4914412016-06-13 17:52:06 -06006330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_BufferInfo_ErrorMessage);
6331
6332 ASSERT_NO_FATAL_FAILURE(InitState());
6333 VkDescriptorPoolSize ds_type_count[4] = {};
6334 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6335 ds_type_count[0].descriptorCount = 1;
6336 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6337 ds_type_count[1].descriptorCount = 1;
6338 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6339 ds_type_count[2].descriptorCount = 1;
6340 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
6341 ds_type_count[3].descriptorCount = 1;
6342
6343 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6344 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6345 ds_pool_ci.maxSets = 1;
6346 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
6347 ds_pool_ci.pPoolSizes = ds_type_count;
6348
6349 VkDescriptorPool ds_pool;
6350 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6351 ASSERT_VK_SUCCESS(err);
6352
Mark Muellerb9896722016-06-16 09:54:29 -06006353 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006354 layout_binding[0].binding = 0;
6355 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6356 layout_binding[0].descriptorCount = 1;
6357 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6358 layout_binding[0].pImmutableSamplers = NULL;
6359
6360 layout_binding[1].binding = 1;
6361 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6362 layout_binding[1].descriptorCount = 1;
6363 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6364 layout_binding[1].pImmutableSamplers = NULL;
6365
6366 VkSamplerCreateInfo sampler_ci = {};
6367 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6368 sampler_ci.pNext = NULL;
6369 sampler_ci.magFilter = VK_FILTER_NEAREST;
6370 sampler_ci.minFilter = VK_FILTER_NEAREST;
6371 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6372 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6373 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6374 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6375 sampler_ci.mipLodBias = 1.0;
6376 sampler_ci.anisotropyEnable = VK_FALSE;
6377 sampler_ci.maxAnisotropy = 1;
6378 sampler_ci.compareEnable = VK_FALSE;
6379 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6380 sampler_ci.minLod = 1.0;
6381 sampler_ci.maxLod = 1.0;
6382 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6383 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6384 VkSampler sampler;
6385
6386 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6387 ASSERT_VK_SUCCESS(err);
6388
6389 layout_binding[2].binding = 2;
6390 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6391 layout_binding[2].descriptorCount = 1;
6392 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6393 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
6394
Mark Muellerd4914412016-06-13 17:52:06 -06006395 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6396 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6397 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
6398 ds_layout_ci.pBindings = layout_binding;
6399 VkDescriptorSetLayout ds_layout;
6400 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6401 ASSERT_VK_SUCCESS(err);
6402
6403 VkDescriptorSetAllocateInfo alloc_info = {};
6404 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6405 alloc_info.descriptorSetCount = 1;
6406 alloc_info.descriptorPool = ds_pool;
6407 alloc_info.pSetLayouts = &ds_layout;
6408 VkDescriptorSet descriptorSet;
6409 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6410 ASSERT_VK_SUCCESS(err);
6411
6412 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6413 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6414 pipeline_layout_ci.pNext = NULL;
6415 pipeline_layout_ci.setLayoutCount = 1;
6416 pipeline_layout_ci.pSetLayouts = &ds_layout;
6417
6418 VkPipelineLayout pipeline_layout;
6419 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6420 ASSERT_VK_SUCCESS(err);
6421
Mark Mueller5c838ce2016-06-16 09:54:29 -06006422 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006423 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6424 descriptor_write.dstSet = descriptorSet;
6425 descriptor_write.dstBinding = 0;
6426 descriptor_write.descriptorCount = 1;
6427 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6428
Mark Mueller5c838ce2016-06-16 09:54:29 -06006429 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06006430 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6431 m_errorMonitor->VerifyFound();
6432
6433 // Create a buffer to update the descriptor with
6434 uint32_t qfi = 0;
6435 VkBufferCreateInfo buffCI = {};
6436 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6437 buffCI.size = 1024;
6438 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6439 buffCI.queueFamilyIndexCount = 1;
6440 buffCI.pQueueFamilyIndices = &qfi;
6441
6442 VkBuffer dyub;
6443 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6444 ASSERT_VK_SUCCESS(err);
6445 VkDescriptorBufferInfo buffInfo = {};
6446 buffInfo.buffer = dyub;
6447 buffInfo.offset = 0;
6448 buffInfo.range = 1024;
6449
6450 descriptor_write.pBufferInfo = &buffInfo;
6451 descriptor_write.descriptorCount = 2;
6452
Mark Mueller5c838ce2016-06-16 09:54:29 -06006453 // 2) The stateFlags don't match between the first and second descriptor
Mark Muellerd4914412016-06-13 17:52:06 -06006454 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, stateFlag_ErrorMessage);
6455 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6456 m_errorMonitor->VerifyFound();
6457
Mark Mueller5c838ce2016-06-16 09:54:29 -06006458 // 3) The second descriptor has a null_ptr pImmutableSamplers and
6459 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06006460 descriptor_write.dstBinding = 1;
6461 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06006462
6463
6464 // Make pImageInfo index non-null to avoid complaints of it missing
6465 VkDescriptorImageInfo imageInfo = {};
6466 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6467 descriptor_write.pImageInfo = &imageInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06006468 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, immutable_ErrorMessage);
6469 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6470 m_errorMonitor->VerifyFound();
6471
Mark Muellerd4914412016-06-13 17:52:06 -06006472 vkDestroyBuffer(m_device->device(), dyub, NULL);
6473 vkDestroySampler(m_device->device(), sampler, NULL);
6474 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6475 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6476 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6477}
6478
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06006479TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
6480 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6481 "due to a buffer dependency being destroyed.");
6482 ASSERT_NO_FATAL_FAILURE(InitState());
6483
6484 VkImageObj image(m_device);
6485 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
6486 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
6487 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
6488 VK_IMAGE_TILING_OPTIMAL, 0);
6489 ASSERT_TRUE(image.initialized());
6490
6491 VkBuffer buffer;
6492 VkDeviceMemory mem;
6493 VkMemoryRequirements mem_reqs;
6494
6495 VkBufferCreateInfo buf_info = {};
6496 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6497 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6498 buf_info.size = 256;
6499 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6500 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
6501 ASSERT_VK_SUCCESS(err);
6502
6503 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
6504
6505 VkMemoryAllocateInfo alloc_info = {};
6506 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6507 alloc_info.allocationSize = 256;
6508 bool pass = false;
6509 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
6510 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
6511 if (!pass) {
6512 vkDestroyBuffer(m_device->device(), buffer, NULL);
6513 return;
6514 }
6515 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
6516 ASSERT_VK_SUCCESS(err);
6517
6518 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
6519 ASSERT_VK_SUCCESS(err);
6520
6521 VkBufferImageCopy region = {};
6522 region.bufferRowLength = 128;
6523 region.bufferImageHeight = 128;
6524 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6525
6526 region.imageSubresource.layerCount = 1;
6527 region.imageExtent.height = 4;
6528 region.imageExtent.width = 4;
6529 region.imageExtent.depth = 1;
6530 m_commandBuffer->BeginCommandBuffer();
6531 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer,
6532 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
6533 1, &region);
6534 m_commandBuffer->EndCommandBuffer();
6535
6536 m_errorMonitor->SetDesiredFailureMsg(
6537 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6538 " that is invalid because bound buffer ");
6539 // Destroy buffer dependency prior to submit to cause ERROR
6540 vkDestroyBuffer(m_device->device(), buffer, NULL);
6541
6542 VkSubmitInfo submit_info = {};
6543 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6544 submit_info.commandBufferCount = 1;
6545 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6546 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6547
6548 m_errorMonitor->VerifyFound();
6549 vkFreeMemory(m_device->handle(), mem, NULL);
6550}
6551
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006552TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
6553 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6554 "due to an image dependency being destroyed.");
6555 ASSERT_NO_FATAL_FAILURE(InitState());
6556
6557 VkImage image;
6558 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6559 VkImageCreateInfo image_create_info = {};
6560 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6561 image_create_info.pNext = NULL;
6562 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6563 image_create_info.format = tex_format;
6564 image_create_info.extent.width = 32;
6565 image_create_info.extent.height = 32;
6566 image_create_info.extent.depth = 1;
6567 image_create_info.mipLevels = 1;
6568 image_create_info.arrayLayers = 1;
6569 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6570 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6571 image_create_info.usage =
6572 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
6573 image_create_info.flags = 0;
6574 VkResult err =
6575 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6576 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06006577 // Have to bind memory to image before recording cmd in cmd buffer using it
6578 VkMemoryRequirements mem_reqs;
6579 VkDeviceMemory image_mem;
6580 bool pass;
6581 VkMemoryAllocateInfo mem_alloc = {};
6582 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6583 mem_alloc.pNext = NULL;
6584 mem_alloc.memoryTypeIndex = 0;
6585 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
6586 mem_alloc.allocationSize = mem_reqs.size;
6587 pass =
6588 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
6589 ASSERT_TRUE(pass);
6590 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
6591 ASSERT_VK_SUCCESS(err);
6592 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
6593 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006594
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006595 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06006596 VkClearColorValue ccv;
6597 ccv.float32[0] = 1.0f;
6598 ccv.float32[1] = 1.0f;
6599 ccv.float32[2] = 1.0f;
6600 ccv.float32[3] = 1.0f;
6601 VkImageSubresourceRange isr = {};
6602 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06006603 isr.baseArrayLayer = 0;
6604 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06006605 isr.layerCount = 1;
6606 isr.levelCount = 1;
6607 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image,
6608 VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006609 m_commandBuffer->EndCommandBuffer();
6610
6611 m_errorMonitor->SetDesiredFailureMsg(
6612 VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
6613 // Destroy image dependency prior to submit to cause ERROR
6614 vkDestroyImage(m_device->device(), image, NULL);
6615
6616 VkSubmitInfo submit_info = {};
6617 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6618 submit_info.commandBufferCount = 1;
6619 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6620 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6621
6622 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06006623 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006624}
6625
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06006626TEST_F(VkLayerTest, ImageMemoryNotBound) {
6627 TEST_DESCRIPTION(
6628 "Attempt to draw with an image which has not had memory bound to it.");
6629 ASSERT_NO_FATAL_FAILURE(InitState());
6630
6631 VkImage image;
6632 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6633 VkImageCreateInfo image_create_info = {};
6634 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6635 image_create_info.pNext = NULL;
6636 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6637 image_create_info.format = tex_format;
6638 image_create_info.extent.width = 32;
6639 image_create_info.extent.height = 32;
6640 image_create_info.extent.depth = 1;
6641 image_create_info.mipLevels = 1;
6642 image_create_info.arrayLayers = 1;
6643 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6644 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6645 image_create_info.usage =
6646 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
6647 image_create_info.flags = 0;
6648 VkResult err =
6649 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6650 ASSERT_VK_SUCCESS(err);
6651 // Have to bind memory to image before recording cmd in cmd buffer using it
6652 VkMemoryRequirements mem_reqs;
6653 VkDeviceMemory image_mem;
6654 bool pass;
6655 VkMemoryAllocateInfo mem_alloc = {};
6656 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6657 mem_alloc.pNext = NULL;
6658 mem_alloc.memoryTypeIndex = 0;
6659 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
6660 mem_alloc.allocationSize = mem_reqs.size;
6661 pass =
6662 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
6663 ASSERT_TRUE(pass);
6664 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
6665 ASSERT_VK_SUCCESS(err);
6666
6667 // Introduce error, do not call vkBindImageMemory(m_device->device(), image,
6668 // image_mem, 0);
6669 m_errorMonitor->SetDesiredFailureMsg(
6670 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6671 "used without first calling vkBindImageMemory");
6672
6673 m_commandBuffer->BeginCommandBuffer();
6674 VkClearColorValue ccv;
6675 ccv.float32[0] = 1.0f;
6676 ccv.float32[1] = 1.0f;
6677 ccv.float32[2] = 1.0f;
6678 ccv.float32[3] = 1.0f;
6679 VkImageSubresourceRange isr = {};
6680 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6681 isr.baseArrayLayer = 0;
6682 isr.baseMipLevel = 0;
6683 isr.layerCount = 1;
6684 isr.levelCount = 1;
6685 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image,
6686 VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
6687 m_commandBuffer->EndCommandBuffer();
6688
6689 m_errorMonitor->VerifyFound();
6690 vkDestroyImage(m_device->device(), image, NULL);
6691 vkFreeMemory(m_device->device(), image_mem, nullptr);
6692}
6693
6694TEST_F(VkLayerTest, BufferMemoryNotBound) {
6695 TEST_DESCRIPTION(
6696 "Attempt to copy from a buffer which has not had memory bound to it.");
6697 ASSERT_NO_FATAL_FAILURE(InitState());
6698
6699 VkImageObj image(m_device);
6700 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
6701 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
6702 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
6703 VK_IMAGE_TILING_OPTIMAL, 0);
6704 ASSERT_TRUE(image.initialized());
6705
6706 VkBuffer buffer;
6707 VkDeviceMemory mem;
6708 VkMemoryRequirements mem_reqs;
6709
6710 VkBufferCreateInfo buf_info = {};
6711 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6712 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6713 buf_info.size = 256;
6714 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6715 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
6716 ASSERT_VK_SUCCESS(err);
6717
6718 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
6719
6720 VkMemoryAllocateInfo alloc_info = {};
6721 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6722 alloc_info.allocationSize = 256;
6723 bool pass = false;
6724 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
6725 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
6726 if (!pass) {
6727 vkDestroyBuffer(m_device->device(), buffer, NULL);
6728 return;
6729 }
6730 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
6731 ASSERT_VK_SUCCESS(err);
6732
6733 // Introduce failure by not calling vkBindBufferMemory(m_device->device(),
6734 // buffer, mem, 0);
6735 m_errorMonitor->SetDesiredFailureMsg(
6736 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6737 "used without first calling vkBindBufferMemory");
6738 VkBufferImageCopy region = {};
6739 region.bufferRowLength = 128;
6740 region.bufferImageHeight = 128;
6741 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6742
6743 region.imageSubresource.layerCount = 1;
6744 region.imageExtent.height = 4;
6745 region.imageExtent.width = 4;
6746 region.imageExtent.depth = 1;
6747 m_commandBuffer->BeginCommandBuffer();
6748 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer,
6749 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
6750 1, &region);
6751 m_commandBuffer->EndCommandBuffer();
6752
6753 m_errorMonitor->VerifyFound();
6754
6755 vkDestroyBuffer(m_device->device(), buffer, NULL);
6756 vkFreeMemory(m_device->handle(), mem, NULL);
6757}
6758
Tobin Ehlis85940f52016-07-07 16:57:21 -06006759TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
6760 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6761 "due to an event dependency being destroyed.");
6762 ASSERT_NO_FATAL_FAILURE(InitState());
6763
6764 VkEvent event;
6765 VkEventCreateInfo evci = {};
6766 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
6767 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
6768 ASSERT_VK_SUCCESS(result);
6769
6770 m_commandBuffer->BeginCommandBuffer();
6771 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event,
6772 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
6773 m_commandBuffer->EndCommandBuffer();
6774
6775 m_errorMonitor->SetDesiredFailureMsg(
6776 VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
6777 // Destroy event dependency prior to submit to cause ERROR
6778 vkDestroyEvent(m_device->device(), event, NULL);
6779
6780 VkSubmitInfo submit_info = {};
6781 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6782 submit_info.commandBufferCount = 1;
6783 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6784 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6785
6786 m_errorMonitor->VerifyFound();
6787}
6788
Tobin Ehlisdbea7552016-07-08 14:33:31 -06006789TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
6790 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6791 "due to a query pool dependency being destroyed.");
6792 ASSERT_NO_FATAL_FAILURE(InitState());
6793
6794 VkQueryPool query_pool;
6795 VkQueryPoolCreateInfo qpci{};
6796 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
6797 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
6798 qpci.queryCount = 1;
6799 VkResult result =
6800 vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
6801 ASSERT_VK_SUCCESS(result);
6802
6803 m_commandBuffer->BeginCommandBuffer();
6804 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
6805 m_commandBuffer->EndCommandBuffer();
6806
6807 m_errorMonitor->SetDesiredFailureMsg(
6808 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6809 " that is invalid because bound query pool ");
6810 // Destroy query pool dependency prior to submit to cause ERROR
6811 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
6812
6813 VkSubmitInfo submit_info = {};
6814 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6815 submit_info.commandBufferCount = 1;
6816 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6817 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6818
6819 m_errorMonitor->VerifyFound();
6820}
6821
Tobin Ehlis24130d92016-07-08 15:50:53 -06006822TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
6823 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6824 "due to a pipeline dependency being destroyed.");
6825 ASSERT_NO_FATAL_FAILURE(InitState());
6826 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6827
6828 VkResult err;
6829
6830 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6831 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6832
6833 VkPipelineLayout pipeline_layout;
6834 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6835 &pipeline_layout);
6836 ASSERT_VK_SUCCESS(err);
6837
6838 VkPipelineViewportStateCreateInfo vp_state_ci = {};
6839 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
6840 vp_state_ci.viewportCount = 1;
6841 VkViewport vp = {}; // Just need dummy vp to point to
6842 vp_state_ci.pViewports = &vp; // Null vp w/ count of 1 should cause error
6843 vp_state_ci.scissorCount = 1;
6844 VkRect2D scissors = {}; // Dummy scissors to point to
6845 vp_state_ci.pScissors = &scissors;
6846 // No dynamic state
6847 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
6848 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
6849
6850 VkPipelineShaderStageCreateInfo shaderStages[2];
6851 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
6852
6853 VkShaderObj vs(m_device, bindStateVertShaderText,
6854 VK_SHADER_STAGE_VERTEX_BIT, this);
6855 VkShaderObj fs(m_device, bindStateFragShaderText,
6856 VK_SHADER_STAGE_FRAGMENT_BIT,
6857 this); // We shouldn't need a fragment shader
6858 // but add it to be able to run on more devices
6859 shaderStages[0] = vs.GetStageCreateInfo();
6860 shaderStages[1] = fs.GetStageCreateInfo();
6861
6862 VkPipelineVertexInputStateCreateInfo vi_ci = {};
6863 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
6864
6865 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
6866 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
6867 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
6868
6869 VkPipelineRasterizationStateCreateInfo rs_ci = {};
6870 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
6871
6872 VkPipelineColorBlendAttachmentState att = {};
6873 att.blendEnable = VK_FALSE;
6874 att.colorWriteMask = 0xf;
6875
6876 VkPipelineColorBlendStateCreateInfo cb_ci = {};
6877 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
6878 cb_ci.attachmentCount = 1;
6879 cb_ci.pAttachments = &att;
6880
6881 VkGraphicsPipelineCreateInfo gp_ci = {};
6882 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
6883 gp_ci.stageCount = 2;
6884 gp_ci.pStages = shaderStages;
6885 gp_ci.pVertexInputState = &vi_ci;
6886 gp_ci.pInputAssemblyState = &ia_ci;
6887 gp_ci.pViewportState = &vp_state_ci;
6888 gp_ci.pRasterizationState = &rs_ci;
6889 gp_ci.pColorBlendState = &cb_ci;
6890 gp_ci.pDynamicState = &dyn_state_ci;
6891 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
6892 gp_ci.layout = pipeline_layout;
6893 gp_ci.renderPass = renderPass();
6894
6895 VkPipelineCacheCreateInfo pc_ci = {};
6896 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
6897
6898 VkPipeline pipeline;
6899 VkPipelineCache pipelineCache;
6900 err =
6901 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
6902 ASSERT_VK_SUCCESS(err);
6903
6904 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
6905 &gp_ci, NULL, &pipeline);
6906 ASSERT_VK_SUCCESS(err);
6907
6908 m_commandBuffer->BeginCommandBuffer();
6909 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6910 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
6911 m_commandBuffer->EndCommandBuffer();
6912 // Now destroy pipeline in order to cause error when submitting
6913 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
6914
6915 m_errorMonitor->SetDesiredFailureMsg(
6916 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6917 " that is invalid because bound pipeline ");
6918
6919 VkSubmitInfo submit_info = {};
6920 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6921 submit_info.commandBufferCount = 1;
6922 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6923 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6924
6925 m_errorMonitor->VerifyFound();
6926 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
6927 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6928}
6929
Karl Schultz6addd812016-02-02 17:17:23 -07006930TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006931 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6932 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006933 // Create a valid cmd buffer
6934 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006935 uint64_t fake_pipeline_handle = 0xbaad6001;
6936 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006937 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06006938 "Invalid Pipeline Object 0xbaad6001");
Karl Schultzbdb75952016-04-19 11:36:49 -06006939 ASSERT_NO_FATAL_FAILURE(InitState());
6940 BeginCommandBuffer();
6941 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6942 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
6943 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006944 // Now issue a draw call with no pipeline bound
6945 m_errorMonitor->SetDesiredFailureMsg(
6946 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6947 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tony Barbourdf4c0042016-06-01 15:55:43 -06006948
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006949 BeginCommandBuffer();
6950 Draw(1, 0, 0, 0);
6951 m_errorMonitor->VerifyFound();
6952 // Finally same check once more but with Dispatch/Compute
6953 m_errorMonitor->SetDesiredFailureMsg(
6954 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6955 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006956 BeginCommandBuffer();
6957 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6958 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006959}
6960
Karl Schultz6addd812016-02-02 17:17:23 -07006961TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
6962 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
6963 // CommandBuffer
6964 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006965
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006966 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006967 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006968
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006969 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006970 ASSERT_NO_FATAL_FAILURE(InitViewport());
6971 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006972 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006973 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6974 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006975
6976 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006977 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6978 ds_pool_ci.pNext = NULL;
6979 ds_pool_ci.maxSets = 1;
6980 ds_pool_ci.poolSizeCount = 1;
6981 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006982
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006983 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006984 err =
6985 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006986 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006987
Tony Barboureb254902015-07-15 12:50:33 -06006988 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006989 dsl_binding.binding = 0;
6990 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6991 dsl_binding.descriptorCount = 1;
6992 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6993 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006994
Tony Barboureb254902015-07-15 12:50:33 -06006995 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006996 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6997 ds_layout_ci.pNext = NULL;
6998 ds_layout_ci.bindingCount = 1;
6999 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007000 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007001 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7002 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007003 ASSERT_VK_SUCCESS(err);
7004
7005 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007006 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007007 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007008 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007009 alloc_info.descriptorPool = ds_pool;
7010 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007011 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7012 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007013 ASSERT_VK_SUCCESS(err);
7014
Tony Barboureb254902015-07-15 12:50:33 -06007015 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007016 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7017 pipeline_layout_ci.pNext = NULL;
7018 pipeline_layout_ci.setLayoutCount = 1;
7019 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007020
7021 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007022 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7023 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007024 ASSERT_VK_SUCCESS(err);
7025
Karl Schultz6addd812016-02-02 17:17:23 -07007026 VkShaderObj vs(m_device, bindStateVertShaderText,
7027 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06007028 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07007029 // on more devices
7030 VkShaderObj fs(m_device, bindStateFragShaderText,
7031 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007032
Tony Barbourc95e4ac2015-08-04 17:05:26 -06007033 VkPipelineObj pipe(m_device);
7034 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06007035 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06007036 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06007037 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06007038
7039 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007040 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7041 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7042 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7043 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7044 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007045
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007046 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007047
Chia-I Wuf7458c52015-10-26 21:10:41 +08007048 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7049 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7050 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007051}
7052
Karl Schultz6addd812016-02-02 17:17:23 -07007053TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007054 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07007055 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007056
Karl Schultz6addd812016-02-02 17:17:23 -07007057 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007058 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
7059 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007060
7061 ASSERT_NO_FATAL_FAILURE(InitState());
7062 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007063 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7064 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007065
7066 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007067 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7068 ds_pool_ci.pNext = NULL;
7069 ds_pool_ci.maxSets = 1;
7070 ds_pool_ci.poolSizeCount = 1;
7071 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007072
7073 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007074 err =
7075 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007076 ASSERT_VK_SUCCESS(err);
7077
7078 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007079 dsl_binding.binding = 0;
7080 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7081 dsl_binding.descriptorCount = 1;
7082 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7083 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007084
7085 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007086 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7087 ds_layout_ci.pNext = NULL;
7088 ds_layout_ci.bindingCount = 1;
7089 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007090 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007091 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7092 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007093 ASSERT_VK_SUCCESS(err);
7094
7095 VkDescriptorSet descriptorSet;
7096 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007097 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007098 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007099 alloc_info.descriptorPool = ds_pool;
7100 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007101 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7102 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007103 ASSERT_VK_SUCCESS(err);
7104
Karl Schultz6addd812016-02-02 17:17:23 -07007105 VkBufferView view =
7106 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007107 VkWriteDescriptorSet descriptor_write;
7108 memset(&descriptor_write, 0, sizeof(descriptor_write));
7109 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7110 descriptor_write.dstSet = descriptorSet;
7111 descriptor_write.dstBinding = 0;
7112 descriptor_write.descriptorCount = 1;
7113 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7114 descriptor_write.pTexelBufferView = &view;
7115
7116 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7117
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007118 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007119
7120 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7121 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7122}
7123
Mark Youngd339ba32016-05-30 13:28:35 -06007124TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
7125 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has"
7126 " no memory bound to it.");
7127
7128 VkResult err;
7129 m_errorMonitor->SetDesiredFailureMsg(
7130 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -06007131 "used without first calling vkBindBufferMemory");
Mark Youngd339ba32016-05-30 13:28:35 -06007132
7133 ASSERT_NO_FATAL_FAILURE(InitState());
7134
7135 // Create a buffer with no bound memory and then attempt to create
7136 // a buffer view.
7137 VkBufferCreateInfo buff_ci = {};
7138 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7139 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7140 buff_ci.size = 256;
7141 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7142 VkBuffer buffer;
7143 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
7144 ASSERT_VK_SUCCESS(err);
7145
7146 VkBufferViewCreateInfo buff_view_ci = {};
7147 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
7148 buff_view_ci.buffer = buffer;
7149 buff_view_ci.format = VK_FORMAT_R8_UNORM;
7150 buff_view_ci.range = VK_WHOLE_SIZE;
7151 VkBufferView buff_view;
7152 err =
7153 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
7154
7155 m_errorMonitor->VerifyFound();
7156 vkDestroyBuffer(m_device->device(), buffer, NULL);
7157 // If last error is success, it still created the view, so delete it.
7158 if (err == VK_SUCCESS) {
7159 vkDestroyBufferView(m_device->device(), buff_view, NULL);
7160 }
7161}
7162
Karl Schultz6addd812016-02-02 17:17:23 -07007163TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
7164 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
7165 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07007166 // 1. No dynamicOffset supplied
7167 // 2. Too many dynamicOffsets supplied
7168 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07007169 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007170 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007171 " requires 1 dynamicOffsets, but only "
7172 "0 dynamicOffsets are left in "
7173 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007174
7175 ASSERT_NO_FATAL_FAILURE(InitState());
7176 ASSERT_NO_FATAL_FAILURE(InitViewport());
7177 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7178
7179 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007180 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7181 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007182
7183 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007184 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7185 ds_pool_ci.pNext = NULL;
7186 ds_pool_ci.maxSets = 1;
7187 ds_pool_ci.poolSizeCount = 1;
7188 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007189
7190 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007191 err =
7192 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007193 ASSERT_VK_SUCCESS(err);
7194
7195 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007196 dsl_binding.binding = 0;
7197 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7198 dsl_binding.descriptorCount = 1;
7199 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7200 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007201
7202 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007203 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7204 ds_layout_ci.pNext = NULL;
7205 ds_layout_ci.bindingCount = 1;
7206 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007207 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007208 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7209 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007210 ASSERT_VK_SUCCESS(err);
7211
7212 VkDescriptorSet descriptorSet;
7213 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007214 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007215 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007216 alloc_info.descriptorPool = ds_pool;
7217 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007218 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7219 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007220 ASSERT_VK_SUCCESS(err);
7221
7222 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007223 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7224 pipeline_layout_ci.pNext = NULL;
7225 pipeline_layout_ci.setLayoutCount = 1;
7226 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007227
7228 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007229 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7230 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007231 ASSERT_VK_SUCCESS(err);
7232
7233 // Create a buffer to update the descriptor with
7234 uint32_t qfi = 0;
7235 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007236 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7237 buffCI.size = 1024;
7238 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7239 buffCI.queueFamilyIndexCount = 1;
7240 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007241
7242 VkBuffer dyub;
7243 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7244 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007245 // Allocate memory and bind to buffer so we can make it to the appropriate
7246 // error
7247 VkMemoryAllocateInfo mem_alloc = {};
7248 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7249 mem_alloc.pNext = NULL;
7250 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12007251 mem_alloc.memoryTypeIndex = 0;
7252
7253 VkMemoryRequirements memReqs;
7254 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
7255 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc,
7256 0);
7257 if (!pass) {
7258 vkDestroyBuffer(m_device->device(), dyub, NULL);
7259 return;
7260 }
7261
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007262 VkDeviceMemory mem;
7263 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
7264 ASSERT_VK_SUCCESS(err);
7265 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
7266 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007267 // Correctly update descriptor to avoid "NOT_UPDATED" error
7268 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007269 buffInfo.buffer = dyub;
7270 buffInfo.offset = 0;
7271 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007272
7273 VkWriteDescriptorSet descriptor_write;
7274 memset(&descriptor_write, 0, sizeof(descriptor_write));
7275 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7276 descriptor_write.dstSet = descriptorSet;
7277 descriptor_write.dstBinding = 0;
7278 descriptor_write.descriptorCount = 1;
7279 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7280 descriptor_write.pBufferInfo = &buffInfo;
7281
7282 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7283
7284 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007285 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7286 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7287 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007288 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07007289 uint32_t pDynOff[2] = {512, 756};
7290 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07007291 m_errorMonitor->SetDesiredFailureMsg(
7292 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07007293 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07007294 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7295 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7296 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12007297 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07007298 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007299 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7300 " dynamic offset 512 combined with "
7301 "offset 0 and range 1024 that "
7302 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07007303 // Create PSO to be used for draw-time errors below
7304 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007305 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007306 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007307 "out gl_PerVertex { \n"
7308 " vec4 gl_Position;\n"
7309 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007310 "void main(){\n"
7311 " gl_Position = vec4(1);\n"
7312 "}\n";
7313 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007314 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007315 "\n"
7316 "layout(location=0) out vec4 x;\n"
7317 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7318 "void main(){\n"
7319 " x = vec4(bar.y);\n"
7320 "}\n";
7321 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7322 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7323 VkPipelineObj pipe(m_device);
7324 pipe.AddShader(&vs);
7325 pipe.AddShader(&fs);
7326 pipe.AddColorAttachment();
7327 pipe.CreateVKPipeline(pipeline_layout, renderPass());
7328
Karl Schultz6addd812016-02-02 17:17:23 -07007329 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7330 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7331 // This update should succeed, but offset size of 512 will overstep buffer
7332 // /w range 1024 & size 1024
7333 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7334 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7335 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07007336 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007337 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007338
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007339 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06007340 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007341
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007342 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007343 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007344 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7345}
7346
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007347TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
7348 TEST_DESCRIPTION("Attempt to update a descriptor with a non-sparse buffer "
7349 "that doesn't have memory bound");
7350 VkResult err;
7351 m_errorMonitor->SetDesiredFailureMsg(
7352 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7353 " used without first calling vkBindBufferMemory.");
7354
7355 ASSERT_NO_FATAL_FAILURE(InitState());
7356 ASSERT_NO_FATAL_FAILURE(InitViewport());
7357 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7358
7359 VkDescriptorPoolSize ds_type_count = {};
7360 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7361 ds_type_count.descriptorCount = 1;
7362
7363 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7364 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7365 ds_pool_ci.pNext = NULL;
7366 ds_pool_ci.maxSets = 1;
7367 ds_pool_ci.poolSizeCount = 1;
7368 ds_pool_ci.pPoolSizes = &ds_type_count;
7369
7370 VkDescriptorPool ds_pool;
7371 err =
7372 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
7373 ASSERT_VK_SUCCESS(err);
7374
7375 VkDescriptorSetLayoutBinding dsl_binding = {};
7376 dsl_binding.binding = 0;
7377 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7378 dsl_binding.descriptorCount = 1;
7379 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7380 dsl_binding.pImmutableSamplers = NULL;
7381
7382 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7383 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7384 ds_layout_ci.pNext = NULL;
7385 ds_layout_ci.bindingCount = 1;
7386 ds_layout_ci.pBindings = &dsl_binding;
7387 VkDescriptorSetLayout ds_layout;
7388 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7389 &ds_layout);
7390 ASSERT_VK_SUCCESS(err);
7391
7392 VkDescriptorSet descriptorSet;
7393 VkDescriptorSetAllocateInfo alloc_info = {};
7394 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7395 alloc_info.descriptorSetCount = 1;
7396 alloc_info.descriptorPool = ds_pool;
7397 alloc_info.pSetLayouts = &ds_layout;
7398 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7399 &descriptorSet);
7400 ASSERT_VK_SUCCESS(err);
7401
7402 // Create a buffer to update the descriptor with
7403 uint32_t qfi = 0;
7404 VkBufferCreateInfo buffCI = {};
7405 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7406 buffCI.size = 1024;
7407 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7408 buffCI.queueFamilyIndexCount = 1;
7409 buffCI.pQueueFamilyIndices = &qfi;
7410
7411 VkBuffer dyub;
7412 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7413 ASSERT_VK_SUCCESS(err);
7414
7415 // Attempt to update descriptor without binding memory to it
7416 VkDescriptorBufferInfo buffInfo = {};
7417 buffInfo.buffer = dyub;
7418 buffInfo.offset = 0;
7419 buffInfo.range = 1024;
7420
7421 VkWriteDescriptorSet descriptor_write;
7422 memset(&descriptor_write, 0, sizeof(descriptor_write));
7423 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7424 descriptor_write.dstSet = descriptorSet;
7425 descriptor_write.dstBinding = 0;
7426 descriptor_write.descriptorCount = 1;
7427 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7428 descriptor_write.pBufferInfo = &buffInfo;
7429
7430 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7431 m_errorMonitor->VerifyFound();
7432
7433 vkDestroyBuffer(m_device->device(), dyub, NULL);
7434 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7435 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7436}
7437
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007438TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007439 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007440 ASSERT_NO_FATAL_FAILURE(InitState());
7441 ASSERT_NO_FATAL_FAILURE(InitViewport());
7442 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7443
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007444 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007445 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007446 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7447 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7448 pipeline_layout_ci.pushConstantRangeCount = 1;
7449 pipeline_layout_ci.pPushConstantRanges = &pc_range;
7450
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007451 //
7452 // Check for invalid push constant ranges in pipeline layouts.
7453 //
7454 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007455 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007456 char const *msg;
7457 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007458
Karl Schultzc81037d2016-05-12 08:11:23 -06007459 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
7460 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
7461 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7462 "vkCreatePipelineLayout() call has push constants index 0 with "
7463 "size 0."},
7464 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7465 "vkCreatePipelineLayout() call has push constants index 0 with "
7466 "size 1."},
7467 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
7468 "vkCreatePipelineLayout() call has push constants index 0 with "
7469 "size 1."},
7470 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
7471 "vkCreatePipelineLayout() call has push constants index 0 with "
7472 "size 0."},
7473 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7474 "vkCreatePipelineLayout() call has push constants index 0 with "
7475 "offset 1. Offset must"},
7476 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
7477 "vkCreatePipelineLayout() call has push constants index 0 "
7478 "with offset "},
7479 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
7480 "vkCreatePipelineLayout() call has push constants "
7481 "index 0 with offset "},
7482 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
7483 "vkCreatePipelineLayout() call has push constants index 0 "
7484 "with offset "},
7485 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
7486 "vkCreatePipelineLayout() call has push "
7487 "constants index 0 with offset "},
7488 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
7489 "vkCreatePipelineLayout() call has push "
7490 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007491 }};
7492
7493 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06007494 for (const auto &iter : range_tests) {
7495 pc_range = iter.range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007496 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7497 iter.msg);
7498 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7499 NULL, &pipeline_layout);
7500 m_errorMonitor->VerifyFound();
7501 if (VK_SUCCESS == err) {
7502 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7503 }
7504 }
7505
7506 // Check for invalid stage flag
7507 pc_range.offset = 0;
7508 pc_range.size = 16;
7509 pc_range.stageFlags = 0;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007510 m_errorMonitor->SetDesiredFailureMsg(
7511 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007512 "vkCreatePipelineLayout() call has no stageFlags set.");
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007513 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7514 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007515 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007516 if (VK_SUCCESS == err) {
7517 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7518 }
7519
7520 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06007521 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007522 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007523 VkPushConstantRange const ranges[ranges_per_test];
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007524 char const *msg;
7525 };
7526
Karl Schultzc81037d2016-05-12 08:11:23 -06007527 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007528 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7529 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7530 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7531 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7532 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7533 "vkCreatePipelineLayout() call has push constants with overlapping "
7534 "ranges: 0:[0, 4), 1:[0, 4)"},
7535 {
7536 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7537 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7538 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7539 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7540 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
7541 "vkCreatePipelineLayout() call has push constants with "
7542 "overlapping "
7543 "ranges: 3:[12, 20), 4:[16, 20)",
7544 },
7545 {
7546 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7547 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7548 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7549 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7550 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7551 "vkCreatePipelineLayout() call has push constants with "
7552 "overlapping "
7553 "ranges: 0:[16, 20), 1:[12, 20)",
7554 },
7555 {
7556 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7557 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7558 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7559 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7560 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7561 "vkCreatePipelineLayout() call has push constants with "
7562 "overlapping "
7563 "ranges: 0:[16, 20), 3:[12, 20)",
7564 },
7565 {
7566 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7567 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
7568 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
7569 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
7570 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
7571 "vkCreatePipelineLayout() call has push constants with "
7572 "overlapping "
7573 "ranges: 0:[16, 20), 2:[4, 100)",
7574 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007575
Karl Schultzc81037d2016-05-12 08:11:23 -06007576 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007577 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06007578 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
7579 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007580 iter.msg);
7581 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7582 NULL, &pipeline_layout);
7583 m_errorMonitor->VerifyFound();
7584 if (VK_SUCCESS == err) {
7585 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7586 }
7587 }
7588
7589 // Run some positive tests to make sure overlap checking in the layer is OK
Karl Schultzc81037d2016-05-12 08:11:23 -06007590 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos =
7591 {{{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7592 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7593 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7594 {VK_SHADER_STAGE_VERTEX_BIT, 12, 4},
7595 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
7596 ""},
7597 {{{VK_SHADER_STAGE_VERTEX_BIT, 92, 24},
7598 {VK_SHADER_STAGE_VERTEX_BIT, 80, 4},
7599 {VK_SHADER_STAGE_VERTEX_BIT, 64, 8},
7600 {VK_SHADER_STAGE_VERTEX_BIT, 4, 16},
7601 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7602 ""}}};
7603 for (const auto &iter : overlapping_range_tests_pos) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007604 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
7605 m_errorMonitor->ExpectSuccess();
7606 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7607 NULL, &pipeline_layout);
7608 m_errorMonitor->VerifyNotFound();
7609 if (VK_SUCCESS == err) {
7610 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7611 }
7612 }
7613
7614 //
7615 // CmdPushConstants tests
7616 //
Karl Schultzc81037d2016-05-12 08:11:23 -06007617 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007618
7619 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzc81037d2016-05-12 08:11:23 -06007620 const std::array<PipelineLayoutTestCase, 16> cmd_range_tests = {{
7621 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7622 "vkCmdPushConstants() call has push constants with size 0. Size "
7623 "must be greater than zero and a multiple of 4."},
7624 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7625 "vkCmdPushConstants() call has push constants with size 1. Size "
7626 "must be greater than zero and a multiple of 4."},
7627 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
7628 "vkCmdPushConstants() call has push constants with size 1. Size "
7629 "must be greater than zero and a multiple of 4."},
7630 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
7631 "vkCmdPushConstants() call has push constants with offset 1. "
7632 "Offset must be a multiple of 4."},
7633 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7634 "vkCmdPushConstants() call has push constants with offset 1. "
7635 "Offset must be a multiple of 4."},
7636 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
7637 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
7638 "0x1 not within flag-matching ranges in pipeline layout"},
7639 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
7640 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
7641 "0x1 not within flag-matching ranges in pipeline layout"},
7642 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
7643 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
7644 "0x1 not within flag-matching ranges in pipeline layout"},
7645 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
7646 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
7647 "0x1 not within flag-matching ranges in pipeline layout"},
7648 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
7649 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
7650 "any of the ranges in pipeline layout"},
7651 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7652 0, 16},
7653 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
7654 "any of the ranges in pipeline layout"},
7655 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007656 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007657 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007658 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007659 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007660 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007661 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007662 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007663 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007664 "vkCmdPushConstants() call has push constants with offset "},
7665 }};
7666
7667 // Two ranges for testing robustness
Karl Schultzc81037d2016-05-12 08:11:23 -06007668 const VkPushConstantRange pc_range2[] = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007669 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06007670 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007671 };
Karl Schultzc81037d2016-05-12 08:11:23 -06007672 pipeline_layout_ci.pushConstantRangeCount =
7673 sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007674 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007675 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7676 &pipeline_layout);
7677 ASSERT_VK_SUCCESS(err);
7678 BeginCommandBuffer();
Karl Schultzc81037d2016-05-12 08:11:23 -06007679 for (const auto &iter : cmd_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007680 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7681 iter.msg);
7682 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
Karl Schultzc81037d2016-05-12 08:11:23 -06007683 iter.range.stageFlags, iter.range.offset,
7684 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007685 m_errorMonitor->VerifyFound();
7686 }
7687
7688 // Check for invalid stage flag
7689 m_errorMonitor->SetDesiredFailureMsg(
7690 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7691 "vkCmdPushConstants() call has no stageFlags set.");
7692 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0,
Karl Schultzc81037d2016-05-12 08:11:23 -06007693 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007694 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06007695 EndCommandBuffer();
7696 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
7697 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007698
Karl Schultzc81037d2016-05-12 08:11:23 -06007699 // overlapping range tests with cmd
7700 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
7701 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
7702 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
7703 "0x1 not within flag-matching ranges in pipeline layout"},
7704 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7705 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
7706 "0x1 not within flag-matching ranges in pipeline layout"},
7707 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
7708 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
7709 "0x1 not within flag-matching ranges in pipeline layout"},
7710 }};
7711 const VkPushConstantRange pc_range3[] = {
7712 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
7713 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7714 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7715 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
7716 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
7717 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
7718 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
7719 };
7720 pipeline_layout_ci.pushConstantRangeCount =
7721 sizeof(pc_range3) / sizeof(VkPushConstantRange);
7722 pipeline_layout_ci.pPushConstantRanges = pc_range3;
7723 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7724 &pipeline_layout);
7725 ASSERT_VK_SUCCESS(err);
7726 BeginCommandBuffer();
7727 for (const auto &iter : cmd_overlap_tests) {
7728 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7729 iter.msg);
7730 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
7731 iter.range.stageFlags, iter.range.offset,
7732 iter.range.size, dummy_values);
7733 m_errorMonitor->VerifyFound();
7734 }
7735 EndCommandBuffer();
7736 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
7737 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7738
7739 // positive overlapping range tests with cmd
7740 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = {{
7741 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, ""},
7742 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4}, ""},
7743 {{VK_SHADER_STAGE_VERTEX_BIT, 20, 12}, ""},
7744 {{VK_SHADER_STAGE_VERTEX_BIT, 56, 36}, ""},
7745 }};
7746 const VkPushConstantRange pc_range4[] = {
7747 {VK_SHADER_STAGE_VERTEX_BIT, 0, 64},
7748 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
7749 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7750 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7751 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
7752 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
7753 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
7754 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
7755 };
7756 pipeline_layout_ci.pushConstantRangeCount =
7757 sizeof(pc_range4) / sizeof(VkPushConstantRange);
7758 pipeline_layout_ci.pPushConstantRanges = pc_range4;
7759 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7760 &pipeline_layout);
7761 ASSERT_VK_SUCCESS(err);
7762 BeginCommandBuffer();
7763 for (const auto &iter : cmd_overlap_tests_pos) {
7764 m_errorMonitor->ExpectSuccess();
7765 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
7766 iter.range.stageFlags, iter.range.offset,
7767 iter.range.size, dummy_values);
7768 m_errorMonitor->VerifyNotFound();
7769 }
7770 EndCommandBuffer();
7771 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007772 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7773}
7774
Karl Schultz6addd812016-02-02 17:17:23 -07007775TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007776 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007777 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007778
7779 ASSERT_NO_FATAL_FAILURE(InitState());
7780 ASSERT_NO_FATAL_FAILURE(InitViewport());
7781 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7782
Mike Stroyanb8a61002016-06-20 16:00:28 -06007783 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
7784 VkImageTiling tiling;
7785 VkFormatProperties format_properties;
7786 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
7787 if (format_properties.linearTilingFeatures &
7788 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
7789 tiling = VK_IMAGE_TILING_LINEAR;
7790 } else if (format_properties.optimalTilingFeatures &
7791 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
7792 tiling = VK_IMAGE_TILING_OPTIMAL;
7793 } else {
7794 printf("Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
7795 "skipped.\n");
7796 return;
7797 }
7798
Tobin Ehlis559c6382015-11-05 09:52:49 -07007799 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7800 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007801 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7802 ds_type_count[0].descriptorCount = 10;
7803 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7804 ds_type_count[1].descriptorCount = 2;
7805 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7806 ds_type_count[2].descriptorCount = 2;
7807 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7808 ds_type_count[3].descriptorCount = 5;
7809 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7810 // type
7811 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7812 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7813 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007814
7815 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007816 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7817 ds_pool_ci.pNext = NULL;
7818 ds_pool_ci.maxSets = 5;
7819 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7820 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007821
7822 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007823 err =
7824 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007825 ASSERT_VK_SUCCESS(err);
7826
7827 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7828 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007829 dsl_binding[0].binding = 0;
7830 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7831 dsl_binding[0].descriptorCount = 5;
7832 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7833 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007834
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007835 // Create layout identical to set0 layout but w/ different stageFlags
7836 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007837 dsl_fs_stage_only.binding = 0;
7838 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7839 dsl_fs_stage_only.descriptorCount = 5;
7840 dsl_fs_stage_only.stageFlags =
7841 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7842 // bind time
7843 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007844 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007845 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7846 ds_layout_ci.pNext = NULL;
7847 ds_layout_ci.bindingCount = 1;
7848 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007849 static const uint32_t NUM_LAYOUTS = 4;
7850 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007851 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007852 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7853 // layout for error case
7854 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7855 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007856 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007857 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07007858 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7859 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007860 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007861 dsl_binding[0].binding = 0;
7862 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007863 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007864 dsl_binding[1].binding = 1;
7865 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7866 dsl_binding[1].descriptorCount = 2;
7867 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7868 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007869 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007870 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07007871 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7872 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007873 ASSERT_VK_SUCCESS(err);
7874 dsl_binding[0].binding = 0;
7875 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007876 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007877 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007878 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7879 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007880 ASSERT_VK_SUCCESS(err);
7881 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007882 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07007883 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7884 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007885 ASSERT_VK_SUCCESS(err);
7886
7887 static const uint32_t NUM_SETS = 4;
7888 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7889 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007890 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007891 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007892 alloc_info.descriptorPool = ds_pool;
7893 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007894 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7895 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007896 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007897 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007898 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007899 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07007900 err =
7901 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007902 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007903
7904 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007905 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7906 pipeline_layout_ci.pNext = NULL;
7907 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7908 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007909
7910 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007911 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7912 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007913 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007914 // Create pipelineLayout with only one setLayout
7915 pipeline_layout_ci.setLayoutCount = 1;
7916 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007917 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7918 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007919 ASSERT_VK_SUCCESS(err);
7920 // Create pipelineLayout with 2 descriptor setLayout at index 0
7921 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7922 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07007923 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7924 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007925 ASSERT_VK_SUCCESS(err);
7926 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7927 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7928 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07007929 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7930 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007931 ASSERT_VK_SUCCESS(err);
7932 // Create pipelineLayout with UB type, but stageFlags for FS only
7933 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7934 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07007935 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7936 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007937 ASSERT_VK_SUCCESS(err);
7938 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7939 VkDescriptorSetLayout pl_bad_s0[2] = {};
7940 pl_bad_s0[0] = ds_layout_fs_only;
7941 pl_bad_s0[1] = ds_layout[1];
7942 pipeline_layout_ci.setLayoutCount = 2;
7943 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7944 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07007945 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7946 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007947 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007948
7949 // Create a buffer to update the descriptor with
7950 uint32_t qfi = 0;
7951 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007952 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7953 buffCI.size = 1024;
7954 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7955 buffCI.queueFamilyIndexCount = 1;
7956 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007957
7958 VkBuffer dyub;
7959 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7960 ASSERT_VK_SUCCESS(err);
7961 // Correctly update descriptor to avoid "NOT_UPDATED" error
7962 static const uint32_t NUM_BUFFS = 5;
7963 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007964 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007965 buffInfo[i].buffer = dyub;
7966 buffInfo[i].offset = 0;
7967 buffInfo[i].range = 1024;
7968 }
Karl Schultz6addd812016-02-02 17:17:23 -07007969 VkImage image;
Karl Schultz6addd812016-02-02 17:17:23 -07007970 const int32_t tex_width = 32;
7971 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007972 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007973 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7974 image_create_info.pNext = NULL;
7975 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7976 image_create_info.format = tex_format;
7977 image_create_info.extent.width = tex_width;
7978 image_create_info.extent.height = tex_height;
7979 image_create_info.extent.depth = 1;
7980 image_create_info.mipLevels = 1;
7981 image_create_info.arrayLayers = 1;
7982 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyanb8a61002016-06-20 16:00:28 -06007983 image_create_info.tiling = tiling;
7984 image_create_info.usage =
7985 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07007986 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007987 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7988 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007989
Karl Schultz6addd812016-02-02 17:17:23 -07007990 VkMemoryRequirements memReqs;
7991 VkDeviceMemory imageMem;
7992 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007993 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007994 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7995 memAlloc.pNext = NULL;
7996 memAlloc.allocationSize = 0;
7997 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007998 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
7999 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07008000 pass =
8001 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07008002 ASSERT_TRUE(pass);
8003 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
8004 ASSERT_VK_SUCCESS(err);
8005 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
8006 ASSERT_VK_SUCCESS(err);
8007
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008008 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008009 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
8010 image_view_create_info.image = image;
8011 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
8012 image_view_create_info.format = tex_format;
8013 image_view_create_info.subresourceRange.layerCount = 1;
8014 image_view_create_info.subresourceRange.baseMipLevel = 0;
8015 image_view_create_info.subresourceRange.levelCount = 1;
8016 image_view_create_info.subresourceRange.aspectMask =
8017 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07008018
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008019 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07008020 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
8021 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008022 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008023 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008024 imageInfo[0].imageView = view;
8025 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
8026 imageInfo[1].imageView = view;
8027 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008028 imageInfo[2].imageView = view;
8029 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
8030 imageInfo[3].imageView = view;
8031 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008032
8033 static const uint32_t NUM_SET_UPDATES = 3;
8034 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
8035 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8036 descriptor_write[0].dstSet = descriptorSet[0];
8037 descriptor_write[0].dstBinding = 0;
8038 descriptor_write[0].descriptorCount = 5;
8039 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8040 descriptor_write[0].pBufferInfo = buffInfo;
8041 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8042 descriptor_write[1].dstSet = descriptorSet[1];
8043 descriptor_write[1].dstBinding = 0;
8044 descriptor_write[1].descriptorCount = 2;
8045 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
8046 descriptor_write[1].pImageInfo = imageInfo;
8047 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
8048 descriptor_write[2].dstSet = descriptorSet[1];
8049 descriptor_write[2].dstBinding = 1;
8050 descriptor_write[2].descriptorCount = 2;
8051 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008052 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008053
8054 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008055
Tobin Ehlis88452832015-12-03 09:40:56 -07008056 // Create PSO to be used for draw-time errors below
8057 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12008058 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07008059 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07008060 "out gl_PerVertex {\n"
8061 " vec4 gl_Position;\n"
8062 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07008063 "void main(){\n"
8064 " gl_Position = vec4(1);\n"
8065 "}\n";
8066 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12008067 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07008068 "\n"
8069 "layout(location=0) out vec4 x;\n"
8070 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
8071 "void main(){\n"
8072 " x = vec4(bar.y);\n"
8073 "}\n";
8074 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8075 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008076 VkPipelineObj pipe(m_device);
8077 pipe.AddShader(&vs);
8078 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07008079 pipe.AddColorAttachment();
8080 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07008081
8082 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07008083
Karl Schultz6addd812016-02-02 17:17:23 -07008084 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8085 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
8086 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
8087 // of PSO
8088 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
8089 // cmd_pipeline.c
8090 // due to the fact that cmd_alloc_dset_data() has not been called in
8091 // cmd_bind_graphics_pipeline()
8092 // TODO : Want to cause various binding incompatibility issues here to test
8093 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07008094 // First cause various verify_layout_compatibility() fails
8095 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008096 // verify_set_layout_compatibility fail cases:
8097 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07008098 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski01714f52016-07-06 09:35:04 -06008099 "Invalid Pipeline Layout Object ");
Karl Schultz6addd812016-02-02 17:17:23 -07008100 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8101 VK_PIPELINE_BIND_POINT_GRAPHICS,
8102 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
8103 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008104 m_errorMonitor->VerifyFound();
8105
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008106 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07008107 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8108 " attempting to bind set to index 1");
8109 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8110 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
8111 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008112 m_errorMonitor->VerifyFound();
8113
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008114 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008115 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
8116 // descriptors
8117 m_errorMonitor->SetDesiredFailureMsg(
8118 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06008119 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07008120 vkCmdBindDescriptorSets(
8121 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8122 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008123 m_errorMonitor->VerifyFound();
8124
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008125 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
8126 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07008127 m_errorMonitor->SetDesiredFailureMsg(
8128 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06008129 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07008130 vkCmdBindDescriptorSets(
8131 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8132 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008133 m_errorMonitor->VerifyFound();
8134
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008135 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
8136 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07008137 m_errorMonitor->SetDesiredFailureMsg(
8138 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06008139 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07008140 vkCmdBindDescriptorSets(
8141 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8142 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008143 m_errorMonitor->VerifyFound();
8144
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008145 // Cause INFO messages due to disturbing previously bound Sets
8146 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07008147 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8148 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8149 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008150 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07008151 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008152 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008153 " previously bound as set #0 was disturbed ");
8154 vkCmdBindDescriptorSets(
8155 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8156 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008157 m_errorMonitor->VerifyFound();
8158
Karl Schultz6addd812016-02-02 17:17:23 -07008159 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8160 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8161 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008162 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07008163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008164 " newly bound as set #0 so set #1 and "
8165 "any subsequent sets were disturbed ");
8166 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8167 VK_PIPELINE_BIND_POINT_GRAPHICS,
8168 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008169 m_errorMonitor->VerifyFound();
8170
Tobin Ehlis10fad692016-07-07 12:00:36 -06008171 // Now that we're done actively using the pipelineLayout that gfx pipeline
8172 // was created with, we should be able to delete it. Do that now to verify
8173 // that validation obeys pipelineLayout lifetime
8174 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
8175
Tobin Ehlis88452832015-12-03 09:40:56 -07008176 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07008177 // 1. Error due to not binding required set (we actually use same code as
8178 // above to disturb set0)
8179 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8180 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8181 2, &descriptorSet[0], 0, NULL);
8182 vkCmdBindDescriptorSets(
8183 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
8184 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
8185 m_errorMonitor->SetDesiredFailureMsg(
8186 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8187 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07008188 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008189 m_errorMonitor->VerifyFound();
8190
Tobin Ehlis991d45a2016-01-06 08:48:41 -07008191 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008192 // 2. Error due to bound set not being compatible with PSO's
8193 // VkPipelineLayout (diff stageFlags in this case)
8194 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
8195 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
8196 2, &descriptorSet[0], 0, NULL);
8197 m_errorMonitor->SetDesiredFailureMsg(
8198 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8199 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07008200 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008201 m_errorMonitor->VerifyFound();
8202
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008203 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07008204 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008205 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
8206 }
8207 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06008208 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
8209 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07008210 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008211 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8212 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008213 vkFreeMemory(m_device->device(), imageMem, NULL);
8214 vkDestroyImage(m_device->device(), image, NULL);
8215 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07008216}
Tobin Ehlis559c6382015-11-05 09:52:49 -07008217
Karl Schultz6addd812016-02-02 17:17:23 -07008218TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008219
Karl Schultz6addd812016-02-02 17:17:23 -07008220 m_errorMonitor->SetDesiredFailureMsg(
8221 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008222 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008223
8224 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008225 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008226 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008227 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008228
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008229 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008230}
8231
Karl Schultz6addd812016-02-02 17:17:23 -07008232TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
8233 VkResult err;
8234 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008235
Karl Schultz6addd812016-02-02 17:17:23 -07008236 m_errorMonitor->SetDesiredFailureMsg(
8237 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07008238 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008239
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008240 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008241
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008242 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008243 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06008244 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008245 cmd.commandPool = m_commandPool;
8246 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008247 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06008248
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008249 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06008250 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008251
8252 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008253 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07008254 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008255 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06008256 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008257 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
8258 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008259 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008260
8261 // The error should be caught by validation of the BeginCommandBuffer call
8262 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
8263
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008264 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008265 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06008266}
8267
Karl Schultz6addd812016-02-02 17:17:23 -07008268TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008269 // Cause error due to Begin while recording CB
8270 // Then cause 2 errors for attempting to reset CB w/o having
8271 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
8272 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008273 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008274 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008275
8276 ASSERT_NO_FATAL_FAILURE(InitState());
8277
8278 // Calls AllocateCommandBuffers
8279 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
8280
Karl Schultz6addd812016-02-02 17:17:23 -07008281 // Force the failure by setting the Renderpass and Framebuffer fields with
8282 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008283 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07008284 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008285 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8286 cmd_buf_info.pNext = NULL;
8287 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008288 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008289
8290 // Begin CB to transition to recording state
8291 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
8292 // Can't re-begin. This should trigger error
8293 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008294 m_errorMonitor->VerifyFound();
8295
Karl Schultz6addd812016-02-02 17:17:23 -07008296 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8297 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008298 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
8299 // Reset attempt will trigger error due to incorrect CommandPool state
8300 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008301 m_errorMonitor->VerifyFound();
8302
Karl Schultz6addd812016-02-02 17:17:23 -07008303 m_errorMonitor->SetDesiredFailureMsg(
8304 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8305 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008306 // Transition CB to RECORDED state
8307 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
8308 // Now attempting to Begin will implicitly reset, which triggers error
8309 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008310 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008311}
8312
Karl Schultz6addd812016-02-02 17:17:23 -07008313TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008314 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07008315 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008316
Karl Schultz6addd812016-02-02 17:17:23 -07008317 m_errorMonitor->SetDesiredFailureMsg(
8318 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008319 "Invalid Pipeline CreateInfo State: Vtx Shader required");
8320
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008321 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008322 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008323
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008324 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008325 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8326 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06008327
8328 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008329 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8330 ds_pool_ci.pNext = NULL;
8331 ds_pool_ci.maxSets = 1;
8332 ds_pool_ci.poolSizeCount = 1;
8333 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008334
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008335 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008336 err =
8337 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008338 ASSERT_VK_SUCCESS(err);
8339
Tony Barboureb254902015-07-15 12:50:33 -06008340 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008341 dsl_binding.binding = 0;
8342 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8343 dsl_binding.descriptorCount = 1;
8344 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8345 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008346
Tony Barboureb254902015-07-15 12:50:33 -06008347 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008348 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8349 ds_layout_ci.pNext = NULL;
8350 ds_layout_ci.bindingCount = 1;
8351 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06008352
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008353 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008354 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8355 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008356 ASSERT_VK_SUCCESS(err);
8357
8358 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008359 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008360 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008361 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008362 alloc_info.descriptorPool = ds_pool;
8363 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008364 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8365 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008366 ASSERT_VK_SUCCESS(err);
8367
Tony Barboureb254902015-07-15 12:50:33 -06008368 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008369 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8370 pipeline_layout_ci.setLayoutCount = 1;
8371 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008372
8373 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008374 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8375 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008376 ASSERT_VK_SUCCESS(err);
8377
Tobin Ehlise68360f2015-10-01 11:15:13 -06008378 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008379 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06008380
8381 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008382 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8383 vp_state_ci.scissorCount = 1;
8384 vp_state_ci.pScissors = &sc;
8385 vp_state_ci.viewportCount = 1;
8386 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008387
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008388 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8389 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8390 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8391 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8392 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8393 rs_state_ci.depthClampEnable = VK_FALSE;
8394 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8395 rs_state_ci.depthBiasEnable = VK_FALSE;
8396
Tony Barboureb254902015-07-15 12:50:33 -06008397 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008398 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8399 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008400 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008401 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8402 gp_ci.layout = pipeline_layout;
8403 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06008404
8405 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008406 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8407 pc_ci.initialDataSize = 0;
8408 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008409
8410 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06008411 VkPipelineCache pipelineCache;
8412
Karl Schultz6addd812016-02-02 17:17:23 -07008413 err =
8414 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06008415 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008416 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8417 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008418
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008419 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008420
Chia-I Wuf7458c52015-10-26 21:10:41 +08008421 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8422 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8423 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8424 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008425}
Tobin Ehlis912df022015-09-17 08:46:18 -06008426/*// TODO : This test should be good, but needs Tess support in compiler to run
8427TEST_F(VkLayerTest, InvalidPatchControlPoints)
8428{
8429 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06008430 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008431
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008432 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008433 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
8434primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008435
Tobin Ehlis912df022015-09-17 08:46:18 -06008436 ASSERT_NO_FATAL_FAILURE(InitState());
8437 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06008438
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008439 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06008440 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008441 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008442
8443 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8444 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8445 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008446 ds_pool_ci.poolSizeCount = 1;
8447 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06008448
8449 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008450 err = vkCreateDescriptorPool(m_device->device(),
8451VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06008452 ASSERT_VK_SUCCESS(err);
8453
8454 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08008455 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06008456 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08008457 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008458 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8459 dsl_binding.pImmutableSamplers = NULL;
8460
8461 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008462 ds_layout_ci.sType =
8463VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06008464 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008465 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07008466 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06008467
8468 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008469 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8470&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06008471 ASSERT_VK_SUCCESS(err);
8472
8473 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07008474 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
8475VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06008476 ASSERT_VK_SUCCESS(err);
8477
8478 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008479 pipeline_layout_ci.sType =
8480VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06008481 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008482 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008483 pipeline_layout_ci.pSetLayouts = &ds_layout;
8484
8485 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008486 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8487&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06008488 ASSERT_VK_SUCCESS(err);
8489
8490 VkPipelineShaderStageCreateInfo shaderStages[3];
8491 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
8492
Karl Schultz6addd812016-02-02 17:17:23 -07008493 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
8494this);
Tobin Ehlis912df022015-09-17 08:46:18 -06008495 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07008496 VkShaderObj
8497tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
8498this);
8499 VkShaderObj
8500te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
8501this);
Tobin Ehlis912df022015-09-17 08:46:18 -06008502
Karl Schultz6addd812016-02-02 17:17:23 -07008503 shaderStages[0].sType =
8504VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008505 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008506 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07008507 shaderStages[1].sType =
8508VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008509 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008510 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07008511 shaderStages[2].sType =
8512VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008513 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008514 shaderStages[2].shader = te.handle();
8515
8516 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008517 iaCI.sType =
8518VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08008519 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06008520
8521 VkPipelineTessellationStateCreateInfo tsCI = {};
8522 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
8523 tsCI.patchControlPoints = 0; // This will cause an error
8524
8525 VkGraphicsPipelineCreateInfo gp_ci = {};
8526 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8527 gp_ci.pNext = NULL;
8528 gp_ci.stageCount = 3;
8529 gp_ci.pStages = shaderStages;
8530 gp_ci.pVertexInputState = NULL;
8531 gp_ci.pInputAssemblyState = &iaCI;
8532 gp_ci.pTessellationState = &tsCI;
8533 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008534 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06008535 gp_ci.pMultisampleState = NULL;
8536 gp_ci.pDepthStencilState = NULL;
8537 gp_ci.pColorBlendState = NULL;
8538 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8539 gp_ci.layout = pipeline_layout;
8540 gp_ci.renderPass = renderPass();
8541
8542 VkPipelineCacheCreateInfo pc_ci = {};
8543 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8544 pc_ci.pNext = NULL;
8545 pc_ci.initialSize = 0;
8546 pc_ci.initialData = 0;
8547 pc_ci.maxSize = 0;
8548
8549 VkPipeline pipeline;
8550 VkPipelineCache pipelineCache;
8551
Karl Schultz6addd812016-02-02 17:17:23 -07008552 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
8553&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06008554 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008555 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8556&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06008557
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008558 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008559
Chia-I Wuf7458c52015-10-26 21:10:41 +08008560 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8561 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8562 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8563 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06008564}
8565*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06008566// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07008567TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07008568 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008569
Karl Schultz6addd812016-02-02 17:17:23 -07008570 m_errorMonitor->SetDesiredFailureMsg(
8571 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008572 "Gfx Pipeline viewport count (1) must match scissor count (0).");
8573
Tobin Ehlise68360f2015-10-01 11:15:13 -06008574 ASSERT_NO_FATAL_FAILURE(InitState());
8575 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008576
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008577 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008578 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8579 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008580
8581 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008582 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8583 ds_pool_ci.maxSets = 1;
8584 ds_pool_ci.poolSizeCount = 1;
8585 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008586
8587 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008588 err =
8589 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008590 ASSERT_VK_SUCCESS(err);
8591
8592 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008593 dsl_binding.binding = 0;
8594 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8595 dsl_binding.descriptorCount = 1;
8596 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008597
8598 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008599 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8600 ds_layout_ci.bindingCount = 1;
8601 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008602
8603 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008604 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8605 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008606 ASSERT_VK_SUCCESS(err);
8607
8608 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008609 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008610 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008611 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008612 alloc_info.descriptorPool = ds_pool;
8613 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008614 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8615 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008616 ASSERT_VK_SUCCESS(err);
8617
8618 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008619 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8620 pipeline_layout_ci.setLayoutCount = 1;
8621 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008622
8623 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008624 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8625 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008626 ASSERT_VK_SUCCESS(err);
8627
8628 VkViewport vp = {}; // Just need dummy vp to point to
8629
8630 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008631 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8632 vp_state_ci.scissorCount = 0;
8633 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
8634 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008635
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008636 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8637 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8638 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8639 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8640 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8641 rs_state_ci.depthClampEnable = VK_FALSE;
8642 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8643 rs_state_ci.depthBiasEnable = VK_FALSE;
8644
Cody Northropeb3a6c12015-10-05 14:44:45 -06008645 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008646 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008647
Karl Schultz6addd812016-02-02 17:17:23 -07008648 VkShaderObj vs(m_device, bindStateVertShaderText,
8649 VK_SHADER_STAGE_VERTEX_BIT, this);
8650 VkShaderObj fs(m_device, bindStateFragShaderText,
8651 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008652 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008653 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008654 shaderStages[0] = vs.GetStageCreateInfo();
8655 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008656
8657 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008658 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8659 gp_ci.stageCount = 2;
8660 gp_ci.pStages = shaderStages;
8661 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008662 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008663 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8664 gp_ci.layout = pipeline_layout;
8665 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008666
8667 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008668 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008669
8670 VkPipeline pipeline;
8671 VkPipelineCache pipelineCache;
8672
Karl Schultz6addd812016-02-02 17:17:23 -07008673 err =
8674 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008675 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008676 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8677 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008678
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008679 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008680
Chia-I Wuf7458c52015-10-26 21:10:41 +08008681 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8682 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8683 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8684 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008685}
Karl Schultz6addd812016-02-02 17:17:23 -07008686// Don't set viewport state in PSO. This is an error b/c we always need this
8687// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06008688// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07008689TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06008690 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07008691 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008692
Karl Schultz6addd812016-02-02 17:17:23 -07008693 m_errorMonitor->SetDesiredFailureMsg(
8694 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008695 "Gfx Pipeline pViewportState is null. Even if ");
8696
Tobin Ehlise68360f2015-10-01 11:15:13 -06008697 ASSERT_NO_FATAL_FAILURE(InitState());
8698 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008699
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008700 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008701 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8702 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008703
8704 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008705 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8706 ds_pool_ci.maxSets = 1;
8707 ds_pool_ci.poolSizeCount = 1;
8708 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008709
8710 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008711 err =
8712 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008713 ASSERT_VK_SUCCESS(err);
8714
8715 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008716 dsl_binding.binding = 0;
8717 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8718 dsl_binding.descriptorCount = 1;
8719 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008720
8721 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008722 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8723 ds_layout_ci.bindingCount = 1;
8724 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008725
8726 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008727 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8728 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008729 ASSERT_VK_SUCCESS(err);
8730
8731 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008732 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008733 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008734 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008735 alloc_info.descriptorPool = ds_pool;
8736 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008737 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8738 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008739 ASSERT_VK_SUCCESS(err);
8740
8741 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008742 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8743 pipeline_layout_ci.setLayoutCount = 1;
8744 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008745
8746 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008747 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8748 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008749 ASSERT_VK_SUCCESS(err);
8750
8751 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8752 // Set scissor as dynamic to avoid second error
8753 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008754 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8755 dyn_state_ci.dynamicStateCount = 1;
8756 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008757
Cody Northropeb3a6c12015-10-05 14:44:45 -06008758 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008759 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008760
Karl Schultz6addd812016-02-02 17:17:23 -07008761 VkShaderObj vs(m_device, bindStateVertShaderText,
8762 VK_SHADER_STAGE_VERTEX_BIT, this);
8763 VkShaderObj fs(m_device, bindStateFragShaderText,
8764 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008765 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008766 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008767 shaderStages[0] = vs.GetStageCreateInfo();
8768 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008769
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008770
8771 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8772 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8773 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8774 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8775 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8776 rs_state_ci.depthClampEnable = VK_FALSE;
8777 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8778 rs_state_ci.depthBiasEnable = VK_FALSE;
8779
Tobin Ehlise68360f2015-10-01 11:15:13 -06008780 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008781 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8782 gp_ci.stageCount = 2;
8783 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008784 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008785 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
8786 // should cause validation error
8787 gp_ci.pDynamicState = &dyn_state_ci;
8788 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8789 gp_ci.layout = pipeline_layout;
8790 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008791
8792 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008793 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008794
8795 VkPipeline pipeline;
8796 VkPipelineCache pipelineCache;
8797
Karl Schultz6addd812016-02-02 17:17:23 -07008798 err =
8799 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008800 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008801 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8802 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008803
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008804 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008805
Chia-I Wuf7458c52015-10-26 21:10:41 +08008806 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8807 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8808 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8809 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008810}
8811// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07008812// Then run second test where dynamic scissor count doesn't match PSO scissor
8813// count
8814TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
8815 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008816
Karl Schultz6addd812016-02-02 17:17:23 -07008817 m_errorMonitor->SetDesiredFailureMsg(
8818 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008819 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
8820
Tobin Ehlise68360f2015-10-01 11:15:13 -06008821 ASSERT_NO_FATAL_FAILURE(InitState());
8822 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008823
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008824 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008825 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8826 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008827
8828 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008829 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8830 ds_pool_ci.maxSets = 1;
8831 ds_pool_ci.poolSizeCount = 1;
8832 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008833
8834 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008835 err =
8836 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008837 ASSERT_VK_SUCCESS(err);
8838
8839 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008840 dsl_binding.binding = 0;
8841 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8842 dsl_binding.descriptorCount = 1;
8843 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008844
8845 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008846 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8847 ds_layout_ci.bindingCount = 1;
8848 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008849
8850 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008851 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8852 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008853 ASSERT_VK_SUCCESS(err);
8854
8855 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008856 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008857 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008858 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008859 alloc_info.descriptorPool = ds_pool;
8860 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008861 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8862 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008863 ASSERT_VK_SUCCESS(err);
8864
8865 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008866 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8867 pipeline_layout_ci.setLayoutCount = 1;
8868 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008869
8870 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008871 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8872 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008873 ASSERT_VK_SUCCESS(err);
8874
8875 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008876 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8877 vp_state_ci.viewportCount = 1;
8878 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
8879 vp_state_ci.scissorCount = 1;
8880 vp_state_ci.pScissors =
8881 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008882
8883 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8884 // Set scissor as dynamic to avoid that error
8885 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008886 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8887 dyn_state_ci.dynamicStateCount = 1;
8888 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008889
Cody Northropeb3a6c12015-10-05 14:44:45 -06008890 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008891 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008892
Karl Schultz6addd812016-02-02 17:17:23 -07008893 VkShaderObj vs(m_device, bindStateVertShaderText,
8894 VK_SHADER_STAGE_VERTEX_BIT, this);
8895 VkShaderObj fs(m_device, bindStateFragShaderText,
8896 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008897 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008898 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008899 shaderStages[0] = vs.GetStageCreateInfo();
8900 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008901
Cody Northropf6622dc2015-10-06 10:33:21 -06008902 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8903 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8904 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008905 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008906 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008907 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008908 vi_ci.pVertexAttributeDescriptions = nullptr;
8909
8910 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8911 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8912 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8913
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008914 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008915 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06008916 rs_ci.pNext = nullptr;
8917
Mark Youngc89c6312016-03-31 16:03:20 -06008918 VkPipelineColorBlendAttachmentState att = {};
8919 att.blendEnable = VK_FALSE;
8920 att.colorWriteMask = 0xf;
8921
Cody Northropf6622dc2015-10-06 10:33:21 -06008922 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8923 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8924 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008925 cb_ci.attachmentCount = 1;
8926 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008927
Tobin Ehlise68360f2015-10-01 11:15:13 -06008928 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008929 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8930 gp_ci.stageCount = 2;
8931 gp_ci.pStages = shaderStages;
8932 gp_ci.pVertexInputState = &vi_ci;
8933 gp_ci.pInputAssemblyState = &ia_ci;
8934 gp_ci.pViewportState = &vp_state_ci;
8935 gp_ci.pRasterizationState = &rs_ci;
8936 gp_ci.pColorBlendState = &cb_ci;
8937 gp_ci.pDynamicState = &dyn_state_ci;
8938 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8939 gp_ci.layout = pipeline_layout;
8940 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008941
8942 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008943 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008944
8945 VkPipeline pipeline;
8946 VkPipelineCache pipelineCache;
8947
Karl Schultz6addd812016-02-02 17:17:23 -07008948 err =
8949 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008950 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008951 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8952 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008953
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008954 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008955
Tobin Ehlisd332f282015-10-02 11:00:56 -06008956 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008957 // First need to successfully create the PSO from above by setting
8958 // pViewports
8959 m_errorMonitor->SetDesiredFailureMsg(
8960 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8961 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
8962 "scissorCount is 1. These counts must match.");
8963
8964 VkViewport vp = {}; // Just need dummy vp to point to
8965 vp_state_ci.pViewports = &vp;
8966 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8967 &gp_ci, NULL, &pipeline);
8968 ASSERT_VK_SUCCESS(err);
8969 BeginCommandBuffer();
8970 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8971 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
8972 VkRect2D scissors[2] = {}; // don't care about data
8973 // Count of 2 doesn't match PSO count of 1
8974 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
8975 Draw(1, 0, 0, 0);
8976
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008977 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008978
8979 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8980 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8981 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8982 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008983 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008984}
8985// Create PSO w/o non-zero scissorCount but no scissor data
8986// Then run second test where dynamic viewportCount doesn't match PSO
8987// viewportCount
8988TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8989 VkResult err;
8990
8991 m_errorMonitor->SetDesiredFailureMsg(
8992 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8993 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
8994
8995 ASSERT_NO_FATAL_FAILURE(InitState());
8996 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8997
8998 VkDescriptorPoolSize ds_type_count = {};
8999 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9000 ds_type_count.descriptorCount = 1;
9001
9002 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9003 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9004 ds_pool_ci.maxSets = 1;
9005 ds_pool_ci.poolSizeCount = 1;
9006 ds_pool_ci.pPoolSizes = &ds_type_count;
9007
9008 VkDescriptorPool ds_pool;
9009 err =
9010 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9011 ASSERT_VK_SUCCESS(err);
9012
9013 VkDescriptorSetLayoutBinding dsl_binding = {};
9014 dsl_binding.binding = 0;
9015 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9016 dsl_binding.descriptorCount = 1;
9017 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9018
9019 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9020 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9021 ds_layout_ci.bindingCount = 1;
9022 ds_layout_ci.pBindings = &dsl_binding;
9023
9024 VkDescriptorSetLayout ds_layout;
9025 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9026 &ds_layout);
9027 ASSERT_VK_SUCCESS(err);
9028
9029 VkDescriptorSet descriptorSet;
9030 VkDescriptorSetAllocateInfo alloc_info = {};
9031 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9032 alloc_info.descriptorSetCount = 1;
9033 alloc_info.descriptorPool = ds_pool;
9034 alloc_info.pSetLayouts = &ds_layout;
9035 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9036 &descriptorSet);
9037 ASSERT_VK_SUCCESS(err);
9038
9039 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
9040 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9041 pipeline_layout_ci.setLayoutCount = 1;
9042 pipeline_layout_ci.pSetLayouts = &ds_layout;
9043
9044 VkPipelineLayout pipeline_layout;
9045 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9046 &pipeline_layout);
9047 ASSERT_VK_SUCCESS(err);
9048
9049 VkPipelineViewportStateCreateInfo vp_state_ci = {};
9050 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9051 vp_state_ci.scissorCount = 1;
9052 vp_state_ci.pScissors =
9053 NULL; // Null scissor w/ count of 1 should cause error
9054 vp_state_ci.viewportCount = 1;
9055 vp_state_ci.pViewports =
9056 NULL; // vp is dynamic (below) so this won't cause error
9057
9058 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
9059 // Set scissor as dynamic to avoid that error
9060 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
9061 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9062 dyn_state_ci.dynamicStateCount = 1;
9063 dyn_state_ci.pDynamicStates = &vp_state;
9064
9065 VkPipelineShaderStageCreateInfo shaderStages[2];
9066 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
9067
9068 VkShaderObj vs(m_device, bindStateVertShaderText,
9069 VK_SHADER_STAGE_VERTEX_BIT, this);
9070 VkShaderObj fs(m_device, bindStateFragShaderText,
9071 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06009072 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07009073 // but add it to be able to run on more devices
9074 shaderStages[0] = vs.GetStageCreateInfo();
9075 shaderStages[1] = fs.GetStageCreateInfo();
9076
9077 VkPipelineVertexInputStateCreateInfo vi_ci = {};
9078 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9079 vi_ci.pNext = nullptr;
9080 vi_ci.vertexBindingDescriptionCount = 0;
9081 vi_ci.pVertexBindingDescriptions = nullptr;
9082 vi_ci.vertexAttributeDescriptionCount = 0;
9083 vi_ci.pVertexAttributeDescriptions = nullptr;
9084
9085 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
9086 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9087 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9088
9089 VkPipelineRasterizationStateCreateInfo rs_ci = {};
9090 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9091 rs_ci.pNext = nullptr;
9092
Mark Youngc89c6312016-03-31 16:03:20 -06009093 VkPipelineColorBlendAttachmentState att = {};
9094 att.blendEnable = VK_FALSE;
9095 att.colorWriteMask = 0xf;
9096
Karl Schultz6addd812016-02-02 17:17:23 -07009097 VkPipelineColorBlendStateCreateInfo cb_ci = {};
9098 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
9099 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06009100 cb_ci.attachmentCount = 1;
9101 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07009102
9103 VkGraphicsPipelineCreateInfo gp_ci = {};
9104 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9105 gp_ci.stageCount = 2;
9106 gp_ci.pStages = shaderStages;
9107 gp_ci.pVertexInputState = &vi_ci;
9108 gp_ci.pInputAssemblyState = &ia_ci;
9109 gp_ci.pViewportState = &vp_state_ci;
9110 gp_ci.pRasterizationState = &rs_ci;
9111 gp_ci.pColorBlendState = &cb_ci;
9112 gp_ci.pDynamicState = &dyn_state_ci;
9113 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9114 gp_ci.layout = pipeline_layout;
9115 gp_ci.renderPass = renderPass();
9116
9117 VkPipelineCacheCreateInfo pc_ci = {};
9118 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9119
9120 VkPipeline pipeline;
9121 VkPipelineCache pipelineCache;
9122
9123 err =
9124 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9125 ASSERT_VK_SUCCESS(err);
9126 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9127 &gp_ci, NULL, &pipeline);
9128
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009129 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07009130
9131 // Now hit second fail case where we set scissor w/ different count than PSO
9132 // First need to successfully create the PSO from above by setting
9133 // pViewports
9134 m_errorMonitor->SetDesiredFailureMsg(
9135 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9136 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
9137 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009138
Tobin Ehlisd332f282015-10-02 11:00:56 -06009139 VkRect2D sc = {}; // Just need dummy vp to point to
9140 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07009141 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9142 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06009143 ASSERT_VK_SUCCESS(err);
9144 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009145 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9146 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06009147 VkViewport viewports[2] = {}; // don't care about data
9148 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07009149 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06009150 Draw(1, 0, 0, 0);
9151
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009152 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06009153
Chia-I Wuf7458c52015-10-26 21:10:41 +08009154 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9155 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9156 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9157 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009158 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06009159}
9160
Mark Young7394fdd2016-03-31 14:56:43 -06009161TEST_F(VkLayerTest, PSOLineWidthInvalid) {
9162 VkResult err;
9163
9164 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06009165 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06009166
9167 ASSERT_NO_FATAL_FAILURE(InitState());
9168 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9169
9170 VkDescriptorPoolSize ds_type_count = {};
9171 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9172 ds_type_count.descriptorCount = 1;
9173
9174 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9175 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9176 ds_pool_ci.maxSets = 1;
9177 ds_pool_ci.poolSizeCount = 1;
9178 ds_pool_ci.pPoolSizes = &ds_type_count;
9179
9180 VkDescriptorPool ds_pool;
9181 err =
9182 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9183 ASSERT_VK_SUCCESS(err);
9184
9185 VkDescriptorSetLayoutBinding dsl_binding = {};
9186 dsl_binding.binding = 0;
9187 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9188 dsl_binding.descriptorCount = 1;
9189 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9190
9191 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9192 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9193 ds_layout_ci.bindingCount = 1;
9194 ds_layout_ci.pBindings = &dsl_binding;
9195
9196 VkDescriptorSetLayout ds_layout;
9197 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9198 &ds_layout);
9199 ASSERT_VK_SUCCESS(err);
9200
9201 VkDescriptorSet descriptorSet;
9202 VkDescriptorSetAllocateInfo alloc_info = {};
9203 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9204 alloc_info.descriptorSetCount = 1;
9205 alloc_info.descriptorPool = ds_pool;
9206 alloc_info.pSetLayouts = &ds_layout;
9207 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9208 &descriptorSet);
9209 ASSERT_VK_SUCCESS(err);
9210
9211 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
9212 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9213 pipeline_layout_ci.setLayoutCount = 1;
9214 pipeline_layout_ci.pSetLayouts = &ds_layout;
9215
9216 VkPipelineLayout pipeline_layout;
9217 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
9218 &pipeline_layout);
9219 ASSERT_VK_SUCCESS(err);
9220
9221 VkPipelineViewportStateCreateInfo vp_state_ci = {};
9222 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9223 vp_state_ci.scissorCount = 1;
9224 vp_state_ci.pScissors = NULL;
9225 vp_state_ci.viewportCount = 1;
9226 vp_state_ci.pViewports = NULL;
9227
9228 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
9229 VK_DYNAMIC_STATE_SCISSOR,
9230 VK_DYNAMIC_STATE_LINE_WIDTH};
9231 // Set scissor as dynamic to avoid that error
9232 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
9233 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
9234 dyn_state_ci.dynamicStateCount = 2;
9235 dyn_state_ci.pDynamicStates = dynamic_states;
9236
9237 VkPipelineShaderStageCreateInfo shaderStages[2];
9238 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
9239
9240 VkShaderObj vs(m_device, bindStateVertShaderText,
9241 VK_SHADER_STAGE_VERTEX_BIT, this);
9242 VkShaderObj fs(m_device, bindStateFragShaderText,
9243 VK_SHADER_STAGE_FRAGMENT_BIT,
9244 this); // TODO - We shouldn't need a fragment shader
9245 // but add it to be able to run on more devices
9246 shaderStages[0] = vs.GetStageCreateInfo();
9247 shaderStages[1] = fs.GetStageCreateInfo();
9248
9249 VkPipelineVertexInputStateCreateInfo vi_ci = {};
9250 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9251 vi_ci.pNext = nullptr;
9252 vi_ci.vertexBindingDescriptionCount = 0;
9253 vi_ci.pVertexBindingDescriptions = nullptr;
9254 vi_ci.vertexAttributeDescriptionCount = 0;
9255 vi_ci.pVertexAttributeDescriptions = nullptr;
9256
9257 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
9258 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9259 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9260
9261 VkPipelineRasterizationStateCreateInfo rs_ci = {};
9262 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9263 rs_ci.pNext = nullptr;
9264
Mark Young47107952016-05-02 15:59:55 -06009265 // Check too low (line width of -1.0f).
9266 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06009267
9268 VkPipelineColorBlendAttachmentState att = {};
9269 att.blendEnable = VK_FALSE;
9270 att.colorWriteMask = 0xf;
9271
9272 VkPipelineColorBlendStateCreateInfo cb_ci = {};
9273 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
9274 cb_ci.pNext = nullptr;
9275 cb_ci.attachmentCount = 1;
9276 cb_ci.pAttachments = &att;
9277
9278 VkGraphicsPipelineCreateInfo gp_ci = {};
9279 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9280 gp_ci.stageCount = 2;
9281 gp_ci.pStages = shaderStages;
9282 gp_ci.pVertexInputState = &vi_ci;
9283 gp_ci.pInputAssemblyState = &ia_ci;
9284 gp_ci.pViewportState = &vp_state_ci;
9285 gp_ci.pRasterizationState = &rs_ci;
9286 gp_ci.pColorBlendState = &cb_ci;
9287 gp_ci.pDynamicState = &dyn_state_ci;
9288 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9289 gp_ci.layout = pipeline_layout;
9290 gp_ci.renderPass = renderPass();
9291
9292 VkPipelineCacheCreateInfo pc_ci = {};
9293 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9294
9295 VkPipeline pipeline;
9296 VkPipelineCache pipelineCache;
9297
9298 err =
9299 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9300 ASSERT_VK_SUCCESS(err);
9301 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9302 &gp_ci, NULL, &pipeline);
9303
9304 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009305 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009306
9307 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9308 "Attempt to set lineWidth to 65536");
9309
9310 // Check too high (line width of 65536.0f).
9311 rs_ci.lineWidth = 65536.0f;
9312
9313 err =
9314 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9315 ASSERT_VK_SUCCESS(err);
9316 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9317 &gp_ci, NULL, &pipeline);
9318
9319 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009320 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009321
9322 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06009323 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06009324
9325 dyn_state_ci.dynamicStateCount = 3;
9326
9327 rs_ci.lineWidth = 1.0f;
9328
9329 err =
9330 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9331 ASSERT_VK_SUCCESS(err);
9332 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9333 &gp_ci, NULL, &pipeline);
9334 BeginCommandBuffer();
9335 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9336 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
9337
9338 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06009339 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06009340 m_errorMonitor->VerifyFound();
9341
9342 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9343 "Attempt to set lineWidth to 65536");
9344
9345 // Check too high with dynamic setting.
9346 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
9347 m_errorMonitor->VerifyFound();
9348 EndCommandBuffer();
9349
9350 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9351 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9352 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9353 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009354 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009355}
9356
Karl Schultz6addd812016-02-02 17:17:23 -07009357TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009358 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009359 m_errorMonitor->SetDesiredFailureMsg(
9360 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009361 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009362
9363 ASSERT_NO_FATAL_FAILURE(InitState());
9364 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009365
Tony Barbourfe3351b2015-07-28 10:17:20 -06009366 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009367 // Don't care about RenderPass handle b/c error should be flagged before
9368 // that
9369 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
9370 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009371
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009372 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009373}
9374
Karl Schultz6addd812016-02-02 17:17:23 -07009375TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009376 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009377 m_errorMonitor->SetDesiredFailureMsg(
9378 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009379 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009380
9381 ASSERT_NO_FATAL_FAILURE(InitState());
9382 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009383
Tony Barbourfe3351b2015-07-28 10:17:20 -06009384 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009385 // Just create a dummy Renderpass that's non-NULL so we can get to the
9386 // proper error
Chris Forbes38ae7c42016-06-21 20:51:44 +12009387 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
Karl Schultz6addd812016-02-02 17:17:23 -07009388 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009389
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009390 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009391}
9392
Chris Forbes2eeabe32016-06-21 20:52:34 +12009393TEST_F(VkLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
9394 m_errorMonitor->ExpectSuccess();
9395
9396 ASSERT_NO_FATAL_FAILURE(InitState());
9397 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9398
9399 BeginCommandBuffer(); // framework implicitly begins the renderpass.
9400 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // end implicit.
9401
9402 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
9403 VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9404 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9405 m_errorMonitor->VerifyNotFound();
9406 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
9407 VK_SUBPASS_CONTENTS_INLINE);
9408 m_errorMonitor->VerifyNotFound();
9409 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9410 m_errorMonitor->VerifyNotFound();
9411
9412 m_commandBuffer->EndCommandBuffer();
9413 m_errorMonitor->VerifyNotFound();
9414}
9415
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009416TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
9417 TEST_DESCRIPTION("Begin a renderPass where clearValueCount is less than"
9418 "the number of renderPass attachments that use loadOp"
9419 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
9420
9421 ASSERT_NO_FATAL_FAILURE(InitState());
9422 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9423
9424 // Create a renderPass with a single attachment that uses loadOp CLEAR
9425 VkAttachmentReference attach = {};
9426 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
9427 VkSubpassDescription subpass = {};
9428 subpass.inputAttachmentCount = 1;
9429 subpass.pInputAttachments = &attach;
9430 VkRenderPassCreateInfo rpci = {};
9431 rpci.subpassCount = 1;
9432 rpci.pSubpasses = &subpass;
9433 rpci.attachmentCount = 1;
9434 VkAttachmentDescription attach_desc = {};
9435 attach_desc.format = VK_FORMAT_UNDEFINED;
9436 // Set loadOp to CLEAR
9437 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
9438 rpci.pAttachments = &attach_desc;
9439 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9440 VkRenderPass rp;
9441 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
9442
9443 VkCommandBufferInheritanceInfo hinfo = {};
9444 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
9445 hinfo.renderPass = VK_NULL_HANDLE;
9446 hinfo.subpass = 0;
9447 hinfo.framebuffer = VK_NULL_HANDLE;
9448 hinfo.occlusionQueryEnable = VK_FALSE;
9449 hinfo.queryFlags = 0;
9450 hinfo.pipelineStatistics = 0;
9451 VkCommandBufferBeginInfo info = {};
9452 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
9453 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9454 info.pInheritanceInfo = &hinfo;
9455
9456 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
9457 VkRenderPassBeginInfo rp_begin = {};
9458 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
9459 rp_begin.pNext = NULL;
9460 rp_begin.renderPass = renderPass();
9461 rp_begin.framebuffer = framebuffer();
9462 rp_begin.clearValueCount = 0; // Should be 1
9463
9464 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis7f0416c2016-07-15 16:01:13 -06009465 " has a clearValueCount of 0 but "
9466 "there must be at least 1 entries in "
9467 "pClearValues array to account for ");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009468
9469 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
9470 VK_SUBPASS_CONTENTS_INLINE);
9471
9472 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06009473
9474 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009475}
9476
Cody Northrop3bb4d962016-05-09 16:15:57 -06009477TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
9478
9479 TEST_DESCRIPTION("End a command buffer with an active render pass");
9480
9481 m_errorMonitor->SetDesiredFailureMsg(
9482 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9483 "It is invalid to issue this call inside an active render pass");
9484
9485 ASSERT_NO_FATAL_FAILURE(InitState());
9486 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9487
9488 // The framework's BeginCommandBuffer calls CreateRenderPass
9489 BeginCommandBuffer();
9490
9491 // Call directly into vkEndCommandBuffer instead of the
9492 // the framework's EndCommandBuffer, which inserts a
9493 // vkEndRenderPass
9494 vkEndCommandBuffer(m_commandBuffer->GetBufferHandle());
9495
9496 m_errorMonitor->VerifyFound();
9497
9498 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
9499 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
9500}
9501
Karl Schultz6addd812016-02-02 17:17:23 -07009502TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009503 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07009504 m_errorMonitor->SetDesiredFailureMsg(
9505 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009506 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009507
9508 ASSERT_NO_FATAL_FAILURE(InitState());
9509 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009510
9511 // Renderpass is started here
9512 BeginCommandBuffer();
9513
9514 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009515 vk_testing::Buffer dstBuffer;
9516 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009517
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009518 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009519
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009520 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009521}
9522
Karl Schultz6addd812016-02-02 17:17:23 -07009523TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009524 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07009525 m_errorMonitor->SetDesiredFailureMsg(
9526 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009527 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009528
9529 ASSERT_NO_FATAL_FAILURE(InitState());
9530 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009531
9532 // Renderpass is started here
9533 BeginCommandBuffer();
9534
9535 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009536 vk_testing::Buffer dstBuffer;
9537 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009538
Karl Schultz6addd812016-02-02 17:17:23 -07009539 VkDeviceSize dstOffset = 0;
9540 VkDeviceSize dataSize = 1024;
Karl Schultzee344492016-07-11 15:09:57 -06009541 const void *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009542
Karl Schultz6addd812016-02-02 17:17:23 -07009543 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
9544 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009545
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009546 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009547}
9548
Karl Schultz6addd812016-02-02 17:17:23 -07009549TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009550 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009551 m_errorMonitor->SetDesiredFailureMsg(
9552 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009553 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009554
9555 ASSERT_NO_FATAL_FAILURE(InitState());
9556 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009557
9558 // Renderpass is started here
9559 BeginCommandBuffer();
9560
Michael Lentine0a369f62016-02-03 16:51:46 -06009561 VkClearColorValue clear_color;
9562 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07009563 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9564 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9565 const int32_t tex_width = 32;
9566 const int32_t tex_height = 32;
9567 VkImageCreateInfo image_create_info = {};
9568 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9569 image_create_info.pNext = NULL;
9570 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9571 image_create_info.format = tex_format;
9572 image_create_info.extent.width = tex_width;
9573 image_create_info.extent.height = tex_height;
9574 image_create_info.extent.depth = 1;
9575 image_create_info.mipLevels = 1;
9576 image_create_info.arrayLayers = 1;
9577 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9578 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9579 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009580
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009581 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07009582 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
9583 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009584
Karl Schultz6addd812016-02-02 17:17:23 -07009585 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
9586 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009587
Karl Schultz6addd812016-02-02 17:17:23 -07009588 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
9589 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009590
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009591 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009592}
9593
Karl Schultz6addd812016-02-02 17:17:23 -07009594TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009595 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009596 m_errorMonitor->SetDesiredFailureMsg(
9597 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009598 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009599
9600 ASSERT_NO_FATAL_FAILURE(InitState());
9601 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009602
9603 // Renderpass is started here
9604 BeginCommandBuffer();
9605
9606 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07009607 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009608 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
9609 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9610 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
9611 image_create_info.extent.width = 64;
9612 image_create_info.extent.height = 64;
9613 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9614 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009615
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009616 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07009617 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
9618 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009619
Karl Schultz6addd812016-02-02 17:17:23 -07009620 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
9621 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009622
Karl Schultz6addd812016-02-02 17:17:23 -07009623 vkCmdClearDepthStencilImage(
9624 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
9625 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
9626 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009627
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009628 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009629}
9630
Karl Schultz6addd812016-02-02 17:17:23 -07009631TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009632 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009633 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009634
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009635 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -06009636 "vkCmdClearAttachments(): This call "
Karl Schultz6addd812016-02-02 17:17:23 -07009637 "must be issued inside an active "
9638 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009639
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009640 ASSERT_NO_FATAL_FAILURE(InitState());
9641 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009642
9643 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009644 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009645 ASSERT_VK_SUCCESS(err);
9646
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009647 VkClearAttachment color_attachment;
9648 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9649 color_attachment.clearValue.color.float32[0] = 0;
9650 color_attachment.clearValue.color.float32[1] = 0;
9651 color_attachment.clearValue.color.float32[2] = 0;
9652 color_attachment.clearValue.color.float32[3] = 0;
9653 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009654 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
9655 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
9656 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009657
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009658 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009659}
9660
Karl Schultz9e66a292016-04-21 15:57:51 -06009661TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
9662 // Try to add a buffer memory barrier with no buffer.
9663 m_errorMonitor->SetDesiredFailureMsg(
9664 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9665 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
9666
9667 ASSERT_NO_FATAL_FAILURE(InitState());
9668 BeginCommandBuffer();
9669
9670 VkBufferMemoryBarrier buf_barrier = {};
9671 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9672 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9673 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9674 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9675 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9676 buf_barrier.buffer = VK_NULL_HANDLE;
9677 buf_barrier.offset = 0;
9678 buf_barrier.size = VK_WHOLE_SIZE;
9679 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9680 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
9681 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
9682
9683 m_errorMonitor->VerifyFound();
9684}
9685
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009686TEST_F(VkLayerTest, InvalidBarriers) {
9687 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
9688
9689 m_errorMonitor->SetDesiredFailureMsg(
9690 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
9691
9692 ASSERT_NO_FATAL_FAILURE(InitState());
9693 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9694
9695 VkMemoryBarrier mem_barrier = {};
9696 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
9697 mem_barrier.pNext = NULL;
9698 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9699 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9700 BeginCommandBuffer();
9701 // BeginCommandBuffer() starts a render pass
9702 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9703 VK_PIPELINE_STAGE_HOST_BIT,
9704 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
9705 &mem_barrier, 0, nullptr, 0, nullptr);
9706 m_errorMonitor->VerifyFound();
9707
9708 m_errorMonitor->SetDesiredFailureMsg(
9709 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9710 "Image Layout cannot be transitioned to UNDEFINED");
9711 VkImageObj image(m_device);
9712 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
9713 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9714 ASSERT_TRUE(image.initialized());
9715 VkImageMemoryBarrier img_barrier = {};
9716 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9717 img_barrier.pNext = NULL;
9718 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9719 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9720 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9721 // New layout can't be UNDEFINED
9722 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9723 img_barrier.image = image.handle();
9724 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9725 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9726 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9727 img_barrier.subresourceRange.baseArrayLayer = 0;
9728 img_barrier.subresourceRange.baseMipLevel = 0;
9729 img_barrier.subresourceRange.layerCount = 1;
9730 img_barrier.subresourceRange.levelCount = 1;
9731 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9732 VK_PIPELINE_STAGE_HOST_BIT,
9733 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9734 nullptr, 1, &img_barrier);
9735 m_errorMonitor->VerifyFound();
9736 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9737
9738 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9739 "Subresource must have the sum of the "
9740 "baseArrayLayer");
9741 // baseArrayLayer + layerCount must be <= image's arrayLayers
9742 img_barrier.subresourceRange.baseArrayLayer = 1;
9743 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9744 VK_PIPELINE_STAGE_HOST_BIT,
9745 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9746 nullptr, 1, &img_barrier);
9747 m_errorMonitor->VerifyFound();
9748 img_barrier.subresourceRange.baseArrayLayer = 0;
9749
9750 m_errorMonitor->SetDesiredFailureMsg(
9751 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9752 "Subresource must have the sum of the baseMipLevel");
9753 // baseMipLevel + levelCount must be <= image's mipLevels
9754 img_barrier.subresourceRange.baseMipLevel = 1;
9755 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9756 VK_PIPELINE_STAGE_HOST_BIT,
9757 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9758 nullptr, 1, &img_barrier);
9759 m_errorMonitor->VerifyFound();
9760 img_barrier.subresourceRange.baseMipLevel = 0;
9761
9762 m_errorMonitor->SetDesiredFailureMsg(
9763 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9764 "Buffer Barriers cannot be used during a render pass");
9765 vk_testing::Buffer buffer;
9766 buffer.init(*m_device, 256);
9767 VkBufferMemoryBarrier buf_barrier = {};
9768 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9769 buf_barrier.pNext = NULL;
9770 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9771 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9772 buf_barrier.buffer = buffer.handle();
9773 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9774 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9775 buf_barrier.offset = 0;
9776 buf_barrier.size = VK_WHOLE_SIZE;
9777 // Can't send buffer barrier during a render pass
9778 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9779 VK_PIPELINE_STAGE_HOST_BIT,
9780 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9781 &buf_barrier, 0, nullptr);
9782 m_errorMonitor->VerifyFound();
9783 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9784
9785 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9786 "which is not less than total size");
9787 buf_barrier.offset = 257;
9788 // Offset greater than total size
9789 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9790 VK_PIPELINE_STAGE_HOST_BIT,
9791 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9792 &buf_barrier, 0, nullptr);
9793 m_errorMonitor->VerifyFound();
9794 buf_barrier.offset = 0;
9795
9796 m_errorMonitor->SetDesiredFailureMsg(
9797 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
9798 buf_barrier.size = 257;
9799 // Size greater than total size
9800 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9801 VK_PIPELINE_STAGE_HOST_BIT,
9802 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9803 &buf_barrier, 0, nullptr);
9804 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009805
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009806 // Now exercise barrier aspect bit errors, first DS
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009807 m_errorMonitor->SetDesiredFailureMsg(
9808 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9809 "Image is a depth and stencil format and thus must "
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009810 "have either one or both of VK_IMAGE_ASPECT_DEPTH_BIT and "
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009811 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
9812 VkDepthStencilObj ds_image(m_device);
9813 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
9814 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009815 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9816 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009817 img_barrier.image = ds_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009818 // Use of COLOR aspect on DS image is error
9819 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009820 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9821 VK_PIPELINE_STAGE_HOST_BIT,
9822 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9823 nullptr, 1, &img_barrier);
9824 m_errorMonitor->VerifyFound();
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009825 // Now test depth-only
9826 VkFormatProperties format_props;
9827
9828 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(),
9829 VK_FORMAT_D16_UNORM, &format_props);
9830 if (format_props.optimalTilingFeatures &
9831 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
9832 m_errorMonitor->SetDesiredFailureMsg(
9833 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9834 "Image is a depth-only format and thus must "
9835 "have VK_IMAGE_ASPECT_DEPTH_BIT set.");
9836 VkDepthStencilObj d_image(m_device);
9837 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
9838 ASSERT_TRUE(d_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009839 img_barrier.oldLayout =
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009840 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009841 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009842 img_barrier.image = d_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009843 // Use of COLOR aspect on depth image is error
9844 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009845 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9846 VK_PIPELINE_STAGE_HOST_BIT,
9847 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
9848 0, nullptr, 1, &img_barrier);
9849 m_errorMonitor->VerifyFound();
9850 }
9851 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(),
9852 VK_FORMAT_S8_UINT, &format_props);
9853 if (format_props.optimalTilingFeatures &
9854 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
9855 // Now test stencil-only
9856 m_errorMonitor->SetDesiredFailureMsg(
9857 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9858 "Image is a stencil-only format and thus must "
9859 "have VK_IMAGE_ASPECT_STENCIL_BIT set.");
9860 VkDepthStencilObj s_image(m_device);
9861 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
9862 ASSERT_TRUE(s_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009863 img_barrier.oldLayout =
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009864 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009865 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009866 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009867 // Use of COLOR aspect on depth image is error
9868 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009869 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9870 VK_PIPELINE_STAGE_HOST_BIT,
9871 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
9872 0, nullptr, 1, &img_barrier);
9873 m_errorMonitor->VerifyFound();
9874 }
9875 // Finally test color
9876 m_errorMonitor->SetDesiredFailureMsg(
9877 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image is a color format and thus must "
9878 "have VK_IMAGE_ASPECT_COLOR_BIT set.");
9879 VkImageObj c_image(m_device);
9880 c_image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
9881 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
9882 0);
9883 ASSERT_TRUE(c_image.initialized());
9884 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9885 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9886 img_barrier.image = c_image.handle();
9887 // Set aspect to depth (non-color)
9888 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
9889 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9890 VK_PIPELINE_STAGE_HOST_BIT,
9891 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9892 nullptr, 1, &img_barrier);
9893 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009894}
9895
Karl Schultz6addd812016-02-02 17:17:23 -07009896TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009897 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009898 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009899
Karl Schultz6addd812016-02-02 17:17:23 -07009900 m_errorMonitor->SetDesiredFailureMsg(
9901 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009902 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
9903
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009904 ASSERT_NO_FATAL_FAILURE(InitState());
9905 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009906 uint32_t qfi = 0;
9907 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009908 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9909 buffCI.size = 1024;
9910 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9911 buffCI.queueFamilyIndexCount = 1;
9912 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009913
9914 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009915 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009916 ASSERT_VK_SUCCESS(err);
9917
9918 BeginCommandBuffer();
9919 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009920 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9921 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009922 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07009923 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
9924 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009925
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009926 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009927
Chia-I Wuf7458c52015-10-26 21:10:41 +08009928 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009929}
9930
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009931TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9932 // Create an out-of-range queueFamilyIndex
9933 m_errorMonitor->SetDesiredFailureMsg(
9934 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesde628532016-04-21 16:30:17 -06009935 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
9936 "of the indices specified when the device was created, via the "
9937 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009938
9939 ASSERT_NO_FATAL_FAILURE(InitState());
9940 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9941 VkBufferCreateInfo buffCI = {};
9942 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9943 buffCI.size = 1024;
9944 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9945 buffCI.queueFamilyIndexCount = 1;
9946 // Introduce failure by specifying invalid queue_family_index
9947 uint32_t qfi = 777;
9948 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06009949 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009950
9951 VkBuffer ib;
9952 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
9953
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009954 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009955 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009956}
9957
Karl Schultz6addd812016-02-02 17:17:23 -07009958TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
9959 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
9960 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009961
Karl Schultz6addd812016-02-02 17:17:23 -07009962 m_errorMonitor->SetDesiredFailureMsg(
9963 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009964 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009965
9966 ASSERT_NO_FATAL_FAILURE(InitState());
9967 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009968
9969 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009970 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009971 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
9972 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009973
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009974 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009975}
9976
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009977TEST_F(VkLayerTest, DSUsageBitsErrors) {
9978 TEST_DESCRIPTION("Attempt to update descriptor sets for images and buffers "
9979 "that do not have correct usage bits sets.");
9980 VkResult err;
9981
9982 ASSERT_NO_FATAL_FAILURE(InitState());
9983 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9984 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9985 ds_type_count[i].type = VkDescriptorType(i);
9986 ds_type_count[i].descriptorCount = 1;
9987 }
9988 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9989 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9990 ds_pool_ci.pNext = NULL;
9991 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9992 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9993 ds_pool_ci.pPoolSizes = ds_type_count;
9994
9995 VkDescriptorPool ds_pool;
9996 err =
9997 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9998 ASSERT_VK_SUCCESS(err);
9999
10000 // Create 10 layouts where each has a single descriptor of different type
10001 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] =
10002 {};
10003 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10004 dsl_binding[i].binding = 0;
10005 dsl_binding[i].descriptorType = VkDescriptorType(i);
10006 dsl_binding[i].descriptorCount = 1;
10007 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
10008 dsl_binding[i].pImmutableSamplers = NULL;
10009 }
10010
10011 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10012 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10013 ds_layout_ci.pNext = NULL;
10014 ds_layout_ci.bindingCount = 1;
10015 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
10016 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10017 ds_layout_ci.pBindings = dsl_binding + i;
10018 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
10019 NULL, ds_layouts + i);
10020 ASSERT_VK_SUCCESS(err);
10021 }
10022 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
10023 VkDescriptorSetAllocateInfo alloc_info = {};
10024 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10025 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10026 alloc_info.descriptorPool = ds_pool;
10027 alloc_info.pSetLayouts = ds_layouts;
10028 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10029 descriptor_sets);
10030 ASSERT_VK_SUCCESS(err);
10031
10032 // Create a buffer & bufferView to be used for invalid updates
10033 VkBufferCreateInfo buff_ci = {};
10034 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10035 // This usage is not valid for any descriptor type
10036 buff_ci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
10037 buff_ci.size = 256;
10038 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10039 VkBuffer buffer;
10040 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10041 ASSERT_VK_SUCCESS(err);
10042
10043 VkBufferViewCreateInfo buff_view_ci = {};
10044 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
10045 buff_view_ci.buffer = buffer;
10046 buff_view_ci.format = VK_FORMAT_R8_UNORM;
10047 buff_view_ci.range = VK_WHOLE_SIZE;
10048 VkBufferView buff_view;
10049 err =
10050 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
10051 ASSERT_VK_SUCCESS(err);
10052
10053 // Create an image to be used for invalid updates
10054 VkImageCreateInfo image_ci = {};
10055 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10056 image_ci.imageType = VK_IMAGE_TYPE_2D;
10057 image_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
10058 image_ci.extent.width = 64;
10059 image_ci.extent.height = 64;
10060 image_ci.extent.depth = 1;
10061 image_ci.mipLevels = 1;
10062 image_ci.arrayLayers = 1;
10063 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
10064 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
10065 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10066 // This usage is not valid for any descriptor type
10067 image_ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
10068 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10069 VkImage image;
10070 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10071 ASSERT_VK_SUCCESS(err);
10072 // Bind memory to image
10073 VkMemoryRequirements mem_reqs;
10074 VkDeviceMemory image_mem;
10075 bool pass;
10076 VkMemoryAllocateInfo mem_alloc = {};
10077 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10078 mem_alloc.pNext = NULL;
10079 mem_alloc.allocationSize = 0;
10080 mem_alloc.memoryTypeIndex = 0;
10081 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10082 mem_alloc.allocationSize = mem_reqs.size;
10083 pass =
10084 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10085 ASSERT_TRUE(pass);
10086 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10087 ASSERT_VK_SUCCESS(err);
10088 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10089 ASSERT_VK_SUCCESS(err);
10090 // Now create view for image
10091 VkImageViewCreateInfo image_view_ci = {};
10092 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10093 image_view_ci.image = image;
10094 image_view_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
10095 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10096 image_view_ci.subresourceRange.layerCount = 1;
10097 image_view_ci.subresourceRange.baseArrayLayer = 0;
10098 image_view_ci.subresourceRange.levelCount = 1;
10099 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10100 VkImageView image_view;
10101 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
10102 &image_view);
10103 ASSERT_VK_SUCCESS(err);
10104
10105 VkDescriptorBufferInfo buff_info = {};
10106 buff_info.buffer = buffer;
10107 VkDescriptorImageInfo img_info = {};
10108 img_info.imageView = image_view;
10109 VkWriteDescriptorSet descriptor_write = {};
10110 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10111 descriptor_write.dstBinding = 0;
10112 descriptor_write.descriptorCount = 1;
10113 descriptor_write.pTexelBufferView = &buff_view;
10114 descriptor_write.pBufferInfo = &buff_info;
10115 descriptor_write.pImageInfo = &img_info;
10116
10117 // These error messages align with VkDescriptorType struct
10118 const char *error_msgs[] = {
10119 "", // placeholder, no error for SAMPLER descriptor
10120 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
10121 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
10122 " does not have VK_IMAGE_USAGE_STORAGE_BIT set.",
10123 " does not have VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT set.",
10124 " does not have VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set.",
10125 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
10126 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
10127 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
10128 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
10129 " does not have VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set."};
10130 // Start loop at 1 as SAMPLER desc type has no usage bit error
10131 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10132 descriptor_write.descriptorType = VkDescriptorType(i);
10133 descriptor_write.dstSet = descriptor_sets[i];
10134 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10135 error_msgs[i]);
10136
10137 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
10138 NULL);
10139
10140 m_errorMonitor->VerifyFound();
10141 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
10142 }
10143 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
10144 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060010145 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010146 vkDestroyImageView(m_device->device(), image_view, NULL);
10147 vkDestroyBuffer(m_device->device(), buffer, NULL);
10148 vkDestroyBufferView(m_device->device(), buff_view, NULL);
10149 vkFreeDescriptorSets(m_device->device(), ds_pool,
10150 VK_DESCRIPTOR_TYPE_RANGE_SIZE, descriptor_sets);
10151 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10152}
10153
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010154TEST_F(VkLayerTest, DSBufferInfoErrors) {
10155 TEST_DESCRIPTION(
10156 "Attempt to update buffer descriptor set that has incorrect "
10157 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
10158 "1. offset value greater than buffer size\n"
10159 "2. range value of 0\n"
10160 "3. range value greater than buffer (size - offset)");
10161 VkResult err;
10162
10163 ASSERT_NO_FATAL_FAILURE(InitState());
10164 VkDescriptorPoolSize ds_type_count = {};
10165 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10166 ds_type_count.descriptorCount = 1;
10167
10168 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10169 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10170 ds_pool_ci.pNext = NULL;
10171 ds_pool_ci.maxSets = 1;
10172 ds_pool_ci.poolSizeCount = 1;
10173 ds_pool_ci.pPoolSizes = &ds_type_count;
10174
10175 VkDescriptorPool ds_pool;
10176 err =
10177 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10178 ASSERT_VK_SUCCESS(err);
10179
10180 // Create layout with single uniform buffer descriptor
10181 VkDescriptorSetLayoutBinding dsl_binding = {};
10182 dsl_binding.binding = 0;
10183 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10184 dsl_binding.descriptorCount = 1;
10185 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10186 dsl_binding.pImmutableSamplers = NULL;
10187
10188 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10189 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10190 ds_layout_ci.pNext = NULL;
10191 ds_layout_ci.bindingCount = 1;
10192 ds_layout_ci.pBindings = &dsl_binding;
10193 VkDescriptorSetLayout ds_layout;
10194 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10195 &ds_layout);
10196 ASSERT_VK_SUCCESS(err);
10197
10198 VkDescriptorSet descriptor_set = {};
10199 VkDescriptorSetAllocateInfo alloc_info = {};
10200 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10201 alloc_info.descriptorSetCount = 1;
10202 alloc_info.descriptorPool = ds_pool;
10203 alloc_info.pSetLayouts = &ds_layout;
10204 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10205 &descriptor_set);
10206 ASSERT_VK_SUCCESS(err);
10207
10208 // Create a buffer to be used for invalid updates
10209 VkBufferCreateInfo buff_ci = {};
10210 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10211 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
10212 buff_ci.size = 256;
10213 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10214 VkBuffer buffer;
10215 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10216 ASSERT_VK_SUCCESS(err);
10217 // Have to bind memory to buffer before descriptor update
10218 VkMemoryAllocateInfo mem_alloc = {};
10219 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10220 mem_alloc.pNext = NULL;
10221 mem_alloc.allocationSize = 256;
10222 mem_alloc.memoryTypeIndex = 0;
10223
10224 VkMemoryRequirements mem_reqs;
10225 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
10226 bool pass =
10227 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10228 if (!pass) {
10229 vkDestroyBuffer(m_device->device(), buffer, NULL);
10230 return;
10231 }
10232
10233 VkDeviceMemory mem;
10234 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
10235 ASSERT_VK_SUCCESS(err);
10236 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
10237 ASSERT_VK_SUCCESS(err);
10238
10239 VkDescriptorBufferInfo buff_info = {};
10240 buff_info.buffer = buffer;
10241 // First make offset 1 larger than buffer size
10242 buff_info.offset = 257;
10243 buff_info.range = VK_WHOLE_SIZE;
10244 VkWriteDescriptorSet descriptor_write = {};
10245 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10246 descriptor_write.dstBinding = 0;
10247 descriptor_write.descriptorCount = 1;
10248 descriptor_write.pTexelBufferView = nullptr;
10249 descriptor_write.pBufferInfo = &buff_info;
10250 descriptor_write.pImageInfo = nullptr;
10251
10252 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10253 descriptor_write.dstSet = descriptor_set;
10254 m_errorMonitor->SetDesiredFailureMsg(
10255 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10256 " offset of 257 is greater than buffer ");
10257
10258 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10259
10260 m_errorMonitor->VerifyFound();
10261 // Now cause error due to range of 0
10262 buff_info.offset = 0;
10263 buff_info.range = 0;
10264 m_errorMonitor->SetDesiredFailureMsg(
10265 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10266 " range is not VK_WHOLE_SIZE and is zero, which is not allowed.");
10267
10268 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10269
10270 m_errorMonitor->VerifyFound();
10271 // Now cause error due to range exceeding buffer size - offset
10272 buff_info.offset = 128;
10273 buff_info.range = 200;
10274 m_errorMonitor->SetDesiredFailureMsg(
10275 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10276 " range is 200 which is greater than buffer size ");
10277
10278 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10279
10280 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -060010281 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010282 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10283 vkDestroyBuffer(m_device->device(), buffer, NULL);
10284 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10285 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10286}
10287
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010288TEST_F(VkLayerTest, DSAspectBitsErrors) {
10289 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
10290 // are set, but could expand this test to hit more cases.
10291 TEST_DESCRIPTION("Attempt to update descriptor sets for images "
10292 "that do not have correct aspect bits sets.");
10293 VkResult err;
10294
10295 ASSERT_NO_FATAL_FAILURE(InitState());
10296 VkDescriptorPoolSize ds_type_count = {};
10297 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10298 ds_type_count.descriptorCount = 1;
10299
10300 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10301 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10302 ds_pool_ci.pNext = NULL;
10303 ds_pool_ci.maxSets = 5;
10304 ds_pool_ci.poolSizeCount = 1;
10305 ds_pool_ci.pPoolSizes = &ds_type_count;
10306
10307 VkDescriptorPool ds_pool;
10308 err =
10309 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10310 ASSERT_VK_SUCCESS(err);
10311
10312 VkDescriptorSetLayoutBinding dsl_binding = {};
10313 dsl_binding.binding = 0;
10314 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10315 dsl_binding.descriptorCount = 1;
10316 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10317 dsl_binding.pImmutableSamplers = NULL;
10318
10319 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10320 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10321 ds_layout_ci.pNext = NULL;
10322 ds_layout_ci.bindingCount = 1;
10323 ds_layout_ci.pBindings = &dsl_binding;
10324 VkDescriptorSetLayout ds_layout;
10325 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10326 &ds_layout);
10327 ASSERT_VK_SUCCESS(err);
10328
10329 VkDescriptorSet descriptor_set = {};
10330 VkDescriptorSetAllocateInfo alloc_info = {};
10331 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10332 alloc_info.descriptorSetCount = 1;
10333 alloc_info.descriptorPool = ds_pool;
10334 alloc_info.pSetLayouts = &ds_layout;
10335 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10336 &descriptor_set);
10337 ASSERT_VK_SUCCESS(err);
10338
10339 // Create an image to be used for invalid updates
10340 VkImageCreateInfo image_ci = {};
10341 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10342 image_ci.imageType = VK_IMAGE_TYPE_2D;
10343 image_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
10344 image_ci.extent.width = 64;
10345 image_ci.extent.height = 64;
10346 image_ci.extent.depth = 1;
10347 image_ci.mipLevels = 1;
10348 image_ci.arrayLayers = 1;
10349 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
10350 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
10351 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10352 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10353 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10354 VkImage image;
10355 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10356 ASSERT_VK_SUCCESS(err);
10357 // Bind memory to image
10358 VkMemoryRequirements mem_reqs;
10359 VkDeviceMemory image_mem;
10360 bool pass;
10361 VkMemoryAllocateInfo mem_alloc = {};
10362 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10363 mem_alloc.pNext = NULL;
10364 mem_alloc.allocationSize = 0;
10365 mem_alloc.memoryTypeIndex = 0;
10366 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10367 mem_alloc.allocationSize = mem_reqs.size;
10368 pass =
10369 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10370 ASSERT_TRUE(pass);
10371 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10372 ASSERT_VK_SUCCESS(err);
10373 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10374 ASSERT_VK_SUCCESS(err);
10375 // Now create view for image
10376 VkImageViewCreateInfo image_view_ci = {};
10377 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10378 image_view_ci.image = image;
10379 image_view_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
10380 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10381 image_view_ci.subresourceRange.layerCount = 1;
10382 image_view_ci.subresourceRange.baseArrayLayer = 0;
10383 image_view_ci.subresourceRange.levelCount = 1;
10384 // Setting both depth & stencil aspect bits is illegal for descriptor
10385 image_view_ci.subresourceRange.aspectMask =
10386 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
10387
10388 VkImageView image_view;
10389 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
10390 &image_view);
10391 ASSERT_VK_SUCCESS(err);
10392
10393 VkDescriptorImageInfo img_info = {};
10394 img_info.imageView = image_view;
10395 VkWriteDescriptorSet descriptor_write = {};
10396 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10397 descriptor_write.dstBinding = 0;
10398 descriptor_write.descriptorCount = 1;
10399 descriptor_write.pTexelBufferView = NULL;
10400 descriptor_write.pBufferInfo = NULL;
10401 descriptor_write.pImageInfo = &img_info;
10402 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10403 descriptor_write.dstSet = descriptor_set;
10404 const char *error_msg = " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10405 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
10406 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10407 error_msg);
10408
10409 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10410
10411 m_errorMonitor->VerifyFound();
10412 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10413 vkDestroyImage(m_device->device(), image, NULL);
10414 vkFreeMemory(m_device->device(), image_mem, NULL);
10415 vkDestroyImageView(m_device->device(), image_view, NULL);
10416 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10417 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10418}
10419
Karl Schultz6addd812016-02-02 17:17:23 -070010420TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010421 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010422 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010423
Karl Schultz6addd812016-02-02 17:17:23 -070010424 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010425 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10426 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10427 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010428
Tobin Ehlis3b780662015-05-28 12:11:26 -060010429 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010430 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010431 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010432 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10433 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010434
10435 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010436 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10437 ds_pool_ci.pNext = NULL;
10438 ds_pool_ci.maxSets = 1;
10439 ds_pool_ci.poolSizeCount = 1;
10440 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010441
Tobin Ehlis3b780662015-05-28 12:11:26 -060010442 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010443 err =
10444 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010445 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010446 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010447 dsl_binding.binding = 0;
10448 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10449 dsl_binding.descriptorCount = 1;
10450 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10451 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010452
Tony Barboureb254902015-07-15 12:50:33 -060010453 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010454 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10455 ds_layout_ci.pNext = NULL;
10456 ds_layout_ci.bindingCount = 1;
10457 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010458
Tobin Ehlis3b780662015-05-28 12:11:26 -060010459 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010460 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10461 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010462 ASSERT_VK_SUCCESS(err);
10463
10464 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010465 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010466 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010467 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010468 alloc_info.descriptorPool = ds_pool;
10469 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010470 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10471 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010472 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010473
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010474 VkSamplerCreateInfo sampler_ci = {};
10475 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10476 sampler_ci.pNext = NULL;
10477 sampler_ci.magFilter = VK_FILTER_NEAREST;
10478 sampler_ci.minFilter = VK_FILTER_NEAREST;
10479 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10480 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10481 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10482 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10483 sampler_ci.mipLodBias = 1.0;
10484 sampler_ci.anisotropyEnable = VK_FALSE;
10485 sampler_ci.maxAnisotropy = 1;
10486 sampler_ci.compareEnable = VK_FALSE;
10487 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10488 sampler_ci.minLod = 1.0;
10489 sampler_ci.maxLod = 1.0;
10490 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10491 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10492 VkSampler sampler;
10493 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10494 ASSERT_VK_SUCCESS(err);
10495
10496 VkDescriptorImageInfo info = {};
10497 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010498
10499 VkWriteDescriptorSet descriptor_write;
10500 memset(&descriptor_write, 0, sizeof(descriptor_write));
10501 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010502 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010503 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010504 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010505 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010506 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010507
10508 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10509
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010510 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010511
Chia-I Wuf7458c52015-10-26 21:10:41 +080010512 vkDestroySampler(m_device->device(), sampler, NULL);
10513 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10514 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010515}
10516
Karl Schultz6addd812016-02-02 17:17:23 -070010517TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010518 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010519 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010520
Karl Schultz6addd812016-02-02 17:17:23 -070010521 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010522 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10523 " binding #0 with 1 total descriptors but update of 1 descriptors "
10524 "starting at binding offset of 0 combined with update array element "
10525 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010526
Tobin Ehlis3b780662015-05-28 12:11:26 -060010527 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010528 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010529 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010530 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10531 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010532
10533 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010534 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10535 ds_pool_ci.pNext = NULL;
10536 ds_pool_ci.maxSets = 1;
10537 ds_pool_ci.poolSizeCount = 1;
10538 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010539
Tobin Ehlis3b780662015-05-28 12:11:26 -060010540 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010541 err =
10542 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010543 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010544
Tony Barboureb254902015-07-15 12:50:33 -060010545 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010546 dsl_binding.binding = 0;
10547 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10548 dsl_binding.descriptorCount = 1;
10549 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10550 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010551
10552 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010553 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10554 ds_layout_ci.pNext = NULL;
10555 ds_layout_ci.bindingCount = 1;
10556 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010557
Tobin Ehlis3b780662015-05-28 12:11:26 -060010558 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010559 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10560 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010561 ASSERT_VK_SUCCESS(err);
10562
10563 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010564 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010565 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010566 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010567 alloc_info.descriptorPool = ds_pool;
10568 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010569 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10570 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010571 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010572
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010573 // Correctly update descriptor to avoid "NOT_UPDATED" error
10574 VkDescriptorBufferInfo buff_info = {};
10575 buff_info.buffer =
10576 VkBuffer(0); // Don't care about buffer handle for this test
10577 buff_info.offset = 0;
10578 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010579
10580 VkWriteDescriptorSet descriptor_write;
10581 memset(&descriptor_write, 0, sizeof(descriptor_write));
10582 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010583 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070010584 descriptor_write.dstArrayElement =
10585 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010586 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010587 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10588 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010589
10590 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10591
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010592 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010593
Chia-I Wuf7458c52015-10-26 21:10:41 +080010594 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10595 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010596}
10597
Karl Schultz6addd812016-02-02 17:17:23 -070010598TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
10599 // Create layout w/ count of 1 and attempt update to that layout w/ binding
10600 // index 2
10601 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010602
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010603 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10604 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010605
Tobin Ehlis3b780662015-05-28 12:11:26 -060010606 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010607 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010608 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010609 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10610 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010611
10612 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010613 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10614 ds_pool_ci.pNext = NULL;
10615 ds_pool_ci.maxSets = 1;
10616 ds_pool_ci.poolSizeCount = 1;
10617 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010618
Tobin Ehlis3b780662015-05-28 12:11:26 -060010619 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010620 err =
10621 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010622 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010623
Tony Barboureb254902015-07-15 12:50:33 -060010624 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010625 dsl_binding.binding = 0;
10626 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10627 dsl_binding.descriptorCount = 1;
10628 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10629 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010630
10631 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010632 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10633 ds_layout_ci.pNext = NULL;
10634 ds_layout_ci.bindingCount = 1;
10635 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010636 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010637 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10638 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010639 ASSERT_VK_SUCCESS(err);
10640
10641 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010642 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010643 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010644 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010645 alloc_info.descriptorPool = ds_pool;
10646 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010647 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10648 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010649 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010650
Tony Barboureb254902015-07-15 12:50:33 -060010651 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010652 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10653 sampler_ci.pNext = NULL;
10654 sampler_ci.magFilter = VK_FILTER_NEAREST;
10655 sampler_ci.minFilter = VK_FILTER_NEAREST;
10656 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10657 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10658 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10659 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10660 sampler_ci.mipLodBias = 1.0;
10661 sampler_ci.anisotropyEnable = VK_FALSE;
10662 sampler_ci.maxAnisotropy = 1;
10663 sampler_ci.compareEnable = VK_FALSE;
10664 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10665 sampler_ci.minLod = 1.0;
10666 sampler_ci.maxLod = 1.0;
10667 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10668 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010669
Tobin Ehlis3b780662015-05-28 12:11:26 -060010670 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010671 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010672 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010673
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010674 VkDescriptorImageInfo info = {};
10675 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010676
10677 VkWriteDescriptorSet descriptor_write;
10678 memset(&descriptor_write, 0, sizeof(descriptor_write));
10679 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010680 descriptor_write.dstSet = descriptorSet;
10681 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010682 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010683 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010684 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010685 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010686
10687 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10688
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010689 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010690
Chia-I Wuf7458c52015-10-26 21:10:41 +080010691 vkDestroySampler(m_device->device(), sampler, NULL);
10692 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10693 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010694}
10695
Karl Schultz6addd812016-02-02 17:17:23 -070010696TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10697 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10698 // types
10699 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010700
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070010701 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis660bcdc2016-05-17 10:39:46 -060010702 ".sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010703
Tobin Ehlis3b780662015-05-28 12:11:26 -060010704 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010705
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010706 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010707 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10708 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010709
10710 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010711 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10712 ds_pool_ci.pNext = NULL;
10713 ds_pool_ci.maxSets = 1;
10714 ds_pool_ci.poolSizeCount = 1;
10715 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010716
Tobin Ehlis3b780662015-05-28 12:11:26 -060010717 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010718 err =
10719 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010720 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010721 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010722 dsl_binding.binding = 0;
10723 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10724 dsl_binding.descriptorCount = 1;
10725 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10726 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010727
Tony Barboureb254902015-07-15 12:50:33 -060010728 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010729 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10730 ds_layout_ci.pNext = NULL;
10731 ds_layout_ci.bindingCount = 1;
10732 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010733
Tobin Ehlis3b780662015-05-28 12:11:26 -060010734 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010735 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10736 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010737 ASSERT_VK_SUCCESS(err);
10738
10739 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010740 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010741 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010742 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010743 alloc_info.descriptorPool = ds_pool;
10744 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010745 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10746 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010747 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010748
Tony Barboureb254902015-07-15 12:50:33 -060010749 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010750 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10751 sampler_ci.pNext = NULL;
10752 sampler_ci.magFilter = VK_FILTER_NEAREST;
10753 sampler_ci.minFilter = VK_FILTER_NEAREST;
10754 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10755 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10756 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10757 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10758 sampler_ci.mipLodBias = 1.0;
10759 sampler_ci.anisotropyEnable = VK_FALSE;
10760 sampler_ci.maxAnisotropy = 1;
10761 sampler_ci.compareEnable = VK_FALSE;
10762 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10763 sampler_ci.minLod = 1.0;
10764 sampler_ci.maxLod = 1.0;
10765 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10766 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010767 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010768 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010769 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010770
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010771 VkDescriptorImageInfo info = {};
10772 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010773
10774 VkWriteDescriptorSet descriptor_write;
10775 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -070010776 descriptor_write.sType =
10777 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010778 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010779 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010780 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010781 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010782 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010783
10784 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10785
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010786 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010787
Chia-I Wuf7458c52015-10-26 21:10:41 +080010788 vkDestroySampler(m_device->device(), sampler, NULL);
10789 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10790 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010791}
10792
Karl Schultz6addd812016-02-02 17:17:23 -070010793TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010794 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010795 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010796
Karl Schultz6addd812016-02-02 17:17:23 -070010797 m_errorMonitor->SetDesiredFailureMsg(
10798 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010799 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010800
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010801 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010802 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10803 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010804 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010805 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10806 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010807
10808 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010809 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10810 ds_pool_ci.pNext = NULL;
10811 ds_pool_ci.maxSets = 1;
10812 ds_pool_ci.poolSizeCount = 1;
10813 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010814
10815 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010816 err =
10817 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010818 ASSERT_VK_SUCCESS(err);
10819
10820 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010821 dsl_binding.binding = 0;
10822 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10823 dsl_binding.descriptorCount = 1;
10824 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10825 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010826
10827 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010828 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10829 ds_layout_ci.pNext = NULL;
10830 ds_layout_ci.bindingCount = 1;
10831 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010832 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010833 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10834 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010835 ASSERT_VK_SUCCESS(err);
10836
10837 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010838 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010839 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010840 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010841 alloc_info.descriptorPool = ds_pool;
10842 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010843 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10844 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010845 ASSERT_VK_SUCCESS(err);
10846
Karl Schultz6addd812016-02-02 17:17:23 -070010847 VkSampler sampler =
10848 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010849
10850 VkDescriptorImageInfo descriptor_info;
10851 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10852 descriptor_info.sampler = sampler;
10853
10854 VkWriteDescriptorSet descriptor_write;
10855 memset(&descriptor_write, 0, sizeof(descriptor_write));
10856 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010857 descriptor_write.dstSet = descriptorSet;
10858 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010859 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010860 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10861 descriptor_write.pImageInfo = &descriptor_info;
10862
10863 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10864
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010865 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010866
Chia-I Wuf7458c52015-10-26 21:10:41 +080010867 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10868 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010869}
10870
Karl Schultz6addd812016-02-02 17:17:23 -070010871TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10872 // Create a single combined Image/Sampler descriptor and send it an invalid
10873 // imageView
10874 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010875
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010876 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10877 "Attempted write update to combined "
10878 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -060010879 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010880
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010881 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010882 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010883 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10884 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010885
10886 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010887 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10888 ds_pool_ci.pNext = NULL;
10889 ds_pool_ci.maxSets = 1;
10890 ds_pool_ci.poolSizeCount = 1;
10891 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010892
10893 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010894 err =
10895 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010896 ASSERT_VK_SUCCESS(err);
10897
10898 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010899 dsl_binding.binding = 0;
10900 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10901 dsl_binding.descriptorCount = 1;
10902 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10903 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010904
10905 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010906 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10907 ds_layout_ci.pNext = NULL;
10908 ds_layout_ci.bindingCount = 1;
10909 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010910 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010911 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10912 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010913 ASSERT_VK_SUCCESS(err);
10914
10915 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010916 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010917 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010918 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010919 alloc_info.descriptorPool = ds_pool;
10920 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010921 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10922 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010923 ASSERT_VK_SUCCESS(err);
10924
10925 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010926 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10927 sampler_ci.pNext = NULL;
10928 sampler_ci.magFilter = VK_FILTER_NEAREST;
10929 sampler_ci.minFilter = VK_FILTER_NEAREST;
10930 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10931 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10932 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10933 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10934 sampler_ci.mipLodBias = 1.0;
10935 sampler_ci.anisotropyEnable = VK_FALSE;
10936 sampler_ci.maxAnisotropy = 1;
10937 sampler_ci.compareEnable = VK_FALSE;
10938 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10939 sampler_ci.minLod = 1.0;
10940 sampler_ci.maxLod = 1.0;
10941 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10942 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010943
10944 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010945 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010946 ASSERT_VK_SUCCESS(err);
10947
Karl Schultz6addd812016-02-02 17:17:23 -070010948 VkImageView view =
10949 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010950
10951 VkDescriptorImageInfo descriptor_info;
10952 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10953 descriptor_info.sampler = sampler;
10954 descriptor_info.imageView = view;
10955
10956 VkWriteDescriptorSet descriptor_write;
10957 memset(&descriptor_write, 0, sizeof(descriptor_write));
10958 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010959 descriptor_write.dstSet = descriptorSet;
10960 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010961 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010962 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10963 descriptor_write.pImageInfo = &descriptor_info;
10964
10965 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10966
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010967 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010968
Chia-I Wuf7458c52015-10-26 21:10:41 +080010969 vkDestroySampler(m_device->device(), sampler, NULL);
10970 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10971 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010972}
10973
Karl Schultz6addd812016-02-02 17:17:23 -070010974TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10975 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10976 // into the other
10977 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010978
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010979 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10980 " binding #1 with type "
10981 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10982 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010983
Tobin Ehlis04356f92015-10-27 16:35:27 -060010984 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010985 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010986 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010987 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10988 ds_type_count[0].descriptorCount = 1;
10989 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10990 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010991
10992 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010993 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10994 ds_pool_ci.pNext = NULL;
10995 ds_pool_ci.maxSets = 1;
10996 ds_pool_ci.poolSizeCount = 2;
10997 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010998
10999 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011000 err =
11001 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011002 ASSERT_VK_SUCCESS(err);
11003 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011004 dsl_binding[0].binding = 0;
11005 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11006 dsl_binding[0].descriptorCount = 1;
11007 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
11008 dsl_binding[0].pImmutableSamplers = NULL;
11009 dsl_binding[1].binding = 1;
11010 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11011 dsl_binding[1].descriptorCount = 1;
11012 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
11013 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011014
11015 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011016 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11017 ds_layout_ci.pNext = NULL;
11018 ds_layout_ci.bindingCount = 2;
11019 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011020
11021 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011022 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11023 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011024 ASSERT_VK_SUCCESS(err);
11025
11026 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011027 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011028 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011029 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011030 alloc_info.descriptorPool = ds_pool;
11031 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011032 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11033 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011034 ASSERT_VK_SUCCESS(err);
11035
11036 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011037 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11038 sampler_ci.pNext = NULL;
11039 sampler_ci.magFilter = VK_FILTER_NEAREST;
11040 sampler_ci.minFilter = VK_FILTER_NEAREST;
11041 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11042 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11043 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11044 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11045 sampler_ci.mipLodBias = 1.0;
11046 sampler_ci.anisotropyEnable = VK_FALSE;
11047 sampler_ci.maxAnisotropy = 1;
11048 sampler_ci.compareEnable = VK_FALSE;
11049 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11050 sampler_ci.minLod = 1.0;
11051 sampler_ci.maxLod = 1.0;
11052 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11053 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011054
11055 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011056 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011057 ASSERT_VK_SUCCESS(err);
11058
11059 VkDescriptorImageInfo info = {};
11060 info.sampler = sampler;
11061
11062 VkWriteDescriptorSet descriptor_write;
11063 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
11064 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011065 descriptor_write.dstSet = descriptorSet;
11066 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080011067 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011068 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11069 descriptor_write.pImageInfo = &info;
11070 // This write update should succeed
11071 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11072 // Now perform a copy update that fails due to type mismatch
11073 VkCopyDescriptorSet copy_ds_update;
11074 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11075 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11076 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -060011077 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011078 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070011079 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +080011080 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011081 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11082
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011083 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011084 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070011085 m_errorMonitor->SetDesiredFailureMsg(
11086 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011087 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -060011088 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11089 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11090 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070011091 copy_ds_update.srcBinding =
11092 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011093 copy_ds_update.dstSet = descriptorSet;
11094 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -060011095 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011096 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11097
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011098 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011099
Tobin Ehlis04356f92015-10-27 16:35:27 -060011100 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070011101 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011102 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
11103 "update array offset of 0 and update of "
11104 "5 descriptors oversteps total number "
11105 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011106
Tobin Ehlis04356f92015-10-27 16:35:27 -060011107 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11108 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11109 copy_ds_update.srcSet = descriptorSet;
11110 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011111 copy_ds_update.dstSet = descriptorSet;
11112 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070011113 copy_ds_update.descriptorCount =
11114 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060011115 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11116
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011117 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011118
Chia-I Wuf7458c52015-10-26 21:10:41 +080011119 vkDestroySampler(m_device->device(), sampler, NULL);
11120 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11121 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011122}
11123
Karl Schultz6addd812016-02-02 17:17:23 -070011124TEST_F(VkLayerTest, NumSamplesMismatch) {
11125 // Create CommandBuffer where MSAA samples doesn't match RenderPass
11126 // sampleCount
11127 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011128
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011129 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011130 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011131
Tobin Ehlis3b780662015-05-28 12:11:26 -060011132 ASSERT_NO_FATAL_FAILURE(InitState());
11133 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011134 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060011135 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011136 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011137
11138 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011139 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11140 ds_pool_ci.pNext = NULL;
11141 ds_pool_ci.maxSets = 1;
11142 ds_pool_ci.poolSizeCount = 1;
11143 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011144
Tobin Ehlis3b780662015-05-28 12:11:26 -060011145 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011146 err =
11147 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011148 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011149
Tony Barboureb254902015-07-15 12:50:33 -060011150 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080011151 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060011152 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080011153 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011154 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11155 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011156
Tony Barboureb254902015-07-15 12:50:33 -060011157 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11158 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11159 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011160 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070011161 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011162
Tobin Ehlis3b780662015-05-28 12:11:26 -060011163 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011164 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11165 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011166 ASSERT_VK_SUCCESS(err);
11167
11168 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011169 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011170 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011171 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011172 alloc_info.descriptorPool = ds_pool;
11173 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011174 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11175 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011176 ASSERT_VK_SUCCESS(err);
11177
Tony Barboureb254902015-07-15 12:50:33 -060011178 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011179 pipe_ms_state_ci.sType =
11180 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11181 pipe_ms_state_ci.pNext = NULL;
11182 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11183 pipe_ms_state_ci.sampleShadingEnable = 0;
11184 pipe_ms_state_ci.minSampleShading = 1.0;
11185 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011186
Tony Barboureb254902015-07-15 12:50:33 -060011187 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011188 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11189 pipeline_layout_ci.pNext = NULL;
11190 pipeline_layout_ci.setLayoutCount = 1;
11191 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011192
11193 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011194 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11195 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011196 ASSERT_VK_SUCCESS(err);
11197
Karl Schultz6addd812016-02-02 17:17:23 -070011198 VkShaderObj vs(m_device, bindStateVertShaderText,
11199 VK_SHADER_STAGE_VERTEX_BIT, this);
11200 VkShaderObj fs(m_device, bindStateFragShaderText,
11201 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011202 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070011203 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011204 VkPipelineObj pipe(m_device);
11205 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011206 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011207 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011208 pipe.SetMSAA(&pipe_ms_state_ci);
11209 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011210
Tony Barbourfe3351b2015-07-28 10:17:20 -060011211 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070011212 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11213 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011214
Mark Young29927482016-05-04 14:38:51 -060011215 // Render triangle (the error should trigger on the attempt to draw).
11216 Draw(3, 1, 0, 0);
11217
11218 // Finalize recording of the command buffer
11219 EndCommandBuffer();
11220
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011221 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011222
Chia-I Wuf7458c52015-10-26 21:10:41 +080011223 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11224 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11225 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011226}
Mark Young29927482016-05-04 14:38:51 -060011227
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011228TEST_F(VkLayerTest, RenderPassIncompatible) {
11229 TEST_DESCRIPTION("Hit RenderPass incompatible cases. "
11230 "Initial case is drawing with an active renderpass that's "
11231 "not compatible with the bound PSO's creation renderpass");
11232 VkResult err;
11233
11234 ASSERT_NO_FATAL_FAILURE(InitState());
11235 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11236
11237 VkDescriptorSetLayoutBinding dsl_binding = {};
11238 dsl_binding.binding = 0;
11239 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11240 dsl_binding.descriptorCount = 1;
11241 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11242 dsl_binding.pImmutableSamplers = NULL;
11243
11244 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11245 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11246 ds_layout_ci.pNext = NULL;
11247 ds_layout_ci.bindingCount = 1;
11248 ds_layout_ci.pBindings = &dsl_binding;
11249
11250 VkDescriptorSetLayout ds_layout;
11251 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11252 &ds_layout);
11253 ASSERT_VK_SUCCESS(err);
11254
11255 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11256 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11257 pipeline_layout_ci.pNext = NULL;
11258 pipeline_layout_ci.setLayoutCount = 1;
11259 pipeline_layout_ci.pSetLayouts = &ds_layout;
11260
11261 VkPipelineLayout pipeline_layout;
11262 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11263 &pipeline_layout);
11264 ASSERT_VK_SUCCESS(err);
11265
11266 VkShaderObj vs(m_device, bindStateVertShaderText,
11267 VK_SHADER_STAGE_VERTEX_BIT, this);
11268 VkShaderObj fs(m_device, bindStateFragShaderText,
11269 VK_SHADER_STAGE_FRAGMENT_BIT,
11270 this); // We shouldn't need a fragment shader
11271 // but add it to be able to run on more devices
11272 // Create a renderpass that will be incompatible with default renderpass
11273 VkAttachmentReference attach = {};
11274 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11275 VkAttachmentReference color_att = {};
11276 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11277 VkSubpassDescription subpass = {};
11278 subpass.inputAttachmentCount = 1;
11279 subpass.pInputAttachments = &attach;
11280 subpass.colorAttachmentCount = 1;
11281 subpass.pColorAttachments = &color_att;
11282 VkRenderPassCreateInfo rpci = {};
11283 rpci.subpassCount = 1;
11284 rpci.pSubpasses = &subpass;
11285 rpci.attachmentCount = 1;
11286 VkAttachmentDescription attach_desc = {};
11287 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011288 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11289 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011290 rpci.pAttachments = &attach_desc;
11291 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11292 VkRenderPass rp;
11293 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11294 VkPipelineObj pipe(m_device);
11295 pipe.AddShader(&vs);
11296 pipe.AddShader(&fs);
11297 pipe.AddColorAttachment();
11298 VkViewport view_port = {};
11299 m_viewports.push_back(view_port);
11300 pipe.SetViewport(m_viewports);
11301 VkRect2D rect = {};
11302 m_scissors.push_back(rect);
11303 pipe.SetScissor(m_scissors);
11304 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11305
11306 VkCommandBufferInheritanceInfo cbii = {};
11307 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11308 cbii.renderPass = rp;
11309 cbii.subpass = 0;
11310 VkCommandBufferBeginInfo cbbi = {};
11311 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11312 cbbi.pInheritanceInfo = &cbii;
11313 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11314 VkRenderPassBeginInfo rpbi = {};
11315 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11316 rpbi.framebuffer = m_framebuffer;
11317 rpbi.renderPass = rp;
11318 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi,
11319 VK_SUBPASS_CONTENTS_INLINE);
11320 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11321 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11322
11323 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11324 " is incompatible w/ gfx pipeline ");
11325 // Render triangle (the error should trigger on the attempt to draw).
11326 Draw(3, 1, 0, 0);
11327
11328 // Finalize recording of the command buffer
11329 EndCommandBuffer();
11330
11331 m_errorMonitor->VerifyFound();
11332
11333 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11334 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11335 vkDestroyRenderPass(m_device->device(), rp, NULL);
11336}
11337
Mark Youngc89c6312016-03-31 16:03:20 -060011338TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11339 // Create Pipeline where the number of blend attachments doesn't match the
11340 // number of color attachments. In this case, we don't add any color
11341 // blend attachments even though we have a color attachment.
11342 VkResult err;
11343
11344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -060011345 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -060011346
11347 ASSERT_NO_FATAL_FAILURE(InitState());
11348 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11349 VkDescriptorPoolSize ds_type_count = {};
11350 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11351 ds_type_count.descriptorCount = 1;
11352
11353 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11354 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11355 ds_pool_ci.pNext = NULL;
11356 ds_pool_ci.maxSets = 1;
11357 ds_pool_ci.poolSizeCount = 1;
11358 ds_pool_ci.pPoolSizes = &ds_type_count;
11359
11360 VkDescriptorPool ds_pool;
11361 err =
11362 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11363 ASSERT_VK_SUCCESS(err);
11364
11365 VkDescriptorSetLayoutBinding dsl_binding = {};
11366 dsl_binding.binding = 0;
11367 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11368 dsl_binding.descriptorCount = 1;
11369 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11370 dsl_binding.pImmutableSamplers = NULL;
11371
11372 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11373 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11374 ds_layout_ci.pNext = NULL;
11375 ds_layout_ci.bindingCount = 1;
11376 ds_layout_ci.pBindings = &dsl_binding;
11377
11378 VkDescriptorSetLayout ds_layout;
11379 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11380 &ds_layout);
11381 ASSERT_VK_SUCCESS(err);
11382
11383 VkDescriptorSet descriptorSet;
11384 VkDescriptorSetAllocateInfo alloc_info = {};
11385 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11386 alloc_info.descriptorSetCount = 1;
11387 alloc_info.descriptorPool = ds_pool;
11388 alloc_info.pSetLayouts = &ds_layout;
11389 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11390 &descriptorSet);
11391 ASSERT_VK_SUCCESS(err);
11392
11393 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
11394 pipe_ms_state_ci.sType =
11395 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11396 pipe_ms_state_ci.pNext = NULL;
11397 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11398 pipe_ms_state_ci.sampleShadingEnable = 0;
11399 pipe_ms_state_ci.minSampleShading = 1.0;
11400 pipe_ms_state_ci.pSampleMask = NULL;
11401
11402 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11403 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11404 pipeline_layout_ci.pNext = NULL;
11405 pipeline_layout_ci.setLayoutCount = 1;
11406 pipeline_layout_ci.pSetLayouts = &ds_layout;
11407
11408 VkPipelineLayout pipeline_layout;
11409 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11410 &pipeline_layout);
11411 ASSERT_VK_SUCCESS(err);
11412
11413 VkShaderObj vs(m_device, bindStateVertShaderText,
11414 VK_SHADER_STAGE_VERTEX_BIT, this);
11415 VkShaderObj fs(m_device, bindStateFragShaderText,
11416 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011417 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -060011418 // but add it to be able to run on more devices
11419 VkPipelineObj pipe(m_device);
11420 pipe.AddShader(&vs);
11421 pipe.AddShader(&fs);
11422 pipe.SetMSAA(&pipe_ms_state_ci);
11423 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11424
11425 BeginCommandBuffer();
11426 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11427 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11428
Mark Young29927482016-05-04 14:38:51 -060011429 // Render triangle (the error should trigger on the attempt to draw).
11430 Draw(3, 1, 0, 0);
11431
11432 // Finalize recording of the command buffer
11433 EndCommandBuffer();
11434
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011435 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011436
11437 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11438 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11439 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11440}
Mark Young29927482016-05-04 14:38:51 -060011441
Mark Muellerd4914412016-06-13 17:52:06 -060011442TEST_F(VkLayerTest, MissingClearAttachment) {
11443 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment "
11444 "structure passed to vkCmdClearAttachments");
11445 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11446 "vkCmdClearAttachments() attachment index 1 not found in attachment "
11447 "reference array of active subpass 0");
11448
11449 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11450 m_errorMonitor->VerifyFound();
11451}
11452
Karl Schultz6addd812016-02-02 17:17:23 -070011453TEST_F(VkLayerTest, ClearCmdNoDraw) {
11454 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
11455 // to issuing a Draw
11456 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011457
Karl Schultz6addd812016-02-02 17:17:23 -070011458 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -070011459 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011460 "vkCmdClearAttachments() issued on CB object ");
11461
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011462 ASSERT_NO_FATAL_FAILURE(InitState());
11463 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011464
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011465 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011466 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11467 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011468
11469 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011470 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11471 ds_pool_ci.pNext = NULL;
11472 ds_pool_ci.maxSets = 1;
11473 ds_pool_ci.poolSizeCount = 1;
11474 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011475
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011476 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011477 err =
11478 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011479 ASSERT_VK_SUCCESS(err);
11480
Tony Barboureb254902015-07-15 12:50:33 -060011481 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011482 dsl_binding.binding = 0;
11483 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11484 dsl_binding.descriptorCount = 1;
11485 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11486 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011487
Tony Barboureb254902015-07-15 12:50:33 -060011488 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011489 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11490 ds_layout_ci.pNext = NULL;
11491 ds_layout_ci.bindingCount = 1;
11492 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011493
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011494 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011495 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11496 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011497 ASSERT_VK_SUCCESS(err);
11498
11499 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011500 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011501 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011502 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011503 alloc_info.descriptorPool = ds_pool;
11504 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011505 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11506 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011507 ASSERT_VK_SUCCESS(err);
11508
Tony Barboureb254902015-07-15 12:50:33 -060011509 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011510 pipe_ms_state_ci.sType =
11511 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11512 pipe_ms_state_ci.pNext = NULL;
11513 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11514 pipe_ms_state_ci.sampleShadingEnable = 0;
11515 pipe_ms_state_ci.minSampleShading = 1.0;
11516 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011517
Tony Barboureb254902015-07-15 12:50:33 -060011518 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011519 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11520 pipeline_layout_ci.pNext = NULL;
11521 pipeline_layout_ci.setLayoutCount = 1;
11522 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011523
11524 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011525 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11526 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011527 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011528
Karl Schultz6addd812016-02-02 17:17:23 -070011529 VkShaderObj vs(m_device, bindStateVertShaderText,
11530 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011531 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011532 // on more devices
11533 VkShaderObj fs(m_device, bindStateFragShaderText,
11534 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011535
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011536 VkPipelineObj pipe(m_device);
11537 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011538 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011539 pipe.SetMSAA(&pipe_ms_state_ci);
11540 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011541
11542 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011543
Karl Schultz6addd812016-02-02 17:17:23 -070011544 // Main thing we care about for this test is that the VkImage obj we're
11545 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011546 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011547 VkClearAttachment color_attachment;
11548 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11549 color_attachment.clearValue.color.float32[0] = 1.0;
11550 color_attachment.clearValue.color.float32[1] = 1.0;
11551 color_attachment.clearValue.color.float32[2] = 1.0;
11552 color_attachment.clearValue.color.float32[3] = 1.0;
11553 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070011554 VkClearRect clear_rect = {
11555 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011556
Karl Schultz6addd812016-02-02 17:17:23 -070011557 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
11558 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011559
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011560 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011561
Chia-I Wuf7458c52015-10-26 21:10:41 +080011562 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11563 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11564 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011565}
11566
Karl Schultz6addd812016-02-02 17:17:23 -070011567TEST_F(VkLayerTest, VtxBufferBadIndex) {
11568 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011569
Karl Schultz6addd812016-02-02 17:17:23 -070011570 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070011571 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -070011572 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011573
Tobin Ehlis502480b2015-06-24 15:53:07 -060011574 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011575 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011576 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011577
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011578 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011579 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11580 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011581
11582 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011583 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11584 ds_pool_ci.pNext = NULL;
11585 ds_pool_ci.maxSets = 1;
11586 ds_pool_ci.poolSizeCount = 1;
11587 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011588
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011589 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011590 err =
11591 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011592 ASSERT_VK_SUCCESS(err);
11593
Tony Barboureb254902015-07-15 12:50:33 -060011594 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011595 dsl_binding.binding = 0;
11596 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11597 dsl_binding.descriptorCount = 1;
11598 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11599 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011600
Tony Barboureb254902015-07-15 12:50:33 -060011601 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011602 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11603 ds_layout_ci.pNext = NULL;
11604 ds_layout_ci.bindingCount = 1;
11605 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011606
Tobin Ehlis502480b2015-06-24 15:53:07 -060011607 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011608 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11609 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011610 ASSERT_VK_SUCCESS(err);
11611
11612 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011613 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011614 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011615 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011616 alloc_info.descriptorPool = ds_pool;
11617 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011618 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11619 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011620 ASSERT_VK_SUCCESS(err);
11621
Tony Barboureb254902015-07-15 12:50:33 -060011622 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011623 pipe_ms_state_ci.sType =
11624 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11625 pipe_ms_state_ci.pNext = NULL;
11626 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11627 pipe_ms_state_ci.sampleShadingEnable = 0;
11628 pipe_ms_state_ci.minSampleShading = 1.0;
11629 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011630
Tony Barboureb254902015-07-15 12:50:33 -060011631 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011632 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11633 pipeline_layout_ci.pNext = NULL;
11634 pipeline_layout_ci.setLayoutCount = 1;
11635 pipeline_layout_ci.pSetLayouts = &ds_layout;
11636 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011637
Karl Schultz6addd812016-02-02 17:17:23 -070011638 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11639 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011640 ASSERT_VK_SUCCESS(err);
11641
Karl Schultz6addd812016-02-02 17:17:23 -070011642 VkShaderObj vs(m_device, bindStateVertShaderText,
11643 VK_SHADER_STAGE_VERTEX_BIT, this);
11644 VkShaderObj fs(m_device, bindStateFragShaderText,
11645 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011646 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070011647 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011648 VkPipelineObj pipe(m_device);
11649 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011650 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011651 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011652 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011653 pipe.SetViewport(m_viewports);
11654 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011655 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011656
11657 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070011658 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11659 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011660 // Don't care about actual data, just need to get to draw to flag error
11661 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -070011662 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
11663 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011664 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011665 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011666
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011667 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011668
Chia-I Wuf7458c52015-10-26 21:10:41 +080011669 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11670 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11671 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011672}
Mark Muellerdfe37552016-07-07 14:47:42 -060011673
11674TEST_F(VkLayerTest, VertexBufferInvalid) {
11675 TEST_DESCRIPTION("Submit a command buffer using deleted vertex buffer, "
11676 "delete a buffer twice, use an invalid offset for each "
11677 "buffer type, and attempt to bind a null buffer");
11678
11679 const char *deleted_buffer_in_command_buffer = "Cannot submit cmd buffer "
11680 "using deleted buffer ";
11681 const char *double_destroy_message = "Cannot free buffer 0x";
11682 const char *invalid_offset_message = "vkBindBufferMemory(): "
11683 "memoryOffset is 0x";
11684 const char *invalid_storage_buffer_offset_message = "vkBindBufferMemory(): "
11685 "storage memoryOffset "
11686 "is 0x";
11687 const char *invalid_texel_buffer_offset_message = "vkBindBufferMemory(): "
11688 "texel memoryOffset "
11689 "is 0x";
11690 const char *invalid_uniform_buffer_offset_message = "vkBindBufferMemory(): "
11691 "uniform memoryOffset "
11692 "is 0x";
11693 const char *bind_null_buffer_message = "In vkBindBufferMemory, attempting"
11694 " to Bind Obj(0x";
11695 const char *free_invalid_buffer_message = "Request to delete memory "
11696 "object 0x";
11697
11698 ASSERT_NO_FATAL_FAILURE(InitState());
11699 ASSERT_NO_FATAL_FAILURE(InitViewport());
11700 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11701
11702 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
11703 pipe_ms_state_ci.sType =
11704 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11705 pipe_ms_state_ci.pNext = NULL;
11706 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11707 pipe_ms_state_ci.sampleShadingEnable = 0;
11708 pipe_ms_state_ci.minSampleShading = 1.0;
11709 pipe_ms_state_ci.pSampleMask = nullptr;
11710
11711 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11712 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11713 VkPipelineLayout pipeline_layout;
11714
11715 VkResult err = vkCreatePipelineLayout(m_device->device(),
11716 &pipeline_layout_ci, nullptr,
11717 &pipeline_layout);
11718 ASSERT_VK_SUCCESS(err);
11719
11720 VkShaderObj vs(m_device, bindStateVertShaderText,
11721 VK_SHADER_STAGE_VERTEX_BIT, this);
11722 VkShaderObj fs(m_device, bindStateFragShaderText,
11723 VK_SHADER_STAGE_FRAGMENT_BIT,
11724 this);
11725 VkPipelineObj pipe(m_device);
11726 pipe.AddShader(&vs);
11727 pipe.AddShader(&fs);
11728 pipe.AddColorAttachment();
11729 pipe.SetMSAA(&pipe_ms_state_ci);
11730 pipe.SetViewport(m_viewports);
11731 pipe.SetScissor(m_scissors);
11732 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11733
11734 BeginCommandBuffer();
11735 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11736 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11737
11738 {
11739 // Create and bind a vertex buffer in a reduced scope, which will cause
11740 // it to be deleted upon leaving this scope
11741 const float vbo_data[3] = {1.f, 0.f, 1.f};
11742 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data),
11743 3, vbo_data);
11744 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11745 draw_verticies.AddVertexInputToPipe(pipe);
11746 }
11747
11748 Draw(1, 0, 0, 0);
11749
11750 EndCommandBuffer();
11751
11752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11753 deleted_buffer_in_command_buffer);
11754 QueueCommandBuffer(false);
11755 m_errorMonitor->VerifyFound();
11756
11757 {
11758 // Create and bind a vertex buffer in a reduced scope, and delete it
11759 // twice, the second through the destructor
11760 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11761 VkBufferTest::eDoubleDelete);
11762 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11763 double_destroy_message);
11764 buffer_test.TestDoubleDestroy();
11765 }
11766 m_errorMonitor->VerifyFound();
11767
11768 if (VkBufferTest::
11769 GetTestConditionValid(m_device,
11770 VkBufferTest::eInvalidMemoryOffset)) {
11771 // Create and bind a memory buffer with an invalid offset.
11772 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11773 invalid_offset_message);
11774 VkBufferTest buffer_test(m_device,
11775 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
11776 VkBufferTest::eInvalidMemoryOffset);
11777 (void) buffer_test;
11778 m_errorMonitor->VerifyFound();
11779 }
11780
11781 if (VkBufferTest::
11782 GetTestConditionValid(m_device,
11783 VkBufferTest::eInvalidDeviceOffset,
11784 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
11785 // Create and bind a memory buffer with an invalid offset again,
11786 // but look for a texel buffer message.
11787 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11788 invalid_texel_buffer_offset_message);
11789 VkBufferTest buffer_test(m_device,
11790 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
11791 VkBufferTest::eInvalidDeviceOffset);
11792 (void) buffer_test;
11793 m_errorMonitor->VerifyFound();
11794 }
11795
11796 if (VkBufferTest::
11797 GetTestConditionValid(m_device,
11798 VkBufferTest::eInvalidDeviceOffset,
11799 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
11800 // Create and bind a memory buffer with an invalid offset again, but
11801 // look for a uniform buffer message.
11802 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11803 invalid_uniform_buffer_offset_message);
11804 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
11805 VkBufferTest::eInvalidDeviceOffset);
11806 (void) buffer_test;
11807 m_errorMonitor->VerifyFound();
11808 }
11809
11810 if (VkBufferTest::
11811 GetTestConditionValid(m_device,
11812 VkBufferTest::eInvalidDeviceOffset,
11813 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
11814 // Create and bind a memory buffer with an invalid offset again, but
11815 // look for a storage buffer message.
11816 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11817 invalid_storage_buffer_offset_message);
11818 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11819 VkBufferTest::eInvalidDeviceOffset);
11820 (void) buffer_test;
11821 m_errorMonitor->VerifyFound();
11822 }
11823
11824 {
11825 // Attempt to bind a null buffer.
11826 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11827 bind_null_buffer_message);
11828 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11829 VkBufferTest::eBindNullBuffer);
11830 (void) buffer_test;
11831 m_errorMonitor->VerifyFound();
11832 }
11833
11834 {
11835 // Attempt to use an invalid handle to delete a buffer.
11836 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11837 free_invalid_buffer_message);
11838 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11839 VkBufferTest::eFreeInvalidHandle);
11840 (void) buffer_test;
11841 }
11842 m_errorMonitor->VerifyFound();
11843
11844 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11845}
11846
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011847// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11848TEST_F(VkLayerTest, InvalidImageLayout) {
11849 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
11850 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11851 "images in the wrong layout when they're copied or transitioned.");
11852 // 3 in ValidateCmdBufImageLayouts
11853 // * -1 Attempt to submit cmd buf w/ deleted image
11854 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11855 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
11856 m_errorMonitor->SetDesiredFailureMsg(
11857 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11858 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11859
11860 ASSERT_NO_FATAL_FAILURE(InitState());
11861 // Create src & dst images to use for copy operations
11862 VkImage src_image;
11863 VkImage dst_image;
11864
11865 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11866 const int32_t tex_width = 32;
11867 const int32_t tex_height = 32;
11868
11869 VkImageCreateInfo image_create_info = {};
11870 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11871 image_create_info.pNext = NULL;
11872 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11873 image_create_info.format = tex_format;
11874 image_create_info.extent.width = tex_width;
11875 image_create_info.extent.height = tex_height;
11876 image_create_info.extent.depth = 1;
11877 image_create_info.mipLevels = 1;
11878 image_create_info.arrayLayers = 4;
11879 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11880 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11881 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
11882 image_create_info.flags = 0;
11883
11884 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11885 ASSERT_VK_SUCCESS(err);
11886 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11887 ASSERT_VK_SUCCESS(err);
11888
11889 BeginCommandBuffer();
11890 VkImageCopy copyRegion;
11891 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11892 copyRegion.srcSubresource.mipLevel = 0;
11893 copyRegion.srcSubresource.baseArrayLayer = 0;
11894 copyRegion.srcSubresource.layerCount = 1;
11895 copyRegion.srcOffset.x = 0;
11896 copyRegion.srcOffset.y = 0;
11897 copyRegion.srcOffset.z = 0;
11898 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11899 copyRegion.dstSubresource.mipLevel = 0;
11900 copyRegion.dstSubresource.baseArrayLayer = 0;
11901 copyRegion.dstSubresource.layerCount = 1;
11902 copyRegion.dstOffset.x = 0;
11903 copyRegion.dstOffset.y = 0;
11904 copyRegion.dstOffset.z = 0;
11905 copyRegion.extent.width = 1;
11906 copyRegion.extent.height = 1;
11907 copyRegion.extent.depth = 1;
11908 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11909 m_errorMonitor->VerifyFound();
11910 // Now cause error due to src image layout changing
11911 m_errorMonitor->SetDesiredFailureMsg(
11912 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11913 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
11914 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11915 m_errorMonitor->VerifyFound();
11916 // Final src error is due to bad layout type
11917 m_errorMonitor->SetDesiredFailureMsg(
11918 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11919 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
11920 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11921 m_errorMonitor->VerifyFound();
11922 // Now verify same checks for dst
11923 m_errorMonitor->SetDesiredFailureMsg(
11924 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11925 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
11926 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11927 m_errorMonitor->VerifyFound();
11928 // Now cause error due to src image layout changing
11929 m_errorMonitor->SetDesiredFailureMsg(
11930 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11931 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
11932 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
11933 m_errorMonitor->VerifyFound();
11934 m_errorMonitor->SetDesiredFailureMsg(
11935 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11936 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
11937 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
11938 m_errorMonitor->VerifyFound();
11939 // Now cause error due to bad image layout transition in PipelineBarrier
11940 VkImageMemoryBarrier image_barrier[1] = {};
11941 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11942 image_barrier[0].image = src_image;
11943 image_barrier[0].subresourceRange.layerCount = 2;
11944 image_barrier[0].subresourceRange.levelCount = 2;
11945 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11946 m_errorMonitor->SetDesiredFailureMsg(
11947 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11948 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
11949 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
11950 m_errorMonitor->VerifyFound();
11951
11952 // Finally some layout errors at RenderPass create time
11953 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
11954 VkAttachmentReference attach = {};
11955 // perf warning for GENERAL layout w/ non-DS input attachment
11956 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11957 VkSubpassDescription subpass = {};
11958 subpass.inputAttachmentCount = 1;
11959 subpass.pInputAttachments = &attach;
11960 VkRenderPassCreateInfo rpci = {};
11961 rpci.subpassCount = 1;
11962 rpci.pSubpasses = &subpass;
11963 rpci.attachmentCount = 1;
11964 VkAttachmentDescription attach_desc = {};
11965 attach_desc.format = VK_FORMAT_UNDEFINED;
11966 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011967 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011968 VkRenderPass rp;
11969 m_errorMonitor->SetDesiredFailureMsg(
11970 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11971 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
11972 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11973 m_errorMonitor->VerifyFound();
11974 // error w/ non-general layout
11975 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11976
11977 m_errorMonitor->SetDesiredFailureMsg(
11978 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11979 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
11980 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11981 m_errorMonitor->VerifyFound();
11982 subpass.inputAttachmentCount = 0;
11983 subpass.colorAttachmentCount = 1;
11984 subpass.pColorAttachments = &attach;
11985 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11986 // perf warning for GENERAL layout on color attachment
11987 m_errorMonitor->SetDesiredFailureMsg(
11988 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11989 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
11990 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11991 m_errorMonitor->VerifyFound();
11992 // error w/ non-color opt or GENERAL layout for color attachment
11993 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11994 m_errorMonitor->SetDesiredFailureMsg(
11995 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11996 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
11997 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11998 m_errorMonitor->VerifyFound();
11999 subpass.colorAttachmentCount = 0;
12000 subpass.pDepthStencilAttachment = &attach;
12001 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12002 // perf warning for GENERAL layout on DS attachment
12003 m_errorMonitor->SetDesiredFailureMsg(
12004 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12005 "Layout for depth attachment is GENERAL but should be DEPTH_STENCIL_ATTACHMENT_OPTIMAL.");
12006 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12007 m_errorMonitor->VerifyFound();
12008 // error w/ non-ds opt or GENERAL layout for color attachment
12009 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12010 m_errorMonitor->SetDesiredFailureMsg(
12011 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12012 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be DEPTH_STENCIL_ATTACHMENT_OPTIMAL or GENERAL.");
12013 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12014 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012015 // For this error we need a valid renderpass so create default one
12016 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12017 attach.attachment = 0;
12018 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
12019 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12020 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12021 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12022 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12023 // Can't do a CLEAR load on READ_ONLY initialLayout
12024 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12025 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12026 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12027 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12028 " with invalid first layout "
12029 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
12030 "ONLY_OPTIMAL");
12031 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12032 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012033
12034 vkDestroyImage(m_device->device(), src_image, NULL);
12035 vkDestroyImage(m_device->device(), dst_image, NULL);
12036}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012037
12038TEST_F(VkLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
12039 TEST_DESCRIPTION("Positive test where we create a renderpass with an "
12040 "attachment that uses LOAD_OP_CLEAR, the first subpass "
12041 "has a valid layout, and a second subpass then uses a "
12042 "valid *READ_ONLY* layout.");
12043 m_errorMonitor->ExpectSuccess();
12044 ASSERT_NO_FATAL_FAILURE(InitState());
12045
12046 VkAttachmentReference attach[2] = {};
12047 attach[0].attachment = 0;
12048 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
12049 attach[1].attachment = 0;
12050 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12051 VkSubpassDescription subpasses[2] = {};
12052 // First subpass clears DS attach on load
12053 subpasses[0].pDepthStencilAttachment = &attach[0];
12054 // 2nd subpass reads in DS as input attachment
12055 subpasses[1].inputAttachmentCount = 1;
12056 subpasses[1].pInputAttachments = &attach[1];
12057 VkAttachmentDescription attach_desc = {};
12058 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
12059 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12060 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12061 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12062 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12063 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12064 attach_desc.initialLayout =
12065 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
12066 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12067 VkRenderPassCreateInfo rpci = {};
12068 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
12069 rpci.attachmentCount = 1;
12070 rpci.pAttachments = &attach_desc;
12071 rpci.subpassCount = 2;
12072 rpci.pSubpasses = subpasses;
12073
12074 // Now create RenderPass and verify no errors
12075 VkRenderPass rp;
12076 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12077 m_errorMonitor->VerifyNotFound();
12078
12079 vkDestroyRenderPass(m_device->device(), rp, NULL);
12080}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012081#endif // DRAW_STATE_TESTS
12082
Tobin Ehlis0788f522015-05-26 16:11:58 -060012083#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -060012084#if GTEST_IS_THREADSAFE
12085struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012086 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012087 VkEvent event;
12088 bool bailout;
12089};
12090
Karl Schultz6addd812016-02-02 17:17:23 -070012091extern "C" void *AddToCommandBuffer(void *arg) {
12092 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012093
Mike Stroyana6d14942016-07-13 15:10:05 -060012094 for (int i = 0; i < 80000; i++) {
Karl Schultz6addd812016-02-02 17:17:23 -070012095 vkCmdSetEvent(data->commandBuffer, data->event,
12096 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012097 if (data->bailout) {
12098 break;
12099 }
12100 }
12101 return NULL;
12102}
12103
Karl Schultz6addd812016-02-02 17:17:23 -070012104TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012105 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012106
Karl Schultz6addd812016-02-02 17:17:23 -070012107 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12108 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012109
Mike Stroyanaccf7692015-05-12 16:00:45 -060012110 ASSERT_NO_FATAL_FAILURE(InitState());
12111 ASSERT_NO_FATAL_FAILURE(InitViewport());
12112 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12113
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012114 // Calls AllocateCommandBuffers
12115 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060012116
12117 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012118 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012119
12120 VkEventCreateInfo event_info;
12121 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012122 VkResult err;
12123
12124 memset(&event_info, 0, sizeof(event_info));
12125 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12126
Chia-I Wuf7458c52015-10-26 21:10:41 +080012127 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012128 ASSERT_VK_SUCCESS(err);
12129
Mike Stroyanaccf7692015-05-12 16:00:45 -060012130 err = vkResetEvent(device(), event);
12131 ASSERT_VK_SUCCESS(err);
12132
12133 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012134 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012135 data.event = event;
12136 data.bailout = false;
12137 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060012138
12139 // First do some correct operations using multiple threads.
12140 // Add many entries to command buffer from another thread.
12141 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
12142 // Make non-conflicting calls from this thread at the same time.
12143 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060012144 uint32_t count;
12145 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060012146 }
12147 test_platform_thread_join(thread, NULL);
12148
12149 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060012150 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012151 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012152 // Add many entries to command buffer from this thread at the same time.
12153 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060012154
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012155 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012156 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012157
Mike Stroyan10b8cb72016-01-22 15:22:03 -070012158 m_errorMonitor->SetBailout(NULL);
12159
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012160 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012161
Chia-I Wuf7458c52015-10-26 21:10:41 +080012162 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012163}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012164#endif // GTEST_IS_THREADSAFE
12165#endif // THREADING_TESTS
12166
Chris Forbes9f7ff632015-05-25 11:13:08 +120012167#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070012168TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012169 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
12170 "with an impossible code size");
12171
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012173 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012174
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012175 ASSERT_NO_FATAL_FAILURE(InitState());
12176 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12177
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012178 VkShaderModule module;
12179 VkShaderModuleCreateInfo moduleCreateInfo;
12180 struct icd_spv_header spv;
12181
12182 spv.magic = ICD_SPV_MAGIC;
12183 spv.version = ICD_SPV_VERSION;
12184 spv.gen_magic = 0;
12185
12186 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12187 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070012188 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012189 moduleCreateInfo.codeSize = 4;
12190 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012191 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012192
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012193 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012194}
12195
Karl Schultz6addd812016-02-02 17:17:23 -070012196TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012197 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
12198 "with a bad magic number");
12199
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012200 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012201 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012202
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012203 ASSERT_NO_FATAL_FAILURE(InitState());
12204 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12205
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012206 VkShaderModule module;
12207 VkShaderModuleCreateInfo moduleCreateInfo;
12208 struct icd_spv_header spv;
12209
12210 spv.magic = ~ICD_SPV_MAGIC;
12211 spv.version = ICD_SPV_VERSION;
12212 spv.gen_magic = 0;
12213
12214 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12215 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070012216 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012217 moduleCreateInfo.codeSize = sizeof(spv) + 10;
12218 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012219 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012220
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012221 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012222}
12223
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012224#if 0
12225// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070012226TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012228 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012229
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012230 ASSERT_NO_FATAL_FAILURE(InitState());
12231 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12232
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012233 VkShaderModule module;
12234 VkShaderModuleCreateInfo moduleCreateInfo;
12235 struct icd_spv_header spv;
12236
12237 spv.magic = ICD_SPV_MAGIC;
12238 spv.version = ~ICD_SPV_VERSION;
12239 spv.gen_magic = 0;
12240
12241 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12242 moduleCreateInfo.pNext = NULL;
12243
Karl Schultz6addd812016-02-02 17:17:23 -070012244 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012245 moduleCreateInfo.codeSize = sizeof(spv) + 10;
12246 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012247 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012248
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012249 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012250}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012251#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012252
Karl Schultz6addd812016-02-02 17:17:23 -070012253TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012254 TEST_DESCRIPTION("Test that a warning is produced for a vertex output that "
12255 "is not consumed by the fragment stage");
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012256 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012257 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012258
Chris Forbes9f7ff632015-05-25 11:13:08 +120012259 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012260 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120012261
12262 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012263 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120012264 "\n"
12265 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070012266 "out gl_PerVertex {\n"
12267 " vec4 gl_Position;\n"
12268 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120012269 "void main(){\n"
12270 " gl_Position = vec4(1);\n"
12271 " x = 0;\n"
12272 "}\n";
12273 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012274 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120012275 "\n"
12276 "layout(location=0) out vec4 color;\n"
12277 "void main(){\n"
12278 " color = vec4(1);\n"
12279 "}\n";
12280
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012281 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12282 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120012283
12284 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012285 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120012286 pipe.AddShader(&vs);
12287 pipe.AddShader(&fs);
12288
Chris Forbes9f7ff632015-05-25 11:13:08 +120012289 VkDescriptorSetObj descriptorSet(m_device);
12290 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012291 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120012292
Tony Barbour5781e8f2015-08-04 16:23:11 -060012293 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120012294
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012295 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120012296}
Chris Forbes9f7ff632015-05-25 11:13:08 +120012297
Karl Schultz6addd812016-02-02 17:17:23 -070012298TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012299 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
12300 "which is not present in the outputs of the previous stage");
12301
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012302 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012303 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012304
Chris Forbes59cb88d2015-05-25 11:13:13 +120012305 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012306 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120012307
12308 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012309 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120012310 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070012311 "out gl_PerVertex {\n"
12312 " vec4 gl_Position;\n"
12313 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120012314 "void main(){\n"
12315 " gl_Position = vec4(1);\n"
12316 "}\n";
12317 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012318 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120012319 "\n"
12320 "layout(location=0) in float x;\n"
12321 "layout(location=0) out vec4 color;\n"
12322 "void main(){\n"
12323 " color = vec4(x);\n"
12324 "}\n";
12325
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012326 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12327 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120012328
12329 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012330 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120012331 pipe.AddShader(&vs);
12332 pipe.AddShader(&fs);
12333
Chris Forbes59cb88d2015-05-25 11:13:13 +120012334 VkDescriptorSetObj descriptorSet(m_device);
12335 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012336 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120012337
Tony Barbour5781e8f2015-08-04 16:23:11 -060012338 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120012339
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012340 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120012341}
12342
Karl Schultz6addd812016-02-02 17:17:23 -070012343TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012344 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
12345 "within an interace block, which is not present in the outputs "
12346 "of the previous stage.");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012347 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012348 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012349
12350 ASSERT_NO_FATAL_FAILURE(InitState());
12351 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12352
12353 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012354 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130012355 "\n"
12356 "out gl_PerVertex {\n"
12357 " vec4 gl_Position;\n"
12358 "};\n"
12359 "void main(){\n"
12360 " gl_Position = vec4(1);\n"
12361 "}\n";
12362 char const *fsSource =
12363 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130012364 "\n"
12365 "in block { layout(location=0) float x; } ins;\n"
12366 "layout(location=0) out vec4 color;\n"
12367 "void main(){\n"
12368 " color = vec4(ins.x);\n"
12369 "}\n";
12370
12371 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12372 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12373
12374 VkPipelineObj pipe(m_device);
12375 pipe.AddColorAttachment();
12376 pipe.AddShader(&vs);
12377 pipe.AddShader(&fs);
12378
12379 VkDescriptorSetObj descriptorSet(m_device);
12380 descriptorSet.AppendDummy();
12381 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12382
12383 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12384
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012385 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130012386}
12387
Karl Schultz6addd812016-02-02 17:17:23 -070012388TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012389 TEST_DESCRIPTION("Test that an error is produced for mismatched array sizes "
12390 "across the VS->FS interface");
Chris Forbes0036fd12016-01-26 14:19:49 +130012391 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +130012392 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -070012393 "output arr[2] of float32' vs 'ptr to "
12394 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130012395
12396 ASSERT_NO_FATAL_FAILURE(InitState());
12397 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12398
12399 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012400 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130012401 "\n"
12402 "layout(location=0) out float x[2];\n"
12403 "out gl_PerVertex {\n"
12404 " vec4 gl_Position;\n"
12405 "};\n"
12406 "void main(){\n"
12407 " x[0] = 0; x[1] = 0;\n"
12408 " gl_Position = vec4(1);\n"
12409 "}\n";
12410 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012411 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130012412 "\n"
12413 "layout(location=0) in float x[3];\n"
12414 "layout(location=0) out vec4 color;\n"
12415 "void main(){\n"
12416 " color = vec4(x[0] + x[1] + x[2]);\n"
12417 "}\n";
12418
12419 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12420 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12421
12422 VkPipelineObj pipe(m_device);
12423 pipe.AddColorAttachment();
12424 pipe.AddShader(&vs);
12425 pipe.AddShader(&fs);
12426
12427 VkDescriptorSetObj descriptorSet(m_device);
12428 descriptorSet.AppendDummy();
12429 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12430
12431 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12432
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012433 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130012434}
12435
Karl Schultz6addd812016-02-02 17:17:23 -070012436TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012437 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
12438 "the VS->FS interface");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012439 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012440 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012441
Chris Forbesb56af562015-05-25 11:13:17 +120012442 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012443 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120012444
12445 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012446 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120012447 "\n"
12448 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070012449 "out gl_PerVertex {\n"
12450 " vec4 gl_Position;\n"
12451 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +120012452 "void main(){\n"
12453 " x = 0;\n"
12454 " gl_Position = vec4(1);\n"
12455 "}\n";
12456 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012457 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120012458 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012459 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +120012460 "layout(location=0) out vec4 color;\n"
12461 "void main(){\n"
12462 " color = vec4(x);\n"
12463 "}\n";
12464
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012465 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12466 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120012467
12468 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012469 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120012470 pipe.AddShader(&vs);
12471 pipe.AddShader(&fs);
12472
Chris Forbesb56af562015-05-25 11:13:17 +120012473 VkDescriptorSetObj descriptorSet(m_device);
12474 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012475 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120012476
Tony Barbour5781e8f2015-08-04 16:23:11 -060012477 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120012478
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012479 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120012480}
12481
Karl Schultz6addd812016-02-02 17:17:23 -070012482TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012483 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
12484 "the VS->FS interface, when the variable is contained within "
12485 "an interface block");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012487 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012488
12489 ASSERT_NO_FATAL_FAILURE(InitState());
12490 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12491
12492 char const *vsSource =
12493 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130012494 "\n"
12495 "out block { layout(location=0) int x; } outs;\n"
12496 "out gl_PerVertex {\n"
12497 " vec4 gl_Position;\n"
12498 "};\n"
12499 "void main(){\n"
12500 " outs.x = 0;\n"
12501 " gl_Position = vec4(1);\n"
12502 "}\n";
12503 char const *fsSource =
12504 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130012505 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012506 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +130012507 "layout(location=0) out vec4 color;\n"
12508 "void main(){\n"
12509 " color = vec4(ins.x);\n"
12510 "}\n";
12511
12512 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12513 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12514
12515 VkPipelineObj pipe(m_device);
12516 pipe.AddColorAttachment();
12517 pipe.AddShader(&vs);
12518 pipe.AddShader(&fs);
12519
12520 VkDescriptorSetObj descriptorSet(m_device);
12521 descriptorSet.AppendDummy();
12522 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12523
12524 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12525
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012526 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130012527}
12528
12529TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012530 TEST_DESCRIPTION("Test that an error is produced for location mismatches across "
12531 "the VS->FS interface; This should manifest as a not-written/not-consumed "
12532 "pair, but flushes out broken walking of the interfaces");
Chris Forbese9928822016-02-17 14:44:52 +130012533 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12534 "location 0.0 which is not written by vertex shader");
12535
12536 ASSERT_NO_FATAL_FAILURE(InitState());
12537 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12538
12539 char const *vsSource =
12540 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130012541 "\n"
12542 "out block { layout(location=1) float x; } outs;\n"
12543 "out gl_PerVertex {\n"
12544 " vec4 gl_Position;\n"
12545 "};\n"
12546 "void main(){\n"
12547 " outs.x = 0;\n"
12548 " gl_Position = vec4(1);\n"
12549 "}\n";
12550 char const *fsSource =
12551 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130012552 "\n"
12553 "in block { layout(location=0) float x; } ins;\n"
12554 "layout(location=0) out vec4 color;\n"
12555 "void main(){\n"
12556 " color = vec4(ins.x);\n"
12557 "}\n";
12558
12559 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12560 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12561
12562 VkPipelineObj pipe(m_device);
12563 pipe.AddColorAttachment();
12564 pipe.AddShader(&vs);
12565 pipe.AddShader(&fs);
12566
12567 VkDescriptorSetObj descriptorSet(m_device);
12568 descriptorSet.AppendDummy();
12569 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12570
12571 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12572
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012573 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130012574}
12575
12576TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012577 TEST_DESCRIPTION("Test that an error is produced for component mismatches across the "
12578 "VS->FS interface. It's not enough to have the same set of locations in "
12579 "use; matching is defined in terms of spirv variables.");
Chris Forbese9928822016-02-17 14:44:52 +130012580 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12581 "location 0.1 which is not written by vertex shader");
12582
12583 ASSERT_NO_FATAL_FAILURE(InitState());
12584 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12585
12586 char const *vsSource =
12587 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130012588 "\n"
12589 "out block { layout(location=0, component=0) float x; } outs;\n"
12590 "out gl_PerVertex {\n"
12591 " vec4 gl_Position;\n"
12592 "};\n"
12593 "void main(){\n"
12594 " outs.x = 0;\n"
12595 " gl_Position = vec4(1);\n"
12596 "}\n";
12597 char const *fsSource =
12598 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130012599 "\n"
12600 "in block { layout(location=0, component=1) float x; } ins;\n"
12601 "layout(location=0) out vec4 color;\n"
12602 "void main(){\n"
12603 " color = vec4(ins.x);\n"
12604 "}\n";
12605
12606 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12607 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12608
12609 VkPipelineObj pipe(m_device);
12610 pipe.AddColorAttachment();
12611 pipe.AddShader(&vs);
12612 pipe.AddShader(&fs);
12613
12614 VkDescriptorSetObj descriptorSet(m_device);
12615 descriptorSet.AppendDummy();
12616 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12617
12618 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12619
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012620 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130012621}
12622
Karl Schultz6addd812016-02-02 17:17:23 -070012623TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012624 TEST_DESCRIPTION("Test that a warning is produced for a vertex attribute which is "
12625 "not consumed by the vertex shader");
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012626 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012627 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012628
Chris Forbesde136e02015-05-25 11:13:28 +120012629 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012630 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120012631
12632 VkVertexInputBindingDescription input_binding;
12633 memset(&input_binding, 0, sizeof(input_binding));
12634
12635 VkVertexInputAttributeDescription input_attrib;
12636 memset(&input_attrib, 0, sizeof(input_attrib));
12637 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12638
12639 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012640 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120012641 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070012642 "out gl_PerVertex {\n"
12643 " vec4 gl_Position;\n"
12644 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +120012645 "void main(){\n"
12646 " gl_Position = vec4(1);\n"
12647 "}\n";
12648 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012649 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120012650 "\n"
12651 "layout(location=0) out vec4 color;\n"
12652 "void main(){\n"
12653 " color = vec4(1);\n"
12654 "}\n";
12655
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012656 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12657 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120012658
12659 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012660 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120012661 pipe.AddShader(&vs);
12662 pipe.AddShader(&fs);
12663
12664 pipe.AddVertexInputBindings(&input_binding, 1);
12665 pipe.AddVertexInputAttribs(&input_attrib, 1);
12666
Chris Forbesde136e02015-05-25 11:13:28 +120012667 VkDescriptorSetObj descriptorSet(m_device);
12668 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012669 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120012670
Tony Barbour5781e8f2015-08-04 16:23:11 -060012671 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120012672
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012673 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120012674}
12675
Karl Schultz6addd812016-02-02 17:17:23 -070012676TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012677 TEST_DESCRIPTION("Test that a warning is produced for a location mismatch on "
12678 "vertex attributes. This flushes out bad behavior in the interface walker");
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012679 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012680 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +130012681
12682 ASSERT_NO_FATAL_FAILURE(InitState());
12683 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12684
12685 VkVertexInputBindingDescription input_binding;
12686 memset(&input_binding, 0, sizeof(input_binding));
12687
12688 VkVertexInputAttributeDescription input_attrib;
12689 memset(&input_attrib, 0, sizeof(input_attrib));
12690 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12691
12692 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012693 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130012694 "\n"
12695 "layout(location=1) in float x;\n"
12696 "out gl_PerVertex {\n"
12697 " vec4 gl_Position;\n"
12698 "};\n"
12699 "void main(){\n"
12700 " gl_Position = vec4(x);\n"
12701 "}\n";
12702 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012703 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130012704 "\n"
12705 "layout(location=0) out vec4 color;\n"
12706 "void main(){\n"
12707 " color = vec4(1);\n"
12708 "}\n";
12709
12710 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12711 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12712
12713 VkPipelineObj pipe(m_device);
12714 pipe.AddColorAttachment();
12715 pipe.AddShader(&vs);
12716 pipe.AddShader(&fs);
12717
12718 pipe.AddVertexInputBindings(&input_binding, 1);
12719 pipe.AddVertexInputAttribs(&input_attrib, 1);
12720
12721 VkDescriptorSetObj descriptorSet(m_device);
12722 descriptorSet.AppendDummy();
12723 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12724
12725 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12726
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012727 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130012728}
12729
Karl Schultz6addd812016-02-02 17:17:23 -070012730TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012731 TEST_DESCRIPTION("Test that an error is produced for a VS input which is not "
12732 "provided by a vertex attribute");
Karl Schultz6addd812016-02-02 17:17:23 -070012733 m_errorMonitor->SetDesiredFailureMsg(
12734 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012735 "VS consumes input at location 0 but not provided");
12736
Chris Forbes62e8e502015-05-25 11:13:29 +120012737 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012738 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120012739
12740 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012741 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120012742 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012743 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -070012744 "out gl_PerVertex {\n"
12745 " vec4 gl_Position;\n"
12746 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120012747 "void main(){\n"
12748 " gl_Position = x;\n"
12749 "}\n";
12750 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012751 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120012752 "\n"
12753 "layout(location=0) out vec4 color;\n"
12754 "void main(){\n"
12755 " color = vec4(1);\n"
12756 "}\n";
12757
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012758 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12759 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120012760
12761 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012762 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120012763 pipe.AddShader(&vs);
12764 pipe.AddShader(&fs);
12765
Chris Forbes62e8e502015-05-25 11:13:29 +120012766 VkDescriptorSetObj descriptorSet(m_device);
12767 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012768 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120012769
Tony Barbour5781e8f2015-08-04 16:23:11 -060012770 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120012771
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012772 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120012773}
12774
Karl Schultz6addd812016-02-02 17:17:23 -070012775TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012776 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the "
12777 "fundamental type (float/int/uint) of an attribute and the "
12778 "VS input that consumes it");
Karl Schultz6addd812016-02-02 17:17:23 -070012779 m_errorMonitor->SetDesiredFailureMsg(
12780 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012781 "location 0 does not match VS input type");
12782
Chris Forbesc97d98e2015-05-25 11:13:31 +120012783 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012784 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120012785
12786 VkVertexInputBindingDescription input_binding;
12787 memset(&input_binding, 0, sizeof(input_binding));
12788
12789 VkVertexInputAttributeDescription input_attrib;
12790 memset(&input_attrib, 0, sizeof(input_attrib));
12791 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12792
12793 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012794 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120012795 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012796 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070012797 "out gl_PerVertex {\n"
12798 " vec4 gl_Position;\n"
12799 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120012800 "void main(){\n"
12801 " gl_Position = vec4(x);\n"
12802 "}\n";
12803 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012804 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120012805 "\n"
12806 "layout(location=0) out vec4 color;\n"
12807 "void main(){\n"
12808 " color = vec4(1);\n"
12809 "}\n";
12810
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012811 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12812 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120012813
12814 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012815 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120012816 pipe.AddShader(&vs);
12817 pipe.AddShader(&fs);
12818
12819 pipe.AddVertexInputBindings(&input_binding, 1);
12820 pipe.AddVertexInputAttribs(&input_attrib, 1);
12821
Chris Forbesc97d98e2015-05-25 11:13:31 +120012822 VkDescriptorSetObj descriptorSet(m_device);
12823 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012824 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120012825
Tony Barbour5781e8f2015-08-04 16:23:11 -060012826 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120012827
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012828 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120012829}
12830
Chris Forbesc68b43c2016-04-06 11:18:47 +120012831TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012832 TEST_DESCRIPTION("Test that an error is produced for a pipeline containing multiple "
12833 "shaders for the same stage");
Chris Forbesc68b43c2016-04-06 11:18:47 +120012834 m_errorMonitor->SetDesiredFailureMsg(
12835 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12836 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
12837
12838 ASSERT_NO_FATAL_FAILURE(InitState());
12839 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12840
12841 char const *vsSource =
12842 "#version 450\n"
12843 "\n"
12844 "out gl_PerVertex {\n"
12845 " vec4 gl_Position;\n"
12846 "};\n"
12847 "void main(){\n"
12848 " gl_Position = vec4(1);\n"
12849 "}\n";
12850 char const *fsSource =
12851 "#version 450\n"
12852 "\n"
12853 "layout(location=0) out vec4 color;\n"
12854 "void main(){\n"
12855 " color = vec4(1);\n"
12856 "}\n";
12857
12858 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12859 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12860
12861 VkPipelineObj pipe(m_device);
12862 pipe.AddColorAttachment();
12863 pipe.AddShader(&vs);
12864 pipe.AddShader(&vs);
12865 pipe.AddShader(&fs);
12866
12867 VkDescriptorSetObj descriptorSet(m_device);
12868 descriptorSet.AppendDummy();
12869 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12870
12871 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12872
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012873 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120012874}
12875
Karl Schultz6addd812016-02-02 17:17:23 -070012876TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012877 TEST_DESCRIPTION("Test that pipeline validation accepts matrices passed "
12878 "as vertex attributes");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012879 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130012880
12881 ASSERT_NO_FATAL_FAILURE(InitState());
12882 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12883
12884 VkVertexInputBindingDescription input_binding;
12885 memset(&input_binding, 0, sizeof(input_binding));
12886
12887 VkVertexInputAttributeDescription input_attribs[2];
12888 memset(input_attribs, 0, sizeof(input_attribs));
12889
12890 for (int i = 0; i < 2; i++) {
12891 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
12892 input_attribs[i].location = i;
12893 }
12894
12895 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012896 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012897 "\n"
12898 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070012899 "out gl_PerVertex {\n"
12900 " vec4 gl_Position;\n"
12901 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012902 "void main(){\n"
12903 " gl_Position = x[0] + x[1];\n"
12904 "}\n";
12905 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012906 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012907 "\n"
12908 "layout(location=0) out vec4 color;\n"
12909 "void main(){\n"
12910 " color = vec4(1);\n"
12911 "}\n";
12912
12913 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12914 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12915
12916 VkPipelineObj pipe(m_device);
12917 pipe.AddColorAttachment();
12918 pipe.AddShader(&vs);
12919 pipe.AddShader(&fs);
12920
12921 pipe.AddVertexInputBindings(&input_binding, 1);
12922 pipe.AddVertexInputAttribs(input_attribs, 2);
12923
12924 VkDescriptorSetObj descriptorSet(m_device);
12925 descriptorSet.AppendDummy();
12926 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12927
12928 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12929
12930 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012931 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130012932}
12933
Chris Forbes2682b242015-11-24 11:13:14 +130012934TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
12935{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012936 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130012937
12938 ASSERT_NO_FATAL_FAILURE(InitState());
12939 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12940
12941 VkVertexInputBindingDescription input_binding;
12942 memset(&input_binding, 0, sizeof(input_binding));
12943
12944 VkVertexInputAttributeDescription input_attribs[2];
12945 memset(input_attribs, 0, sizeof(input_attribs));
12946
12947 for (int i = 0; i < 2; i++) {
12948 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
12949 input_attribs[i].location = i;
12950 }
12951
12952 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012953 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012954 "\n"
12955 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -070012956 "out gl_PerVertex {\n"
12957 " vec4 gl_Position;\n"
12958 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012959 "void main(){\n"
12960 " gl_Position = x[0] + x[1];\n"
12961 "}\n";
12962 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012963 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012964 "\n"
12965 "layout(location=0) out vec4 color;\n"
12966 "void main(){\n"
12967 " color = vec4(1);\n"
12968 "}\n";
12969
12970 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12971 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12972
12973 VkPipelineObj pipe(m_device);
12974 pipe.AddColorAttachment();
12975 pipe.AddShader(&vs);
12976 pipe.AddShader(&fs);
12977
12978 pipe.AddVertexInputBindings(&input_binding, 1);
12979 pipe.AddVertexInputAttribs(input_attribs, 2);
12980
12981 VkDescriptorSetObj descriptorSet(m_device);
12982 descriptorSet.AppendDummy();
12983 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12984
12985 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12986
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012987 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130012988}
Chris Forbes2682b242015-11-24 11:13:14 +130012989
Chris Forbesbc290ce2016-07-06 12:01:49 +120012990TEST_F(VkLayerTest, CreatePipelineAttribComponents)
12991{
Chris Forbes1cc79542016-07-20 11:13:44 +120012992 TEST_DESCRIPTION("Test that pipeline validation accepts consuming a vertex attribute "
12993 "through multiple VS inputs, each consuming a different subset of the "
12994 "components.");
Chris Forbesbc290ce2016-07-06 12:01:49 +120012995 m_errorMonitor->ExpectSuccess();
12996
12997 ASSERT_NO_FATAL_FAILURE(InitState());
12998 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12999
13000 VkVertexInputBindingDescription input_binding;
13001 memset(&input_binding, 0, sizeof(input_binding));
13002
13003 VkVertexInputAttributeDescription input_attribs[3];
13004 memset(input_attribs, 0, sizeof(input_attribs));
13005
13006 for (int i = 0; i < 3; i++) {
13007 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
13008 input_attribs[i].location = i;
13009 }
13010
13011 char const *vsSource =
13012 "#version 450\n"
13013 "\n"
13014 "layout(location=0) in vec4 x;\n"
13015 "layout(location=1) in vec3 y1;\n"
13016 "layout(location=1, component=3) in float y2;\n"
13017 "layout(location=2) in vec4 z;\n"
13018 "out gl_PerVertex {\n"
13019 " vec4 gl_Position;\n"
13020 "};\n"
13021 "void main(){\n"
13022 " gl_Position = x + vec4(y1, y2) + z;\n"
13023 "}\n";
13024 char const *fsSource =
13025 "#version 450\n"
13026 "\n"
13027 "layout(location=0) out vec4 color;\n"
13028 "void main(){\n"
13029 " color = vec4(1);\n"
13030 "}\n";
13031
13032 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13033 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13034
13035 VkPipelineObj pipe(m_device);
13036 pipe.AddColorAttachment();
13037 pipe.AddShader(&vs);
13038 pipe.AddShader(&fs);
13039
13040 pipe.AddVertexInputBindings(&input_binding, 1);
13041 pipe.AddVertexInputAttribs(input_attribs, 3);
13042
13043 VkDescriptorSetObj descriptorSet(m_device);
13044 descriptorSet.AppendDummy();
13045 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13046
13047 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13048
13049 m_errorMonitor->VerifyNotFound();
13050}
13051
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013052TEST_F(VkLayerTest, CreatePipelineSimplePositive)
13053{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013054 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013055
13056 ASSERT_NO_FATAL_FAILURE(InitState());
13057 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13058
13059 char const *vsSource =
13060 "#version 450\n"
13061 "out gl_PerVertex {\n"
13062 " vec4 gl_Position;\n"
13063 "};\n"
13064 "void main(){\n"
13065 " gl_Position = vec4(0);\n"
13066 "}\n";
13067 char const *fsSource =
13068 "#version 450\n"
13069 "\n"
13070 "layout(location=0) out vec4 color;\n"
13071 "void main(){\n"
13072 " color = vec4(1);\n"
13073 "}\n";
13074
13075 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13076 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13077
13078 VkPipelineObj pipe(m_device);
13079 pipe.AddColorAttachment();
13080 pipe.AddShader(&vs);
13081 pipe.AddShader(&fs);
13082
13083 VkDescriptorSetObj descriptorSet(m_device);
13084 descriptorSet.AppendDummy();
13085 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13086
13087 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13088
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013089 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013090}
13091
Chris Forbes912c9192016-04-05 17:50:35 +120013092TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
13093{
Chris Forbes1cc79542016-07-20 11:13:44 +120013094 TEST_DESCRIPTION("Test that pipeline validation accepts the relaxed type matching rules "
13095 "set out in 14.1.3: fundamental type must match, and producer side must "
13096 "have at least as many components");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013097 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +120013098
13099 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
13100
13101 ASSERT_NO_FATAL_FAILURE(InitState());
13102 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13103
13104 char const *vsSource =
13105 "#version 450\n"
13106 "out gl_PerVertex {\n"
13107 " vec4 gl_Position;\n"
13108 "};\n"
13109 "layout(location=0) out vec3 x;\n"
13110 "layout(location=1) out ivec3 y;\n"
13111 "layout(location=2) out vec3 z;\n"
13112 "void main(){\n"
13113 " gl_Position = vec4(0);\n"
13114 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
13115 "}\n";
13116 char const *fsSource =
13117 "#version 450\n"
13118 "\n"
13119 "layout(location=0) out vec4 color;\n"
13120 "layout(location=0) in float x;\n"
13121 "layout(location=1) flat in int y;\n"
13122 "layout(location=2) in vec2 z;\n"
13123 "void main(){\n"
13124 " color = vec4(1 + x + y + z.x);\n"
13125 "}\n";
13126
13127 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13128 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13129
13130 VkPipelineObj pipe(m_device);
13131 pipe.AddColorAttachment();
13132 pipe.AddShader(&vs);
13133 pipe.AddShader(&fs);
13134
13135 VkDescriptorSetObj descriptorSet(m_device);
13136 descriptorSet.AppendDummy();
13137 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13138
Mike Stroyan255e9582016-06-24 09:49:32 -060013139 VkResult err = VK_SUCCESS;
13140 err =
13141 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13142 ASSERT_VK_SUCCESS(err);
13143
Chris Forbes912c9192016-04-05 17:50:35 +120013144
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013145 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +120013146}
13147
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013148TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
13149{
Chris Forbes1cc79542016-07-20 11:13:44 +120013150 TEST_DESCRIPTION("Test that pipeline validation accepts per-vertex variables "
13151 "passed between the TCS and TES stages");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013152 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013153
13154 ASSERT_NO_FATAL_FAILURE(InitState());
13155 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13156
Chris Forbesc1e852d2016-04-04 19:26:42 +120013157 if (!m_device->phy().features().tessellationShader) {
13158 printf("Device does not support tessellation shaders; skipped.\n");
13159 return;
13160 }
13161
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013162 char const *vsSource =
13163 "#version 450\n"
13164 "void main(){}\n";
13165 char const *tcsSource =
13166 "#version 450\n"
13167 "layout(location=0) out int x[];\n"
13168 "layout(vertices=3) out;\n"
13169 "void main(){\n"
13170 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
13171 " gl_TessLevelInner[0] = 1;\n"
13172 " x[gl_InvocationID] = gl_InvocationID;\n"
13173 "}\n";
13174 char const *tesSource =
13175 "#version 450\n"
13176 "layout(triangles, equal_spacing, cw) in;\n"
13177 "layout(location=0) in int x[];\n"
13178 "out gl_PerVertex { vec4 gl_Position; };\n"
13179 "void main(){\n"
13180 " gl_Position.xyz = gl_TessCoord;\n"
13181 " gl_Position.w = x[0] + x[1] + x[2];\n"
13182 "}\n";
13183 char const *fsSource =
13184 "#version 450\n"
13185 "layout(location=0) out vec4 color;\n"
13186 "void main(){\n"
13187 " color = vec4(1);\n"
13188 "}\n";
13189
13190 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13191 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
13192 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
13193 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13194
13195 VkPipelineInputAssemblyStateCreateInfo iasci{
13196 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
13197 nullptr,
13198 0,
13199 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
13200 VK_FALSE};
13201
Chris Forbesb4cacb62016-04-04 19:15:00 +120013202 VkPipelineTessellationStateCreateInfo tsci{
13203 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
13204 nullptr,
13205 0,
13206 3};
13207
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013208 VkPipelineObj pipe(m_device);
13209 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +120013210 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013211 pipe.AddColorAttachment();
13212 pipe.AddShader(&vs);
13213 pipe.AddShader(&tcs);
13214 pipe.AddShader(&tes);
13215 pipe.AddShader(&fs);
13216
13217 VkDescriptorSetObj descriptorSet(m_device);
13218 descriptorSet.AppendDummy();
13219 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13220
13221 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13222
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013223 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013224}
13225
Chris Forbesa0ab8152016-04-20 13:34:27 +120013226TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
13227{
Chris Forbes1cc79542016-07-20 11:13:44 +120013228 TEST_DESCRIPTION("Test that pipeline validation accepts a user-defined "
13229 "interface block passed into the geometry shader. This "
13230 "is interesting because the 'extra' array level is not "
13231 "present on the member type, but on the block instance.");
Chris Forbesa0ab8152016-04-20 13:34:27 +120013232 m_errorMonitor->ExpectSuccess();
13233
13234 ASSERT_NO_FATAL_FAILURE(InitState());
13235 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13236
13237 if (!m_device->phy().features().geometryShader) {
13238 printf("Device does not support geometry shaders; skipped.\n");
13239 return;
13240 }
13241
13242 char const *vsSource =
13243 "#version 450\n"
13244 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
13245 "void main(){\n"
13246 " vs_out.x = vec4(1);\n"
13247 "}\n";
13248 char const *gsSource =
13249 "#version 450\n"
13250 "layout(triangles) in;\n"
13251 "layout(triangle_strip, max_vertices=3) out;\n"
13252 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
13253 "out gl_PerVertex { vec4 gl_Position; };\n"
13254 "void main() {\n"
13255 " gl_Position = gs_in[0].x;\n"
13256 " EmitVertex();\n"
13257 "}\n";
13258 char const *fsSource =
13259 "#version 450\n"
13260 "layout(location=0) out vec4 color;\n"
13261 "void main(){\n"
13262 " color = vec4(1);\n"
13263 "}\n";
13264
13265 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13266 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
13267 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13268
13269 VkPipelineObj pipe(m_device);
13270 pipe.AddColorAttachment();
13271 pipe.AddShader(&vs);
13272 pipe.AddShader(&gs);
13273 pipe.AddShader(&fs);
13274
13275 VkDescriptorSetObj descriptorSet(m_device);
13276 descriptorSet.AppendDummy();
13277 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13278
13279 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13280
13281 m_errorMonitor->VerifyNotFound();
13282}
13283
Chris Forbesa0193bc2016-04-04 19:19:47 +120013284TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
13285{
Chris Forbes1cc79542016-07-20 11:13:44 +120013286 TEST_DESCRIPTION("Test that an error is produced for a variable output from "
13287 "the TCS without the patch decoration, but consumed in the TES "
13288 "with the decoration.");
Chris Forbesa0193bc2016-04-04 19:19:47 +120013289 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13290 "is per-vertex in tessellation control shader stage "
13291 "but per-patch in tessellation evaluation shader stage");
13292
13293 ASSERT_NO_FATAL_FAILURE(InitState());
13294 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13295
Chris Forbesc1e852d2016-04-04 19:26:42 +120013296 if (!m_device->phy().features().tessellationShader) {
13297 printf("Device does not support tessellation shaders; skipped.\n");
13298 return;
13299 }
13300
Chris Forbesa0193bc2016-04-04 19:19:47 +120013301 char const *vsSource =
13302 "#version 450\n"
13303 "void main(){}\n";
13304 char const *tcsSource =
13305 "#version 450\n"
13306 "layout(location=0) out int x[];\n"
13307 "layout(vertices=3) out;\n"
13308 "void main(){\n"
13309 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
13310 " gl_TessLevelInner[0] = 1;\n"
13311 " x[gl_InvocationID] = gl_InvocationID;\n"
13312 "}\n";
13313 char const *tesSource =
13314 "#version 450\n"
13315 "layout(triangles, equal_spacing, cw) in;\n"
13316 "layout(location=0) patch in int x;\n"
13317 "out gl_PerVertex { vec4 gl_Position; };\n"
13318 "void main(){\n"
13319 " gl_Position.xyz = gl_TessCoord;\n"
13320 " gl_Position.w = x;\n"
13321 "}\n";
13322 char const *fsSource =
13323 "#version 450\n"
13324 "layout(location=0) out vec4 color;\n"
13325 "void main(){\n"
13326 " color = vec4(1);\n"
13327 "}\n";
13328
13329 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13330 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
13331 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
13332 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13333
13334 VkPipelineInputAssemblyStateCreateInfo iasci{
13335 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
13336 nullptr,
13337 0,
13338 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
13339 VK_FALSE};
13340
13341 VkPipelineTessellationStateCreateInfo tsci{
13342 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
13343 nullptr,
13344 0,
13345 3};
13346
13347 VkPipelineObj pipe(m_device);
13348 pipe.SetInputAssembly(&iasci);
13349 pipe.SetTessellation(&tsci);
13350 pipe.AddColorAttachment();
13351 pipe.AddShader(&vs);
13352 pipe.AddShader(&tcs);
13353 pipe.AddShader(&tes);
13354 pipe.AddShader(&fs);
13355
13356 VkDescriptorSetObj descriptorSet(m_device);
13357 descriptorSet.AppendDummy();
13358 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13359
13360 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13361
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013362 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120013363}
13364
Karl Schultz6addd812016-02-02 17:17:23 -070013365TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013366 TEST_DESCRIPTION("Test that an error is produced for a vertex attribute setup where multiple "
13367 "bindings provide the same location");
Karl Schultz6addd812016-02-02 17:17:23 -070013368 m_errorMonitor->SetDesiredFailureMsg(
13369 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013370 "Duplicate vertex input binding descriptions for binding 0");
13371
Chris Forbes280ba2c2015-06-12 11:16:41 +120013372 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013373 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120013374
13375 /* Two binding descriptions for binding 0 */
13376 VkVertexInputBindingDescription input_bindings[2];
13377 memset(input_bindings, 0, sizeof(input_bindings));
13378
13379 VkVertexInputAttributeDescription input_attrib;
13380 memset(&input_attrib, 0, sizeof(input_attrib));
13381 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13382
13383 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013384 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120013385 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013386 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070013387 "out gl_PerVertex {\n"
13388 " vec4 gl_Position;\n"
13389 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120013390 "void main(){\n"
13391 " gl_Position = vec4(x);\n"
13392 "}\n";
13393 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013394 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120013395 "\n"
13396 "layout(location=0) out vec4 color;\n"
13397 "void main(){\n"
13398 " color = vec4(1);\n"
13399 "}\n";
13400
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013401 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13402 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120013403
13404 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013405 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120013406 pipe.AddShader(&vs);
13407 pipe.AddShader(&fs);
13408
13409 pipe.AddVertexInputBindings(input_bindings, 2);
13410 pipe.AddVertexInputAttribs(&input_attrib, 1);
13411
Chris Forbes280ba2c2015-06-12 11:16:41 +120013412 VkDescriptorSetObj descriptorSet(m_device);
13413 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013414 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120013415
Tony Barbour5781e8f2015-08-04 16:23:11 -060013416 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120013417
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013418 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120013419}
Chris Forbes8f68b562015-05-25 11:13:32 +120013420
Chris Forbes35efec72016-04-21 14:32:08 +120013421TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013422 TEST_DESCRIPTION("Test that pipeline validation accepts basic use of 64bit vertex "
13423 "attributes. This is interesting because they consume multiple "
13424 "locations.");
Chris Forbes35efec72016-04-21 14:32:08 +120013425 m_errorMonitor->ExpectSuccess();
13426
13427 ASSERT_NO_FATAL_FAILURE(InitState());
13428 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13429
Chris Forbes91cf3a82016-06-28 17:51:35 +120013430 if (!m_device->phy().features().shaderFloat64) {
Chris Forbes35efec72016-04-21 14:32:08 +120013431 printf("Device does not support 64bit vertex attributes; skipped.\n");
13432 return;
13433 }
13434
13435 VkVertexInputBindingDescription input_bindings[1];
13436 memset(input_bindings, 0, sizeof(input_bindings));
13437
13438 VkVertexInputAttributeDescription input_attribs[4];
13439 memset(input_attribs, 0, sizeof(input_attribs));
13440 input_attribs[0].location = 0;
13441 input_attribs[0].offset = 0;
13442 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
13443 input_attribs[1].location = 2;
13444 input_attribs[1].offset = 32;
13445 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
13446 input_attribs[2].location = 4;
13447 input_attribs[2].offset = 64;
13448 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
13449 input_attribs[3].location = 6;
13450 input_attribs[3].offset = 96;
13451 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
13452
13453 char const *vsSource =
13454 "#version 450\n"
13455 "\n"
13456 "layout(location=0) in dmat4 x;\n"
13457 "out gl_PerVertex {\n"
13458 " vec4 gl_Position;\n"
13459 "};\n"
13460 "void main(){\n"
13461 " gl_Position = vec4(x[0][0]);\n"
13462 "}\n";
13463 char const *fsSource =
13464 "#version 450\n"
13465 "\n"
13466 "layout(location=0) out vec4 color;\n"
13467 "void main(){\n"
13468 " color = vec4(1);\n"
13469 "}\n";
13470
13471 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13472 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13473
13474 VkPipelineObj pipe(m_device);
13475 pipe.AddColorAttachment();
13476 pipe.AddShader(&vs);
13477 pipe.AddShader(&fs);
13478
13479 pipe.AddVertexInputBindings(input_bindings, 1);
13480 pipe.AddVertexInputAttribs(input_attribs, 4);
13481
13482 VkDescriptorSetObj descriptorSet(m_device);
13483 descriptorSet.AppendDummy();
13484 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13485
13486 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13487
13488 m_errorMonitor->VerifyNotFound();
13489}
13490
Karl Schultz6addd812016-02-02 17:17:23 -070013491TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013492 TEST_DESCRIPTION("Test that an error is produced for a FS which does not "
13493 "provide an output for one of the pipeline's color attachments");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013494 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013495 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013496
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013497 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013498
13499 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013500 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013501 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013502 "out gl_PerVertex {\n"
13503 " vec4 gl_Position;\n"
13504 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013505 "void main(){\n"
13506 " gl_Position = vec4(1);\n"
13507 "}\n";
13508 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013509 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013510 "\n"
13511 "void main(){\n"
13512 "}\n";
13513
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013514 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13515 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013516
13517 VkPipelineObj pipe(m_device);
13518 pipe.AddShader(&vs);
13519 pipe.AddShader(&fs);
13520
Chia-I Wu08accc62015-07-07 11:50:03 +080013521 /* set up CB 0, not written */
13522 pipe.AddColorAttachment();
13523 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013524
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013525 VkDescriptorSetObj descriptorSet(m_device);
13526 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013527 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013528
Tony Barbour5781e8f2015-08-04 16:23:11 -060013529 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013530
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013531 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013532}
13533
Karl Schultz6addd812016-02-02 17:17:23 -070013534TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013535 TEST_DESCRIPTION("Test that a warning is produced for a FS which provides a spurious "
13536 "output with no matching attachment");
Karl Schultz6addd812016-02-02 17:17:23 -070013537 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070013538 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013539 "FS writes to output location 1 with no matching attachment");
13540
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013541 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013542
13543 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013544 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013545 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013546 "out gl_PerVertex {\n"
13547 " vec4 gl_Position;\n"
13548 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013549 "void main(){\n"
13550 " gl_Position = vec4(1);\n"
13551 "}\n";
13552 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013553 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013554 "\n"
13555 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013556 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013557 "void main(){\n"
13558 " x = vec4(1);\n"
13559 " y = vec4(1);\n"
13560 "}\n";
13561
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013562 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13563 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013564
13565 VkPipelineObj pipe(m_device);
13566 pipe.AddShader(&vs);
13567 pipe.AddShader(&fs);
13568
Chia-I Wu08accc62015-07-07 11:50:03 +080013569 /* set up CB 0, not written */
13570 pipe.AddColorAttachment();
13571 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013572 /* FS writes CB 1, but we don't configure it */
13573
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013574 VkDescriptorSetObj descriptorSet(m_device);
13575 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013576 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013577
Tony Barbour5781e8f2015-08-04 16:23:11 -060013578 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013579
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013580 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013581}
13582
Karl Schultz6addd812016-02-02 17:17:23 -070013583TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013584 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the fundamental "
13585 "type of an FS output variable, and the format of the corresponding attachment");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013586 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013587 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013588
Chris Forbesa36d69e2015-05-25 11:13:44 +120013589 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013590
13591 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013592 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120013593 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013594 "out gl_PerVertex {\n"
13595 " vec4 gl_Position;\n"
13596 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120013597 "void main(){\n"
13598 " gl_Position = vec4(1);\n"
13599 "}\n";
13600 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013601 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120013602 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013603 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +120013604 "void main(){\n"
13605 " x = ivec4(1);\n"
13606 "}\n";
13607
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013608 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13609 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120013610
13611 VkPipelineObj pipe(m_device);
13612 pipe.AddShader(&vs);
13613 pipe.AddShader(&fs);
13614
Chia-I Wu08accc62015-07-07 11:50:03 +080013615 /* set up CB 0; type is UNORM by default */
13616 pipe.AddColorAttachment();
13617 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013618
Chris Forbesa36d69e2015-05-25 11:13:44 +120013619 VkDescriptorSetObj descriptorSet(m_device);
13620 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013621 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120013622
Tony Barbour5781e8f2015-08-04 16:23:11 -060013623 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013624
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013625 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120013626}
Chris Forbes7b1b8932015-06-05 14:43:36 +120013627
Karl Schultz6addd812016-02-02 17:17:23 -070013628TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013629 TEST_DESCRIPTION("Test that an error is produced for a shader consuming a uniform "
13630 "block which has no corresponding binding in the pipeline layout");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013631 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013632 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013633
Chris Forbes556c76c2015-08-14 12:04:59 +120013634 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120013635
13636 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013637 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120013638 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013639 "out gl_PerVertex {\n"
13640 " vec4 gl_Position;\n"
13641 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120013642 "void main(){\n"
13643 " gl_Position = vec4(1);\n"
13644 "}\n";
13645 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013646 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120013647 "\n"
13648 "layout(location=0) out vec4 x;\n"
13649 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
13650 "void main(){\n"
13651 " x = vec4(bar.y);\n"
13652 "}\n";
13653
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013654 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13655 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120013656
Chris Forbes556c76c2015-08-14 12:04:59 +120013657 VkPipelineObj pipe(m_device);
13658 pipe.AddShader(&vs);
13659 pipe.AddShader(&fs);
13660
13661 /* set up CB 0; type is UNORM by default */
13662 pipe.AddColorAttachment();
13663 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13664
13665 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013666 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120013667
13668 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13669
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013670 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120013671}
13672
Chris Forbes5c59e902016-02-26 16:56:09 +130013673TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013674 TEST_DESCRIPTION("Test that an error is produced for a shader consuming push constants "
13675 "which are not provided in the pipeline layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130013676 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13677 "not declared in layout");
13678
13679 ASSERT_NO_FATAL_FAILURE(InitState());
13680
13681 char const *vsSource =
13682 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130013683 "\n"
13684 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13685 "out gl_PerVertex {\n"
13686 " vec4 gl_Position;\n"
13687 "};\n"
13688 "void main(){\n"
13689 " gl_Position = vec4(consts.x);\n"
13690 "}\n";
13691 char const *fsSource =
13692 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130013693 "\n"
13694 "layout(location=0) out vec4 x;\n"
13695 "void main(){\n"
13696 " x = vec4(1);\n"
13697 "}\n";
13698
13699 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13700 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13701
13702 VkPipelineObj pipe(m_device);
13703 pipe.AddShader(&vs);
13704 pipe.AddShader(&fs);
13705
13706 /* set up CB 0; type is UNORM by default */
13707 pipe.AddColorAttachment();
13708 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13709
13710 VkDescriptorSetObj descriptorSet(m_device);
13711 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13712
13713 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13714
13715 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013716 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130013717}
13718
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013719TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013720 TEST_DESCRIPTION("Test that an error is produced for a compute pipeline consuming a "
13721 "descriptor which is not provided in the pipeline layout");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013722 m_errorMonitor->SetDesiredFailureMsg(
13723 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13724 "Shader uses descriptor slot 0.0");
13725
13726 ASSERT_NO_FATAL_FAILURE(InitState());
13727
13728 char const *csSource =
13729 "#version 450\n"
13730 "\n"
13731 "layout(local_size_x=1) in;\n"
13732 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13733 "void main(){\n"
13734 " x = vec4(1);\n"
13735 "}\n";
13736
13737 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13738
13739 VkDescriptorSetObj descriptorSet(m_device);
13740 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13741
13742 VkComputePipelineCreateInfo cpci = {
13743 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
13744 nullptr, 0, {
13745 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
13746 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
13747 cs.handle(), "main", nullptr
13748 },
13749 descriptorSet.GetPipelineLayout(),
13750 VK_NULL_HANDLE, -1
13751 };
13752
13753 VkPipeline pipe;
13754 VkResult err = vkCreateComputePipelines(
13755 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
13756
13757 m_errorMonitor->VerifyFound();
13758
13759 if (err == VK_SUCCESS) {
13760 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13761 }
13762}
13763
13764TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013765 TEST_DESCRIPTION("Test that pipeline validation accepts a compute pipeline which declares a "
13766 "descriptor-backed resource which is not provided, but the shader does not "
13767 "statically use it. This is interesting because it requires compute pipelines "
13768 "to have a proper descriptor use walk, which they didn't for some time.");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013769 m_errorMonitor->ExpectSuccess();
13770
13771 ASSERT_NO_FATAL_FAILURE(InitState());
13772
13773 char const *csSource =
13774 "#version 450\n"
13775 "\n"
13776 "layout(local_size_x=1) in;\n"
13777 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13778 "void main(){\n"
13779 " // x is not used.\n"
13780 "}\n";
13781
13782 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13783
13784 VkDescriptorSetObj descriptorSet(m_device);
13785 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13786
13787 VkComputePipelineCreateInfo cpci = {
13788 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
13789 nullptr, 0, {
13790 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
13791 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
13792 cs.handle(), "main", nullptr
13793 },
13794 descriptorSet.GetPipelineLayout(),
13795 VK_NULL_HANDLE, -1
13796 };
13797
13798 VkPipeline pipe;
13799 VkResult err = vkCreateComputePipelines(
13800 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
13801
13802 m_errorMonitor->VerifyNotFound();
13803
13804 if (err == VK_SUCCESS) {
13805 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13806 }
13807}
13808
Chris Forbes22a9b092016-07-19 14:34:05 +120013809TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013810 TEST_DESCRIPTION("Test that an error is produced for a pipeline consuming a "
13811 "descriptor-backed resource of a mismatched type");
Chris Forbes22a9b092016-07-19 14:34:05 +120013812 m_errorMonitor->SetDesiredFailureMsg(
13813 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13814 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
13815
13816 ASSERT_NO_FATAL_FAILURE(InitState());
13817
13818 VkDescriptorSetLayoutBinding binding = {
13819 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
13820 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
13821 };
13822 VkDescriptorSetLayoutCreateInfo dslci = {
13823 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
13824 0, 1, &binding
13825 };
13826 VkDescriptorSetLayout dsl;
13827 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
13828 nullptr, &dsl);
13829 ASSERT_VK_SUCCESS(err);
13830
13831 VkPipelineLayoutCreateInfo plci = {
13832 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
13833 0, 1, &dsl, 0, nullptr
13834 };
13835 VkPipelineLayout pl;
13836 err = vkCreatePipelineLayout(m_device->device(), &plci,
13837 nullptr, &pl);
13838 ASSERT_VK_SUCCESS(err);
13839
13840 char const *csSource =
13841 "#version 450\n"
13842 "\n"
13843 "layout(local_size_x=1) in;\n"
13844 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13845 "void main() {\n"
13846 " x.x = 1.0f;\n"
13847 "}\n";
13848 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13849
13850 VkComputePipelineCreateInfo cpci = {
13851 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
13852 0, {
13853 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
13854 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
13855 cs.handle(), "main", nullptr
13856 },
13857 pl, VK_NULL_HANDLE, -1
13858 };
13859
13860 VkPipeline pipe;
13861 err = vkCreateComputePipelines(
13862 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
13863
13864 m_errorMonitor->VerifyFound();
13865
13866 if (err == VK_SUCCESS) {
13867 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13868 }
13869
13870 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
13871 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
13872}
13873
Chris Forbese10a51f2016-07-19 14:42:51 +120013874TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013875 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
13876 "sampler portion of a combined image + sampler");
Chris Forbese10a51f2016-07-19 14:42:51 +120013877 m_errorMonitor->ExpectSuccess();
13878
13879 ASSERT_NO_FATAL_FAILURE(InitState());
13880
13881 VkDescriptorSetLayoutBinding bindings[] = {
13882 {
13883 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
13884 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
13885 },
13886 {
13887 1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
13888 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
13889 },
13890 {
13891 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
13892 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
13893 },
13894 };
13895 VkDescriptorSetLayoutCreateInfo dslci = {
13896 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
13897 0, 3, bindings
13898 };
13899 VkDescriptorSetLayout dsl;
13900 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
13901 nullptr, &dsl);
13902 ASSERT_VK_SUCCESS(err);
13903
13904 VkPipelineLayoutCreateInfo plci = {
13905 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
13906 0, 1, &dsl, 0, nullptr
13907 };
13908 VkPipelineLayout pl;
13909 err = vkCreatePipelineLayout(m_device->device(), &plci,
13910 nullptr, &pl);
13911 ASSERT_VK_SUCCESS(err);
13912
13913 char const *csSource =
13914 "#version 450\n"
13915 "\n"
13916 "layout(local_size_x=1) in;\n"
13917 "layout(set=0, binding=0) uniform sampler s;\n"
13918 "layout(set=0, binding=1) uniform texture2D t;\n"
13919 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
13920 "void main() {\n"
13921 " x = texture(sampler2D(t, s), vec2(0));\n"
13922 "}\n";
13923 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13924
13925 VkComputePipelineCreateInfo cpci = {
13926 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
13927 0, {
13928 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
13929 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
13930 cs.handle(), "main", nullptr
13931 },
13932 pl, VK_NULL_HANDLE, -1
13933 };
13934
13935 VkPipeline pipe;
13936 err = vkCreateComputePipelines(
13937 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
13938
13939 m_errorMonitor->VerifyNotFound();
13940
13941 if (err == VK_SUCCESS) {
13942 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13943 }
13944
13945 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
13946 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
13947}
13948
Chris Forbes91c3b2a2016-07-19 14:46:38 +120013949TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013950 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
13951 "image portion of a combined image + sampler");
Chris Forbes91c3b2a2016-07-19 14:46:38 +120013952 m_errorMonitor->ExpectSuccess();
13953
13954 ASSERT_NO_FATAL_FAILURE(InitState());
13955
13956 VkDescriptorSetLayoutBinding bindings[] = {
13957 {
13958 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
13959 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
13960 },
13961 {
13962 1, VK_DESCRIPTOR_TYPE_SAMPLER,
13963 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
13964 },
13965 {
13966 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
13967 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
13968 },
13969 };
13970 VkDescriptorSetLayoutCreateInfo dslci = {
13971 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
13972 0, 3, bindings
13973 };
13974 VkDescriptorSetLayout dsl;
13975 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
13976 nullptr, &dsl);
13977 ASSERT_VK_SUCCESS(err);
13978
13979 VkPipelineLayoutCreateInfo plci = {
13980 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
13981 0, 1, &dsl, 0, nullptr
13982 };
13983 VkPipelineLayout pl;
13984 err = vkCreatePipelineLayout(m_device->device(), &plci,
13985 nullptr, &pl);
13986 ASSERT_VK_SUCCESS(err);
13987
13988 char const *csSource =
13989 "#version 450\n"
13990 "\n"
13991 "layout(local_size_x=1) in;\n"
13992 "layout(set=0, binding=0) uniform texture2D t;\n"
13993 "layout(set=0, binding=1) uniform sampler s;\n"
13994 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
13995 "void main() {\n"
13996 " x = texture(sampler2D(t, s), vec2(0));\n"
13997 "}\n";
13998 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13999
14000 VkComputePipelineCreateInfo cpci = {
14001 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
14002 0, {
14003 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14004 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14005 cs.handle(), "main", nullptr
14006 },
14007 pl, VK_NULL_HANDLE, -1
14008 };
14009
14010 VkPipeline pipe;
14011 err = vkCreateComputePipelines(
14012 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14013
14014 m_errorMonitor->VerifyNotFound();
14015
14016 if (err == VK_SUCCESS) {
14017 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14018 }
14019
14020 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14021 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14022}
14023
Chris Forbes6a4991a2016-07-19 15:07:32 +120014024TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Chris Forbes1cc79542016-07-20 11:13:44 +120014025 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming "
14026 "both the sampler and the image of a combined image+sampler "
14027 "but via separate variables");
Chris Forbes6a4991a2016-07-19 15:07:32 +120014028 m_errorMonitor->ExpectSuccess();
14029
14030 ASSERT_NO_FATAL_FAILURE(InitState());
14031
14032 VkDescriptorSetLayoutBinding bindings[] = {
14033 {
14034 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
14035 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14036 },
14037 {
14038 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
14039 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
14040 },
14041 };
14042 VkDescriptorSetLayoutCreateInfo dslci = {
14043 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
14044 0, 2, bindings
14045 };
14046 VkDescriptorSetLayout dsl;
14047 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
14048 nullptr, &dsl);
14049 ASSERT_VK_SUCCESS(err);
14050
14051 VkPipelineLayoutCreateInfo plci = {
14052 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
14053 0, 1, &dsl, 0, nullptr
14054 };
14055 VkPipelineLayout pl;
14056 err = vkCreatePipelineLayout(m_device->device(), &plci,
14057 nullptr, &pl);
14058 ASSERT_VK_SUCCESS(err);
14059
14060 char const *csSource =
14061 "#version 450\n"
14062 "\n"
14063 "layout(local_size_x=1) in;\n"
14064 "layout(set=0, binding=0) uniform texture2D t;\n"
14065 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
14066 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
14067 "void main() {\n"
14068 " x = texture(sampler2D(t, s), vec2(0));\n"
14069 "}\n";
14070 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14071
14072 VkComputePipelineCreateInfo cpci = {
14073 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
14074 0, {
14075 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14076 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14077 cs.handle(), "main", nullptr
14078 },
14079 pl, VK_NULL_HANDLE, -1
14080 };
14081
14082 VkPipeline pipe;
14083 err = vkCreateComputePipelines(
14084 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14085
14086 m_errorMonitor->VerifyNotFound();
14087
14088 if (err == VK_SUCCESS) {
14089 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14090 }
14091
14092 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14093 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14094}
14095
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014096#endif // SHADER_CHECKER_TESTS
14097
14098#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -060014099TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -070014100 m_errorMonitor->SetDesiredFailureMsg(
14101 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014102 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014103
14104 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014105
14106 // Create an image
14107 VkImage image;
14108
Karl Schultz6addd812016-02-02 17:17:23 -070014109 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14110 const int32_t tex_width = 32;
14111 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014112
14113 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014114 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14115 image_create_info.pNext = NULL;
14116 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14117 image_create_info.format = tex_format;
14118 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014119 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070014120 image_create_info.extent.depth = 1;
14121 image_create_info.mipLevels = 1;
14122 image_create_info.arrayLayers = 1;
14123 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14124 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14125 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14126 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014127
14128 // Introduce error by sending down a bogus width extent
14129 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014130 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014131
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014132 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014133}
14134
Mark Youngc48c4c12016-04-11 14:26:49 -060014135TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
14136 m_errorMonitor->SetDesiredFailureMsg(
14137 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14138 "CreateImage extents is 0 for at least one required dimension");
14139
14140 ASSERT_NO_FATAL_FAILURE(InitState());
14141
14142 // Create an image
14143 VkImage image;
14144
14145 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14146 const int32_t tex_width = 32;
14147 const int32_t tex_height = 32;
14148
14149 VkImageCreateInfo image_create_info = {};
14150 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14151 image_create_info.pNext = NULL;
14152 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14153 image_create_info.format = tex_format;
14154 image_create_info.extent.width = tex_width;
14155 image_create_info.extent.height = tex_height;
14156 image_create_info.extent.depth = 1;
14157 image_create_info.mipLevels = 1;
14158 image_create_info.arrayLayers = 1;
14159 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14160 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14161 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14162 image_create_info.flags = 0;
14163
14164 // Introduce error by sending down a bogus width extent
14165 image_create_info.extent.width = 0;
14166 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
14167
14168 m_errorMonitor->VerifyFound();
14169}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014170#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +120014171
Tobin Ehliscde08892015-09-22 10:11:37 -060014172#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070014173TEST_F(VkLayerTest, InvalidImageView) {
14174 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060014175
Karl Schultz6addd812016-02-02 17:17:23 -070014176 m_errorMonitor->SetDesiredFailureMsg(
14177 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014178 "vkCreateImageView called with baseMipLevel 10 ");
14179
Tobin Ehliscde08892015-09-22 10:11:37 -060014180 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060014181
Mike Stroyana3082432015-09-25 13:39:21 -060014182 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070014183 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060014184
Karl Schultz6addd812016-02-02 17:17:23 -070014185 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14186 const int32_t tex_width = 32;
14187 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060014188
14189 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014190 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14191 image_create_info.pNext = NULL;
14192 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14193 image_create_info.format = tex_format;
14194 image_create_info.extent.width = tex_width;
14195 image_create_info.extent.height = tex_height;
14196 image_create_info.extent.depth = 1;
14197 image_create_info.mipLevels = 1;
14198 image_create_info.arrayLayers = 1;
14199 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14200 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14201 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14202 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060014203
Chia-I Wuf7458c52015-10-26 21:10:41 +080014204 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060014205 ASSERT_VK_SUCCESS(err);
14206
14207 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014208 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14209 image_view_create_info.image = image;
14210 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14211 image_view_create_info.format = tex_format;
14212 image_view_create_info.subresourceRange.layerCount = 1;
14213 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
14214 image_view_create_info.subresourceRange.levelCount = 1;
14215 image_view_create_info.subresourceRange.aspectMask =
14216 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060014217
14218 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070014219 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
14220 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060014221
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014222 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060014223 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060014224}
Mike Stroyana3082432015-09-25 13:39:21 -060014225
Mark Youngd339ba32016-05-30 13:28:35 -060014226TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
14227 VkResult err;
14228
14229 m_errorMonitor->SetDesiredFailureMsg(
14230 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -060014231 "used without first calling vkBindImageMemory");
Mark Youngd339ba32016-05-30 13:28:35 -060014232
14233 ASSERT_NO_FATAL_FAILURE(InitState());
14234
14235 // Create an image and try to create a view with no memory backing the image
14236 VkImage image;
14237
14238 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14239 const int32_t tex_width = 32;
14240 const int32_t tex_height = 32;
14241
14242 VkImageCreateInfo image_create_info = {};
14243 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14244 image_create_info.pNext = NULL;
14245 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14246 image_create_info.format = tex_format;
14247 image_create_info.extent.width = tex_width;
14248 image_create_info.extent.height = tex_height;
14249 image_create_info.extent.depth = 1;
14250 image_create_info.mipLevels = 1;
14251 image_create_info.arrayLayers = 1;
14252 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14253 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14254 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14255 image_create_info.flags = 0;
14256
14257 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
14258 ASSERT_VK_SUCCESS(err);
14259
14260 VkImageViewCreateInfo image_view_create_info = {};
14261 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14262 image_view_create_info.image = image;
14263 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14264 image_view_create_info.format = tex_format;
14265 image_view_create_info.subresourceRange.layerCount = 1;
14266 image_view_create_info.subresourceRange.baseMipLevel = 0;
14267 image_view_create_info.subresourceRange.levelCount = 1;
14268 image_view_create_info.subresourceRange.aspectMask =
14269 VK_IMAGE_ASPECT_COLOR_BIT;
14270
14271 VkImageView view;
14272 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
14273 &view);
14274
14275 m_errorMonitor->VerifyFound();
14276 vkDestroyImage(m_device->device(), image, NULL);
14277 // If last error is success, it still created the view, so delete it.
14278 if (err == VK_SUCCESS) {
14279 vkDestroyImageView(m_device->device(), view, NULL);
14280 }
14281
14282}
14283
Karl Schultz6addd812016-02-02 17:17:23 -070014284TEST_F(VkLayerTest, InvalidImageViewAspect) {
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014285 TEST_DESCRIPTION(
14286 "Create an image and try to create a view with an invalid aspectMask");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014287 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070014288 "vkCreateImageView: Color image "
14289 "formats must have ONLY the "
14290 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014291
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014292 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014293
Karl Schultz6addd812016-02-02 17:17:23 -070014294 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014295 VkImageObj image(m_device);
14296 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT,
14297 VK_IMAGE_TILING_LINEAR, 0);
14298 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014299
14300 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014301 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014302 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070014303 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14304 image_view_create_info.format = tex_format;
14305 image_view_create_info.subresourceRange.baseMipLevel = 0;
14306 image_view_create_info.subresourceRange.levelCount = 1;
14307 // Cause an error by setting an invalid image aspect
14308 image_view_create_info.subresourceRange.aspectMask =
14309 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014310
14311 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014312 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014313
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014314 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014315}
14316
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014317TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070014318 VkResult err;
14319 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014320
Karl Schultz6addd812016-02-02 17:17:23 -070014321 m_errorMonitor->SetDesiredFailureMsg(
14322 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014323 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014324
Mike Stroyana3082432015-09-25 13:39:21 -060014325 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014326
14327 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014328 VkImage srcImage;
14329 VkImage dstImage;
14330 VkDeviceMemory srcMem;
14331 VkDeviceMemory destMem;
14332 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014333
14334 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014335 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14336 image_create_info.pNext = NULL;
14337 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14338 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14339 image_create_info.extent.width = 32;
14340 image_create_info.extent.height = 32;
14341 image_create_info.extent.depth = 1;
14342 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014343 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070014344 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14345 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14346 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14347 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014348
Karl Schultz6addd812016-02-02 17:17:23 -070014349 err =
14350 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014351 ASSERT_VK_SUCCESS(err);
14352
Karl Schultz6addd812016-02-02 17:17:23 -070014353 err =
14354 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014355 ASSERT_VK_SUCCESS(err);
14356
14357 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014358 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014359 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14360 memAlloc.pNext = NULL;
14361 memAlloc.allocationSize = 0;
14362 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014363
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014364 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014365 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014366 pass =
14367 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014368 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014369 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014370 ASSERT_VK_SUCCESS(err);
14371
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014372 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014373 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014374 pass =
14375 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014376 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014377 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014378 ASSERT_VK_SUCCESS(err);
14379
14380 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14381 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014382 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014383 ASSERT_VK_SUCCESS(err);
14384
14385 BeginCommandBuffer();
14386 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014387 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014388 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014389 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014390 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060014391 copyRegion.srcOffset.x = 0;
14392 copyRegion.srcOffset.y = 0;
14393 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014394 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014395 copyRegion.dstSubresource.mipLevel = 0;
14396 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014397 // Introduce failure by forcing the dst layerCount to differ from src
14398 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014399 copyRegion.dstOffset.x = 0;
14400 copyRegion.dstOffset.y = 0;
14401 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014402 copyRegion.extent.width = 1;
14403 copyRegion.extent.height = 1;
14404 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014405 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14406 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014407 EndCommandBuffer();
14408
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014409 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014410
Chia-I Wuf7458c52015-10-26 21:10:41 +080014411 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014412 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014413 vkFreeMemory(m_device->device(), srcMem, NULL);
14414 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014415}
14416
Tony Barbourd6673642016-05-05 14:46:39 -060014417TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
14418
14419 TEST_DESCRIPTION("Creating images with unsuported formats ");
14420
14421 ASSERT_NO_FATAL_FAILURE(InitState());
14422 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14423 VkImageObj image(m_device);
14424 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
14425 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
14426 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
14427 VK_IMAGE_TILING_OPTIMAL, 0);
14428 ASSERT_TRUE(image.initialized());
14429
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014430 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
14431 VkImageCreateInfo image_create_info;
14432 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14433 image_create_info.pNext = NULL;
14434 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14435 image_create_info.format = VK_FORMAT_UNDEFINED;
14436 image_create_info.extent.width = 32;
14437 image_create_info.extent.height = 32;
14438 image_create_info.extent.depth = 1;
14439 image_create_info.mipLevels = 1;
14440 image_create_info.arrayLayers = 1;
14441 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14442 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14443 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14444 image_create_info.flags = 0;
14445
14446 m_errorMonitor->SetDesiredFailureMsg(
14447 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14448 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
14449
14450 VkImage localImage;
14451 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
14452 m_errorMonitor->VerifyFound();
14453
Tony Barbourd6673642016-05-05 14:46:39 -060014454 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014455 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060014456 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
14457 VkFormat format = static_cast<VkFormat>(f);
14458 VkFormatProperties fProps = m_device->format_properties(format);
14459 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
14460 fProps.optimalTilingFeatures == 0) {
14461 unsupported = format;
14462 break;
14463 }
14464 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014465
Tony Barbourd6673642016-05-05 14:46:39 -060014466 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060014467 image_create_info.format = unsupported;
Tony Barbourd6673642016-05-05 14:46:39 -060014468 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014469 "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060014470
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014471 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060014472 m_errorMonitor->VerifyFound();
14473 }
14474}
14475
14476TEST_F(VkLayerTest, ImageLayerViewTests) {
14477 VkResult ret;
14478 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
14479
14480 ASSERT_NO_FATAL_FAILURE(InitState());
14481
14482 VkImageObj image(m_device);
14483 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
14484 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
14485 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
14486 VK_IMAGE_TILING_OPTIMAL, 0);
14487 ASSERT_TRUE(image.initialized());
14488
14489 VkImageView imgView;
14490 VkImageViewCreateInfo imgViewInfo = {};
14491 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
14492 imgViewInfo.image = image.handle();
14493 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
14494 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
14495 imgViewInfo.subresourceRange.layerCount = 1;
14496 imgViewInfo.subresourceRange.baseMipLevel = 0;
14497 imgViewInfo.subresourceRange.levelCount = 1;
14498 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14499
14500 m_errorMonitor->SetDesiredFailureMsg(
14501 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14502 "vkCreateImageView called with baseMipLevel");
14503 // View can't have baseMipLevel >= image's mipLevels - Expect
14504 // VIEW_CREATE_ERROR
14505 imgViewInfo.subresourceRange.baseMipLevel = 1;
14506 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14507 m_errorMonitor->VerifyFound();
14508 imgViewInfo.subresourceRange.baseMipLevel = 0;
14509
14510 m_errorMonitor->SetDesiredFailureMsg(
14511 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14512 "vkCreateImageView called with baseArrayLayer");
14513 // View can't have baseArrayLayer >= image's arraySize - Expect
14514 // VIEW_CREATE_ERROR
14515 imgViewInfo.subresourceRange.baseArrayLayer = 1;
14516 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14517 m_errorMonitor->VerifyFound();
14518 imgViewInfo.subresourceRange.baseArrayLayer = 0;
14519
14520 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14521 "vkCreateImageView called with 0 in "
14522 "pCreateInfo->subresourceRange."
14523 "levelCount");
14524 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
14525 imgViewInfo.subresourceRange.levelCount = 0;
14526 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14527 m_errorMonitor->VerifyFound();
14528 imgViewInfo.subresourceRange.levelCount = 1;
14529
14530 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14531 "vkCreateImageView called with 0 in "
14532 "pCreateInfo->subresourceRange."
14533 "layerCount");
14534 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
14535 imgViewInfo.subresourceRange.layerCount = 0;
14536 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14537 m_errorMonitor->VerifyFound();
14538 imgViewInfo.subresourceRange.layerCount = 1;
14539
14540 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14541 "but both must be color formats");
14542 // Can't use depth format for view into color image - Expect INVALID_FORMAT
14543 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
14544 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14545 m_errorMonitor->VerifyFound();
14546 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
14547
14548 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14549 "Formats MUST be IDENTICAL unless "
14550 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
14551 "was set on image creation.");
14552 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
14553 // VIEW_CREATE_ERROR
14554 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
14555 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14556 m_errorMonitor->VerifyFound();
14557 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
14558
14559 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14560 "can support ImageViews with "
14561 "differing formats but they must be "
14562 "in the same compatibility class.");
14563 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
14564 // VIEW_CREATE_ERROR
14565 VkImageCreateInfo mutImgInfo = image.create_info();
14566 VkImage mutImage;
14567 mutImgInfo.format = VK_FORMAT_R8_UINT;
14568 assert(
14569 m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures &
14570 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
14571 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
14572 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14573 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
14574 ASSERT_VK_SUCCESS(ret);
14575 imgViewInfo.image = mutImage;
14576 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14577 m_errorMonitor->VerifyFound();
14578 imgViewInfo.image = image.handle();
14579 vkDestroyImage(m_device->handle(), mutImage, NULL);
14580}
14581
14582TEST_F(VkLayerTest, MiscImageLayerTests) {
14583
14584 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
14585
14586 ASSERT_NO_FATAL_FAILURE(InitState());
14587
14588 VkImageObj image(m_device);
14589 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
14590 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
14591 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
14592 VK_IMAGE_TILING_OPTIMAL, 0);
14593 ASSERT_TRUE(image.initialized());
14594
14595 m_errorMonitor->SetDesiredFailureMsg(
14596 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14597 "number of layers in image subresource is zero");
14598 vk_testing::Buffer buffer;
14599 VkMemoryPropertyFlags reqs = 0;
14600 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
14601 VkBufferImageCopy region = {};
14602 region.bufferRowLength = 128;
14603 region.bufferImageHeight = 128;
14604 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14605 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
14606 region.imageSubresource.layerCount = 0;
14607 region.imageExtent.height = 4;
14608 region.imageExtent.width = 4;
14609 region.imageExtent.depth = 1;
14610 m_commandBuffer->BeginCommandBuffer();
14611 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
14612 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
14613 1, &region);
14614 m_errorMonitor->VerifyFound();
14615 region.imageSubresource.layerCount = 1;
14616
14617 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14618 "aspectMasks for each region must "
14619 "specify only COLOR or DEPTH or "
14620 "STENCIL");
14621 // Expect MISMATCHED_IMAGE_ASPECT
14622 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
14623 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
14624 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
14625 1, &region);
14626 m_errorMonitor->VerifyFound();
14627 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14628
14629 m_errorMonitor->SetDesiredFailureMsg(
14630 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14631 "If the format of srcImage is a depth, stencil, depth stencil or "
14632 "integer-based format then filter must be VK_FILTER_NEAREST");
14633 // Expect INVALID_FILTER
14634 VkImageObj intImage1(m_device);
14635 intImage1.init(128, 128, VK_FORMAT_R8_UINT,
14636 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
14637 0);
14638 VkImageObj intImage2(m_device);
14639 intImage2.init(128, 128, VK_FORMAT_R8_UINT,
14640 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
14641 0);
14642 VkImageBlit blitRegion = {};
14643 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14644 blitRegion.srcSubresource.baseArrayLayer = 0;
14645 blitRegion.srcSubresource.layerCount = 1;
14646 blitRegion.srcSubresource.mipLevel = 0;
14647 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14648 blitRegion.dstSubresource.baseArrayLayer = 0;
14649 blitRegion.dstSubresource.layerCount = 1;
14650 blitRegion.dstSubresource.mipLevel = 0;
14651
14652 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
14653 intImage1.layout(), intImage2.handle(), intImage2.layout(),
14654 16, &blitRegion, VK_FILTER_LINEAR);
14655 m_errorMonitor->VerifyFound();
14656
14657 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14658 "called with 0 in ppMemoryBarriers");
14659 VkImageMemoryBarrier img_barrier;
14660 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
14661 img_barrier.pNext = NULL;
14662 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
14663 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
14664 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14665 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14666 img_barrier.image = image.handle();
14667 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
14668 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
14669 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14670 img_barrier.subresourceRange.baseArrayLayer = 0;
14671 img_barrier.subresourceRange.baseMipLevel = 0;
14672 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
14673 img_barrier.subresourceRange.layerCount = 0;
14674 img_barrier.subresourceRange.levelCount = 1;
14675 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
14676 VK_PIPELINE_STAGE_HOST_BIT,
14677 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
14678 nullptr, 1, &img_barrier);
14679 m_errorMonitor->VerifyFound();
14680 img_barrier.subresourceRange.layerCount = 1;
14681}
14682
14683TEST_F(VkLayerTest, ImageFormatLimits) {
14684
14685 TEST_DESCRIPTION("Exceed the limits of image format ");
14686
14687 m_errorMonitor->SetDesiredFailureMsg(
14688 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14689 "CreateImage extents exceed allowable limits for format");
14690 VkImageCreateInfo image_create_info = {};
14691 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14692 image_create_info.pNext = NULL;
14693 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14694 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14695 image_create_info.extent.width = 32;
14696 image_create_info.extent.height = 32;
14697 image_create_info.extent.depth = 1;
14698 image_create_info.mipLevels = 1;
14699 image_create_info.arrayLayers = 1;
14700 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14701 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14702 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14703 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
14704 image_create_info.flags = 0;
14705
14706 VkImage nullImg;
14707 VkImageFormatProperties imgFmtProps;
14708 vkGetPhysicalDeviceImageFormatProperties(
14709 gpu(), image_create_info.format, image_create_info.imageType,
14710 image_create_info.tiling, image_create_info.usage,
14711 image_create_info.flags, &imgFmtProps);
14712 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
14713 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14714 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14715 m_errorMonitor->VerifyFound();
14716 image_create_info.extent.depth = 1;
14717
14718 m_errorMonitor->SetDesiredFailureMsg(
14719 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14720 "exceeds allowable maximum supported by format of");
14721 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
14722 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14723 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14724 m_errorMonitor->VerifyFound();
14725 image_create_info.mipLevels = 1;
14726
14727 m_errorMonitor->SetDesiredFailureMsg(
14728 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14729 "exceeds allowable maximum supported by format of");
14730 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
14731 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14732 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14733 m_errorMonitor->VerifyFound();
14734 image_create_info.arrayLayers = 1;
14735
14736 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14737 "is not supported by format");
14738 int samples = imgFmtProps.sampleCounts >> 1;
14739 image_create_info.samples = (VkSampleCountFlagBits)samples;
14740 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14741 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14742 m_errorMonitor->VerifyFound();
14743 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14744
14745 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14746 "pCreateInfo->initialLayout, must be "
14747 "VK_IMAGE_LAYOUT_UNDEFINED or "
14748 "VK_IMAGE_LAYOUT_PREINITIALIZED");
14749 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14750 // Expect INVALID_LAYOUT
14751 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14752 m_errorMonitor->VerifyFound();
14753 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
14754}
14755
Karl Schultz6addd812016-02-02 17:17:23 -070014756TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060014757 VkResult err;
14758 bool pass;
14759
14760 // Create color images with different format sizes and try to copy between them
14761 m_errorMonitor->SetDesiredFailureMsg(
14762 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14763 "vkCmdCopyImage called with unmatched source and dest image format sizes");
14764
14765 ASSERT_NO_FATAL_FAILURE(InitState());
14766
14767 // Create two images of different types and try to copy between them
14768 VkImage srcImage;
14769 VkImage dstImage;
14770 VkDeviceMemory srcMem;
14771 VkDeviceMemory destMem;
14772 VkMemoryRequirements memReqs;
14773
14774 VkImageCreateInfo image_create_info = {};
14775 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14776 image_create_info.pNext = NULL;
14777 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14778 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14779 image_create_info.extent.width = 32;
14780 image_create_info.extent.height = 32;
14781 image_create_info.extent.depth = 1;
14782 image_create_info.mipLevels = 1;
14783 image_create_info.arrayLayers = 1;
14784 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14785 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14786 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14787 image_create_info.flags = 0;
14788
14789 err =
14790 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
14791 ASSERT_VK_SUCCESS(err);
14792
14793 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
14794 // Introduce failure by creating second image with a different-sized format.
14795 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
14796
14797 err =
14798 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
14799 ASSERT_VK_SUCCESS(err);
14800
14801 // Allocate memory
14802 VkMemoryAllocateInfo memAlloc = {};
14803 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14804 memAlloc.pNext = NULL;
14805 memAlloc.allocationSize = 0;
14806 memAlloc.memoryTypeIndex = 0;
14807
14808 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
14809 memAlloc.allocationSize = memReqs.size;
14810 pass =
14811 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
14812 ASSERT_TRUE(pass);
14813 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
14814 ASSERT_VK_SUCCESS(err);
14815
14816 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
14817 memAlloc.allocationSize = memReqs.size;
14818 pass =
14819 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
14820 ASSERT_TRUE(pass);
14821 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
14822 ASSERT_VK_SUCCESS(err);
14823
14824 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14825 ASSERT_VK_SUCCESS(err);
14826 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
14827 ASSERT_VK_SUCCESS(err);
14828
14829 BeginCommandBuffer();
14830 VkImageCopy copyRegion;
14831 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14832 copyRegion.srcSubresource.mipLevel = 0;
14833 copyRegion.srcSubresource.baseArrayLayer = 0;
14834 copyRegion.srcSubresource.layerCount = 0;
14835 copyRegion.srcOffset.x = 0;
14836 copyRegion.srcOffset.y = 0;
14837 copyRegion.srcOffset.z = 0;
14838 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14839 copyRegion.dstSubresource.mipLevel = 0;
14840 copyRegion.dstSubresource.baseArrayLayer = 0;
14841 copyRegion.dstSubresource.layerCount = 0;
14842 copyRegion.dstOffset.x = 0;
14843 copyRegion.dstOffset.y = 0;
14844 copyRegion.dstOffset.z = 0;
14845 copyRegion.extent.width = 1;
14846 copyRegion.extent.height = 1;
14847 copyRegion.extent.depth = 1;
14848 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14849 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
14850 EndCommandBuffer();
14851
14852 m_errorMonitor->VerifyFound();
14853
14854 vkDestroyImage(m_device->device(), srcImage, NULL);
14855 vkDestroyImage(m_device->device(), dstImage, NULL);
14856 vkFreeMemory(m_device->device(), srcMem, NULL);
14857 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014858}
14859
Karl Schultz6addd812016-02-02 17:17:23 -070014860TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
14861 VkResult err;
14862 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014863
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014864 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014865 m_errorMonitor->SetDesiredFailureMsg(
14866 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014867 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014868
Mike Stroyana3082432015-09-25 13:39:21 -060014869 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014870
14871 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014872 VkImage srcImage;
14873 VkImage dstImage;
14874 VkDeviceMemory srcMem;
14875 VkDeviceMemory destMem;
14876 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014877
14878 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014879 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14880 image_create_info.pNext = NULL;
14881 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14882 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14883 image_create_info.extent.width = 32;
14884 image_create_info.extent.height = 32;
14885 image_create_info.extent.depth = 1;
14886 image_create_info.mipLevels = 1;
14887 image_create_info.arrayLayers = 1;
14888 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14889 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14890 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14891 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014892
Karl Schultz6addd812016-02-02 17:17:23 -070014893 err =
14894 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014895 ASSERT_VK_SUCCESS(err);
14896
Karl Schultzbdb75952016-04-19 11:36:49 -060014897 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
14898
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014899 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070014900 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014901 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
14902 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014903
Karl Schultz6addd812016-02-02 17:17:23 -070014904 err =
14905 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014906 ASSERT_VK_SUCCESS(err);
14907
14908 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014909 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014910 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14911 memAlloc.pNext = NULL;
14912 memAlloc.allocationSize = 0;
14913 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014914
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014915 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014916 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014917 pass =
14918 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014919 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014920 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014921 ASSERT_VK_SUCCESS(err);
14922
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014923 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014924 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014925 pass =
14926 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014927 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014928 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014929 ASSERT_VK_SUCCESS(err);
14930
14931 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14932 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014933 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014934 ASSERT_VK_SUCCESS(err);
14935
14936 BeginCommandBuffer();
14937 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014938 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014939 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014940 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014941 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014942 copyRegion.srcOffset.x = 0;
14943 copyRegion.srcOffset.y = 0;
14944 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014945 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014946 copyRegion.dstSubresource.mipLevel = 0;
14947 copyRegion.dstSubresource.baseArrayLayer = 0;
14948 copyRegion.dstSubresource.layerCount = 0;
14949 copyRegion.dstOffset.x = 0;
14950 copyRegion.dstOffset.y = 0;
14951 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014952 copyRegion.extent.width = 1;
14953 copyRegion.extent.height = 1;
14954 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014955 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14956 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014957 EndCommandBuffer();
14958
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014959 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014960
Chia-I Wuf7458c52015-10-26 21:10:41 +080014961 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014962 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014963 vkFreeMemory(m_device->device(), srcMem, NULL);
14964 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014965}
14966
Karl Schultz6addd812016-02-02 17:17:23 -070014967TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
14968 VkResult err;
14969 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014970
Karl Schultz6addd812016-02-02 17:17:23 -070014971 m_errorMonitor->SetDesiredFailureMsg(
14972 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014973 "vkCmdResolveImage called with source sample count less than 2.");
14974
Mike Stroyana3082432015-09-25 13:39:21 -060014975 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014976
14977 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070014978 VkImage srcImage;
14979 VkImage dstImage;
14980 VkDeviceMemory srcMem;
14981 VkDeviceMemory destMem;
14982 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014983
14984 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014985 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14986 image_create_info.pNext = NULL;
14987 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14988 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14989 image_create_info.extent.width = 32;
14990 image_create_info.extent.height = 1;
14991 image_create_info.extent.depth = 1;
14992 image_create_info.mipLevels = 1;
14993 image_create_info.arrayLayers = 1;
14994 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14995 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14996 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14997 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014998
Karl Schultz6addd812016-02-02 17:17:23 -070014999 err =
15000 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015001 ASSERT_VK_SUCCESS(err);
15002
Karl Schultz6addd812016-02-02 17:17:23 -070015003 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015004
Karl Schultz6addd812016-02-02 17:17:23 -070015005 err =
15006 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015007 ASSERT_VK_SUCCESS(err);
15008
15009 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015010 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015011 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15012 memAlloc.pNext = NULL;
15013 memAlloc.allocationSize = 0;
15014 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015015
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015016 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015017 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015018 pass =
15019 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015020 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015021 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015022 ASSERT_VK_SUCCESS(err);
15023
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015024 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015025 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015026 pass =
15027 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015028 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015029 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015030 ASSERT_VK_SUCCESS(err);
15031
15032 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15033 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015034 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015035 ASSERT_VK_SUCCESS(err);
15036
15037 BeginCommandBuffer();
15038 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015039 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15040 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015041 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015042 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015043 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015044 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015045 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015046 resolveRegion.srcOffset.x = 0;
15047 resolveRegion.srcOffset.y = 0;
15048 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015049 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015050 resolveRegion.dstSubresource.mipLevel = 0;
15051 resolveRegion.dstSubresource.baseArrayLayer = 0;
15052 resolveRegion.dstSubresource.layerCount = 0;
15053 resolveRegion.dstOffset.x = 0;
15054 resolveRegion.dstOffset.y = 0;
15055 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015056 resolveRegion.extent.width = 1;
15057 resolveRegion.extent.height = 1;
15058 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015059 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15060 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015061 EndCommandBuffer();
15062
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015063 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015064
Chia-I Wuf7458c52015-10-26 21:10:41 +080015065 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015066 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015067 vkFreeMemory(m_device->device(), srcMem, NULL);
15068 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015069}
15070
Karl Schultz6addd812016-02-02 17:17:23 -070015071TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
15072 VkResult err;
15073 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015074
Karl Schultz6addd812016-02-02 17:17:23 -070015075 m_errorMonitor->SetDesiredFailureMsg(
15076 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015077 "vkCmdResolveImage called with dest sample count greater than 1.");
15078
Mike Stroyana3082432015-09-25 13:39:21 -060015079 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015080
Chris Forbesa7530692016-05-08 12:35:39 +120015081 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070015082 VkImage srcImage;
15083 VkImage dstImage;
15084 VkDeviceMemory srcMem;
15085 VkDeviceMemory destMem;
15086 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015087
15088 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015089 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15090 image_create_info.pNext = NULL;
15091 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15092 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15093 image_create_info.extent.width = 32;
15094 image_create_info.extent.height = 1;
15095 image_create_info.extent.depth = 1;
15096 image_create_info.mipLevels = 1;
15097 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120015098 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015099 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15100 // Note: Some implementations expect color attachment usage for any
15101 // multisample surface
15102 image_create_info.usage =
15103 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15104 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015105
Karl Schultz6addd812016-02-02 17:17:23 -070015106 err =
15107 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015108 ASSERT_VK_SUCCESS(err);
15109
Karl Schultz6addd812016-02-02 17:17:23 -070015110 // Note: Some implementations expect color attachment usage for any
15111 // multisample surface
15112 image_create_info.usage =
15113 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015114
Karl Schultz6addd812016-02-02 17:17:23 -070015115 err =
15116 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015117 ASSERT_VK_SUCCESS(err);
15118
15119 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015120 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015121 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15122 memAlloc.pNext = NULL;
15123 memAlloc.allocationSize = 0;
15124 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015125
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015126 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015127 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015128 pass =
15129 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015130 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015131 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015132 ASSERT_VK_SUCCESS(err);
15133
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015134 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015135 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015136 pass =
15137 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015138 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015139 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015140 ASSERT_VK_SUCCESS(err);
15141
15142 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15143 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015144 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015145 ASSERT_VK_SUCCESS(err);
15146
15147 BeginCommandBuffer();
15148 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015149 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15150 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015151 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015152 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015153 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015154 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015155 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015156 resolveRegion.srcOffset.x = 0;
15157 resolveRegion.srcOffset.y = 0;
15158 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015159 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015160 resolveRegion.dstSubresource.mipLevel = 0;
15161 resolveRegion.dstSubresource.baseArrayLayer = 0;
15162 resolveRegion.dstSubresource.layerCount = 0;
15163 resolveRegion.dstOffset.x = 0;
15164 resolveRegion.dstOffset.y = 0;
15165 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015166 resolveRegion.extent.width = 1;
15167 resolveRegion.extent.height = 1;
15168 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015169 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15170 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015171 EndCommandBuffer();
15172
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015173 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015174
Chia-I Wuf7458c52015-10-26 21:10:41 +080015175 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015176 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015177 vkFreeMemory(m_device->device(), srcMem, NULL);
15178 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015179}
15180
Karl Schultz6addd812016-02-02 17:17:23 -070015181TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
15182 VkResult err;
15183 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015184
Karl Schultz6addd812016-02-02 17:17:23 -070015185 m_errorMonitor->SetDesiredFailureMsg(
15186 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015187 "vkCmdResolveImage called with unmatched source and dest formats.");
15188
Mike Stroyana3082432015-09-25 13:39:21 -060015189 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015190
15191 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015192 VkImage srcImage;
15193 VkImage dstImage;
15194 VkDeviceMemory srcMem;
15195 VkDeviceMemory destMem;
15196 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015197
15198 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015199 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15200 image_create_info.pNext = NULL;
15201 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15202 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15203 image_create_info.extent.width = 32;
15204 image_create_info.extent.height = 1;
15205 image_create_info.extent.depth = 1;
15206 image_create_info.mipLevels = 1;
15207 image_create_info.arrayLayers = 1;
15208 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
15209 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15210 // Note: Some implementations expect color attachment usage for any
15211 // multisample surface
15212 image_create_info.usage =
15213 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15214 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015215
Karl Schultz6addd812016-02-02 17:17:23 -070015216 err =
15217 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015218 ASSERT_VK_SUCCESS(err);
15219
Karl Schultz6addd812016-02-02 17:17:23 -070015220 // Set format to something other than source image
15221 image_create_info.format = VK_FORMAT_R32_SFLOAT;
15222 // Note: Some implementations expect color attachment usage for any
15223 // multisample surface
15224 image_create_info.usage =
15225 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15226 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015227
Karl Schultz6addd812016-02-02 17:17:23 -070015228 err =
15229 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015230 ASSERT_VK_SUCCESS(err);
15231
15232 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015233 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015234 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15235 memAlloc.pNext = NULL;
15236 memAlloc.allocationSize = 0;
15237 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015238
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015239 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015240 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015241 pass =
15242 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015243 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015244 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015245 ASSERT_VK_SUCCESS(err);
15246
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015247 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015248 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015249 pass =
15250 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015251 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015252 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015253 ASSERT_VK_SUCCESS(err);
15254
15255 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15256 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015257 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015258 ASSERT_VK_SUCCESS(err);
15259
15260 BeginCommandBuffer();
15261 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015262 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15263 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015264 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015265 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015266 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015267 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015268 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015269 resolveRegion.srcOffset.x = 0;
15270 resolveRegion.srcOffset.y = 0;
15271 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015272 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015273 resolveRegion.dstSubresource.mipLevel = 0;
15274 resolveRegion.dstSubresource.baseArrayLayer = 0;
15275 resolveRegion.dstSubresource.layerCount = 0;
15276 resolveRegion.dstOffset.x = 0;
15277 resolveRegion.dstOffset.y = 0;
15278 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015279 resolveRegion.extent.width = 1;
15280 resolveRegion.extent.height = 1;
15281 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015282 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15283 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015284 EndCommandBuffer();
15285
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015286 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015287
Chia-I Wuf7458c52015-10-26 21:10:41 +080015288 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015289 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015290 vkFreeMemory(m_device->device(), srcMem, NULL);
15291 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015292}
15293
Karl Schultz6addd812016-02-02 17:17:23 -070015294TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
15295 VkResult err;
15296 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015297
Karl Schultz6addd812016-02-02 17:17:23 -070015298 m_errorMonitor->SetDesiredFailureMsg(
15299 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015300 "vkCmdResolveImage called with unmatched source and dest image types.");
15301
Mike Stroyana3082432015-09-25 13:39:21 -060015302 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015303
15304 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015305 VkImage srcImage;
15306 VkImage dstImage;
15307 VkDeviceMemory srcMem;
15308 VkDeviceMemory destMem;
15309 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015310
15311 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015312 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15313 image_create_info.pNext = NULL;
15314 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15315 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15316 image_create_info.extent.width = 32;
15317 image_create_info.extent.height = 1;
15318 image_create_info.extent.depth = 1;
15319 image_create_info.mipLevels = 1;
15320 image_create_info.arrayLayers = 1;
15321 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
15322 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15323 // Note: Some implementations expect color attachment usage for any
15324 // multisample surface
15325 image_create_info.usage =
15326 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15327 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015328
Karl Schultz6addd812016-02-02 17:17:23 -070015329 err =
15330 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015331 ASSERT_VK_SUCCESS(err);
15332
Karl Schultz6addd812016-02-02 17:17:23 -070015333 image_create_info.imageType = VK_IMAGE_TYPE_1D;
15334 // Note: Some implementations expect color attachment usage for any
15335 // multisample surface
15336 image_create_info.usage =
15337 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15338 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015339
Karl Schultz6addd812016-02-02 17:17:23 -070015340 err =
15341 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015342 ASSERT_VK_SUCCESS(err);
15343
15344 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015345 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015346 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15347 memAlloc.pNext = NULL;
15348 memAlloc.allocationSize = 0;
15349 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015350
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015351 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015352 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015353 pass =
15354 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015355 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015356 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015357 ASSERT_VK_SUCCESS(err);
15358
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015359 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015360 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015361 pass =
15362 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015363 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015364 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015365 ASSERT_VK_SUCCESS(err);
15366
15367 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15368 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015369 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015370 ASSERT_VK_SUCCESS(err);
15371
15372 BeginCommandBuffer();
15373 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015374 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15375 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015376 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015377 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015378 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015379 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015380 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015381 resolveRegion.srcOffset.x = 0;
15382 resolveRegion.srcOffset.y = 0;
15383 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015384 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015385 resolveRegion.dstSubresource.mipLevel = 0;
15386 resolveRegion.dstSubresource.baseArrayLayer = 0;
15387 resolveRegion.dstSubresource.layerCount = 0;
15388 resolveRegion.dstOffset.x = 0;
15389 resolveRegion.dstOffset.y = 0;
15390 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015391 resolveRegion.extent.width = 1;
15392 resolveRegion.extent.height = 1;
15393 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015394 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15395 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015396 EndCommandBuffer();
15397
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015398 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015399
Chia-I Wuf7458c52015-10-26 21:10:41 +080015400 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015401 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015402 vkFreeMemory(m_device->device(), srcMem, NULL);
15403 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015404}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015405
Karl Schultz6addd812016-02-02 17:17:23 -070015406TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015407 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070015408 // to using a DS format, then cause it to hit error due to COLOR_BIT not
15409 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015410 // The image format check comes 2nd in validation so we trigger it first,
15411 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070015412 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015413
Karl Schultz6addd812016-02-02 17:17:23 -070015414 m_errorMonitor->SetDesiredFailureMsg(
15415 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015416 "Combination depth/stencil image formats can have only the ");
15417
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015418 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015419
Chia-I Wu1b99bb22015-10-27 19:25:11 +080015420 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015421 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
15422 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015423
15424 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015425 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
15426 ds_pool_ci.pNext = NULL;
15427 ds_pool_ci.maxSets = 1;
15428 ds_pool_ci.poolSizeCount = 1;
15429 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015430
15431 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070015432 err =
15433 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015434 ASSERT_VK_SUCCESS(err);
15435
15436 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015437 dsl_binding.binding = 0;
15438 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
15439 dsl_binding.descriptorCount = 1;
15440 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
15441 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015442
15443 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015444 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
15445 ds_layout_ci.pNext = NULL;
15446 ds_layout_ci.bindingCount = 1;
15447 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015448 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070015449 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
15450 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015451 ASSERT_VK_SUCCESS(err);
15452
15453 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015454 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080015455 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070015456 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015457 alloc_info.descriptorPool = ds_pool;
15458 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070015459 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
15460 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015461 ASSERT_VK_SUCCESS(err);
15462
Karl Schultz6addd812016-02-02 17:17:23 -070015463 VkImage image_bad;
15464 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015465 // One bad format and one good format for Color attachment
Tobin Ehlis269f0322016-05-25 16:24:21 -060015466 const VkFormat tex_format_bad = VK_FORMAT_D24_UNORM_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015467 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070015468 const int32_t tex_width = 32;
15469 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015470
15471 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015472 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15473 image_create_info.pNext = NULL;
15474 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15475 image_create_info.format = tex_format_bad;
15476 image_create_info.extent.width = tex_width;
15477 image_create_info.extent.height = tex_height;
15478 image_create_info.extent.depth = 1;
15479 image_create_info.mipLevels = 1;
15480 image_create_info.arrayLayers = 1;
15481 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15482 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15483 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
15484 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
15485 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015486
Karl Schultz6addd812016-02-02 17:17:23 -070015487 err =
15488 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015489 ASSERT_VK_SUCCESS(err);
15490 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -070015491 image_create_info.usage =
15492 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15493 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
15494 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015495 ASSERT_VK_SUCCESS(err);
15496
15497 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015498 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15499 image_view_create_info.image = image_bad;
15500 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15501 image_view_create_info.format = tex_format_bad;
15502 image_view_create_info.subresourceRange.baseArrayLayer = 0;
15503 image_view_create_info.subresourceRange.baseMipLevel = 0;
15504 image_view_create_info.subresourceRange.layerCount = 1;
15505 image_view_create_info.subresourceRange.levelCount = 1;
15506 image_view_create_info.subresourceRange.aspectMask =
15507 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015508
15509 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070015510 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
15511 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015512
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015513 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015514
Chia-I Wuf7458c52015-10-26 21:10:41 +080015515 vkDestroyImage(m_device->device(), image_bad, NULL);
15516 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015517 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
15518 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015519}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015520
15521TEST_F(VkLayerTest, ClearImageErrors) {
15522 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and "
15523 "ClearDepthStencilImage with a color image.");
15524
15525 ASSERT_NO_FATAL_FAILURE(InitState());
15526 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15527
15528 // Renderpass is started here so end it as Clear cmds can't be in renderpass
15529 BeginCommandBuffer();
15530 m_commandBuffer->EndRenderPass();
15531
15532 // Color image
15533 VkClearColorValue clear_color;
15534 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
15535 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
15536 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
15537 const int32_t img_width = 32;
15538 const int32_t img_height = 32;
15539 VkImageCreateInfo image_create_info = {};
15540 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15541 image_create_info.pNext = NULL;
15542 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15543 image_create_info.format = color_format;
15544 image_create_info.extent.width = img_width;
15545 image_create_info.extent.height = img_height;
15546 image_create_info.extent.depth = 1;
15547 image_create_info.mipLevels = 1;
15548 image_create_info.arrayLayers = 1;
15549 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15550 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15551 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15552
15553 vk_testing::Image color_image;
15554 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info,
15555 reqs);
15556
15557 const VkImageSubresourceRange color_range =
15558 vk_testing::Image::subresource_range(image_create_info,
15559 VK_IMAGE_ASPECT_COLOR_BIT);
15560
15561 // Depth/Stencil image
15562 VkClearDepthStencilValue clear_value = {0};
15563 reqs = 0; // don't need HOST_VISIBLE DS image
15564 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
15565 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
15566 ds_image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
15567 ds_image_create_info.extent.width = 64;
15568 ds_image_create_info.extent.height = 64;
15569 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15570 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
15571
15572 vk_testing::Image ds_image;
15573 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info,
15574 reqs);
15575
15576 const VkImageSubresourceRange ds_range =
15577 vk_testing::Image::subresource_range(ds_image_create_info,
15578 VK_IMAGE_ASPECT_DEPTH_BIT);
15579
15580 m_errorMonitor->SetDesiredFailureMsg(
15581 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15582 "vkCmdClearColorImage called with depth/stencil image.");
15583
15584 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
15585 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
15586 &color_range);
15587
15588 m_errorMonitor->VerifyFound();
15589
Tony Barbour26434b92016-06-02 09:43:50 -060015590 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15591 "vkCmdClearColorImage called with "
15592 "image created without "
15593 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
15594
15595 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
15596 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
15597 &color_range);
15598
15599 m_errorMonitor->VerifyFound();
15600
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015601 // Call CmdClearDepthStencilImage with color image
15602 m_errorMonitor->SetDesiredFailureMsg(
15603 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15604 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
15605
15606 vkCmdClearDepthStencilImage(
15607 m_commandBuffer->GetBufferHandle(), color_image.handle(),
15608 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
15609 &ds_range);
15610
15611 m_errorMonitor->VerifyFound();
15612}
Tobin Ehliscde08892015-09-22 10:11:37 -060015613#endif // IMAGE_TESTS
15614
Tony Barbour300a6082015-04-07 13:44:53 -060015615int main(int argc, char **argv) {
15616 int result;
15617
Cody Northrop8e54a402016-03-08 22:25:52 -070015618#ifdef ANDROID
15619 int vulkanSupport = InitVulkan();
15620 if (vulkanSupport == 0)
15621 return 1;
15622#endif
15623
Tony Barbour300a6082015-04-07 13:44:53 -060015624 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060015625 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060015626
15627 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
15628
15629 result = RUN_ALL_TESTS();
15630
Tony Barbour6918cd52015-04-09 12:58:51 -060015631 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060015632 return result;
15633}