blob: 29dd04e4ad98455081138fc778410cb3da6c03c0 [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
2 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
Michael Lentine0a369f62016-02-03 16:51:46 -06005 * Copyright (c) 2015-2016 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
20 */
Tony Barbour65c48b32015-11-17 10:02:56 -070021
Cody Northrop8e54a402016-03-08 22:25:52 -070022#ifdef ANDROID
23#include "vulkan_wrapper.h"
24#else
David Pinedo9316d3b2015-11-06 12:54:48 -070025#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070026#endif
Courtney Goeltzenleuchter58f3eff2015-10-07 13:28:58 -060027#include "test_common.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060028#include "vkrenderframework.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060029#include "vk_layer_config.h"
Jon Ashburn7fa7e222016-02-02 12:08:10 -070030#include "icd-spv.h"
Tony Barbour300a6082015-04-07 13:44:53 -060031
Mark Lobodzinski3780e142015-05-14 15:08:13 -050032#define GLM_FORCE_RADIANS
33#include "glm/glm.hpp"
34#include <glm/gtc/matrix_transform.hpp>
35
Dustin Gravesffa90fa2016-05-06 11:20:38 -060036#define PARAMETER_VALIDATION_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060037#define MEM_TRACKER_TESTS 1
38#define OBJ_TRACKER_TESTS 1
39#define DRAW_STATE_TESTS 1
40#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120041#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060042#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060043#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060044
Mark Lobodzinski3780e142015-05-14 15:08:13 -050045//--------------------------------------------------------------------------------------
46// Mesh and VertexFormat Data
47//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070048struct Vertex {
49 float posX, posY, posZ, posW; // Position data
50 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050051};
52
Karl Schultz6addd812016-02-02 17:17:23 -070053#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050054
55typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070056 BsoFailNone = 0x00000000,
57 BsoFailLineWidth = 0x00000001,
58 BsoFailDepthBias = 0x00000002,
59 BsoFailViewport = 0x00000004,
60 BsoFailScissor = 0x00000008,
61 BsoFailBlend = 0x00000010,
62 BsoFailDepthBounds = 0x00000020,
63 BsoFailStencilReadMask = 0x00000040,
64 BsoFailStencilWriteMask = 0x00000080,
65 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060066 BsoFailCmdClearAttachments = 0x00000200,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050067} BsoFailSelect;
68
69struct vktriangle_vs_uniform {
70 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070071 float mvp[4][4];
72 float position[3][4];
73 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050074};
75
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050076static const char bindStateVertShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120077 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070078 "vec2 vertices[3];\n"
79 "out gl_PerVertex {\n"
80 " vec4 gl_Position;\n"
81 "};\n"
82 "void main() {\n"
83 " vertices[0] = vec2(-1.0, -1.0);\n"
84 " vertices[1] = vec2( 1.0, -1.0);\n"
85 " vertices[2] = vec2( 0.0, 1.0);\n"
86 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
87 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050088
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050089static const char bindStateFragShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120090 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070091 "\n"
92 "layout(location = 0) out vec4 uFragColor;\n"
93 "void main(){\n"
94 " uFragColor = vec4(0,1,0,1);\n"
95 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050096
Karl Schultz6addd812016-02-02 17:17:23 -070097static VKAPI_ATTR VkBool32 VKAPI_CALL
98myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
99 uint64_t srcObject, size_t location, int32_t msgCode,
100 const char *pLayerPrefix, const char *pMsg, void *pUserData);
Tony Barbour300a6082015-04-07 13:44:53 -0600101
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600102// ********************************************************
103// ErrorMonitor Usage:
104//
105// Call SetDesiredFailureMsg with a string to be compared against all
106// encountered log messages. Passing NULL will match all log messages.
107// logMsg will return true for skipCall only if msg is matched or NULL.
108//
109// Call DesiredMsgFound to determine if the desired failure message
110// was encountered.
111
Tony Barbour300a6082015-04-07 13:44:53 -0600112class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700113 public:
114 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600115 test_platform_thread_create_mutex(&m_mutex);
116 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700117 m_msgFlags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700118 m_bailout = NULL;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600119 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600120 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600121
Dustin Graves48458142016-04-29 16:11:55 -0600122 ~ErrorMonitor() { test_platform_thread_delete_mutex(&m_mutex); }
123
Karl Schultz6addd812016-02-02 17:17:23 -0700124 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200125 // also discard all collected messages to this point
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600126 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600127 m_failureMsg.clear();
128 m_otherMsgs.clear();
129 m_desiredMsg = msgString;
Karl Schultz6addd812016-02-02 17:17:23 -0700130 m_msgFound = VK_FALSE;
131 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600132 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600133 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600134
Karl Schultz6addd812016-02-02 17:17:23 -0700135 VkBool32 CheckForDesiredMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600136 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600137 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600138 if (m_bailout != NULL) {
139 *m_bailout = true;
140 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600141 string errorString(msgString);
142 if (msgFlags & m_msgFlags) {
143 if (errorString.find(m_desiredMsg) != string::npos) {
Chris Forbesc7b8ad72016-04-04 18:50:38 +1200144 if (m_msgFound) { /* if multiple matches, don't lose all but the last! */
145 m_otherMsgs.push_back(m_failureMsg);
146 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600147 m_failureMsg = errorString;
Karl Schultz6addd812016-02-02 17:17:23 -0700148 m_msgFound = VK_TRUE;
149 result = VK_TRUE;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600150 } else {
151 m_otherMsgs.push_back(errorString);
152 }
153 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600154 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600155 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600156 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600157
Karl Schultz6addd812016-02-02 17:17:23 -0700158 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600159
Karl Schultz6addd812016-02-02 17:17:23 -0700160 string GetFailureMsg(void) { return m_failureMsg; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600161
Karl Schultz6addd812016-02-02 17:17:23 -0700162 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600163
Karl Schultz6addd812016-02-02 17:17:23 -0700164 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600165
Karl Schultz6addd812016-02-02 17:17:23 -0700166 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600167 vector<string> otherMsgs = GetOtherFailureMsgs();
168 cout << "Other error messages logged for this test were:" << endl;
169 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
170 cout << " " << *iter << endl;
171 }
172 }
173
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200174 /* helpers */
175
176 void ExpectSuccess() {
177 // match anything
178 SetDesiredFailureMsg(~0u, "");
179 }
180
181 void VerifyFound() {
182 // Not seeing the desired message is a failure. /Before/ throwing, dump
183 // any other messages.
184 if (!DesiredMsgFound()) {
185 DumpFailureMsgs();
186 FAIL() << "Did not receive expected error '" << m_desiredMsg << "'";
187 }
188 }
189
190 void VerifyNotFound() {
191 // ExpectSuccess() configured us to match anything. Any error is a
192 // failure.
193 if (DesiredMsgFound()) {
194 DumpFailureMsgs();
195 FAIL() << "Expected to succeed but got error: " << GetFailureMsg();
196 }
197 }
198
Karl Schultz6addd812016-02-02 17:17:23 -0700199 private:
200 VkFlags m_msgFlags;
201 string m_desiredMsg;
202 string m_failureMsg;
203 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600204 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700205 bool *m_bailout;
206 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600207};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500208
Karl Schultz6addd812016-02-02 17:17:23 -0700209static VKAPI_ATTR VkBool32 VKAPI_CALL
210myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
211 uint64_t srcObject, size_t location, int32_t msgCode,
212 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
213 if (msgFlags &
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700214 (VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT |
Karl Schultz6addd812016-02-02 17:17:23 -0700215 VK_DEBUG_REPORT_ERROR_BIT_EXT)) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600216 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600217 return errMonitor->CheckForDesiredMsg(msgFlags, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600218 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600219 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600220}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500221
Karl Schultz6addd812016-02-02 17:17:23 -0700222class VkLayerTest : public VkRenderFramework {
223 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800224 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
225 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700226 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText,
227 BsoFailSelect failMask);
228 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
229 VkPipelineObj &pipelineobj,
230 VkDescriptorSetObj &descriptorSet,
231 BsoFailSelect failMask);
232 void GenericDrawPreparation(VkPipelineObj &pipelineobj,
233 VkDescriptorSetObj &descriptorSet,
234 BsoFailSelect failMask) {
235 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet,
236 failMask);
237 }
Tony Barbour300a6082015-04-07 13:44:53 -0600238
Tony Barbourfe3351b2015-07-28 10:17:20 -0600239 /* Convenience functions that use built-in command buffer */
Karl Schultz6addd812016-02-02 17:17:23 -0700240 VkResult BeginCommandBuffer() {
241 return BeginCommandBuffer(*m_commandBuffer);
242 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800243 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Karl Schultz6addd812016-02-02 17:17:23 -0700244 void Draw(uint32_t vertexCount, uint32_t instanceCount,
245 uint32_t firstVertex, uint32_t firstInstance) {
246 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex,
247 firstInstance);
248 }
249 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
250 uint32_t firstIndex, int32_t vertexOffset,
251 uint32_t firstInstance) {
252 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex,
253 vertexOffset, firstInstance);
254 }
Mark Muellerdfe37552016-07-07 14:47:42 -0600255 void QueueCommandBuffer(bool checkSuccess = true) {
256 m_commandBuffer->QueueCommandBuffer(checkSuccess); }
Karl Schultz6addd812016-02-02 17:17:23 -0700257 void QueueCommandBuffer(const VkFence &fence) {
258 m_commandBuffer->QueueCommandBuffer(fence);
259 }
260 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
261 VkDeviceSize offset, uint32_t binding) {
262 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
263 }
264 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
265 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
266 }
267
268 protected:
269 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600270 bool m_enableWSI;
Tony Barbour300a6082015-04-07 13:44:53 -0600271
272 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600273 std::vector<const char *> instance_layer_names;
274 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600275 std::vector<const char *> instance_extension_names;
276 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600277
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700278 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600279 /*
280 * Since CreateDbgMsgCallback is an instance level extension call
281 * any extension / layer that utilizes that feature also needs
282 * to be enabled at create instance time.
283 */
Karl Schultz6addd812016-02-02 17:17:23 -0700284 // Use Threading layer first to protect others from
285 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700286 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600287 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800288 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700289 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800290 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600291 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700292 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600293
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700294 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600295 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800296 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700297 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800298 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600299 device_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700300 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour300a6082015-04-07 13:44:53 -0600301
Ian Elliott2c1daf52016-05-12 09:41:46 -0600302 if (m_enableWSI) {
303 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
304 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
305#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
306#if defined(VK_USE_PLATFORM_ANDROID_KHR)
307 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
308#endif // VK_USE_PLATFORM_ANDROID_KHR
309#if defined(VK_USE_PLATFORM_MIR_KHR)
310 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
311#endif // VK_USE_PLATFORM_MIR_KHR
312#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
313 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
314#endif // VK_USE_PLATFORM_WAYLAND_KHR
315#if defined(VK_USE_PLATFORM_WIN32_KHR)
316 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
317#endif // VK_USE_PLATFORM_WIN32_KHR
318#endif // NEED_TO_TEST_THIS_ON_PLATFORM
319#if defined(VK_USE_PLATFORM_XCB_KHR)
320 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
321#elif defined(VK_USE_PLATFORM_XLIB_KHR)
322 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
323#endif // VK_USE_PLATFORM_XLIB_KHR
324 }
325
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600326 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600327 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800328 this->app_info.pApplicationName = "layer_tests";
329 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600330 this->app_info.pEngineName = "unittest";
331 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600332 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600333
Tony Barbour15524c32015-04-29 17:34:29 -0600334 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600335 InitFramework(instance_layer_names, device_layer_names,
336 instance_extension_names, device_extension_names,
337 myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600338 }
339
340 virtual void TearDown() {
341 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600342 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600343 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600344 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600345
346 VkLayerTest() {
347 m_enableWSI = false;
348 }
Tony Barbour300a6082015-04-07 13:44:53 -0600349};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500350
Karl Schultz6addd812016-02-02 17:17:23 -0700351VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600352 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600353
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800354 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600355
356 /*
357 * For render test all drawing happens in a single render pass
358 * on a single command buffer.
359 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200360 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800361 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600362 }
363
364 return result;
365}
366
Karl Schultz6addd812016-02-02 17:17:23 -0700367VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600368 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600369
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200370 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800371 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200372 }
Tony Barbour300a6082015-04-07 13:44:53 -0600373
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800374 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600375
376 return result;
377}
378
Karl Schultz6addd812016-02-02 17:17:23 -0700379void VkLayerTest::VKTriangleTest(const char *vertShaderText,
380 const char *fragShaderText,
381 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500382 // Create identity matrix
383 int i;
384 struct vktriangle_vs_uniform data;
385
386 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700387 glm::mat4 View = glm::mat4(1.0f);
388 glm::mat4 Model = glm::mat4(1.0f);
389 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500390 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700391 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500392
393 memcpy(&data.mvp, &MVP[0][0], matrixSize);
394
Karl Schultz6addd812016-02-02 17:17:23 -0700395 static const Vertex tri_data[] = {
396 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
397 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
398 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500399 };
400
Karl Schultz6addd812016-02-02 17:17:23 -0700401 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500402 data.position[i][0] = tri_data[i].posX;
403 data.position[i][1] = tri_data[i].posY;
404 data.position[i][2] = tri_data[i].posZ;
405 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700406 data.color[i][0] = tri_data[i].r;
407 data.color[i][1] = tri_data[i].g;
408 data.color[i][2] = tri_data[i].b;
409 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500410 }
411
412 ASSERT_NO_FATAL_FAILURE(InitState());
413 ASSERT_NO_FATAL_FAILURE(InitViewport());
414
Karl Schultz6addd812016-02-02 17:17:23 -0700415 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
416 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500417
Karl Schultz6addd812016-02-02 17:17:23 -0700418 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
419 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
420 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500421
422 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800423 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500424 pipelineobj.AddShader(&vs);
425 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600426 if (failMask & BsoFailLineWidth) {
427 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600428 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
429 ia_state.sType =
430 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
431 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
432 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600433 }
434 if (failMask & BsoFailDepthBias) {
435 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600436 VkPipelineRasterizationStateCreateInfo rs_state = {};
437 rs_state.sType =
438 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
439 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600440 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600441 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600442 }
Karl Schultz6addd812016-02-02 17:17:23 -0700443 // Viewport and scissors must stay in synch or other errors will occur than
444 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600445 if (failMask & BsoFailViewport) {
446 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600447 m_viewports.clear();
448 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600449 }
450 if (failMask & BsoFailScissor) {
451 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600452 m_scissors.clear();
453 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600454 }
455 if (failMask & BsoFailBlend) {
456 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600457 VkPipelineColorBlendAttachmentState att_state = {};
458 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
459 att_state.blendEnable = VK_TRUE;
460 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600461 }
462 if (failMask & BsoFailDepthBounds) {
463 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
464 }
465 if (failMask & BsoFailStencilReadMask) {
466 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
467 }
468 if (failMask & BsoFailStencilWriteMask) {
469 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
470 }
471 if (failMask & BsoFailStencilReference) {
472 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
473 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500474
475 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700476 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
477 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500478
479 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600480 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500481
Tony Barbourfe3351b2015-07-28 10:17:20 -0600482 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500483
484 // render triangle
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -0600485 Draw(3, 1, 0, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500486
Mark Muellerd4914412016-06-13 17:52:06 -0600487 if (failMask & BsoFailCmdClearAttachments) {
488 VkClearAttachment color_attachment = {};
489 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
490 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
491 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
492
493 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
494 &color_attachment, 1, &clear_rect);
495 }
496
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500497 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600498 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500499
Tony Barbourfe3351b2015-07-28 10:17:20 -0600500 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500501}
502
Karl Schultz6addd812016-02-02 17:17:23 -0700503void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
504 VkPipelineObj &pipelineobj,
505 VkDescriptorSetObj &descriptorSet,
506 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500507 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700508 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
509 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500510 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700511 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
512 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500513 }
514
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800515 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700516 // Make sure depthWriteEnable is set so that Depth fail test will work
517 // correctly
518 // Make sure stencilTestEnable is set so that Stencil fail test will work
519 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600520 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800521 stencil.failOp = VK_STENCIL_OP_KEEP;
522 stencil.passOp = VK_STENCIL_OP_KEEP;
523 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
524 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600525
526 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
527 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600528 ds_ci.pNext = NULL;
529 ds_ci.depthTestEnable = VK_FALSE;
530 ds_ci.depthWriteEnable = VK_TRUE;
531 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
532 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600533 if (failMask & BsoFailDepthBounds) {
534 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600535 ds_ci.maxDepthBounds = 0.0f;
536 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600537 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600538 ds_ci.stencilTestEnable = VK_TRUE;
539 ds_ci.front = stencil;
540 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600541
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600542 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600543 pipelineobj.SetViewport(m_viewports);
544 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800545 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700546 VkResult err = pipelineobj.CreateVKPipeline(
547 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600548 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800549 commandBuffer->BindPipeline(pipelineobj);
550 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500551}
552
Ian Elliott2c1daf52016-05-12 09:41:46 -0600553class VkWsiEnabledLayerTest : public VkLayerTest {
554 public:
555protected:
556 VkWsiEnabledLayerTest() {
557 m_enableWSI = true;
558 }
559};
560
Mark Muellerdfe37552016-07-07 14:47:42 -0600561class VkBufferTest {
562public:
563 enum eTestEnFlags {
564 eDoubleDelete,
565 eInvalidDeviceOffset,
566 eInvalidMemoryOffset,
567 eBindNullBuffer,
568 eFreeInvalidHandle,
569 };
570
571 enum eTestConditions {
572 eOffsetAlignment = 1
573 };
574
575 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice,
576 eTestEnFlags aTestFlag,
577 VkBufferUsageFlags aBufferUsage = 0) {
578 if (eInvalidDeviceOffset != aTestFlag &&
579 eInvalidMemoryOffset != aTestFlag) {
580 return true;
581 }
582 VkDeviceSize offset_limit = 0;
583 if (eInvalidMemoryOffset == aTestFlag) {
584 VkBuffer vulkanBuffer;
585 VkBufferCreateInfo buffer_create_info = {};
586 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
587 buffer_create_info.size = 32;
588 buffer_create_info.usage = aBufferUsage;
589
590 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr,
591 &vulkanBuffer);
592 VkMemoryRequirements memory_reqs = {0};
593
594 vkGetBufferMemoryRequirements(aVulkanDevice->device(),
595 vulkanBuffer, &memory_reqs);
596 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
597 offset_limit = memory_reqs.alignment;
598 }
599 else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT |
600 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
601 offset_limit =
602 aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
603 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
604 offset_limit =
605 aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
606 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
607 offset_limit =
608 aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
609 }
610 if (eOffsetAlignment < offset_limit) {
611 return true;
612 }
613 return false;
614 }
615
616 // A constructor which performs validation tests within construction.
617 VkBufferTest(VkDeviceObj *aVulkanDevice,
618 VkBufferUsageFlags aBufferUsage,
619 eTestEnFlags aTestFlag)
620 : AllocateCurrent(false), BoundCurrent(false),
621 CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
622
623 if (eBindNullBuffer == aTestFlag) {
624 VulkanMemory = 0;
625 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
626 } else {
627 VkBufferCreateInfo buffer_create_info = {};
628 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
629 buffer_create_info.size = 32;
630 buffer_create_info.usage = aBufferUsage;
631
632 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr,
633 &VulkanBuffer);
634
635 CreateCurrent = true;
636
637 VkMemoryRequirements memory_requirements;
638 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer,
639 &memory_requirements);
640
641 VkMemoryAllocateInfo memory_allocate_info = {};
642 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
643 memory_allocate_info.allocationSize = memory_requirements.size;
644 bool pass = aVulkanDevice->phy().
645 set_memory_type(memory_requirements.memoryTypeBits,
646 &memory_allocate_info,
647 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
648 if (!pass) {
649 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
650 return;
651 }
652
653 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL,
654 &VulkanMemory);
655 AllocateCurrent = true;
656 // NB: 1 is intentionally an invalid offset value
657 const bool offset_en = eInvalidDeviceOffset == aTestFlag ||
658 eInvalidMemoryOffset == aTestFlag;
659 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory,
660 offset_en ? eOffsetAlignment : 0);
661 BoundCurrent = true;
662
663 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
664 }
665 }
666
667 ~VkBufferTest() {
668 if (CreateCurrent) {
669 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
670 }
671 if (AllocateCurrent) {
672 if (InvalidDeleteEn) {
673 union {
674 VkDeviceMemory device_memory;
675 unsigned long long index_access;
676 } bad_index;
677
678 bad_index.device_memory = VulkanMemory;
679 bad_index.index_access++;
680
681 vkFreeMemory(VulkanDevice,
682 bad_index.device_memory,
683 nullptr);
684 }
685 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
686 }
687 }
688
689 bool GetBufferCurrent() {
690 return AllocateCurrent && BoundCurrent && CreateCurrent;
691 }
692
693 const VkBuffer &GetBuffer() {
694 return VulkanBuffer;
695 }
696
697 void TestDoubleDestroy() {
698 // Destroy the buffer but leave the flag set, which will cause
699 // the buffer to be destroyed again in the destructor.
700 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
701 }
702
703protected:
704 bool AllocateCurrent;
705 bool BoundCurrent;
706 bool CreateCurrent;
707 bool InvalidDeleteEn;
708
709 VkBuffer VulkanBuffer;
710 VkDevice VulkanDevice;
711 VkDeviceMemory VulkanMemory;
712
713};
714
715class VkVerticesObj {
716public:
717 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount,
718 unsigned aBindingCount, unsigned aByteStride,
719 VkDeviceSize aVertexCount, const float *aVerticies)
720 : BoundCurrent(false),
721 AttributeCount(aAttributeCount),
722 BindingCount(aBindingCount),
723 BindId(BindIdGenerator),
724 PipelineVertexInputStateCreateInfo(),
725 VulkanMemoryBuffer(aVulkanDevice, 1,
726 static_cast<int>(aByteStride * aVertexCount),
727 reinterpret_cast<const void *>(aVerticies),
728 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
729 BindIdGenerator++; // NB: This can wrap w/misuse
730
731 VertexInputAttributeDescription =
732 new VkVertexInputAttributeDescription[AttributeCount];
733 VertexInputBindingDescription =
734 new VkVertexInputBindingDescription[BindingCount];
735
736 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions =
737 VertexInputAttributeDescription;
738 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount =
739 AttributeCount;
740 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions =
741 VertexInputBindingDescription;
742 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount =
743 BindingCount;
744 PipelineVertexInputStateCreateInfo.sType =
745 VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
746
747 unsigned i = 0;
748 do {
749 VertexInputAttributeDescription[i].binding = BindId;
750 VertexInputAttributeDescription[i].location = i;
751 VertexInputAttributeDescription[i].format =
752 VK_FORMAT_R32G32B32_SFLOAT;
753 VertexInputAttributeDescription[i].offset =
754 sizeof(float) * aByteStride;
755 i++;
756 } while (AttributeCount < i);
757
758 i = 0;
759 do {
760 VertexInputBindingDescription[i].binding = BindId;
761 VertexInputBindingDescription[i].stride = aByteStride;
762 VertexInputBindingDescription[i].inputRate =
763 VK_VERTEX_INPUT_RATE_VERTEX;
764 i++;
765 } while (BindingCount < i);
766 }
767
768 ~VkVerticesObj() {
769 if (VertexInputAttributeDescription) {
770 delete[] VertexInputAttributeDescription;
771 }
772 if (VertexInputBindingDescription) {
773 delete[] VertexInputBindingDescription;
774 }
775 }
776
777 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
778 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription,
779 AttributeCount);
780 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription,
781 BindingCount);
782 return true;
783 }
784
785 void BindVertexBuffers(VkCommandBuffer aCommandBuffer,
786 unsigned aOffsetCount = 0,
787 VkDeviceSize *aOffsetList = nullptr) {
788 VkDeviceSize *offsetList;
789 unsigned offsetCount;
790
791 if (aOffsetCount) {
792 offsetList = aOffsetList;
793 offsetCount = aOffsetCount;
794 } else {
795 offsetList = new VkDeviceSize[1]();
796 offsetCount = 1;
797 }
798
799 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount,
800 &VulkanMemoryBuffer.handle(), offsetList);
801 BoundCurrent = true;
802
803 if (!aOffsetCount) {
804 delete [] offsetList;
805 }
806 }
807
808protected:
809 static uint32_t BindIdGenerator;
810
811 bool BoundCurrent;
812 unsigned AttributeCount;
813 unsigned BindingCount;
814 uint32_t BindId;
815
816 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
817 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
818 VkVertexInputBindingDescription *VertexInputBindingDescription;
819 VkConstantBufferObj VulkanMemoryBuffer;
820};
821
822uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500823// ********************************************************************************************************************
824// ********************************************************************************************************************
825// ********************************************************************************************************************
826// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600827#if PARAMETER_VALIDATION_TESTS
828TEST_F(VkLayerTest, RequiredParameter) {
829 TEST_DESCRIPTION("Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
830 "pointer, array, and array count parameters");
831
832 ASSERT_NO_FATAL_FAILURE(InitState());
833
834 m_errorMonitor->SetDesiredFailureMsg(
835 VK_DEBUG_REPORT_ERROR_BIT_EXT,
836 "required parameter pFeatures specified as NULL");
837 // Specify NULL for a pointer to a handle
838 // Expected to trigger an error with
839 // parameter_validation::validate_required_pointer
840 vkGetPhysicalDeviceFeatures(gpu(), NULL);
841 m_errorMonitor->VerifyFound();
842
843 m_errorMonitor->SetDesiredFailureMsg(
844 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600845 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600846 // Specify NULL for pointer to array count
847 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600848 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600849 m_errorMonitor->VerifyFound();
850
851 m_errorMonitor->SetDesiredFailureMsg(
852 VK_DEBUG_REPORT_ERROR_BIT_EXT,
853 "parameter viewportCount must be greater than 0");
854 // Specify 0 for a required array count
855 // Expected to trigger an error with parameter_validation::validate_array
856 VkViewport view_port = {};
857 m_commandBuffer->SetViewport(0, 0, &view_port);
858 m_errorMonitor->VerifyFound();
859
860 m_errorMonitor->SetDesiredFailureMsg(
861 VK_DEBUG_REPORT_ERROR_BIT_EXT,
862 "required parameter pViewports specified as NULL");
863 // Specify NULL for a required array
864 // Expected to trigger an error with parameter_validation::validate_array
865 m_commandBuffer->SetViewport(0, 1, NULL);
866 m_errorMonitor->VerifyFound();
867
868 m_errorMonitor->SetDesiredFailureMsg(
869 VK_DEBUG_REPORT_ERROR_BIT_EXT,
870 "required parameter memory specified as VK_NULL_HANDLE");
871 // Specify VK_NULL_HANDLE for a required handle
872 // Expected to trigger an error with
873 // parameter_validation::validate_required_handle
874 vkUnmapMemory(device(), VK_NULL_HANDLE);
875 m_errorMonitor->VerifyFound();
876
877 m_errorMonitor->SetDesiredFailureMsg(
878 VK_DEBUG_REPORT_ERROR_BIT_EXT,
879 "required parameter pFences[0] specified as VK_NULL_HANDLE");
880 // Specify VK_NULL_HANDLE for a required handle array entry
881 // Expected to trigger an error with
882 // parameter_validation::validate_required_handle_array
883 VkFence fence = VK_NULL_HANDLE;
884 vkResetFences(device(), 1, &fence);
885 m_errorMonitor->VerifyFound();
886
887 m_errorMonitor->SetDesiredFailureMsg(
888 VK_DEBUG_REPORT_ERROR_BIT_EXT,
889 "required parameter pAllocateInfo specified as NULL");
890 // Specify NULL for a required struct pointer
891 // Expected to trigger an error with
892 // parameter_validation::validate_struct_type
893 VkDeviceMemory memory = VK_NULL_HANDLE;
894 vkAllocateMemory(device(), NULL, NULL, &memory);
895 m_errorMonitor->VerifyFound();
896
897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
898 "value of faceMask must not be 0");
899 // Specify 0 for a required VkFlags parameter
900 // Expected to trigger an error with parameter_validation::validate_flags
901 m_commandBuffer->SetStencilReference(0, 0);
902 m_errorMonitor->VerifyFound();
903
904 m_errorMonitor->SetDesiredFailureMsg(
905 VK_DEBUG_REPORT_ERROR_BIT_EXT,
906 "value of pSubmits[i].pWaitDstStageMask[0] must not be 0");
907 // Specify 0 for a required VkFlags array entry
908 // Expected to trigger an error with
909 // parameter_validation::validate_flags_array
910 VkSemaphore semaphore = VK_NULL_HANDLE;
911 VkPipelineStageFlags stageFlags = 0;
912 VkSubmitInfo submitInfo = {};
913 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
914 submitInfo.waitSemaphoreCount = 1;
915 submitInfo.pWaitSemaphores = &semaphore;
916 submitInfo.pWaitDstStageMask = &stageFlags;
917 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
918 m_errorMonitor->VerifyFound();
919}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600920
Dustin Gravesfce74c02016-05-10 11:42:58 -0600921TEST_F(VkLayerTest, ReservedParameter) {
922 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
923
924 ASSERT_NO_FATAL_FAILURE(InitState());
925
926 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
927 " must be 0");
928 // Specify 0 for a reserved VkFlags parameter
929 // Expected to trigger an error with
930 // parameter_validation::validate_reserved_flags
931 VkEvent event_handle = VK_NULL_HANDLE;
932 VkEventCreateInfo event_info = {};
933 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
934 event_info.flags = 1;
935 vkCreateEvent(device(), &event_info, NULL, &event_handle);
936 m_errorMonitor->VerifyFound();
937}
938
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600939TEST_F(VkLayerTest, InvalidStructSType) {
940 TEST_DESCRIPTION("Specify an invalid VkStructureType for a Vulkan "
941 "structure's sType field");
942
943 ASSERT_NO_FATAL_FAILURE(InitState());
944
945 m_errorMonitor->SetDesiredFailureMsg(
946 VK_DEBUG_REPORT_ERROR_BIT_EXT,
947 "parameter pAllocateInfo->sType must be");
948 // Zero struct memory, effectively setting sType to
949 // VK_STRUCTURE_TYPE_APPLICATION_INFO
950 // Expected to trigger an error with
951 // parameter_validation::validate_struct_type
952 VkMemoryAllocateInfo alloc_info = {};
953 VkDeviceMemory memory = VK_NULL_HANDLE;
954 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
955 m_errorMonitor->VerifyFound();
956
957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
958 "parameter pSubmits[0].sType must be");
959 // Zero struct memory, effectively setting sType to
960 // VK_STRUCTURE_TYPE_APPLICATION_INFO
961 // Expected to trigger an error with
962 // parameter_validation::validate_struct_type_array
963 VkSubmitInfo submit_info = {};
964 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
965 m_errorMonitor->VerifyFound();
966}
967
968TEST_F(VkLayerTest, InvalidStructPNext) {
969 TEST_DESCRIPTION(
970 "Specify an invalid value for a Vulkan structure's pNext field");
971
972 ASSERT_NO_FATAL_FAILURE(InitState());
973
974 m_errorMonitor->SetDesiredFailureMsg(
Dustin Gravesaf5c0292016-07-19 13:43:53 -0600975 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz38b50992016-07-11 16:09:09 -0600976 "value of pCreateInfo->pNext must be NULL");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600977 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be
Karl Schultz38b50992016-07-11 16:09:09 -0600978 // NULL.
979 // Need to pick a function that has no allowed pNext structure types.
980 // Expected to trigger an error with
981 // parameter_validation::validate_struct_pnext
982 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600983 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600984 // Zero-initialization will provide the correct sType
985 VkApplicationInfo app_info = {};
986 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
987 event_alloc_info.pNext = &app_info;
988 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
989 m_errorMonitor->VerifyFound();
990
991 m_errorMonitor->SetDesiredFailureMsg(
Dustin Gravesaf5c0292016-07-19 13:43:53 -0600992 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz38b50992016-07-11 16:09:09 -0600993 " chain includes a structure with unexpected VkStructureType ");
994 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
995 // a function that has allowed pNext structure types and specify
996 // a structure type that is not allowed.
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600997 // Expected to trigger an error with
998 // parameter_validation::validate_struct_pnext
999 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -06001000 VkMemoryAllocateInfo memory_alloc_info = {};
1001 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1002 memory_alloc_info.pNext = &app_info;
1003 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -06001004 m_errorMonitor->VerifyFound();
1005
Dustin Graves47b6cba2016-05-10 17:34:38 -06001006 m_errorMonitor->SetDesiredFailureMsg(
Dustin Gravesaf5c0292016-07-19 13:43:53 -06001007 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Dustin Graves47b6cba2016-05-10 17:34:38 -06001008 " chain includes a structure with unexpected VkStructureType ");
1009 // Set VkGraphicsPipelineCreateInfo::VkPipelineRasterizationStateCreateInfo::pNext to an invalid structure, when pNext is allowed to be a non-NULL value
1010 // Expected to trigger an error with
1011 // parameter_validation::validate_struct_pnext
1012 VkDescriptorPoolSize ds_type_count = {};
1013 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1014 ds_type_count.descriptorCount = 1;
1015
1016 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1017 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1018 ds_pool_ci.pNext = NULL;
1019 ds_pool_ci.maxSets = 1;
1020 ds_pool_ci.poolSizeCount = 1;
1021 ds_pool_ci.pPoolSizes = &ds_type_count;
1022
1023 VkDescriptorPool ds_pool;
1024 VkResult err =
1025 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
1026 ASSERT_VK_SUCCESS(err);
1027
1028 VkDescriptorSetLayoutBinding dsl_binding = {};
1029 dsl_binding.binding = 0;
1030 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1031 dsl_binding.descriptorCount = 1;
1032 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1033 dsl_binding.pImmutableSamplers = NULL;
1034
1035 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1036 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1037 ds_layout_ci.pNext = NULL;
1038 ds_layout_ci.bindingCount = 1;
1039 ds_layout_ci.pBindings = &dsl_binding;
1040
1041 VkDescriptorSetLayout ds_layout;
1042 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1043 &ds_layout);
1044 ASSERT_VK_SUCCESS(err);
1045
1046 VkDescriptorSet descriptorSet;
1047 VkDescriptorSetAllocateInfo ds_alloc_info = {};
1048 ds_alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1049 ds_alloc_info.descriptorSetCount = 1;
1050 ds_alloc_info.descriptorPool = ds_pool;
1051 ds_alloc_info.pSetLayouts = &ds_layout;
1052 err = vkAllocateDescriptorSets(m_device->device(), &ds_alloc_info,
1053 &descriptorSet);
1054 ASSERT_VK_SUCCESS(err);
1055
1056 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1057 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1058 pipeline_layout_ci.setLayoutCount = 1;
1059 pipeline_layout_ci.pSetLayouts = &ds_layout;
1060
1061 VkPipelineLayout pipeline_layout;
1062 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1063 &pipeline_layout);
1064 ASSERT_VK_SUCCESS(err);
1065
1066 VkViewport vp = {}; // Just need dummy vp to point to
1067 VkRect2D sc = {}; // dummy scissor to point to
1068
1069 VkPipelineViewportStateCreateInfo vp_state_ci = {};
1070 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
1071 vp_state_ci.scissorCount = 1;
1072 vp_state_ci.pScissors = &sc;
1073 vp_state_ci.viewportCount = 1;
1074 vp_state_ci.pViewports = &vp;
1075
1076 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
1077 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1078 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
1079 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
1080 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
1081 rs_state_ci.depthClampEnable = VK_FALSE;
1082 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
1083 rs_state_ci.depthBiasEnable = VK_FALSE;
1084
1085 VkGraphicsPipelineCreateInfo gp_ci = {};
1086 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
1087 gp_ci.pViewportState = &vp_state_ci;
1088 gp_ci.pRasterizationState = &rs_state_ci;
1089 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
1090 gp_ci.layout = pipeline_layout;
1091 gp_ci.renderPass = renderPass();
1092
1093 VkPipelineCacheCreateInfo pc_ci = {};
1094 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
1095 pc_ci.initialDataSize = 0;
1096 pc_ci.pInitialData = 0;
1097
1098 VkPipeline pipeline;
1099 VkPipelineCache pipelineCache;
1100
1101 err =
1102 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
1103 ASSERT_VK_SUCCESS(err);
1104
1105 // Set VkPipelineRasterizationStateCreateInfo::pNext to an invalid value
1106 VkApplicationInfo invalid_pnext_struct = {};
1107 rs_state_ci.pNext = &invalid_pnext_struct;
1108
1109 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
1110 &gp_ci, NULL, &pipeline);
1111 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06001112 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
1113 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1114 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1115 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1116
Dustin Gravesfd1c8fe2016-07-15 11:40:20 -06001117 // Positive test to check parameter_validation and unique_objects support
1118 // for NV_dedicated_allocation
1119 uint32_t extension_count = 0;
1120 bool supports_nv_dedicated_allocation = false;
1121 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count,
1122 nullptr);
1123 ASSERT_VK_SUCCESS(err);
1124
1125 if (extension_count > 0) {
1126 std::vector<VkExtensionProperties> available_extensions(
1127 extension_count);
1128
1129 err = vkEnumerateDeviceExtensionProperties(
1130 gpu(), nullptr, &extension_count, &available_extensions[0]);
1131 ASSERT_VK_SUCCESS(err);
1132
1133 for (const auto &extension_props : available_extensions) {
1134 if (strcmp(extension_props.extensionName,
1135 VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
1136 supports_nv_dedicated_allocation = true;
1137 }
1138 }
1139 }
1140
1141 if (supports_nv_dedicated_allocation) {
1142 m_errorMonitor->ExpectSuccess();
1143
1144 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info =
1145 {};
1146 dedicated_buffer_create_info.sType =
1147 VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
1148 dedicated_buffer_create_info.pNext = nullptr;
1149 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
1150
1151 uint32_t queue_family_index = 0;
1152 VkBufferCreateInfo buffer_create_info = {};
1153 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1154 buffer_create_info.pNext = &dedicated_buffer_create_info;
1155 buffer_create_info.size = 1024;
1156 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1157 buffer_create_info.queueFamilyIndexCount = 1;
1158 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1159
1160 VkBuffer buffer;
1161 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info,
1162 NULL, &buffer);
1163 ASSERT_VK_SUCCESS(err);
1164
1165 VkMemoryRequirements memory_reqs;
1166 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1167
1168 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
1169 dedicated_memory_info.sType =
1170 VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
1171 dedicated_memory_info.pNext = nullptr;
1172 dedicated_memory_info.buffer = buffer;
1173 dedicated_memory_info.image = VK_NULL_HANDLE;
1174
1175 VkMemoryAllocateInfo memory_info = {};
1176 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1177 memory_info.pNext = &dedicated_memory_info;
1178 memory_info.allocationSize = memory_reqs.size;
1179
1180 bool pass;
1181 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1182 &memory_info, 0);
1183 ASSERT_TRUE(pass);
1184
1185 VkDeviceMemory buffer_memory;
1186 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1187 &buffer_memory);
1188 ASSERT_VK_SUCCESS(err);
1189
1190 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1191 ASSERT_VK_SUCCESS(err);
1192
1193 vkDestroyBuffer(m_device->device(), buffer, NULL);
1194 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1195
1196 m_errorMonitor->VerifyNotFound();
1197 }
Dustin Gravesc99cf5a2016-05-09 14:40:29 -06001198}
Dustin Graves5d33d532016-05-09 16:21:12 -06001199
1200TEST_F(VkLayerTest, UnrecognizedValue) {
1201 TEST_DESCRIPTION(
1202 "Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
1203
1204 ASSERT_NO_FATAL_FAILURE(InitState());
1205
1206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1207 "does not fall within the begin..end "
1208 "range of the core VkFormat "
1209 "enumeration tokens");
1210 // Specify an invalid VkFormat value
1211 // Expected to trigger an error with
1212 // parameter_validation::validate_ranged_enum
1213 VkFormatProperties format_properties;
1214 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000),
1215 &format_properties);
1216 m_errorMonitor->VerifyFound();
1217
1218 m_errorMonitor->SetDesiredFailureMsg(
1219 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1220 "contains flag bits that are not recognized members of");
1221 // Specify an invalid VkFlags bitmask value
1222 // Expected to trigger an error with parameter_validation::validate_flags
1223 VkImageFormatProperties image_format_properties;
1224 vkGetPhysicalDeviceImageFormatProperties(
1225 gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D,
1226 VK_IMAGE_TILING_OPTIMAL, static_cast<VkImageUsageFlags>(1 << 25), 0,
1227 &image_format_properties);
1228 m_errorMonitor->VerifyFound();
1229
1230 m_errorMonitor->SetDesiredFailureMsg(
1231 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1232 "contains flag bits that are not recognized members of");
1233 // Specify an invalid VkFlags array entry
1234 // Expected to trigger an error with
1235 // parameter_validation::validate_flags_array
1236 VkSemaphore semaphore = VK_NULL_HANDLE;
1237 VkPipelineStageFlags stage_flags =
1238 static_cast<VkPipelineStageFlags>(1 << 25);
1239 VkSubmitInfo submit_info = {};
1240 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1241 submit_info.waitSemaphoreCount = 1;
1242 submit_info.pWaitSemaphores = &semaphore;
1243 submit_info.pWaitDstStageMask = &stage_flags;
1244 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1245 m_errorMonitor->VerifyFound();
1246
1247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1248 "is neither VK_TRUE nor VK_FALSE");
1249 // Specify an invalid VkBool32 value
1250 // Expected to trigger a warning with
1251 // parameter_validation::validate_bool32
1252 VkSampler sampler = VK_NULL_HANDLE;
1253 VkSamplerCreateInfo sampler_info = {};
1254 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1255 sampler_info.pNext = NULL;
1256 sampler_info.magFilter = VK_FILTER_NEAREST;
1257 sampler_info.minFilter = VK_FILTER_NEAREST;
1258 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1259 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1260 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1261 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1262 sampler_info.mipLodBias = 1.0;
1263 sampler_info.maxAnisotropy = 1;
1264 sampler_info.compareEnable = VK_FALSE;
1265 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1266 sampler_info.minLod = 1.0;
1267 sampler_info.maxLod = 1.0;
1268 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1269 sampler_info.unnormalizedCoordinates = VK_FALSE;
1270 // Not VK_TRUE or VK_FALSE
1271 sampler_info.anisotropyEnable = 3;
1272 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1273 m_errorMonitor->VerifyFound();
1274}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001275
1276TEST_F(VkLayerTest, FailedReturnValue) {
1277 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1278
1279 ASSERT_NO_FATAL_FAILURE(InitState());
1280
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001281 // Find an unsupported image format
1282 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1283 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1284 VkFormat format = static_cast<VkFormat>(f);
1285 VkFormatProperties fProps = m_device->format_properties(format);
1286 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
1287 fProps.optimalTilingFeatures == 0) {
1288 unsupported = format;
1289 break;
1290 }
1291 }
1292
1293 if (unsupported != VK_FORMAT_UNDEFINED) {
1294 m_errorMonitor->SetDesiredFailureMsg(
1295 VK_DEBUG_REPORT_WARNING_BIT_EXT,
1296 "the requested format is not supported on this device");
1297 // Specify an unsupported VkFormat value to generate a
1298 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1299 // Expected to trigger a warning from
1300 // parameter_validation::validate_result
1301 VkImageFormatProperties image_format_properties;
1302 VkResult err = vkGetPhysicalDeviceImageFormatProperties(
1303 gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1304 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
1305 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1306 m_errorMonitor->VerifyFound();
1307 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001308}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001309
1310TEST_F(VkLayerTest, UpdateBufferAlignment) {
1311 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
1312 uint32_t updateData[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
1313
1314 ASSERT_NO_FATAL_FAILURE(InitState());
1315
1316 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1317 vk_testing::Buffer buffer;
1318 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1319
1320 BeginCommandBuffer();
1321 // Introduce failure by using dstOffset that is not multiple of 4
1322 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1323 " is not a multiple of 4");
1324 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1325 m_errorMonitor->VerifyFound();
1326
1327 // Introduce failure by using dataSize that is not multiple of 4
1328 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1329 " is not a multiple of 4");
1330 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1331 m_errorMonitor->VerifyFound();
1332
1333 // Introduce failure by using dataSize that is < 0
1334 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1335 "must be greater than zero and less than or equal to 65536");
1336 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1337 m_errorMonitor->VerifyFound();
1338
1339 // Introduce failure by using dataSize that is > 65536
1340 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1341 "must be greater than zero and less than or equal to 65536");
1342 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1343 m_errorMonitor->VerifyFound();
1344
1345 EndCommandBuffer();
1346}
1347
1348TEST_F(VkLayerTest, FillBufferAlignment) {
1349 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1350
1351 ASSERT_NO_FATAL_FAILURE(InitState());
1352
1353 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1354 vk_testing::Buffer buffer;
1355 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1356
1357 BeginCommandBuffer();
1358
1359 // Introduce failure by using dstOffset that is not multiple of 4
1360 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1361 " is not a multiple of 4");
1362 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1363 m_errorMonitor->VerifyFound();
1364
1365 // Introduce failure by using size that is not multiple of 4
1366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1367 " is not a multiple of 4");
1368 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1369 m_errorMonitor->VerifyFound();
1370
1371 // Introduce failure by using size that is zero
1372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1373 "must be greater than zero");
1374 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1375 m_errorMonitor->VerifyFound();
1376
1377 EndCommandBuffer();
1378}
Dustin Graves40f35822016-06-23 11:12:53 -06001379
1380// This is a positive test. No failures are expected.
1381TEST_F(VkLayerTest, IgnoreUnrelatedDescriptor) {
1382 TEST_DESCRIPTION("Ensure that the vkUpdateDescriptorSet validation code "
1383 "is ignoring VkWriteDescriptorSet members that are not "
1384 "related to the descriptor type specified by "
1385 "VkWriteDescriptorSet::descriptorType. Correct "
1386 "validation behavior will result in the test running to "
1387 "completion without validation errors.");
1388
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001389 const uintptr_t invalid_ptr = 0xcdcdcdcd;
1390
Dustin Graves40f35822016-06-23 11:12:53 -06001391 ASSERT_NO_FATAL_FAILURE(InitState());
1392
1393 // Image Case
1394 {
1395 m_errorMonitor->ExpectSuccess();
1396
1397 VkImage image;
1398 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1399 const int32_t tex_width = 32;
1400 const int32_t tex_height = 32;
1401 VkImageCreateInfo image_create_info = {};
1402 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1403 image_create_info.pNext = NULL;
1404 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1405 image_create_info.format = tex_format;
1406 image_create_info.extent.width = tex_width;
1407 image_create_info.extent.height = tex_height;
1408 image_create_info.extent.depth = 1;
1409 image_create_info.mipLevels = 1;
1410 image_create_info.arrayLayers = 1;
1411 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis51cde412016-07-11 16:08:30 -06001412 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Dustin Graves40f35822016-06-23 11:12:53 -06001413 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1414 image_create_info.flags = 0;
1415 VkResult err =
1416 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1417 ASSERT_VK_SUCCESS(err);
1418
1419 VkMemoryRequirements memory_reqs;
1420 VkDeviceMemory image_memory;
1421 bool pass;
1422 VkMemoryAllocateInfo memory_info = {};
1423 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1424 memory_info.pNext = NULL;
1425 memory_info.allocationSize = 0;
1426 memory_info.memoryTypeIndex = 0;
1427 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
1428 memory_info.allocationSize = memory_reqs.size;
1429 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1430 &memory_info, 0);
1431 ASSERT_TRUE(pass);
1432 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1433 &image_memory);
1434 ASSERT_VK_SUCCESS(err);
1435 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
1436 ASSERT_VK_SUCCESS(err);
1437
1438 VkImageViewCreateInfo image_view_create_info = {};
1439 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
1440 image_view_create_info.image = image;
1441 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
1442 image_view_create_info.format = tex_format;
1443 image_view_create_info.subresourceRange.layerCount = 1;
1444 image_view_create_info.subresourceRange.baseMipLevel = 0;
1445 image_view_create_info.subresourceRange.levelCount = 1;
1446 image_view_create_info.subresourceRange.aspectMask =
1447 VK_IMAGE_ASPECT_COLOR_BIT;
1448
1449 VkImageView view;
1450 err = vkCreateImageView(m_device->device(), &image_view_create_info,
1451 NULL, &view);
1452 ASSERT_VK_SUCCESS(err);
1453
1454 VkDescriptorPoolSize ds_type_count = {};
1455 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1456 ds_type_count.descriptorCount = 1;
1457
1458 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1459 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1460 ds_pool_ci.pNext = NULL;
1461 ds_pool_ci.maxSets = 1;
1462 ds_pool_ci.poolSizeCount = 1;
1463 ds_pool_ci.pPoolSizes = &ds_type_count;
1464
1465 VkDescriptorPool ds_pool;
1466 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL,
1467 &ds_pool);
1468 ASSERT_VK_SUCCESS(err);
1469
1470 VkDescriptorSetLayoutBinding dsl_binding = {};
1471 dsl_binding.binding = 0;
1472 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1473 dsl_binding.descriptorCount = 1;
1474 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1475 dsl_binding.pImmutableSamplers = NULL;
1476
1477 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1478 ds_layout_ci.sType =
1479 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1480 ds_layout_ci.pNext = NULL;
1481 ds_layout_ci.bindingCount = 1;
1482 ds_layout_ci.pBindings = &dsl_binding;
1483 VkDescriptorSetLayout ds_layout;
1484 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
1485 NULL, &ds_layout);
1486 ASSERT_VK_SUCCESS(err);
1487
1488 VkDescriptorSet descriptor_set;
1489 VkDescriptorSetAllocateInfo alloc_info = {};
1490 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1491 alloc_info.descriptorSetCount = 1;
1492 alloc_info.descriptorPool = ds_pool;
1493 alloc_info.pSetLayouts = &ds_layout;
1494 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1495 &descriptor_set);
1496 ASSERT_VK_SUCCESS(err);
1497
1498 VkDescriptorImageInfo image_info = {};
1499 image_info.imageView = view;
1500 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
1501
1502 VkWriteDescriptorSet descriptor_write;
1503 memset(&descriptor_write, 0, sizeof(descriptor_write));
1504 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1505 descriptor_write.dstSet = descriptor_set;
1506 descriptor_write.dstBinding = 0;
1507 descriptor_write.descriptorCount = 1;
1508 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1509 descriptor_write.pImageInfo = &image_info;
1510
1511 // Set pBufferInfo and pTexelBufferView to invalid values, which should
1512 // be
1513 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
1514 // This will most likely produce a crash if the parameter_validation
1515 // layer
1516 // does not correctly ignore pBufferInfo.
1517 descriptor_write.pBufferInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001518 reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001519 descriptor_write.pTexelBufferView =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001520 reinterpret_cast<const VkBufferView *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001521
1522 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
1523 NULL);
1524
1525 m_errorMonitor->VerifyNotFound();
1526
Dustin Graves40f35822016-06-23 11:12:53 -06001527 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1528 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1529 vkDestroyImageView(m_device->device(), view, NULL);
1530 vkDestroyImage(m_device->device(), image, NULL);
1531 vkFreeMemory(m_device->device(), image_memory, NULL);
1532 }
1533
1534 // Buffer Case
1535 {
1536 m_errorMonitor->ExpectSuccess();
1537
1538 VkBuffer buffer;
1539 uint32_t queue_family_index = 0;
1540 VkBufferCreateInfo buffer_create_info = {};
1541 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1542 buffer_create_info.size = 1024;
1543 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1544 buffer_create_info.queueFamilyIndexCount = 1;
1545 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1546
1547 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info,
1548 NULL, &buffer);
1549 ASSERT_VK_SUCCESS(err);
1550
1551 VkMemoryRequirements memory_reqs;
1552 VkDeviceMemory buffer_memory;
1553 bool pass;
1554 VkMemoryAllocateInfo memory_info = {};
1555 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1556 memory_info.pNext = NULL;
1557 memory_info.allocationSize = 0;
1558 memory_info.memoryTypeIndex = 0;
1559
1560 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1561 memory_info.allocationSize = memory_reqs.size;
1562 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1563 &memory_info, 0);
1564 ASSERT_TRUE(pass);
1565
1566 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1567 &buffer_memory);
1568 ASSERT_VK_SUCCESS(err);
1569 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1570 ASSERT_VK_SUCCESS(err);
1571
1572 VkDescriptorPoolSize ds_type_count = {};
1573 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1574 ds_type_count.descriptorCount = 1;
1575
1576 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1577 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1578 ds_pool_ci.pNext = NULL;
1579 ds_pool_ci.maxSets = 1;
1580 ds_pool_ci.poolSizeCount = 1;
1581 ds_pool_ci.pPoolSizes = &ds_type_count;
1582
1583 VkDescriptorPool ds_pool;
1584 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL,
1585 &ds_pool);
1586 ASSERT_VK_SUCCESS(err);
1587
1588 VkDescriptorSetLayoutBinding dsl_binding = {};
1589 dsl_binding.binding = 0;
1590 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1591 dsl_binding.descriptorCount = 1;
1592 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1593 dsl_binding.pImmutableSamplers = NULL;
1594
1595 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1596 ds_layout_ci.sType =
1597 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1598 ds_layout_ci.pNext = NULL;
1599 ds_layout_ci.bindingCount = 1;
1600 ds_layout_ci.pBindings = &dsl_binding;
1601 VkDescriptorSetLayout ds_layout;
1602 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
1603 NULL, &ds_layout);
1604 ASSERT_VK_SUCCESS(err);
1605
1606 VkDescriptorSet descriptor_set;
1607 VkDescriptorSetAllocateInfo alloc_info = {};
1608 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1609 alloc_info.descriptorSetCount = 1;
1610 alloc_info.descriptorPool = ds_pool;
1611 alloc_info.pSetLayouts = &ds_layout;
1612 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1613 &descriptor_set);
1614 ASSERT_VK_SUCCESS(err);
1615
1616 VkDescriptorBufferInfo buffer_info = {};
1617 buffer_info.buffer = buffer;
1618 buffer_info.offset = 0;
1619 buffer_info.range = 1024;
1620
1621 VkWriteDescriptorSet descriptor_write;
1622 memset(&descriptor_write, 0, sizeof(descriptor_write));
1623 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1624 descriptor_write.dstSet = descriptor_set;
1625 descriptor_write.dstBinding = 0;
1626 descriptor_write.descriptorCount = 1;
1627 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1628 descriptor_write.pBufferInfo = &buffer_info;
1629
1630 // Set pImageInfo and pTexelBufferView to invalid values, which should
1631 // be
1632 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
1633 // This will most likely produce a crash if the parameter_validation
1634 // layer
1635 // does not correctly ignore pImageInfo.
1636 descriptor_write.pImageInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001637 reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001638 descriptor_write.pTexelBufferView =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001639 reinterpret_cast<const VkBufferView *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001640
1641 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
1642 NULL);
1643
1644 m_errorMonitor->VerifyNotFound();
1645
1646 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
1647 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1648 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1649 vkDestroyBuffer(m_device->device(), buffer, NULL);
1650 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1651 }
1652
1653 // Texel Buffer Case
1654 {
1655 m_errorMonitor->ExpectSuccess();
1656
1657 VkBuffer buffer;
1658 uint32_t queue_family_index = 0;
1659 VkBufferCreateInfo buffer_create_info = {};
1660 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1661 buffer_create_info.size = 1024;
1662 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
1663 buffer_create_info.queueFamilyIndexCount = 1;
1664 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1665
1666 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info,
1667 NULL, &buffer);
1668 ASSERT_VK_SUCCESS(err);
1669
1670 VkMemoryRequirements memory_reqs;
1671 VkDeviceMemory buffer_memory;
1672 bool pass;
1673 VkMemoryAllocateInfo memory_info = {};
1674 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1675 memory_info.pNext = NULL;
1676 memory_info.allocationSize = 0;
1677 memory_info.memoryTypeIndex = 0;
1678
1679 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1680 memory_info.allocationSize = memory_reqs.size;
1681 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1682 &memory_info, 0);
1683 ASSERT_TRUE(pass);
1684
1685 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1686 &buffer_memory);
1687 ASSERT_VK_SUCCESS(err);
1688 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1689 ASSERT_VK_SUCCESS(err);
1690
1691 VkBufferViewCreateInfo buff_view_ci = {};
1692 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
1693 buff_view_ci.buffer = buffer;
1694 buff_view_ci.format = VK_FORMAT_R8_UNORM;
1695 buff_view_ci.range = VK_WHOLE_SIZE;
1696 VkBufferView buffer_view;
1697 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL,
1698 &buffer_view);
1699
1700 VkDescriptorPoolSize ds_type_count = {};
1701 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1702 ds_type_count.descriptorCount = 1;
1703
1704 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1705 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1706 ds_pool_ci.pNext = NULL;
1707 ds_pool_ci.maxSets = 1;
1708 ds_pool_ci.poolSizeCount = 1;
1709 ds_pool_ci.pPoolSizes = &ds_type_count;
1710
1711 VkDescriptorPool ds_pool;
1712 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL,
1713 &ds_pool);
1714 ASSERT_VK_SUCCESS(err);
1715
1716 VkDescriptorSetLayoutBinding dsl_binding = {};
1717 dsl_binding.binding = 0;
1718 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1719 dsl_binding.descriptorCount = 1;
1720 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1721 dsl_binding.pImmutableSamplers = NULL;
1722
1723 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1724 ds_layout_ci.sType =
1725 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1726 ds_layout_ci.pNext = NULL;
1727 ds_layout_ci.bindingCount = 1;
1728 ds_layout_ci.pBindings = &dsl_binding;
1729 VkDescriptorSetLayout ds_layout;
1730 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
1731 NULL, &ds_layout);
1732 ASSERT_VK_SUCCESS(err);
1733
1734 VkDescriptorSet descriptor_set;
1735 VkDescriptorSetAllocateInfo alloc_info = {};
1736 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1737 alloc_info.descriptorSetCount = 1;
1738 alloc_info.descriptorPool = ds_pool;
1739 alloc_info.pSetLayouts = &ds_layout;
1740 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1741 &descriptor_set);
1742 ASSERT_VK_SUCCESS(err);
1743
1744 VkWriteDescriptorSet descriptor_write;
1745 memset(&descriptor_write, 0, sizeof(descriptor_write));
1746 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1747 descriptor_write.dstSet = descriptor_set;
1748 descriptor_write.dstBinding = 0;
1749 descriptor_write.descriptorCount = 1;
1750 descriptor_write.descriptorType =
1751 VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1752 descriptor_write.pTexelBufferView = &buffer_view;
1753
1754 // Set pImageInfo and pBufferInfo to invalid values, which should be
1755 // ignored for descriptorType ==
1756 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
1757 // This will most likely produce a crash if the parameter_validation
1758 // layer
1759 // does not correctly ignore pImageInfo and pBufferInfo.
1760 descriptor_write.pImageInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001761 reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001762 descriptor_write.pBufferInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001763 reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001764
1765 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
1766 NULL);
1767
1768 m_errorMonitor->VerifyNotFound();
1769
1770 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
1771 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1772 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1773 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
1774 vkDestroyBuffer(m_device->device(), buffer, NULL);
1775 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1776 }
1777}
Dustin Gravesffa90fa2016-05-06 11:20:38 -06001778#endif // PARAMETER_VALIDATION_TESTS
1779
Tobin Ehlis0788f522015-05-26 16:11:58 -06001780#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001781#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001782TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001783{
1784 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001785 VkFenceCreateInfo fenceInfo = {};
1786 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1787 fenceInfo.pNext = NULL;
1788 fenceInfo.flags = 0;
1789
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001790 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001791
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001792 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001793
1794 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1795 vk_testing::Buffer buffer;
1796 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001797
Tony Barbourfe3351b2015-07-28 10:17:20 -06001798 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001799 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001800 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001801
1802 testFence.init(*m_device, fenceInfo);
1803
1804 // Bypass framework since it does the waits automatically
1805 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001806 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001807 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1808 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001809 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001810 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001811 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001812 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001813 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001814 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001815 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001816
1817 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001818 ASSERT_VK_SUCCESS( err );
1819
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001820 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001821 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001822
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001823 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001824}
1825
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001826TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001827{
1828 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001829 VkFenceCreateInfo fenceInfo = {};
1830 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1831 fenceInfo.pNext = NULL;
1832 fenceInfo.flags = 0;
1833
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001834 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001835
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001836 ASSERT_NO_FATAL_FAILURE(InitState());
1837 ASSERT_NO_FATAL_FAILURE(InitViewport());
1838 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1839
Tony Barbourfe3351b2015-07-28 10:17:20 -06001840 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001841 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001842 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001843
1844 testFence.init(*m_device, fenceInfo);
1845
1846 // Bypass framework since it does the waits automatically
1847 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001848 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001849 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1850 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001851 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001852 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001853 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001854 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001855 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001856 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001857 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001858
1859 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001860 ASSERT_VK_SUCCESS( err );
1861
Jon Ashburnf19916e2016-01-11 13:12:43 -07001862 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001863 VkCommandBufferBeginInfo info = {};
1864 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1865 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001866 info.renderPass = VK_NULL_HANDLE;
1867 info.subpass = 0;
1868 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001869 info.occlusionQueryEnable = VK_FALSE;
1870 info.queryFlags = 0;
1871 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001872
1873 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001874 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001875
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001876 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001877}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001878#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001879
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001880// This is a positive test. No failures are expected.
1881TEST_F(VkLayerTest, TestAliasedMemoryTracking) {
1882 VkResult err;
1883 bool pass;
1884
1885 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
1886 "the buffer, create an image, and bind the same memory to "
1887 "it");
1888
1889 m_errorMonitor->ExpectSuccess();
1890
1891 ASSERT_NO_FATAL_FAILURE(InitState());
1892
1893 VkBuffer buffer;
1894 VkImage image;
1895 VkDeviceMemory mem;
1896 VkMemoryRequirements mem_reqs;
1897
1898 VkBufferCreateInfo buf_info = {};
1899 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1900 buf_info.pNext = NULL;
1901 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1902 buf_info.size = 256;
1903 buf_info.queueFamilyIndexCount = 0;
1904 buf_info.pQueueFamilyIndices = NULL;
1905 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1906 buf_info.flags = 0;
1907 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1908 ASSERT_VK_SUCCESS(err);
1909
1910 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1911
1912 VkMemoryAllocateInfo alloc_info = {};
1913 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1914 alloc_info.pNext = NULL;
1915 alloc_info.memoryTypeIndex = 0;
1916
1917 // Ensure memory is big enough for both bindings
1918 alloc_info.allocationSize = 0x10000;
1919
1920 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
1921 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1922 if (!pass) {
1923 vkDestroyBuffer(m_device->device(), buffer, NULL);
1924 return;
1925 }
1926
1927 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1928 ASSERT_VK_SUCCESS(err);
1929
1930 uint8_t *pData;
1931 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
1932 (void **)&pData);
1933 ASSERT_VK_SUCCESS(err);
1934
Mark Lobodzinski2abefa92016-05-05 11:45:57 -06001935 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001936
1937 vkUnmapMemory(m_device->device(), mem);
1938
1939 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1940 ASSERT_VK_SUCCESS(err);
1941
1942 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
1943 // memory. In fact, it was never used by the GPU.
1944 // Just be be sure, wait for idle.
1945 vkDestroyBuffer(m_device->device(), buffer, NULL);
1946 vkDeviceWaitIdle(m_device->device());
1947
1948 VkImageCreateInfo image_create_info = {};
1949 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1950 image_create_info.pNext = NULL;
1951 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1952 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1953 image_create_info.extent.width = 64;
1954 image_create_info.extent.height = 64;
1955 image_create_info.extent.depth = 1;
1956 image_create_info.mipLevels = 1;
1957 image_create_info.arrayLayers = 1;
1958 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1959 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1960 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1961 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1962 image_create_info.queueFamilyIndexCount = 0;
1963 image_create_info.pQueueFamilyIndices = NULL;
1964 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1965 image_create_info.flags = 0;
1966
1967 VkMemoryAllocateInfo mem_alloc = {};
1968 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1969 mem_alloc.pNext = NULL;
1970 mem_alloc.allocationSize = 0;
1971 mem_alloc.memoryTypeIndex = 0;
1972
1973 /* Create a mappable image. It will be the texture if linear images are ok
1974 * to be textures or it will be the staging image if they are not.
1975 */
1976 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1977 ASSERT_VK_SUCCESS(err);
1978
1979 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
1980
1981 mem_alloc.allocationSize = mem_reqs.size;
1982
1983 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
1984 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1985 if (!pass) {
1986 vkDestroyImage(m_device->device(), image, NULL);
1987 return;
1988 }
1989
Tobin Ehlis077ded32016-05-12 17:39:13 -06001990 // VALIDATION FAILURE:
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001991 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1992 ASSERT_VK_SUCCESS(err);
1993
1994 m_errorMonitor->VerifyNotFound();
1995
Tony Barbourdf4c0042016-06-01 15:55:43 -06001996 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001997 vkDestroyBuffer(m_device->device(), buffer, NULL);
1998 vkDestroyImage(m_device->device(), image, NULL);
1999}
2000
Tobin Ehlisf11be982016-05-11 13:52:53 -06002001TEST_F(VkLayerTest, InvalidMemoryAliasing) {
2002 TEST_DESCRIPTION("Create a buffer and image, allocate memory, and bind the "
2003 "buffer and image to memory such that they will alias.");
2004 VkResult err;
2005 bool pass;
2006 ASSERT_NO_FATAL_FAILURE(InitState());
2007
Tobin Ehlis077ded32016-05-12 17:39:13 -06002008 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06002009 VkImage image;
2010 VkDeviceMemory mem; // buffer will be bound first
2011 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06002012 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Tobin Ehlisf11be982016-05-11 13:52:53 -06002013
2014 VkBufferCreateInfo buf_info = {};
2015 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2016 buf_info.pNext = NULL;
2017 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2018 buf_info.size = 256;
2019 buf_info.queueFamilyIndexCount = 0;
2020 buf_info.pQueueFamilyIndices = NULL;
2021 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2022 buf_info.flags = 0;
2023 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
2024 ASSERT_VK_SUCCESS(err);
2025
Tobin Ehlis077ded32016-05-12 17:39:13 -06002026 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002027
2028 VkImageCreateInfo image_create_info = {};
2029 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2030 image_create_info.pNext = NULL;
2031 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2032 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
2033 image_create_info.extent.width = 64;
2034 image_create_info.extent.height = 64;
2035 image_create_info.extent.depth = 1;
2036 image_create_info.mipLevels = 1;
2037 image_create_info.arrayLayers = 1;
2038 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2039 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2040 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
2041 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
2042 image_create_info.queueFamilyIndexCount = 0;
2043 image_create_info.pQueueFamilyIndices = NULL;
2044 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2045 image_create_info.flags = 0;
2046
Tobin Ehlisf11be982016-05-11 13:52:53 -06002047 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2048 ASSERT_VK_SUCCESS(err);
2049
Tobin Ehlis077ded32016-05-12 17:39:13 -06002050 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
2051
2052 VkMemoryAllocateInfo alloc_info = {};
2053 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2054 alloc_info.pNext = NULL;
2055 alloc_info.memoryTypeIndex = 0;
2056 // Ensure memory is big enough for both bindings
2057 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
2058 pass = m_device->phy().set_memory_type(
2059 buff_mem_reqs.memoryTypeBits | img_mem_reqs.memoryTypeBits, &alloc_info,
2060 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002061 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06002062 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002063 vkDestroyImage(m_device->device(), image, NULL);
2064 return;
2065 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06002066 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
2067 ASSERT_VK_SUCCESS(err);
2068 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
2069 ASSERT_VK_SUCCESS(err);
2070
Tobin Ehlisf11be982016-05-11 13:52:53 -06002071 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2072 " is aliased with buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06002073 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06002074 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2075 m_errorMonitor->VerifyFound();
2076
2077 // Now correctly bind image to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06002078 // aliasing buffer2
2079 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
2080 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002081 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
2082 ASSERT_VK_SUCCESS(err);
2083 err = vkBindImageMemory(m_device->device(), image, mem_img, 0);
2084 ASSERT_VK_SUCCESS(err);
2085 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2086 " is aliased with image 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06002087 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002088 m_errorMonitor->VerifyFound();
2089
2090 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06002091 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002092 vkDestroyImage(m_device->device(), image, NULL);
2093 vkFreeMemory(m_device->device(), mem, NULL);
2094 vkFreeMemory(m_device->device(), mem_img, NULL);
2095}
2096
Tobin Ehlis35372522016-05-12 08:32:31 -06002097TEST_F(VkLayerTest, InvalidMemoryMapping) {
2098 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
2099 VkResult err;
2100 bool pass;
2101 ASSERT_NO_FATAL_FAILURE(InitState());
2102
2103 VkBuffer buffer;
2104 VkDeviceMemory mem;
2105 VkMemoryRequirements mem_reqs;
2106
2107 VkBufferCreateInfo buf_info = {};
2108 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2109 buf_info.pNext = NULL;
2110 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2111 buf_info.size = 256;
2112 buf_info.queueFamilyIndexCount = 0;
2113 buf_info.pQueueFamilyIndices = NULL;
2114 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2115 buf_info.flags = 0;
2116 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
2117 ASSERT_VK_SUCCESS(err);
2118
2119 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
2120 VkMemoryAllocateInfo alloc_info = {};
2121 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2122 alloc_info.pNext = NULL;
2123 alloc_info.memoryTypeIndex = 0;
2124
2125 // Ensure memory is big enough for both bindings
2126 static const VkDeviceSize allocation_size = 0x10000;
2127 alloc_info.allocationSize = allocation_size;
2128 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
2129 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
2130 if (!pass) {
2131 vkDestroyBuffer(m_device->device(), buffer, NULL);
2132 return;
2133 }
2134 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
2135 ASSERT_VK_SUCCESS(err);
2136
2137 uint8_t *pData;
2138 // Attempt to map memory size 0 is invalid
2139 m_errorMonitor->SetDesiredFailureMsg(
2140 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2141 "VkMapMemory: Attempting to map memory range of size zero");
2142 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
2143 m_errorMonitor->VerifyFound();
2144 // Map memory twice
2145 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
2146 (void **)&pData);
2147 ASSERT_VK_SUCCESS(err);
2148 m_errorMonitor->SetDesiredFailureMsg(
2149 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2150 "VkMapMemory: Attempting to map memory on an already-mapped object ");
2151 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
2152 (void **)&pData);
2153 m_errorMonitor->VerifyFound();
2154
2155 // Unmap the memory to avoid re-map error
2156 vkUnmapMemory(m_device->device(), mem);
2157 // overstep allocation with VK_WHOLE_SIZE
2158 m_errorMonitor->SetDesiredFailureMsg(
2159 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2160 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
2161 err = vkMapMemory(m_device->device(), mem, allocation_size + 1,
2162 VK_WHOLE_SIZE, 0, (void **)&pData);
2163 m_errorMonitor->VerifyFound();
2164 // overstep allocation w/o VK_WHOLE_SIZE
2165 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2166 " oversteps total array size 0x");
2167 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0,
2168 (void **)&pData);
2169 m_errorMonitor->VerifyFound();
2170 // Now error due to unmapping memory that's not mapped
2171 m_errorMonitor->SetDesiredFailureMsg(
2172 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2173 "Unmapping Memory without memory being mapped: ");
2174 vkUnmapMemory(m_device->device(), mem);
2175 m_errorMonitor->VerifyFound();
2176 // Now map memory and cause errors due to flushing invalid ranges
2177 err = vkMapMemory(m_device->device(), mem, 16, VK_WHOLE_SIZE, 0,
2178 (void **)&pData);
2179 ASSERT_VK_SUCCESS(err);
2180 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12002181 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06002182 mmr.memory = mem;
2183 mmr.offset = 15; // Error b/c offset less than offset of mapped mem
2184 m_errorMonitor->SetDesiredFailureMsg(
2185 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2186 ") is less than Memory Object's offset (");
2187 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2188 m_errorMonitor->VerifyFound();
2189 // Now flush range that oversteps mapped range
2190 vkUnmapMemory(m_device->device(), mem);
2191 err = vkMapMemory(m_device->device(), mem, 0, 256, 0, (void **)&pData);
2192 ASSERT_VK_SUCCESS(err);
2193 mmr.offset = 16;
2194 mmr.size = 256; // flushing bounds (272) exceed mapped bounds (256)
2195 m_errorMonitor->SetDesiredFailureMsg(
2196 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2197 ") exceeds the Memory Object's upper-bound (");
2198 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2199 m_errorMonitor->VerifyFound();
2200
2201 pass =
2202 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
2203 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
2204 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
2205 if (!pass) {
2206 vkFreeMemory(m_device->device(), mem, NULL);
2207 vkDestroyBuffer(m_device->device(), buffer, NULL);
2208 return;
2209 }
2210 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
2211 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
2212
2213 vkDestroyBuffer(m_device->device(), buffer, NULL);
2214 vkFreeMemory(m_device->device(), mem, NULL);
2215}
2216
Ian Elliott1c32c772016-04-28 14:47:13 -06002217TEST_F(VkLayerTest, EnableWsiBeforeUse) {
2218 VkResult err;
2219 bool pass;
2220
Ian Elliott489eec02016-05-05 14:12:44 -06002221// FIXME: After we turn on this code for non-Linux platforms, uncomment the
2222// following declaration (which is temporarily being moved below):
2223// VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002224 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2225 VkSwapchainCreateInfoKHR swapchain_create_info = {};
2226 uint32_t swapchain_image_count = 0;
2227// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
2228 uint32_t image_index = 0;
2229// VkPresentInfoKHR present_info = {};
2230
2231 ASSERT_NO_FATAL_FAILURE(InitState());
2232
Ian Elliott3f06ce52016-04-29 14:46:21 -06002233#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
2234#if defined(VK_USE_PLATFORM_ANDROID_KHR)
2235 // Use the functions from the VK_KHR_android_surface extension without
2236 // enabling that extension:
2237
2238 // Create a surface:
2239 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002240 m_errorMonitor->SetDesiredFailureMsg(
2241 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2242 "extension was not enabled for this");
2243 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
2244 &surface);
2245 pass = (err != VK_SUCCESS);
2246 ASSERT_TRUE(pass);
2247 m_errorMonitor->VerifyFound();
2248#endif // VK_USE_PLATFORM_ANDROID_KHR
2249
2250
2251#if defined(VK_USE_PLATFORM_MIR_KHR)
2252 // Use the functions from the VK_KHR_mir_surface extension without enabling
2253 // that extension:
2254
2255 // Create a surface:
2256 VkMirSurfaceCreateInfoKHR mir_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002257 m_errorMonitor->SetDesiredFailureMsg(
2258 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2259 "extension was not enabled for this");
2260 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
2261 pass = (err != VK_SUCCESS);
2262 ASSERT_TRUE(pass);
2263 m_errorMonitor->VerifyFound();
2264
2265 // Tell whether an mir_connection supports presentation:
2266 MirConnection *mir_connection = NULL;
2267 m_errorMonitor->SetDesiredFailureMsg(
2268 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2269 "extension was not enabled for this");
2270 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
2271 visual_id);
2272 m_errorMonitor->VerifyFound();
2273#endif // VK_USE_PLATFORM_MIR_KHR
2274
2275
2276#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
2277 // Use the functions from the VK_KHR_wayland_surface extension without
2278 // enabling that extension:
2279
2280 // Create a surface:
2281 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002282 m_errorMonitor->SetDesiredFailureMsg(
2283 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2284 "extension was not enabled for this");
2285 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
2286 &surface);
2287 pass = (err != VK_SUCCESS);
2288 ASSERT_TRUE(pass);
2289 m_errorMonitor->VerifyFound();
2290
2291 // Tell whether an wayland_display supports presentation:
2292 struct wl_display wayland_display = {};
2293 m_errorMonitor->SetDesiredFailureMsg(
2294 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2295 "extension was not enabled for this");
2296 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
2297 &wayland_display);
2298 m_errorMonitor->VerifyFound();
2299#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -06002300#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06002301
2302
2303#if defined(VK_USE_PLATFORM_WIN32_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06002304// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2305// TO NON-LINUX PLATFORMS:
2306VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06002307 // Use the functions from the VK_KHR_win32_surface extension without
2308 // enabling that extension:
2309
2310 // Create a surface:
2311 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002312 m_errorMonitor->SetDesiredFailureMsg(
2313 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2314 "extension was not enabled for this");
2315 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
2316 &surface);
2317 pass = (err != VK_SUCCESS);
2318 ASSERT_TRUE(pass);
2319 m_errorMonitor->VerifyFound();
2320
2321 // Tell whether win32 supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06002322 m_errorMonitor->SetDesiredFailureMsg(
2323 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2324 "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06002325 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06002326 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002327// Set this (for now, until all platforms are supported and tested):
2328#define NEED_TO_TEST_THIS_ON_PLATFORM
2329#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06002330
2331
Ian Elliott1c32c772016-04-28 14:47:13 -06002332#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06002333// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2334// TO NON-LINUX PLATFORMS:
2335VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002336 // Use the functions from the VK_KHR_xcb_surface extension without enabling
2337 // that extension:
2338
2339 // Create a surface:
2340 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06002341 m_errorMonitor->SetDesiredFailureMsg(
2342 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2343 "extension was not enabled for this");
2344 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2345 pass = (err != VK_SUCCESS);
2346 ASSERT_TRUE(pass);
2347 m_errorMonitor->VerifyFound();
2348
2349 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06002350 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06002351 xcb_visualid_t visual_id = 0;
2352 m_errorMonitor->SetDesiredFailureMsg(
2353 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2354 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06002355 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -06002356 visual_id);
2357 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002358// Set this (for now, until all platforms are supported and tested):
2359#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002360#endif // VK_USE_PLATFORM_XCB_KHR
2361
2362
Ian Elliott12630812016-04-29 14:35:43 -06002363#if defined(VK_USE_PLATFORM_XLIB_KHR)
2364 // Use the functions from the VK_KHR_xlib_surface extension without enabling
2365 // that extension:
2366
2367 // Create a surface:
2368 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
Ian Elliott12630812016-04-29 14:35:43 -06002369 m_errorMonitor->SetDesiredFailureMsg(
2370 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2371 "extension was not enabled for this");
2372 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
2373 pass = (err != VK_SUCCESS);
2374 ASSERT_TRUE(pass);
2375 m_errorMonitor->VerifyFound();
2376
2377 // Tell whether an Xlib VisualID supports presentation:
2378 Display *dpy = NULL;
2379 VisualID visual = 0;
2380 m_errorMonitor->SetDesiredFailureMsg(
2381 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2382 "extension was not enabled for this");
2383 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
2384 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002385// Set this (for now, until all platforms are supported and tested):
2386#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06002387#endif // VK_USE_PLATFORM_XLIB_KHR
2388
2389
Ian Elliott1c32c772016-04-28 14:47:13 -06002390 // Use the functions from the VK_KHR_surface extension without enabling
2391 // that extension:
2392
Ian Elliott489eec02016-05-05 14:12:44 -06002393#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002394 // Destroy a surface:
2395 m_errorMonitor->SetDesiredFailureMsg(
2396 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2397 "extension was not enabled for this");
2398 vkDestroySurfaceKHR(instance(), surface, NULL);
2399 m_errorMonitor->VerifyFound();
2400
2401 // Check if surface supports presentation:
2402 VkBool32 supported = false;
2403 m_errorMonitor->SetDesiredFailureMsg(
2404 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2405 "extension was not enabled for this");
2406 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2407 pass = (err != VK_SUCCESS);
2408 ASSERT_TRUE(pass);
2409 m_errorMonitor->VerifyFound();
2410
2411 // Check surface capabilities:
2412 VkSurfaceCapabilitiesKHR capabilities = {};
2413 m_errorMonitor->SetDesiredFailureMsg(
2414 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2415 "extension was not enabled for this");
2416 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
2417 &capabilities);
2418 pass = (err != VK_SUCCESS);
2419 ASSERT_TRUE(pass);
2420 m_errorMonitor->VerifyFound();
2421
2422 // Check surface formats:
2423 uint32_t format_count = 0;
2424 VkSurfaceFormatKHR *formats = NULL;
2425 m_errorMonitor->SetDesiredFailureMsg(
2426 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2427 "extension was not enabled for this");
2428 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
2429 &format_count, formats);
2430 pass = (err != VK_SUCCESS);
2431 ASSERT_TRUE(pass);
2432 m_errorMonitor->VerifyFound();
2433
2434 // Check surface present modes:
2435 uint32_t present_mode_count = 0;
2436 VkSurfaceFormatKHR *present_modes = NULL;
2437 m_errorMonitor->SetDesiredFailureMsg(
2438 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2439 "extension was not enabled for this");
2440 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
2441 &present_mode_count, present_modes);
2442 pass = (err != VK_SUCCESS);
2443 ASSERT_TRUE(pass);
2444 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002445#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002446
2447
2448 // Use the functions from the VK_KHR_swapchain extension without enabling
2449 // that extension:
2450
2451 // Create a swapchain:
2452 m_errorMonitor->SetDesiredFailureMsg(
2453 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2454 "extension was not enabled for this");
2455 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2456 swapchain_create_info.pNext = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06002457 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
2458 NULL, &swapchain);
2459 pass = (err != VK_SUCCESS);
2460 ASSERT_TRUE(pass);
2461 m_errorMonitor->VerifyFound();
2462
2463 // Get the images from the swapchain:
2464 m_errorMonitor->SetDesiredFailureMsg(
2465 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2466 "extension was not enabled for this");
2467 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
2468 &swapchain_image_count, NULL);
2469 pass = (err != VK_SUCCESS);
2470 ASSERT_TRUE(pass);
2471 m_errorMonitor->VerifyFound();
2472
2473 // Try to acquire an image:
2474 m_errorMonitor->SetDesiredFailureMsg(
2475 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2476 "extension was not enabled for this");
2477 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
2478 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
2479 pass = (err != VK_SUCCESS);
2480 ASSERT_TRUE(pass);
2481 m_errorMonitor->VerifyFound();
2482
2483 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002484 //
2485 // NOTE: Currently can't test this because a real swapchain is needed (as
2486 // opposed to the fake one we created) in order for the layer to lookup the
2487 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06002488
2489 // Destroy the swapchain:
2490 m_errorMonitor->SetDesiredFailureMsg(
2491 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2492 "extension was not enabled for this");
2493 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
2494 m_errorMonitor->VerifyFound();
2495}
2496
Ian Elliott2c1daf52016-05-12 09:41:46 -06002497TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
Ian Elliott2c1daf52016-05-12 09:41:46 -06002498
Dustin Graves6c6d8982016-05-17 10:09:21 -06002499#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott2c1daf52016-05-12 09:41:46 -06002500 VkSurfaceKHR surface = VK_NULL_HANDLE;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002501
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002502 VkResult err;
2503 bool pass;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002504 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2505 VkSwapchainCreateInfoKHR swapchain_create_info = {};
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002506 // uint32_t swapchain_image_count = 0;
2507 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
2508 // uint32_t image_index = 0;
2509 // VkPresentInfoKHR present_info = {};
Ian Elliott2c1daf52016-05-12 09:41:46 -06002510
2511 ASSERT_NO_FATAL_FAILURE(InitState());
2512
2513 // Use the create function from one of the VK_KHR_*_surface extension in
2514 // order to create a surface, testing all known errors in the process,
2515 // before successfully creating a surface:
2516 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002517 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2518 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002519 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
2520 pass = (err != VK_SUCCESS);
2521 ASSERT_TRUE(pass);
2522 m_errorMonitor->VerifyFound();
2523
2524 // Next, try to create a surface with the wrong
2525 // VkXcbSurfaceCreateInfoKHR::sType:
2526 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
2527 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002528 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2529 "called with the wrong value for");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002530 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2531 pass = (err != VK_SUCCESS);
2532 ASSERT_TRUE(pass);
2533 m_errorMonitor->VerifyFound();
2534
Ian Elliott2c1daf52016-05-12 09:41:46 -06002535 // Create a native window, and then correctly create a surface:
2536 xcb_connection_t *connection;
2537 xcb_screen_t *screen;
2538 xcb_window_t xcb_window;
2539 xcb_intern_atom_reply_t *atom_wm_delete_window;
2540
2541 const xcb_setup_t *setup;
2542 xcb_screen_iterator_t iter;
2543 int scr;
2544 uint32_t value_mask, value_list[32];
2545 int width = 1;
2546 int height = 1;
2547
2548 connection = xcb_connect(NULL, &scr);
2549 ASSERT_TRUE(connection != NULL);
2550 setup = xcb_get_setup(connection);
2551 iter = xcb_setup_roots_iterator(setup);
2552 while (scr-- > 0)
2553 xcb_screen_next(&iter);
2554 screen = iter.data;
2555
2556 xcb_window = xcb_generate_id(connection);
2557
2558 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
2559 value_list[0] = screen->black_pixel;
2560 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE |
2561 XCB_EVENT_MASK_STRUCTURE_NOTIFY;
2562
2563 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window,
2564 screen->root, 0, 0, width, height, 0,
2565 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual,
2566 value_mask, value_list);
2567
2568 /* Magic code that will send notification when window is destroyed */
2569 xcb_intern_atom_cookie_t cookie =
2570 xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
2571 xcb_intern_atom_reply_t *reply =
2572 xcb_intern_atom_reply(connection, cookie, 0);
2573
2574 xcb_intern_atom_cookie_t cookie2 =
2575 xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002576 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002577 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window,
2578 (*reply).atom, 4, 32, 1,
2579 &(*atom_wm_delete_window).atom);
2580 free(reply);
2581
2582 xcb_map_window(connection, xcb_window);
2583
2584 // Force the x/y coordinates to 100,100 results are identical in consecutive
2585 // runs
2586 const uint32_t coords[] = {100, 100};
2587 xcb_configure_window(connection, xcb_window,
2588 XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
2589
Ian Elliott2c1daf52016-05-12 09:41:46 -06002590 // Finally, try to correctly create a surface:
2591 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
2592 xcb_create_info.pNext = NULL;
2593 xcb_create_info.flags = 0;
2594 xcb_create_info.connection = connection;
2595 xcb_create_info.window = xcb_window;
2596 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2597 pass = (err == VK_SUCCESS);
2598 ASSERT_TRUE(pass);
2599
Ian Elliott2c1daf52016-05-12 09:41:46 -06002600 // Check if surface supports presentation:
2601
2602 // 1st, do so without having queried the queue families:
2603 VkBool32 supported = false;
2604 // TODO: Get the following error to come out:
2605 m_errorMonitor->SetDesiredFailureMsg(
2606 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2607 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
2608 "function");
2609 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2610 pass = (err != VK_SUCCESS);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002611 // ASSERT_TRUE(pass);
2612 // m_errorMonitor->VerifyFound();
Ian Elliott2c1daf52016-05-12 09:41:46 -06002613
2614 // Next, query a queue family index that's too large:
2615 m_errorMonitor->SetDesiredFailureMsg(
2616 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2617 "called with a queueFamilyIndex that is too large");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002618 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface,
2619 &supported);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002620 pass = (err != VK_SUCCESS);
2621 ASSERT_TRUE(pass);
2622 m_errorMonitor->VerifyFound();
2623
2624 // Finally, do so correctly:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002625 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2626 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002627 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2628 pass = (err == VK_SUCCESS);
2629 ASSERT_TRUE(pass);
2630
Ian Elliott2c1daf52016-05-12 09:41:46 -06002631 // Before proceeding, try to create a swapchain without having called
2632 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
2633 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2634 swapchain_create_info.pNext = NULL;
2635 swapchain_create_info.flags = 0;
2636 m_errorMonitor->SetDesiredFailureMsg(
2637 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2638 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002639 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2640 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002641 pass = (err != VK_SUCCESS);
2642 ASSERT_TRUE(pass);
2643 m_errorMonitor->VerifyFound();
2644
Ian Elliott2c1daf52016-05-12 09:41:46 -06002645 // Get the surface capabilities:
2646 VkSurfaceCapabilitiesKHR surface_capabilities;
2647
2648 // Do so correctly (only error logged by this entrypoint is if the
2649 // extension isn't enabled):
2650 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
2651 &surface_capabilities);
2652 pass = (err == VK_SUCCESS);
2653 ASSERT_TRUE(pass);
2654
Ian Elliott2c1daf52016-05-12 09:41:46 -06002655 // Get the surface formats:
2656 uint32_t surface_format_count;
2657
2658 // First, try without a pointer to surface_format_count:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002659 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2660 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002661 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
2662 pass = (err == VK_SUCCESS);
2663 ASSERT_TRUE(pass);
2664 m_errorMonitor->VerifyFound();
2665
2666 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
2667 // correctly done a 1st try (to get the count):
2668 m_errorMonitor->SetDesiredFailureMsg(
2669 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2670 "but no prior positive value has been seen for");
2671 surface_format_count = 0;
2672 vkGetPhysicalDeviceSurfaceFormatsKHR(
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002673 gpu(), surface, &surface_format_count,
2674 (VkSurfaceFormatKHR *)&surface_format_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002675 pass = (err == VK_SUCCESS);
2676 ASSERT_TRUE(pass);
2677 m_errorMonitor->VerifyFound();
2678
2679 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002680 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
2681 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002682 pass = (err == VK_SUCCESS);
2683 ASSERT_TRUE(pass);
2684
2685 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002686 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(
2687 surface_format_count * sizeof(VkSurfaceFormatKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002688
2689 // Next, do a 2nd try with surface_format_count being set too high:
2690 surface_format_count += 5;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002691 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2692 "that is greater than the value");
2693 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002694 surface_formats);
2695 pass = (err == VK_SUCCESS);
2696 ASSERT_TRUE(pass);
2697 m_errorMonitor->VerifyFound();
2698
2699 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002700 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
2701 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002702 pass = (err == VK_SUCCESS);
2703 ASSERT_TRUE(pass);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002704 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002705 surface_formats);
2706 pass = (err == VK_SUCCESS);
2707 ASSERT_TRUE(pass);
2708
Ian Elliott2c1daf52016-05-12 09:41:46 -06002709 // Get the surface present modes:
2710 uint32_t surface_present_mode_count;
2711
2712 // First, try without a pointer to surface_format_count:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002713 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2714 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002715 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
2716 pass = (err == VK_SUCCESS);
2717 ASSERT_TRUE(pass);
2718 m_errorMonitor->VerifyFound();
2719
2720 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
2721 // correctly done a 1st try (to get the count):
2722 m_errorMonitor->SetDesiredFailureMsg(
2723 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2724 "but no prior positive value has been seen for");
2725 surface_present_mode_count = 0;
2726 vkGetPhysicalDeviceSurfacePresentModesKHR(
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002727 gpu(), surface, &surface_present_mode_count,
2728 (VkPresentModeKHR *)&surface_present_mode_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002729 pass = (err == VK_SUCCESS);
2730 ASSERT_TRUE(pass);
2731 m_errorMonitor->VerifyFound();
2732
2733 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002734 vkGetPhysicalDeviceSurfacePresentModesKHR(
2735 gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002736 pass = (err == VK_SUCCESS);
2737 ASSERT_TRUE(pass);
2738
2739 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002740 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(
2741 surface_present_mode_count * sizeof(VkPresentModeKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002742
2743 // Next, do a 2nd try with surface_format_count being set too high:
2744 surface_present_mode_count += 5;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002745 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2746 "that is greater than the value");
2747 vkGetPhysicalDeviceSurfacePresentModesKHR(
2748 gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002749 pass = (err == VK_SUCCESS);
2750 ASSERT_TRUE(pass);
2751 m_errorMonitor->VerifyFound();
2752
2753 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002754 vkGetPhysicalDeviceSurfacePresentModesKHR(
2755 gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002756 pass = (err == VK_SUCCESS);
2757 ASSERT_TRUE(pass);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002758 vkGetPhysicalDeviceSurfacePresentModesKHR(
2759 gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002760 pass = (err == VK_SUCCESS);
2761 ASSERT_TRUE(pass);
2762
Ian Elliott2c1daf52016-05-12 09:41:46 -06002763 // Create a swapchain:
2764
2765 // First, try without a pointer to swapchain_create_info:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002766 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2767 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002768 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
2769 pass = (err != VK_SUCCESS);
2770 ASSERT_TRUE(pass);
2771 m_errorMonitor->VerifyFound();
2772
2773 // Next, call with a non-NULL swapchain_create_info, that has the wrong
2774 // sType:
2775 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002776 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2777 "called with the wrong value for");
2778 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2779 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002780 pass = (err != VK_SUCCESS);
2781 ASSERT_TRUE(pass);
2782 m_errorMonitor->VerifyFound();
2783
2784 // Next, call with a NULL swapchain pointer:
2785 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2786 swapchain_create_info.pNext = NULL;
2787 swapchain_create_info.flags = 0;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002788 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2789 "called with NULL pointer");
2790 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2791 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002792 pass = (err != VK_SUCCESS);
2793 ASSERT_TRUE(pass);
2794 m_errorMonitor->VerifyFound();
2795
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002796 // TODO: Enhance swapchain layer so that
2797 // swapchain_create_info.queueFamilyIndexCount is checked against something?
Ian Elliott2c1daf52016-05-12 09:41:46 -06002798
2799 // Next, call with a queue family index that's too large:
2800 uint32_t queueFamilyIndex[2] = {100000, 0};
2801 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2802 swapchain_create_info.queueFamilyIndexCount = 2;
2803 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
2804 m_errorMonitor->SetDesiredFailureMsg(
2805 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2806 "called with a queueFamilyIndex that is too large");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002807 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2808 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002809 pass = (err != VK_SUCCESS);
2810 ASSERT_TRUE(pass);
2811 m_errorMonitor->VerifyFound();
2812
2813 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
2814 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2815 swapchain_create_info.queueFamilyIndexCount = 1;
2816 m_errorMonitor->SetDesiredFailureMsg(
2817 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2818 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
2819 "pCreateInfo->pQueueFamilyIndices).");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002820 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2821 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002822 pass = (err != VK_SUCCESS);
2823 ASSERT_TRUE(pass);
2824 m_errorMonitor->VerifyFound();
2825
2826 // Next, call with an invalid imageSharingMode:
2827 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
2828 swapchain_create_info.queueFamilyIndexCount = 1;
2829 m_errorMonitor->SetDesiredFailureMsg(
2830 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2831 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002832 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2833 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002834 pass = (err != VK_SUCCESS);
2835 ASSERT_TRUE(pass);
2836 m_errorMonitor->VerifyFound();
2837 // Fix for the future:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002838 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2839 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002840 swapchain_create_info.queueFamilyIndexCount = 0;
2841 queueFamilyIndex[0] = 0;
2842 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
2843
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002844 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
Ian Elliott2c1daf52016-05-12 09:41:46 -06002845 // Get the images from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002846 // Acquire an image from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002847 // Present an image to a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002848 // Destroy the swapchain:
2849
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002850 // TODOs:
2851 //
2852 // - Try destroying the device without first destroying the swapchain
2853 //
2854 // - Try destroying the device without first destroying the surface
2855 //
2856 // - Try destroying the surface without first destroying the swapchain
Ian Elliott2c1daf52016-05-12 09:41:46 -06002857
2858 // Destroy the surface:
2859 vkDestroySurfaceKHR(instance(), surface, NULL);
2860
Ian Elliott2c1daf52016-05-12 09:41:46 -06002861 // Tear down the window:
2862 xcb_destroy_window(connection, xcb_window);
2863 xcb_disconnect(connection);
2864
2865#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002866 return;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002867#endif // VK_USE_PLATFORM_XCB_KHR
2868}
2869
Karl Schultz6addd812016-02-02 17:17:23 -07002870TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
2871 VkResult err;
2872 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002873
Karl Schultz6addd812016-02-02 17:17:23 -07002874 m_errorMonitor->SetDesiredFailureMsg(
2875 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002876 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
2877
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002878 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002879
2880 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002881 VkImage image;
2882 VkDeviceMemory mem;
2883 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002884
Karl Schultz6addd812016-02-02 17:17:23 -07002885 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2886 const int32_t tex_width = 32;
2887 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002888
Tony Barboureb254902015-07-15 12:50:33 -06002889 VkImageCreateInfo image_create_info = {};
2890 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002891 image_create_info.pNext = NULL;
2892 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2893 image_create_info.format = tex_format;
2894 image_create_info.extent.width = tex_width;
2895 image_create_info.extent.height = tex_height;
2896 image_create_info.extent.depth = 1;
2897 image_create_info.mipLevels = 1;
2898 image_create_info.arrayLayers = 1;
2899 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2900 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2901 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2902 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002903
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002904 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002905 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002906 mem_alloc.pNext = NULL;
2907 mem_alloc.allocationSize = 0;
2908 // Introduce failure, do NOT set memProps to
2909 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
2910 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002911
Chia-I Wuf7458c52015-10-26 21:10:41 +08002912 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002913 ASSERT_VK_SUCCESS(err);
2914
Karl Schultz6addd812016-02-02 17:17:23 -07002915 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002916
Mark Lobodzinski23065352015-05-29 09:32:35 -05002917 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002918
Karl Schultz6addd812016-02-02 17:17:23 -07002919 pass =
2920 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
2921 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
2922 if (!pass) { // If we can't find any unmappable memory this test doesn't
2923 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002924 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002925 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002926 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002927
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002928 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002929 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002930 ASSERT_VK_SUCCESS(err);
2931
2932 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002933 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002934 ASSERT_VK_SUCCESS(err);
2935
2936 // Map memory as if to initialize the image
2937 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07002938 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
2939 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002940
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002941 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002942
Chia-I Wuf7458c52015-10-26 21:10:41 +08002943 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002944 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002945}
2946
Karl Schultz6addd812016-02-02 17:17:23 -07002947TEST_F(VkLayerTest, RebindMemory) {
2948 VkResult err;
2949 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002950
Karl Schultz6addd812016-02-02 17:17:23 -07002951 m_errorMonitor->SetDesiredFailureMsg(
2952 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002953 "which has already been bound to mem object");
2954
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002955 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002956
2957 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002958 VkImage image;
2959 VkDeviceMemory mem1;
2960 VkDeviceMemory mem2;
2961 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002962
Karl Schultz6addd812016-02-02 17:17:23 -07002963 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2964 const int32_t tex_width = 32;
2965 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002966
Tony Barboureb254902015-07-15 12:50:33 -06002967 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002968 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2969 image_create_info.pNext = NULL;
2970 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2971 image_create_info.format = tex_format;
2972 image_create_info.extent.width = tex_width;
2973 image_create_info.extent.height = tex_height;
2974 image_create_info.extent.depth = 1;
2975 image_create_info.mipLevels = 1;
2976 image_create_info.arrayLayers = 1;
2977 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2978 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2979 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2980 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002981
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002982 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002983 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2984 mem_alloc.pNext = NULL;
2985 mem_alloc.allocationSize = 0;
2986 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002987
Karl Schultz6addd812016-02-02 17:17:23 -07002988 // Introduce failure, do NOT set memProps to
2989 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002990 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002991 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002992 ASSERT_VK_SUCCESS(err);
2993
Karl Schultz6addd812016-02-02 17:17:23 -07002994 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002995
2996 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002997 pass =
2998 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002999 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003000
3001 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003002 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003003 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003004 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003005 ASSERT_VK_SUCCESS(err);
3006
3007 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06003008 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003009 ASSERT_VK_SUCCESS(err);
3010
Karl Schultz6addd812016-02-02 17:17:23 -07003011 // Introduce validation failure, try to bind a different memory object to
3012 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06003013 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003014
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003015 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003016
Chia-I Wuf7458c52015-10-26 21:10:41 +08003017 vkDestroyImage(m_device->device(), image, NULL);
3018 vkFreeMemory(m_device->device(), mem1, NULL);
3019 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05003020}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05003021
Karl Schultz6addd812016-02-02 17:17:23 -07003022TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06003023 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003024
Karl Schultz6addd812016-02-02 17:17:23 -07003025 m_errorMonitor->SetDesiredFailureMsg(
3026 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
3027 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06003028
3029 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06003030 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3031 fenceInfo.pNext = NULL;
3032 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06003033
Tony Barbour300a6082015-04-07 13:44:53 -06003034 ASSERT_NO_FATAL_FAILURE(InitState());
3035 ASSERT_NO_FATAL_FAILURE(InitViewport());
3036 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3037
Tony Barbourfe3351b2015-07-28 10:17:20 -06003038 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003039 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
3040 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06003041 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06003042
3043 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06003044
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003045 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08003046 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3047 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003048 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003049 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07003050 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08003051 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003052 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08003053 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06003054 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06003055
3056 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07003057 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06003058
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003059 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06003060}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003061// This is a positive test. We used to expect error in this case but spec now
3062// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07003063TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003064 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06003065 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06003066 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06003067 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3068 fenceInfo.pNext = NULL;
3069
Tony Barbour0b4d9562015-04-09 10:48:04 -06003070 ASSERT_NO_FATAL_FAILURE(InitState());
3071 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08003072 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003073 VkResult result = vkResetFences(m_device->device(), 1, fences);
3074 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06003075
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06003076 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06003077}
Tobin Ehlis41376e12015-07-03 08:45:14 -06003078
Chris Forbese70b7d32016-06-15 15:49:12 +12003079#if 0
3080TEST_F(VkLayerTest, LongFenceChain)
3081{
3082 m_errorMonitor->ExpectSuccess();
3083
3084 ASSERT_NO_FATAL_FAILURE(InitState());
3085 VkResult err;
3086
3087 std::vector<VkFence> fences;
3088
3089 const int chainLength = 32768;
3090
3091 for (int i = 0; i < chainLength; i++) {
3092 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3093 VkFence fence;
3094 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
3095 ASSERT_VK_SUCCESS(err);
3096
3097 fences.push_back(fence);
3098
3099 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3100 0, nullptr, 0, nullptr };
3101 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
3102 ASSERT_VK_SUCCESS(err);
3103
3104 }
3105
3106 // BOOM, stack overflow.
3107 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
3108
3109 for (auto fence : fences)
3110 vkDestroyFence(m_device->device(), fence, nullptr);
3111
3112 m_errorMonitor->VerifyNotFound();
3113}
3114#endif
3115
Chris Forbes18127d12016-06-08 16:52:28 +12003116TEST_F(VkLayerTest, CommandBufferSimultaneousUseSync)
3117{
3118 m_errorMonitor->ExpectSuccess();
3119
3120 ASSERT_NO_FATAL_FAILURE(InitState());
3121 VkResult err;
3122
3123 // Record (empty!) command buffer that can be submitted multiple times
3124 // simultaneously.
3125 VkCommandBufferBeginInfo cbbi = {
3126 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
3127 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr
3128 };
3129 m_commandBuffer->BeginCommandBuffer(&cbbi);
3130 m_commandBuffer->EndCommandBuffer();
3131
3132 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3133 VkFence fence;
3134 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
3135 ASSERT_VK_SUCCESS(err);
3136
3137 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
3138 VkSemaphore s1, s2;
3139 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
3140 ASSERT_VK_SUCCESS(err);
3141 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
3142 ASSERT_VK_SUCCESS(err);
3143
3144 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
3145 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3146 1, &m_commandBuffer->handle(), 1, &s1 };
3147 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
3148 ASSERT_VK_SUCCESS(err);
3149
3150 // Submit CB again, signaling s2.
3151 si.pSignalSemaphores = &s2;
3152 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
3153 ASSERT_VK_SUCCESS(err);
3154
3155 // Wait for fence.
3156 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3157 ASSERT_VK_SUCCESS(err);
3158
3159 // CB is still in flight from second submission, but semaphore s1 is no
3160 // longer in flight. delete it.
3161 vkDestroySemaphore(m_device->device(), s1, nullptr);
3162
3163 m_errorMonitor->VerifyNotFound();
3164
3165 // Force device idle and clean up remaining objects
3166 vkDeviceWaitIdle(m_device->device());
3167 vkDestroySemaphore(m_device->device(), s2, nullptr);
3168 vkDestroyFence(m_device->device(), fence, nullptr);
3169}
3170
Chris Forbes4e44c912016-06-16 10:20:00 +12003171TEST_F(VkLayerTest, FenceCreateSignaledWaitHandling)
3172{
3173 m_errorMonitor->ExpectSuccess();
3174
3175 ASSERT_NO_FATAL_FAILURE(InitState());
3176 VkResult err;
3177
3178 // A fence created signaled
3179 VkFenceCreateInfo fci1 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT };
3180 VkFence f1;
3181 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
3182 ASSERT_VK_SUCCESS(err);
3183
3184 // A fence created not
3185 VkFenceCreateInfo fci2 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3186 VkFence f2;
3187 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
3188 ASSERT_VK_SUCCESS(err);
3189
3190 // Submit the unsignaled fence
3191 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3192 0, nullptr, 0, nullptr };
3193 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
3194
3195 // Wait on both fences, with signaled first.
3196 VkFence fences[] = { f1, f2 };
3197 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
3198
3199 // Should have both retired!
3200 vkDestroyFence(m_device->device(), f1, nullptr);
3201 vkDestroyFence(m_device->device(), f2, nullptr);
3202
3203 m_errorMonitor->VerifyNotFound();
3204}
3205
Tobin Ehlis41376e12015-07-03 08:45:14 -06003206TEST_F(VkLayerTest, InvalidUsageBits)
3207{
Tony Barbourf92621a2016-05-02 14:28:12 -06003208 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06003209 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06003210 "Initialize buffer with wrong usage then perform copy expecting errors "
3211 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003212 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003213 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06003214
3215 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06003216 VkImageObj image(m_device);
3217 // Initialize image with USAGE_INPUT_ATTACHMENT
Tobin Ehlis8b313c02016-05-25 15:01:52 -06003218 image.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06003219 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
3220 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06003221
Tony Barbourf92621a2016-05-02 14:28:12 -06003222 VkImageView dsv;
3223 VkImageViewCreateInfo dsvci = {};
3224 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3225 dsvci.image = image.handle();
3226 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3227 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
3228 dsvci.subresourceRange.layerCount = 1;
3229 dsvci.subresourceRange.baseMipLevel = 0;
3230 dsvci.subresourceRange.levelCount = 1;
3231 dsvci.subresourceRange.aspectMask =
3232 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06003233
Tony Barbourf92621a2016-05-02 14:28:12 -06003234 // Create a view with depth / stencil aspect for image with different usage
3235 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003236
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003237 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06003238
3239 // Initialize buffer with TRANSFER_DST usage
3240 vk_testing::Buffer buffer;
3241 VkMemoryPropertyFlags reqs = 0;
3242 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3243 VkBufferImageCopy region = {};
3244 region.bufferRowLength = 128;
3245 region.bufferImageHeight = 128;
3246 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3247 region.imageSubresource.layerCount = 1;
3248 region.imageExtent.height = 16;
3249 region.imageExtent.width = 16;
3250 region.imageExtent.depth = 1;
3251
3252 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3253 "Invalid usage flag for buffer ");
3254 // Buffer usage not set to TRANSFER_SRC and image usage not set to
3255 // TRANSFER_DST
3256 BeginCommandBuffer();
3257 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
3258 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
3259 1, &region);
3260 m_errorMonitor->VerifyFound();
3261
3262 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3263 "Invalid usage flag for image ");
3264 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
3265 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
3266 1, &region);
3267 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06003268}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003269#endif // MEM_TRACKER_TESTS
3270
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06003271#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003272
3273TEST_F(VkLayerTest, LeakAnObject) {
3274 VkResult err;
3275
3276 TEST_DESCRIPTION(
3277 "Create a fence and destroy its device without first destroying the fence.");
3278
3279 // Note that we have to create a new device since destroying the
3280 // framework's device causes Teardown() to fail and just calling Teardown
3281 // will destroy the errorMonitor.
3282
3283 m_errorMonitor->SetDesiredFailureMsg(
3284 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3285 "OBJ ERROR : VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT object");
3286
3287 ASSERT_NO_FATAL_FAILURE(InitState());
3288
3289 const std::vector<VkQueueFamilyProperties> queue_props =
3290 m_device->queue_props;
3291 std::vector<VkDeviceQueueCreateInfo> queue_info;
3292 queue_info.reserve(queue_props.size());
3293 std::vector<std::vector<float>> queue_priorities;
3294 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
3295 VkDeviceQueueCreateInfo qi = {};
3296 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
3297 qi.pNext = NULL;
3298 qi.queueFamilyIndex = i;
3299 qi.queueCount = queue_props[i].queueCount;
3300 queue_priorities.emplace_back(qi.queueCount, 0.0f);
3301 qi.pQueuePriorities = queue_priorities[i].data();
3302 queue_info.push_back(qi);
3303 }
3304
3305 std::vector<const char *> device_layer_names;
3306 std::vector<const char *> device_extension_names;
3307 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
3308 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
3309 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
3310 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003311 device_layer_names.push_back("VK_LAYER_LUNARG_image");
3312 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
3313
3314 // The sacrificial device object
3315 VkDevice testDevice;
3316 VkDeviceCreateInfo device_create_info = {};
3317 auto features = m_device->phy().features();
3318 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
3319 device_create_info.pNext = NULL;
3320 device_create_info.queueCreateInfoCount = queue_info.size();
3321 device_create_info.pQueueCreateInfos = queue_info.data();
3322 device_create_info.enabledLayerCount = device_layer_names.size();
3323 device_create_info.ppEnabledLayerNames = device_layer_names.data();
3324 device_create_info.pEnabledFeatures = &features;
3325 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
3326 ASSERT_VK_SUCCESS(err);
3327
3328 VkFence fence;
3329 VkFenceCreateInfo fence_create_info = {};
3330 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3331 fence_create_info.pNext = NULL;
3332 fence_create_info.flags = 0;
3333 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
3334 ASSERT_VK_SUCCESS(err);
3335
3336 // Induce failure by not calling vkDestroyFence
3337 vkDestroyDevice(testDevice, NULL);
3338 m_errorMonitor->VerifyFound();
3339}
3340
3341TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
3342
3343 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
3344 "attempt to delete them from another.");
3345
3346 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3347 "FreeCommandBuffers is attempting to free Command Buffer");
3348
3349 VkCommandPool command_pool_one;
3350 VkCommandPool command_pool_two;
3351
3352 VkCommandPoolCreateInfo pool_create_info{};
3353 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3354 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3355 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3356
3357 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3358 &command_pool_one);
3359
3360 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3361 &command_pool_two);
3362
3363 VkCommandBuffer command_buffer[9];
3364 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3365 command_buffer_allocate_info.sType =
3366 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3367 command_buffer_allocate_info.commandPool = command_pool_one;
3368 command_buffer_allocate_info.commandBufferCount = 9;
3369 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3370 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3371 command_buffer);
3372
3373 vkFreeCommandBuffers(m_device->device(), command_pool_two, 4,
3374 &command_buffer[3]);
3375
3376 m_errorMonitor->VerifyFound();
3377
3378 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
3379 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
3380}
3381
3382TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
3383 VkResult err;
3384
3385 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
3386 "attempt to delete them from another.");
3387
3388 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3389 "FreeDescriptorSets is attempting to free descriptorSet");
3390
3391 ASSERT_NO_FATAL_FAILURE(InitState());
3392 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3393
3394 VkDescriptorPoolSize ds_type_count = {};
3395 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
3396 ds_type_count.descriptorCount = 1;
3397
3398 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3399 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3400 ds_pool_ci.pNext = NULL;
3401 ds_pool_ci.flags = 0;
3402 ds_pool_ci.maxSets = 1;
3403 ds_pool_ci.poolSizeCount = 1;
3404 ds_pool_ci.pPoolSizes = &ds_type_count;
3405
3406 VkDescriptorPool ds_pool_one;
3407 err =
3408 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
3409 ASSERT_VK_SUCCESS(err);
3410
3411 // Create a second descriptor pool
3412 VkDescriptorPool ds_pool_two;
3413 err =
3414 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
3415 ASSERT_VK_SUCCESS(err);
3416
3417 VkDescriptorSetLayoutBinding dsl_binding = {};
3418 dsl_binding.binding = 0;
3419 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3420 dsl_binding.descriptorCount = 1;
3421 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3422 dsl_binding.pImmutableSamplers = NULL;
3423
3424 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3425 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3426 ds_layout_ci.pNext = NULL;
3427 ds_layout_ci.bindingCount = 1;
3428 ds_layout_ci.pBindings = &dsl_binding;
3429
3430 VkDescriptorSetLayout ds_layout;
3431 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3432 &ds_layout);
3433 ASSERT_VK_SUCCESS(err);
3434
3435 VkDescriptorSet descriptorSet;
3436 VkDescriptorSetAllocateInfo alloc_info = {};
3437 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3438 alloc_info.descriptorSetCount = 1;
3439 alloc_info.descriptorPool = ds_pool_one;
3440 alloc_info.pSetLayouts = &ds_layout;
3441 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3442 &descriptorSet);
3443 ASSERT_VK_SUCCESS(err);
3444
3445 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
3446
3447 m_errorMonitor->VerifyFound();
3448
3449 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3450 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
3451 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
3452}
3453
3454TEST_F(VkLayerTest, CreateUnknownObject) {
3455 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3456 "Invalid VkImage Object ");
3457
3458 TEST_DESCRIPTION(
3459 "Pass an invalid image object handle into a Vulkan API call.");
3460
3461 ASSERT_NO_FATAL_FAILURE(InitState());
3462
3463 // Pass bogus handle into GetImageMemoryRequirements
3464 VkMemoryRequirements mem_reqs;
3465 uint64_t fakeImageHandle = 0xCADECADE;
3466 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
3467
3468 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
3469
3470 m_errorMonitor->VerifyFound();
3471}
3472
Karl Schultz6addd812016-02-02 17:17:23 -07003473TEST_F(VkLayerTest, PipelineNotBound) {
3474 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003475
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003476 TEST_DESCRIPTION(
3477 "Pass in an invalid pipeline object handle into a Vulkan API call.");
3478
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003480 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003481
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003482 ASSERT_NO_FATAL_FAILURE(InitState());
3483 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003484
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003485 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003486 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3487 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003488
3489 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003490 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3491 ds_pool_ci.pNext = NULL;
3492 ds_pool_ci.maxSets = 1;
3493 ds_pool_ci.poolSizeCount = 1;
3494 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003495
3496 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003497 err =
3498 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003499 ASSERT_VK_SUCCESS(err);
3500
3501 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003502 dsl_binding.binding = 0;
3503 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3504 dsl_binding.descriptorCount = 1;
3505 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3506 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003507
3508 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003509 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3510 ds_layout_ci.pNext = NULL;
3511 ds_layout_ci.bindingCount = 1;
3512 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003513
3514 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003515 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3516 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003517 ASSERT_VK_SUCCESS(err);
3518
3519 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003520 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003521 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003522 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003523 alloc_info.descriptorPool = ds_pool;
3524 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003525 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3526 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003527 ASSERT_VK_SUCCESS(err);
3528
3529 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003530 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3531 pipeline_layout_ci.pNext = NULL;
3532 pipeline_layout_ci.setLayoutCount = 1;
3533 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003534
3535 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003536 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3537 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003538 ASSERT_VK_SUCCESS(err);
3539
Mark Youngad779052016-01-06 14:26:04 -07003540 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003541
3542 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003543 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3544 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003545
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003546 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003547
Chia-I Wuf7458c52015-10-26 21:10:41 +08003548 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3549 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3550 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003551}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003552
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003553TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
3554 VkResult err;
3555
3556 TEST_DESCRIPTION("Test validation check for an invalid memory type index "
3557 "during bind[Buffer|Image]Memory time");
3558
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003559 ASSERT_NO_FATAL_FAILURE(InitState());
3560
3561 // Create an image, allocate memory, set a bad typeIndex and then try to
3562 // bind it
3563 VkImage image;
3564 VkDeviceMemory mem;
3565 VkMemoryRequirements mem_reqs;
3566 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3567 const int32_t tex_width = 32;
3568 const int32_t tex_height = 32;
3569
3570 VkImageCreateInfo image_create_info = {};
3571 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3572 image_create_info.pNext = NULL;
3573 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3574 image_create_info.format = tex_format;
3575 image_create_info.extent.width = tex_width;
3576 image_create_info.extent.height = tex_height;
3577 image_create_info.extent.depth = 1;
3578 image_create_info.mipLevels = 1;
3579 image_create_info.arrayLayers = 1;
3580 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3581 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3582 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3583 image_create_info.flags = 0;
3584
3585 VkMemoryAllocateInfo mem_alloc = {};
3586 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3587 mem_alloc.pNext = NULL;
3588 mem_alloc.allocationSize = 0;
3589 mem_alloc.memoryTypeIndex = 0;
3590
3591 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3592 ASSERT_VK_SUCCESS(err);
3593
3594 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
3595 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003596
3597 // Introduce Failure, select invalid TypeIndex
3598 VkPhysicalDeviceMemoryProperties memory_info;
3599
3600 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
3601 unsigned int i;
3602 for (i = 0; i < memory_info.memoryTypeCount; i++) {
3603 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
3604 mem_alloc.memoryTypeIndex = i;
3605 break;
3606 }
3607 }
3608 if (i >= memory_info.memoryTypeCount) {
3609 printf("No invalid memory type index could be found; skipped.\n");
3610 vkDestroyImage(m_device->device(), image, NULL);
3611 return;
3612 }
3613
3614 m_errorMonitor->SetDesiredFailureMsg(
3615 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3616 "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003617
3618 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
3619 ASSERT_VK_SUCCESS(err);
3620
3621 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3622 (void)err;
3623
3624 m_errorMonitor->VerifyFound();
3625
3626 vkDestroyImage(m_device->device(), image, NULL);
3627 vkFreeMemory(m_device->device(), mem, NULL);
3628}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003629
Karl Schultz6addd812016-02-02 17:17:23 -07003630TEST_F(VkLayerTest, BindInvalidMemory) {
3631 VkResult err;
3632 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003633
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003634 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003635 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003636
Tobin Ehlisec598302015-09-15 15:02:17 -06003637 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003638
3639 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07003640 VkImage image;
3641 VkDeviceMemory mem;
3642 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003643
Karl Schultz6addd812016-02-02 17:17:23 -07003644 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3645 const int32_t tex_width = 32;
3646 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003647
3648 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003649 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3650 image_create_info.pNext = NULL;
3651 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3652 image_create_info.format = tex_format;
3653 image_create_info.extent.width = tex_width;
3654 image_create_info.extent.height = tex_height;
3655 image_create_info.extent.depth = 1;
3656 image_create_info.mipLevels = 1;
3657 image_create_info.arrayLayers = 1;
3658 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3659 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3660 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3661 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003662
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003663 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003664 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3665 mem_alloc.pNext = NULL;
3666 mem_alloc.allocationSize = 0;
3667 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003668
Chia-I Wuf7458c52015-10-26 21:10:41 +08003669 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003670 ASSERT_VK_SUCCESS(err);
3671
Karl Schultz6addd812016-02-02 17:17:23 -07003672 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003673
3674 mem_alloc.allocationSize = mem_reqs.size;
3675
Karl Schultz6addd812016-02-02 17:17:23 -07003676 pass =
3677 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003678 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003679
3680 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003681 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003682 ASSERT_VK_SUCCESS(err);
3683
3684 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003685 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003686
3687 // Try to bind free memory that has been freed
3688 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3689 // This may very well return an error.
3690 (void)err;
3691
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003692 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003693
Chia-I Wuf7458c52015-10-26 21:10:41 +08003694 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003695}
3696
Karl Schultz6addd812016-02-02 17:17:23 -07003697TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
3698 VkResult err;
3699 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003700
Karl Schultz6addd812016-02-02 17:17:23 -07003701 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3702 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003703
Tobin Ehlisec598302015-09-15 15:02:17 -06003704 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003705
Karl Schultz6addd812016-02-02 17:17:23 -07003706 // Create an image object, allocate memory, destroy the object and then try
3707 // to bind it
3708 VkImage image;
3709 VkDeviceMemory mem;
3710 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003711
Karl Schultz6addd812016-02-02 17:17:23 -07003712 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3713 const int32_t tex_width = 32;
3714 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003715
3716 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003717 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3718 image_create_info.pNext = NULL;
3719 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3720 image_create_info.format = tex_format;
3721 image_create_info.extent.width = tex_width;
3722 image_create_info.extent.height = tex_height;
3723 image_create_info.extent.depth = 1;
3724 image_create_info.mipLevels = 1;
3725 image_create_info.arrayLayers = 1;
3726 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3727 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3728 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3729 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003730
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003731 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003732 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3733 mem_alloc.pNext = NULL;
3734 mem_alloc.allocationSize = 0;
3735 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003736
Chia-I Wuf7458c52015-10-26 21:10:41 +08003737 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003738 ASSERT_VK_SUCCESS(err);
3739
Karl Schultz6addd812016-02-02 17:17:23 -07003740 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003741
3742 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003743 pass =
3744 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003745 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003746
3747 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003748 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003749 ASSERT_VK_SUCCESS(err);
3750
3751 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003752 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003753 ASSERT_VK_SUCCESS(err);
3754
3755 // Now Try to bind memory to this destroyed object
3756 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3757 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07003758 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06003759
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003760 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003761
Chia-I Wuf7458c52015-10-26 21:10:41 +08003762 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003763}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003764
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003765#endif // OBJ_TRACKER_TESTS
3766
Tobin Ehlis0788f522015-05-26 16:11:58 -06003767#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06003768
Chris Forbes48a53902016-06-30 11:46:27 +12003769TEST_F(VkLayerTest, RenderPassInitialLayoutUndefined) {
3770 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass with an attachment's "
3771 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
3772 "the command buffer has prior knowledge of that "
3773 "attachment's layout.");
3774
3775 m_errorMonitor->ExpectSuccess();
3776
3777 ASSERT_NO_FATAL_FAILURE(InitState());
3778
3779 // A renderpass with one color attachment.
3780 VkAttachmentDescription attachment = {
3781 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3782 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3783 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3784 VK_IMAGE_LAYOUT_UNDEFINED,
3785 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3786 };
3787
3788 VkAttachmentReference att_ref = {
3789 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3790 };
3791
3792 VkSubpassDescription subpass = {
3793 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3794 1, &att_ref, nullptr, nullptr, 0, nullptr
3795 };
3796
3797 VkRenderPassCreateInfo rpci = {
3798 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3799 0, 1, &attachment, 1, &subpass, 0, nullptr
3800 };
3801
3802 VkRenderPass rp;
3803 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3804 ASSERT_VK_SUCCESS(err);
3805
3806 // A compatible framebuffer.
3807 VkImageObj image(m_device);
3808 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3809 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3810 VK_IMAGE_TILING_OPTIMAL, 0);
3811 ASSERT_TRUE(image.initialized());
3812
3813 VkImageViewCreateInfo ivci = {
3814 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3815 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3816 {
3817 VK_COMPONENT_SWIZZLE_IDENTITY,
3818 VK_COMPONENT_SWIZZLE_IDENTITY,
3819 VK_COMPONENT_SWIZZLE_IDENTITY,
3820 VK_COMPONENT_SWIZZLE_IDENTITY
3821 },
3822 {
3823 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3824 },
3825 };
3826 VkImageView view;
3827 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3828 ASSERT_VK_SUCCESS(err);
3829
3830 VkFramebufferCreateInfo fci = {
3831 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3832 0, rp, 1, &view,
3833 32, 32, 1
3834 };
3835 VkFramebuffer fb;
3836 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3837 ASSERT_VK_SUCCESS(err);
3838
3839 // Record a single command buffer which uses this renderpass twice. The
3840 // bug is triggered at the beginning of the second renderpass, when the
3841 // command buffer already has a layout recorded for the attachment.
3842 VkRenderPassBeginInfo rpbi = {
3843 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06003844 rp, fb, { { 0, 0 } , { 32, 32 } },
Chris Forbes48a53902016-06-30 11:46:27 +12003845 0, nullptr
3846 };
3847 BeginCommandBuffer();
3848 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3849 VK_SUBPASS_CONTENTS_INLINE);
3850 vkCmdEndRenderPass(m_commandBuffer->handle());
3851 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3852 VK_SUBPASS_CONTENTS_INLINE);
3853
3854 m_errorMonitor->VerifyNotFound();
3855
3856 vkCmdEndRenderPass(m_commandBuffer->handle());
3857 EndCommandBuffer();
3858
3859 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3860 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3861 vkDestroyImageView(m_device->device(), view, nullptr);
3862}
3863
Chris Forbes51bf7c92016-06-30 15:22:08 +12003864TEST_F(VkLayerTest, RenderPassSubpassZeroTransitionsApplied) {
3865 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass applies the layout "
3866 "transitions for the first subpass");
3867
3868 m_errorMonitor->ExpectSuccess();
3869
3870 ASSERT_NO_FATAL_FAILURE(InitState());
3871
3872 // A renderpass with one color attachment.
3873 VkAttachmentDescription attachment = {
3874 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3875 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3876 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3877 VK_IMAGE_LAYOUT_UNDEFINED,
3878 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3879 };
3880
3881 VkAttachmentReference att_ref = {
3882 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3883 };
3884
3885 VkSubpassDescription subpass = {
3886 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3887 1, &att_ref, nullptr, nullptr, 0, nullptr
3888 };
3889
3890 VkSubpassDependency dep = {
Chris Forbescb4c7ad2016-07-06 10:28:18 +12003891 0, 0, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3892 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Chris Forbes51bf7c92016-06-30 15:22:08 +12003893 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3894 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3895 VK_DEPENDENCY_BY_REGION_BIT
3896 };
3897
3898 VkRenderPassCreateInfo rpci = {
3899 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3900 0, 1, &attachment, 1, &subpass, 1, &dep
3901 };
3902
3903 VkResult err;
3904 VkRenderPass rp;
3905 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3906 ASSERT_VK_SUCCESS(err);
3907
3908 // A compatible framebuffer.
3909 VkImageObj image(m_device);
3910 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3911 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3912 VK_IMAGE_TILING_OPTIMAL, 0);
3913 ASSERT_TRUE(image.initialized());
3914
3915 VkImageViewCreateInfo ivci = {
3916 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3917 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3918 {
3919 VK_COMPONENT_SWIZZLE_IDENTITY,
3920 VK_COMPONENT_SWIZZLE_IDENTITY,
3921 VK_COMPONENT_SWIZZLE_IDENTITY,
3922 VK_COMPONENT_SWIZZLE_IDENTITY
3923 },
3924 {
3925 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3926 },
3927 };
3928 VkImageView view;
3929 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3930 ASSERT_VK_SUCCESS(err);
3931
3932 VkFramebufferCreateInfo fci = {
3933 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3934 0, rp, 1, &view,
3935 32, 32, 1
3936 };
3937 VkFramebuffer fb;
3938 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3939 ASSERT_VK_SUCCESS(err);
3940
3941 // Record a single command buffer which issues a pipeline barrier w/
3942 // image memory barrier for the attachment. This detects the previously
3943 // missing tracking of the subpass layout by throwing a validation error
3944 // if it doesn't occur.
3945 VkRenderPassBeginInfo rpbi = {
3946 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06003947 rp, fb, { { 0, 0 }, { 32, 32 } },
Chris Forbes51bf7c92016-06-30 15:22:08 +12003948 0, nullptr
3949 };
3950 BeginCommandBuffer();
3951 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3952 VK_SUBPASS_CONTENTS_INLINE);
3953
3954 VkImageMemoryBarrier imb = {
3955 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, nullptr,
3956 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3957 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3958 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3959 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3960 VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
3961 image.handle(),
3962 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
3963 };
3964 vkCmdPipelineBarrier(m_commandBuffer->handle(),
Chris Forbescb4c7ad2016-07-06 10:28:18 +12003965 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3966 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Chris Forbes51bf7c92016-06-30 15:22:08 +12003967 VK_DEPENDENCY_BY_REGION_BIT,
3968 0, nullptr, 0, nullptr, 1, &imb);
3969
3970 vkCmdEndRenderPass(m_commandBuffer->handle());
3971 m_errorMonitor->VerifyNotFound();
3972 EndCommandBuffer();
3973
3974 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3975 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3976 vkDestroyImageView(m_device->device(), view, nullptr);
3977}
3978
Chris Forbes6b3d3f42016-06-30 16:09:47 +12003979TEST_F(VkLayerTest, RenderPassTransitionsAttachmentUnused) {
3980 TEST_DESCRIPTION("Ensure that layout transitions work correctly without "
3981 "errors, when an attachment reference is "
3982 "VK_ATTACHMENT_UNUSED");
3983
3984 m_errorMonitor->ExpectSuccess();
3985
3986 ASSERT_NO_FATAL_FAILURE(InitState());
3987
3988 // A renderpass with no attachments
3989 VkAttachmentReference att_ref = {
3990 VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3991 };
3992
3993 VkSubpassDescription subpass = {
3994 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3995 1, &att_ref, nullptr, nullptr, 0, nullptr
3996 };
3997
3998 VkRenderPassCreateInfo rpci = {
3999 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4000 0, 0, nullptr, 1, &subpass, 0, nullptr
4001 };
4002
4003 VkRenderPass rp;
4004 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4005 ASSERT_VK_SUCCESS(err);
4006
4007 // A compatible framebuffer.
4008 VkFramebufferCreateInfo fci = {
4009 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
4010 0, rp, 0, nullptr,
4011 32, 32, 1
4012 };
4013 VkFramebuffer fb;
4014 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
4015 ASSERT_VK_SUCCESS(err);
4016
4017 // Record a command buffer which just begins and ends the renderpass. The
4018 // bug manifests in BeginRenderPass.
4019 VkRenderPassBeginInfo rpbi = {
4020 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06004021 rp, fb, { { 0, 0 }, { 32, 32 } },
Chris Forbes6b3d3f42016-06-30 16:09:47 +12004022 0, nullptr
4023 };
4024 BeginCommandBuffer();
4025 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
4026 VK_SUBPASS_CONTENTS_INLINE);
4027 vkCmdEndRenderPass(m_commandBuffer->handle());
4028 m_errorMonitor->VerifyNotFound();
4029 EndCommandBuffer();
4030
4031 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4032 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4033}
4034
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004035// This is a positive test. No errors are expected.
4036TEST_F(VkLayerTest, StencilLoadOp) {
4037 TEST_DESCRIPTION("Create a stencil-only attachment with a LOAD_OP set to "
4038 "CLEAR. stencil[Load|Store]Op used to be ignored.");
4039 VkResult result = VK_SUCCESS;
4040 VkImageFormatProperties formatProps;
4041 vkGetPhysicalDeviceImageFormatProperties(
4042 gpu(), VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_TYPE_2D,
4043 VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4044 VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
4045 0, &formatProps);
4046 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
4047 return;
4048 }
4049
4050 ASSERT_NO_FATAL_FAILURE(InitState());
4051 VkFormat depth_stencil_fmt = VK_FORMAT_D24_UNORM_S8_UINT;
4052 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
4053 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4054 VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
4055 VkAttachmentDescription att = {};
4056 VkAttachmentReference ref = {};
4057 att.format = depth_stencil_fmt;
4058 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
4059 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
4060 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
4061 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
4062 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4063 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4064
4065 VkClearValue clear;
4066 clear.depthStencil.depth = 1.0;
4067 clear.depthStencil.stencil = 0;
4068 ref.attachment = 0;
4069 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4070
4071 VkSubpassDescription subpass = {};
4072 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
4073 subpass.flags = 0;
4074 subpass.inputAttachmentCount = 0;
4075 subpass.pInputAttachments = NULL;
4076 subpass.colorAttachmentCount = 0;
4077 subpass.pColorAttachments = NULL;
4078 subpass.pResolveAttachments = NULL;
4079 subpass.pDepthStencilAttachment = &ref;
4080 subpass.preserveAttachmentCount = 0;
4081 subpass.pPreserveAttachments = NULL;
4082
4083 VkRenderPass rp;
4084 VkRenderPassCreateInfo rp_info = {};
4085 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4086 rp_info.attachmentCount = 1;
4087 rp_info.pAttachments = &att;
4088 rp_info.subpassCount = 1;
4089 rp_info.pSubpasses = &subpass;
4090 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
4091 ASSERT_VK_SUCCESS(result);
4092
4093 VkImageView *depthView = m_depthStencil->BindInfo();
4094 VkFramebufferCreateInfo fb_info = {};
4095 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4096 fb_info.pNext = NULL;
4097 fb_info.renderPass = rp;
4098 fb_info.attachmentCount = 1;
4099 fb_info.pAttachments = depthView;
4100 fb_info.width = 100;
4101 fb_info.height = 100;
4102 fb_info.layers = 1;
4103 VkFramebuffer fb;
4104 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4105 ASSERT_VK_SUCCESS(result);
4106
4107
4108 VkRenderPassBeginInfo rpbinfo = {};
4109 rpbinfo.clearValueCount = 1;
4110 rpbinfo.pClearValues = &clear;
4111 rpbinfo.pNext = NULL;
4112 rpbinfo.renderPass = rp;
4113 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4114 rpbinfo.renderArea.extent.width = 100;
4115 rpbinfo.renderArea.extent.height = 100;
4116 rpbinfo.renderArea.offset.x = 0;
4117 rpbinfo.renderArea.offset.y = 0;
4118 rpbinfo.framebuffer = fb;
4119
4120 VkFence fence = {};
4121 VkFenceCreateInfo fence_ci = {};
4122 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4123 fence_ci.pNext = nullptr;
4124 fence_ci.flags = 0;
4125 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
4126 ASSERT_VK_SUCCESS(result);
4127
4128
4129 m_commandBuffer->BeginCommandBuffer();
4130 m_commandBuffer->BeginRenderPass(rpbinfo);
4131 m_commandBuffer->EndRenderPass();
4132 m_commandBuffer->EndCommandBuffer();
4133 m_commandBuffer->QueueCommandBuffer(fence);
4134
4135 VkImageObj destImage(m_device);
4136 destImage.init(100, 100, depth_stencil_fmt,
4137 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4138 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4139 VK_IMAGE_TILING_OPTIMAL, 0);
4140 VkImageMemoryBarrier barrier = {};
4141 VkImageSubresourceRange range;
4142 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
4143 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
4144 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4145 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT |
4146 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
4147 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4148 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
4149 barrier.image = m_depthStencil->handle();
4150 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4151 range.baseMipLevel = 0;
4152 range.levelCount = 1;
4153 range.baseArrayLayer = 0;
4154 range.layerCount = 1;
4155 barrier.subresourceRange = range;
4156 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
4157 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
4158 cmdbuf.BeginCommandBuffer();
4159 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4160 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
4161 nullptr, 1, &barrier);
4162 barrier.srcAccessMask = 0;
4163 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4164 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
4165 barrier.image = destImage.handle();
4166 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
4167 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4168 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4169 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
4170 nullptr, 1, &barrier);
4171 VkImageCopy cregion;
4172 cregion.srcSubresource.aspectMask =
4173 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4174 cregion.srcSubresource.mipLevel = 0;
4175 cregion.srcSubresource.baseArrayLayer = 0;
4176 cregion.srcSubresource.layerCount = 1;
4177 cregion.srcOffset.x = 0;
4178 cregion.srcOffset.y = 0;
4179 cregion.srcOffset.z = 0;
4180 cregion.dstSubresource.aspectMask =
4181 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4182 cregion.dstSubresource.mipLevel = 0;
4183 cregion.dstSubresource.baseArrayLayer = 0;
4184 cregion.dstSubresource.layerCount = 1;
4185 cregion.dstOffset.x = 0;
4186 cregion.dstOffset.y = 0;
4187 cregion.dstOffset.z = 0;
4188 cregion.extent.width = 100;
4189 cregion.extent.height = 100;
4190 cregion.extent.depth = 1;
4191 cmdbuf.CopyImage(m_depthStencil->handle(),
4192 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
4193 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
4194 cmdbuf.EndCommandBuffer();
4195
4196 VkSubmitInfo submit_info;
4197 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4198 submit_info.pNext = NULL;
4199 submit_info.waitSemaphoreCount = 0;
4200 submit_info.pWaitSemaphores = NULL;
4201 submit_info.pWaitDstStageMask = NULL;
4202 submit_info.commandBufferCount = 1;
4203 submit_info.pCommandBuffers = &cmdbuf.handle();
4204 submit_info.signalSemaphoreCount = 0;
4205 submit_info.pSignalSemaphores = NULL;
4206
4207 m_errorMonitor->ExpectSuccess();
4208 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4209 m_errorMonitor->VerifyNotFound();
4210
Mark Lobodzinskid0440da2016-06-17 15:10:03 -06004211 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004212 vkDestroyFence(m_device->device(), fence, nullptr);
4213 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4214 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4215}
4216
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004217TEST_F(VkLayerTest, UnusedPreserveAttachment) {
4218 TEST_DESCRIPTION("Create a framebuffer where a subpass has a preserve "
4219 "attachment reference of VK_ATTACHMENT_UNUSED");
4220
4221 ASSERT_NO_FATAL_FAILURE(InitState());
4222 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4223
4224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4225 "must not be VK_ATTACHMENT_UNUSED");
4226
4227 VkAttachmentReference color_attach = {};
4228 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4229 color_attach.attachment = 0;
4230 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
4231 VkSubpassDescription subpass = {};
4232 subpass.colorAttachmentCount = 1;
4233 subpass.pColorAttachments = &color_attach;
4234 subpass.preserveAttachmentCount = 1;
4235 subpass.pPreserveAttachments = &preserve_attachment;
4236
4237 VkRenderPassCreateInfo rpci = {};
4238 rpci.subpassCount = 1;
4239 rpci.pSubpasses = &subpass;
4240 rpci.attachmentCount = 1;
4241 VkAttachmentDescription attach_desc = {};
4242 attach_desc.format = VK_FORMAT_UNDEFINED;
4243 rpci.pAttachments = &attach_desc;
4244 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4245 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004246 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004247
4248 m_errorMonitor->VerifyFound();
4249
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004250 if (result == VK_SUCCESS) {
4251 vkDestroyRenderPass(m_device->device(), rp, NULL);
4252 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004253}
4254
Chris Forbesc5389742016-06-29 11:49:23 +12004255TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004256 TEST_DESCRIPTION("Ensure that CreateRenderPass produces a validation error "
4257 "when the source of a subpass multisample resolve "
4258 "does not have multiple samples.");
4259
Chris Forbesc5389742016-06-29 11:49:23 +12004260 ASSERT_NO_FATAL_FAILURE(InitState());
4261
4262 m_errorMonitor->SetDesiredFailureMsg(
4263 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbes6655bb32016-07-01 18:27:30 +12004264 "Subpass 0 requests multisample resolve from attachment 0 which has "
4265 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12004266
4267 VkAttachmentDescription attachments[] = {
4268 {
4269 0, VK_FORMAT_R8G8B8A8_UNORM,
4270 VK_SAMPLE_COUNT_1_BIT,
4271 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4272 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4273 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4274 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4275 },
4276 {
4277 0, VK_FORMAT_R8G8B8A8_UNORM,
4278 VK_SAMPLE_COUNT_1_BIT,
4279 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4280 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4281 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4282 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4283 },
4284 };
4285
4286 VkAttachmentReference color = {
4287 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4288 };
4289
4290 VkAttachmentReference resolve = {
4291 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4292 };
4293
4294 VkSubpassDescription subpass = {
4295 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4296 0, nullptr,
4297 1, &color,
4298 &resolve,
4299 nullptr,
4300 0, nullptr
4301 };
4302
4303 VkRenderPassCreateInfo rpci = {
4304 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4305 0, 2, attachments, 1, &subpass, 0, nullptr
4306 };
4307
4308 VkRenderPass rp;
4309 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4310
4311 m_errorMonitor->VerifyFound();
4312
4313 if (err == VK_SUCCESS)
4314 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4315}
4316
4317TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004318 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4319 "when a subpass multisample resolve operation is "
4320 "requested, and the destination of that resolve has "
4321 "multiple samples.");
4322
Chris Forbesc5389742016-06-29 11:49:23 +12004323 ASSERT_NO_FATAL_FAILURE(InitState());
4324
4325 m_errorMonitor->SetDesiredFailureMsg(
4326 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4327 "Subpass 0 requests multisample resolve into attachment 1, which "
4328 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
4329
4330 VkAttachmentDescription attachments[] = {
4331 {
4332 0, VK_FORMAT_R8G8B8A8_UNORM,
4333 VK_SAMPLE_COUNT_4_BIT,
4334 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4335 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4336 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4337 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4338 },
4339 {
4340 0, VK_FORMAT_R8G8B8A8_UNORM,
4341 VK_SAMPLE_COUNT_4_BIT,
4342 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4343 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4344 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4345 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4346 },
4347 };
4348
4349 VkAttachmentReference color = {
4350 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4351 };
4352
4353 VkAttachmentReference resolve = {
4354 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4355 };
4356
4357 VkSubpassDescription subpass = {
4358 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4359 0, nullptr,
4360 1, &color,
4361 &resolve,
4362 nullptr,
4363 0, nullptr
4364 };
4365
4366 VkRenderPassCreateInfo rpci = {
4367 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4368 0, 2, attachments, 1, &subpass, 0, nullptr
4369 };
4370
4371 VkRenderPass rp;
4372 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4373
4374 m_errorMonitor->VerifyFound();
4375
4376 if (err == VK_SUCCESS)
4377 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4378}
4379
Chris Forbes3f128ef2016-06-29 14:58:53 +12004380TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004381 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4382 "when the color and depth attachments used by a subpass "
4383 "have inconsistent sample counts");
4384
Chris Forbes3f128ef2016-06-29 14:58:53 +12004385 ASSERT_NO_FATAL_FAILURE(InitState());
4386
4387 m_errorMonitor->SetDesiredFailureMsg(
4388 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4389 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
4390
4391 VkAttachmentDescription attachments[] = {
4392 {
4393 0, VK_FORMAT_R8G8B8A8_UNORM,
4394 VK_SAMPLE_COUNT_1_BIT,
4395 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4396 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4397 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4398 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4399 },
4400 {
4401 0, VK_FORMAT_R8G8B8A8_UNORM,
4402 VK_SAMPLE_COUNT_4_BIT,
4403 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4404 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4405 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4406 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4407 },
4408 };
4409
4410 VkAttachmentReference color[] = {
4411 {
4412 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4413 },
4414 {
4415 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4416 },
4417 };
4418
4419 VkSubpassDescription subpass = {
4420 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4421 0, nullptr,
4422 2, color,
4423 nullptr,
4424 nullptr,
4425 0, nullptr
4426 };
4427
4428 VkRenderPassCreateInfo rpci = {
4429 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4430 0, 2, attachments, 1, &subpass, 0, nullptr
4431 };
4432
4433 VkRenderPass rp;
4434 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4435
4436 m_errorMonitor->VerifyFound();
4437
4438 if (err == VK_SUCCESS)
4439 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4440}
4441
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004442TEST_F(VkLayerTest, FramebufferCreateErrors) {
4443 TEST_DESCRIPTION("Hit errors when attempting to create a framebuffer :\n"
4444 " 1. Mismatch between fb & renderPass attachmentCount\n"
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004445 " 2. Use a color image as depthStencil attachment\n"
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004446 " 3. Mismatch fb & renderPass attachment formats\n"
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004447 " 4. Mismatch fb & renderPass attachment #samples\n"
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004448 " 5. FB attachment w/ non-1 mip-levels\n"
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004449 " 6. FB attachment where dimensions don't match\n"
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004450 " 7. FB attachment w/o identity swizzle\n"
4451 " 8. FB dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004452
4453 ASSERT_NO_FATAL_FAILURE(InitState());
4454 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4455
4456 m_errorMonitor->SetDesiredFailureMsg(
4457 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004458 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 "
4459 "does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004460
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004461 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004462 VkAttachmentReference attach = {};
4463 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4464 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004465 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004466 VkRenderPassCreateInfo rpci = {};
4467 rpci.subpassCount = 1;
4468 rpci.pSubpasses = &subpass;
4469 rpci.attachmentCount = 1;
4470 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004471 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004472 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004473 rpci.pAttachments = &attach_desc;
4474 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4475 VkRenderPass rp;
4476 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4477 ASSERT_VK_SUCCESS(err);
4478
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004479 VkImageView ivs[2];
4480 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
4481 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004482 VkFramebufferCreateInfo fb_info = {};
4483 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4484 fb_info.pNext = NULL;
4485 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004486 // Set mis-matching attachmentCount
4487 fb_info.attachmentCount = 2;
4488 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004489 fb_info.width = 100;
4490 fb_info.height = 100;
4491 fb_info.layers = 1;
4492
4493 VkFramebuffer fb;
4494 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4495
4496 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004497 if (err == VK_SUCCESS) {
4498 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4499 }
4500 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004501
4502 // Create a renderPass with a depth-stencil attachment created with
4503 // IMAGE_USAGE_COLOR_ATTACHMENT
4504 // Add our color attachment to pDepthStencilAttachment
4505 subpass.pDepthStencilAttachment = &attach;
4506 subpass.pColorAttachments = NULL;
4507 VkRenderPass rp_ds;
4508 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
4509 ASSERT_VK_SUCCESS(err);
4510 // Set correct attachment count, but attachment has COLOR usage bit set
4511 fb_info.attachmentCount = 1;
4512 fb_info.renderPass = rp_ds;
4513
4514 m_errorMonitor->SetDesiredFailureMsg(
4515 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4516 " conflicts with the image's IMAGE_USAGE flags ");
4517 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4518
4519 m_errorMonitor->VerifyFound();
4520 if (err == VK_SUCCESS) {
4521 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4522 }
4523 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004524
4525 // Create new renderpass with alternate attachment format from fb
4526 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
4527 subpass.pDepthStencilAttachment = NULL;
4528 subpass.pColorAttachments = &attach;
4529 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4530 ASSERT_VK_SUCCESS(err);
4531
4532 // Cause error due to mis-matched formats between rp & fb
4533 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
4534 fb_info.renderPass = rp;
4535 m_errorMonitor->SetDesiredFailureMsg(
4536 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4537 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
4538 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4539
4540 m_errorMonitor->VerifyFound();
4541 if (err == VK_SUCCESS) {
4542 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4543 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004544 vkDestroyRenderPass(m_device->device(), rp, NULL);
4545
4546 // Create new renderpass with alternate sample count from fb
4547 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
4548 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
4549 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4550 ASSERT_VK_SUCCESS(err);
4551
4552 // Cause error due to mis-matched sample count between rp & fb
4553 fb_info.renderPass = rp;
4554 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4555 " has VK_SAMPLE_COUNT_1_BIT samples "
4556 "that do not match the "
4557 "VK_SAMPLE_COUNT_4_BIT ");
4558 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4559
4560 m_errorMonitor->VerifyFound();
4561 if (err == VK_SUCCESS) {
4562 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4563 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004564
4565 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004566
4567 // Create a custom imageView with non-1 mip levels
4568 VkImageObj image(m_device);
4569 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
4570 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4571 ASSERT_TRUE(image.initialized());
4572
4573 VkImageView view;
4574 VkImageViewCreateInfo ivci = {};
4575 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4576 ivci.image = image.handle();
4577 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4578 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4579 ivci.subresourceRange.layerCount = 1;
4580 ivci.subresourceRange.baseMipLevel = 0;
4581 // Set level count 2 (only 1 is allowed for FB attachment)
4582 ivci.subresourceRange.levelCount = 2;
4583 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4584 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4585 ASSERT_VK_SUCCESS(err);
4586 // Re-create renderpass to have matching sample count
4587 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4588 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4589 ASSERT_VK_SUCCESS(err);
4590
4591 fb_info.renderPass = rp;
4592 fb_info.pAttachments = &view;
4593 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4594 " has mip levelCount of 2 but only ");
4595 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4596
4597 m_errorMonitor->VerifyFound();
4598 if (err == VK_SUCCESS) {
4599 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4600 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004601 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004602 // Update view to original color buffer and grow FB dimensions too big
4603 fb_info.pAttachments = ivs;
4604 fb_info.height = 1024;
4605 fb_info.width = 1024;
4606 fb_info.layers = 2;
4607 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4608 " Attachment dimensions must be at "
4609 "least as large. ");
4610 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4611
4612 m_errorMonitor->VerifyFound();
4613 if (err == VK_SUCCESS) {
4614 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4615 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004616 // Create view attachment with non-identity swizzle
4617 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4618 ivci.image = image.handle();
4619 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4620 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4621 ivci.subresourceRange.layerCount = 1;
4622 ivci.subresourceRange.baseMipLevel = 0;
4623 ivci.subresourceRange.levelCount = 1;
4624 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4625 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4626 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4627 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4628 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4629 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4630 ASSERT_VK_SUCCESS(err);
4631
4632 fb_info.pAttachments = &view;
4633 fb_info.height = 100;
4634 fb_info.width = 100;
4635 fb_info.layers = 1;
4636 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4637 " has non-identy swizzle. All "
4638 "framebuffer attachments must have "
4639 "been created with the identity "
4640 "swizzle. ");
4641 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4642
4643 m_errorMonitor->VerifyFound();
4644 if (err == VK_SUCCESS) {
4645 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4646 }
4647 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004648 // Request fb that exceeds max dimensions
4649 // reset attachment to color attachment
4650 fb_info.pAttachments = ivs;
4651 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
4652 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
4653 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
4654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4655 " Requested VkFramebufferCreateInfo "
4656 "dimensions exceed physical device "
4657 "limits. ");
4658 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4659
4660 m_errorMonitor->VerifyFound();
4661 if (err == VK_SUCCESS) {
4662 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4663 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004664
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004665 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004666}
4667
Mark Lobodzinskic808d442016-04-14 10:57:23 -06004668// This is a positive test. No errors should be generated.
Michael Lentine860b0fe2016-05-20 10:14:00 -05004669TEST_F(VkLayerTest, WaitEventThenSet) {
4670 TEST_DESCRIPTION(
4671 "Wait on a event then set it after the wait has been submitted.");
4672
Michael Lentine860b0fe2016-05-20 10:14:00 -05004673 m_errorMonitor->ExpectSuccess();
4674
4675 VkEvent event;
4676 VkEventCreateInfo event_create_info{};
4677 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4678 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
4679
4680 VkCommandPool command_pool;
4681 VkCommandPoolCreateInfo pool_create_info{};
4682 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4683 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4684 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4685 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4686 &command_pool);
4687
4688 VkCommandBuffer command_buffer;
4689 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4690 command_buffer_allocate_info.sType =
4691 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4692 command_buffer_allocate_info.commandPool = command_pool;
4693 command_buffer_allocate_info.commandBufferCount = 1;
4694 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4695 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4696 &command_buffer);
4697
4698 VkQueue queue = VK_NULL_HANDLE;
4699 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06004700 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05004701
4702 {
4703 VkCommandBufferBeginInfo begin_info{};
4704 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4705 vkBeginCommandBuffer(command_buffer, &begin_info);
4706
4707 vkCmdWaitEvents(command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT,
4708 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
4709 nullptr, 0, nullptr);
4710 vkCmdResetEvent(command_buffer, event,
4711 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
4712 vkEndCommandBuffer(command_buffer);
4713 }
4714 {
4715 VkSubmitInfo submit_info{};
4716 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4717 submit_info.commandBufferCount = 1;
4718 submit_info.pCommandBuffers = &command_buffer;
4719 submit_info.signalSemaphoreCount = 0;
4720 submit_info.pSignalSemaphores = nullptr;
4721 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4722 }
4723 { vkSetEvent(m_device->device(), event); }
4724
4725 vkQueueWaitIdle(queue);
4726
4727 vkDestroyEvent(m_device->device(), event, nullptr);
4728 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
4729 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
4730
4731 m_errorMonitor->VerifyNotFound();
4732}
Michael Lentine5627e692016-05-20 17:45:02 -05004733// This is a positive test. No errors should be generated.
4734TEST_F(VkLayerTest, QueryAndCopyMultipleCommandBuffers) {
4735 TEST_DESCRIPTION(
4736 "Issue a query and copy from it on a second command buffer.");
4737
4738 if ((m_device->queue_props.empty()) ||
4739 (m_device->queue_props[0].queueCount < 2))
4740 return;
4741
4742 m_errorMonitor->ExpectSuccess();
4743
4744 VkQueryPool query_pool;
4745 VkQueryPoolCreateInfo query_pool_create_info{};
4746 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
4747 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
4748 query_pool_create_info.queryCount = 1;
4749 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr,
4750 &query_pool);
4751
4752 VkCommandPool command_pool;
4753 VkCommandPoolCreateInfo pool_create_info{};
4754 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4755 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4756 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4757 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4758 &command_pool);
4759
4760 VkCommandBuffer command_buffer[2];
4761 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4762 command_buffer_allocate_info.sType =
4763 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4764 command_buffer_allocate_info.commandPool = command_pool;
4765 command_buffer_allocate_info.commandBufferCount = 2;
4766 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4767 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4768 command_buffer);
4769
4770 VkQueue queue = VK_NULL_HANDLE;
4771 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
4772 1, &queue);
4773
4774 uint32_t qfi = 0;
4775 VkBufferCreateInfo buff_create_info = {};
4776 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4777 buff_create_info.size = 1024;
4778 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
4779 buff_create_info.queueFamilyIndexCount = 1;
4780 buff_create_info.pQueueFamilyIndices = &qfi;
4781
4782 VkResult err;
4783 VkBuffer buffer;
4784 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
4785 ASSERT_VK_SUCCESS(err);
4786 VkMemoryAllocateInfo mem_alloc = {};
4787 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4788 mem_alloc.pNext = NULL;
4789 mem_alloc.allocationSize = 1024;
4790 mem_alloc.memoryTypeIndex = 0;
4791
4792 VkMemoryRequirements memReqs;
4793 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
4794 bool pass =
4795 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
4796 if (!pass) {
4797 vkDestroyBuffer(m_device->device(), buffer, NULL);
4798 return;
4799 }
4800
4801 VkDeviceMemory mem;
4802 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
4803 ASSERT_VK_SUCCESS(err);
4804 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4805 ASSERT_VK_SUCCESS(err);
4806
4807 {
4808 VkCommandBufferBeginInfo begin_info{};
4809 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4810 vkBeginCommandBuffer(command_buffer[0], &begin_info);
4811
4812 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
4813 vkCmdWriteTimestamp(command_buffer[0],
4814 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
4815
4816 vkEndCommandBuffer(command_buffer[0]);
4817
4818 vkBeginCommandBuffer(command_buffer[1], &begin_info);
4819
4820 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer,
4821 0, 0, 0);
4822
4823 vkEndCommandBuffer(command_buffer[1]);
4824 }
4825 {
4826 VkSubmitInfo submit_info{};
4827 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4828 submit_info.commandBufferCount = 2;
4829 submit_info.pCommandBuffers = command_buffer;
4830 submit_info.signalSemaphoreCount = 0;
4831 submit_info.pSignalSemaphores = nullptr;
4832 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4833 }
4834
4835 vkQueueWaitIdle(queue);
4836
4837 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
4838 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
4839 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06004840 vkDestroyBuffer(m_device->device(), buffer, NULL);
4841 vkFreeMemory(m_device->device(), mem, NULL);
Michael Lentine5627e692016-05-20 17:45:02 -05004842
4843 m_errorMonitor->VerifyNotFound();
4844}
Michael Lentine860b0fe2016-05-20 10:14:00 -05004845
4846TEST_F(VkLayerTest, ResetEventThenSet) {
4847 TEST_DESCRIPTION(
4848 "Reset an event then set it after the reset has been submitted.");
4849
Michael Lentine860b0fe2016-05-20 10:14:00 -05004850 m_errorMonitor->ExpectSuccess();
4851
4852 VkEvent event;
4853 VkEventCreateInfo event_create_info{};
4854 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4855 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
4856
4857 VkCommandPool command_pool;
4858 VkCommandPoolCreateInfo pool_create_info{};
4859 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4860 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4861 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4862 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4863 &command_pool);
4864
4865 VkCommandBuffer command_buffer;
4866 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4867 command_buffer_allocate_info.sType =
4868 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4869 command_buffer_allocate_info.commandPool = command_pool;
4870 command_buffer_allocate_info.commandBufferCount = 1;
4871 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4872 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4873 &command_buffer);
4874
4875 VkQueue queue = VK_NULL_HANDLE;
4876 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06004877 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05004878
4879 {
4880 VkCommandBufferBeginInfo begin_info{};
4881 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4882 vkBeginCommandBuffer(command_buffer, &begin_info);
4883
4884 vkCmdResetEvent(command_buffer, event,
4885 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
4886 vkCmdWaitEvents(command_buffer, 1, &event,
4887 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4888 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
4889 nullptr, 0, nullptr);
4890 vkEndCommandBuffer(command_buffer);
4891 }
4892 {
4893 VkSubmitInfo submit_info{};
4894 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4895 submit_info.commandBufferCount = 1;
4896 submit_info.pCommandBuffers = &command_buffer;
4897 submit_info.signalSemaphoreCount = 0;
4898 submit_info.pSignalSemaphores = nullptr;
4899 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4900 }
4901 {
4902 m_errorMonitor->SetDesiredFailureMsg(
4903 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkSetEvent() on event "
4904 "0x1 that is already in use by a "
4905 "command buffer.");
4906 vkSetEvent(m_device->device(), event);
4907 m_errorMonitor->VerifyFound();
4908 }
4909
4910 vkQueueWaitIdle(queue);
4911
4912 vkDestroyEvent(m_device->device(), event, nullptr);
4913 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
4914 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
4915}
4916
4917// This is a positive test. No errors should be generated.
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004918TEST_F(VkLayerTest, TwoFencesThreeFrames) {
4919 TEST_DESCRIPTION("Two command buffers with two separate fences are each "
4920 "run through a Submit & WaitForFences cycle 3 times. This "
4921 "previously revealed a bug so running this positive test "
4922 "to prevent a regression.");
4923 m_errorMonitor->ExpectSuccess();
4924
4925 ASSERT_NO_FATAL_FAILURE(InitState());
4926 VkQueue queue = VK_NULL_HANDLE;
4927 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
4928 0, &queue);
4929
4930 static const uint32_t NUM_OBJECTS = 2;
4931 static const uint32_t NUM_FRAMES = 3;
4932 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
4933 VkFence fences[NUM_OBJECTS] = {};
4934
4935 VkCommandPool cmd_pool;
4936 VkCommandPoolCreateInfo cmd_pool_ci = {};
4937 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4938 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
4939 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4940 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci,
4941 nullptr, &cmd_pool);
4942 ASSERT_VK_SUCCESS(err);
4943
4944 VkCommandBufferAllocateInfo cmd_buf_info = {};
4945 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4946 cmd_buf_info.commandPool = cmd_pool;
4947 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4948 cmd_buf_info.commandBufferCount = 1;
4949
4950 VkFenceCreateInfo fence_ci = {};
4951 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4952 fence_ci.pNext = nullptr;
4953 fence_ci.flags = 0;
4954
4955 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
4956 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info,
4957 &cmd_buffers[i]);
4958 ASSERT_VK_SUCCESS(err);
4959 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
4960 ASSERT_VK_SUCCESS(err);
4961 }
4962
4963 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
Tobin Ehlisf9025162016-05-26 06:55:21 -06004964 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
4965 // Create empty cmd buffer
4966 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
4967 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004968
Tobin Ehlisf9025162016-05-26 06:55:21 -06004969 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
4970 ASSERT_VK_SUCCESS(err);
4971 err = vkEndCommandBuffer(cmd_buffers[obj]);
4972 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004973
Tobin Ehlisf9025162016-05-26 06:55:21 -06004974 VkSubmitInfo submit_info = {};
4975 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4976 submit_info.commandBufferCount = 1;
4977 submit_info.pCommandBuffers = &cmd_buffers[obj];
4978 // Submit cmd buffer and wait for fence
4979 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
4980 ASSERT_VK_SUCCESS(err);
4981 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE,
4982 UINT64_MAX);
4983 ASSERT_VK_SUCCESS(err);
4984 err = vkResetFences(m_device->device(), 1, &fences[obj]);
4985 ASSERT_VK_SUCCESS(err);
4986 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004987 }
4988 m_errorMonitor->VerifyNotFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06004989 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
4990 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
4991 vkDestroyFence(m_device->device(), fences[i], nullptr);
4992 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004993}
4994// This is a positive test. No errors should be generated.
Mark Lobodzinskic808d442016-04-14 10:57:23 -06004995TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
4996
4997 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
4998 "submitted on separate queues followed by a QueueWaitIdle.");
4999
Dustin Graves48458142016-04-29 16:11:55 -06005000 if ((m_device->queue_props.empty()) ||
5001 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005002 return;
5003
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005004 m_errorMonitor->ExpectSuccess();
5005
5006 VkSemaphore semaphore;
5007 VkSemaphoreCreateInfo semaphore_create_info{};
5008 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5009 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5010 &semaphore);
5011
5012 VkCommandPool command_pool;
5013 VkCommandPoolCreateInfo pool_create_info{};
5014 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5015 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5016 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5017 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5018 &command_pool);
5019
5020 VkCommandBuffer command_buffer[2];
5021 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5022 command_buffer_allocate_info.sType =
5023 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5024 command_buffer_allocate_info.commandPool = command_pool;
5025 command_buffer_allocate_info.commandBufferCount = 2;
5026 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5027 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5028 command_buffer);
5029
5030 VkQueue queue = VK_NULL_HANDLE;
5031 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5032 1, &queue);
5033
5034 {
5035 VkCommandBufferBeginInfo begin_info{};
5036 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5037 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5038
5039 vkCmdPipelineBarrier(command_buffer[0],
5040 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5041 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5042 0, nullptr, 0, nullptr);
5043
5044 VkViewport viewport{};
5045 viewport.maxDepth = 1.0f;
5046 viewport.minDepth = 0.0f;
5047 viewport.width = 512;
5048 viewport.height = 512;
5049 viewport.x = 0;
5050 viewport.y = 0;
5051 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5052 vkEndCommandBuffer(command_buffer[0]);
5053 }
5054 {
5055 VkCommandBufferBeginInfo begin_info{};
5056 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5057 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5058
5059 VkViewport viewport{};
5060 viewport.maxDepth = 1.0f;
5061 viewport.minDepth = 0.0f;
5062 viewport.width = 512;
5063 viewport.height = 512;
5064 viewport.x = 0;
5065 viewport.y = 0;
5066 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5067 vkEndCommandBuffer(command_buffer[1]);
5068 }
5069 {
5070 VkSubmitInfo submit_info{};
5071 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5072 submit_info.commandBufferCount = 1;
5073 submit_info.pCommandBuffers = &command_buffer[0];
5074 submit_info.signalSemaphoreCount = 1;
5075 submit_info.pSignalSemaphores = &semaphore;
5076 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5077 }
5078 {
5079 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5080 VkSubmitInfo submit_info{};
5081 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5082 submit_info.commandBufferCount = 1;
5083 submit_info.pCommandBuffers = &command_buffer[1];
5084 submit_info.waitSemaphoreCount = 1;
5085 submit_info.pWaitSemaphores = &semaphore;
5086 submit_info.pWaitDstStageMask = flags;
5087 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5088 }
5089
5090 vkQueueWaitIdle(m_device->m_queue);
5091
5092 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5093 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5094 &command_buffer[0]);
5095 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5096
5097 m_errorMonitor->VerifyNotFound();
5098}
5099
5100// This is a positive test. No errors should be generated.
5101TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
5102
5103 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5104 "submitted on separate queues, the second having a fence"
5105 "followed by a QueueWaitIdle.");
5106
Dustin Graves48458142016-04-29 16:11:55 -06005107 if ((m_device->queue_props.empty()) ||
5108 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005109 return;
5110
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005111 m_errorMonitor->ExpectSuccess();
5112
5113 VkFence fence;
5114 VkFenceCreateInfo fence_create_info{};
5115 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5116 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5117
5118 VkSemaphore semaphore;
5119 VkSemaphoreCreateInfo semaphore_create_info{};
5120 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5121 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5122 &semaphore);
5123
5124 VkCommandPool command_pool;
5125 VkCommandPoolCreateInfo pool_create_info{};
5126 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5127 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5128 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5129 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5130 &command_pool);
5131
5132 VkCommandBuffer command_buffer[2];
5133 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5134 command_buffer_allocate_info.sType =
5135 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5136 command_buffer_allocate_info.commandPool = command_pool;
5137 command_buffer_allocate_info.commandBufferCount = 2;
5138 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5139 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5140 command_buffer);
5141
5142 VkQueue queue = VK_NULL_HANDLE;
5143 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5144 1, &queue);
5145
5146 {
5147 VkCommandBufferBeginInfo begin_info{};
5148 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5149 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5150
5151 vkCmdPipelineBarrier(command_buffer[0],
5152 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5153 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5154 0, nullptr, 0, nullptr);
5155
5156 VkViewport viewport{};
5157 viewport.maxDepth = 1.0f;
5158 viewport.minDepth = 0.0f;
5159 viewport.width = 512;
5160 viewport.height = 512;
5161 viewport.x = 0;
5162 viewport.y = 0;
5163 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5164 vkEndCommandBuffer(command_buffer[0]);
5165 }
5166 {
5167 VkCommandBufferBeginInfo begin_info{};
5168 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5169 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5170
5171 VkViewport viewport{};
5172 viewport.maxDepth = 1.0f;
5173 viewport.minDepth = 0.0f;
5174 viewport.width = 512;
5175 viewport.height = 512;
5176 viewport.x = 0;
5177 viewport.y = 0;
5178 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5179 vkEndCommandBuffer(command_buffer[1]);
5180 }
5181 {
5182 VkSubmitInfo submit_info{};
5183 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5184 submit_info.commandBufferCount = 1;
5185 submit_info.pCommandBuffers = &command_buffer[0];
5186 submit_info.signalSemaphoreCount = 1;
5187 submit_info.pSignalSemaphores = &semaphore;
5188 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5189 }
5190 {
5191 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5192 VkSubmitInfo submit_info{};
5193 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5194 submit_info.commandBufferCount = 1;
5195 submit_info.pCommandBuffers = &command_buffer[1];
5196 submit_info.waitSemaphoreCount = 1;
5197 submit_info.pWaitSemaphores = &semaphore;
5198 submit_info.pWaitDstStageMask = flags;
5199 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5200 }
5201
5202 vkQueueWaitIdle(m_device->m_queue);
5203
5204 vkDestroyFence(m_device->device(), fence, nullptr);
5205 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5206 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5207 &command_buffer[0]);
5208 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5209
5210 m_errorMonitor->VerifyNotFound();
5211}
5212
5213// This is a positive test. No errors should be generated.
5214TEST_F(VkLayerTest,
5215 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
5216
5217 TEST_DESCRIPTION(
5218 "Two command buffers, each in a separate QueueSubmit call "
5219 "submitted on separate queues, the second having a fence"
5220 "followed by two consecutive WaitForFences calls on the same fence.");
5221
Dustin Graves48458142016-04-29 16:11:55 -06005222 if ((m_device->queue_props.empty()) ||
5223 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005224 return;
5225
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005226 m_errorMonitor->ExpectSuccess();
5227
5228 VkFence fence;
5229 VkFenceCreateInfo fence_create_info{};
5230 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5231 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5232
5233 VkSemaphore semaphore;
5234 VkSemaphoreCreateInfo semaphore_create_info{};
5235 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5236 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5237 &semaphore);
5238
5239 VkCommandPool command_pool;
5240 VkCommandPoolCreateInfo pool_create_info{};
5241 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5242 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5243 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5244 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5245 &command_pool);
5246
5247 VkCommandBuffer command_buffer[2];
5248 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5249 command_buffer_allocate_info.sType =
5250 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5251 command_buffer_allocate_info.commandPool = command_pool;
5252 command_buffer_allocate_info.commandBufferCount = 2;
5253 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5254 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5255 command_buffer);
5256
5257 VkQueue queue = VK_NULL_HANDLE;
5258 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5259 1, &queue);
5260
5261 {
5262 VkCommandBufferBeginInfo begin_info{};
5263 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5264 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5265
5266 vkCmdPipelineBarrier(command_buffer[0],
5267 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5268 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5269 0, nullptr, 0, nullptr);
5270
5271 VkViewport viewport{};
5272 viewport.maxDepth = 1.0f;
5273 viewport.minDepth = 0.0f;
5274 viewport.width = 512;
5275 viewport.height = 512;
5276 viewport.x = 0;
5277 viewport.y = 0;
5278 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5279 vkEndCommandBuffer(command_buffer[0]);
5280 }
5281 {
5282 VkCommandBufferBeginInfo begin_info{};
5283 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5284 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5285
5286 VkViewport viewport{};
5287 viewport.maxDepth = 1.0f;
5288 viewport.minDepth = 0.0f;
5289 viewport.width = 512;
5290 viewport.height = 512;
5291 viewport.x = 0;
5292 viewport.y = 0;
5293 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5294 vkEndCommandBuffer(command_buffer[1]);
5295 }
5296 {
5297 VkSubmitInfo submit_info{};
5298 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5299 submit_info.commandBufferCount = 1;
5300 submit_info.pCommandBuffers = &command_buffer[0];
5301 submit_info.signalSemaphoreCount = 1;
5302 submit_info.pSignalSemaphores = &semaphore;
5303 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5304 }
5305 {
5306 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5307 VkSubmitInfo submit_info{};
5308 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5309 submit_info.commandBufferCount = 1;
5310 submit_info.pCommandBuffers = &command_buffer[1];
5311 submit_info.waitSemaphoreCount = 1;
5312 submit_info.pWaitSemaphores = &semaphore;
5313 submit_info.pWaitDstStageMask = flags;
5314 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5315 }
5316
5317 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5318 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5319
5320 vkDestroyFence(m_device->device(), fence, nullptr);
5321 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5322 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5323 &command_buffer[0]);
5324 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5325
5326 m_errorMonitor->VerifyNotFound();
5327}
5328
Chris Forbes0f8126b2016-06-20 17:48:22 +12005329#if 0
5330TEST_F(VkLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
5331 if ((m_device->queue_props.empty()) ||
5332 (m_device->queue_props[0].queueCount < 2)) {
5333 printf("Test requires two queues, skipping\n");
5334 return;
5335 }
5336
5337 VkResult err;
5338
5339 m_errorMonitor->ExpectSuccess();
5340
5341 VkQueue q0 = m_device->m_queue;
5342 VkQueue q1 = nullptr;
5343 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
5344 ASSERT_NE(q1, nullptr);
5345
5346 // An (empty) command buffer. We must have work in the first submission --
5347 // the layer treats unfenced work differently from fenced work.
5348 VkCommandPoolCreateInfo cpci = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0 };
5349 VkCommandPool pool;
5350 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
5351 ASSERT_VK_SUCCESS(err);
5352 VkCommandBufferAllocateInfo cbai = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr,
5353 pool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1
5354 };
5355 VkCommandBuffer cb;
5356 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
5357 ASSERT_VK_SUCCESS(err);
5358 VkCommandBufferBeginInfo cbbi = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
5359 0, nullptr
5360 };
5361 err = vkBeginCommandBuffer(cb, &cbbi);
5362 ASSERT_VK_SUCCESS(err);
5363 err = vkEndCommandBuffer(cb);
5364 ASSERT_VK_SUCCESS(err);
5365
5366 // A semaphore
5367 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
5368 VkSemaphore s;
5369 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
5370 ASSERT_VK_SUCCESS(err);
5371
5372 // First submission, to q0
5373 VkSubmitInfo s0 = {
5374 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
5375 0, nullptr, nullptr,
5376 1, &cb,
5377 1, &s
5378 };
5379
5380 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
5381 ASSERT_VK_SUCCESS(err);
5382
5383 // Second submission, to q1, waiting on s
5384 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
5385 VkSubmitInfo s1 = {
5386 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
5387 1, &s, &waitmask,
5388 0, nullptr,
5389 0, nullptr
5390 };
5391
5392 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
5393 ASSERT_VK_SUCCESS(err);
5394
5395 // Wait for q0 idle
5396 err = vkQueueWaitIdle(q0);
5397 ASSERT_VK_SUCCESS(err);
5398
5399 // Command buffer should have been completed (it was on q0); reset the pool.
5400 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
5401
5402 m_errorMonitor->VerifyNotFound();
5403
5404 // Force device completely idle and clean up resources
5405 vkDeviceWaitIdle(m_device->device());
5406 vkDestroyCommandPool(m_device->device(), pool, nullptr);
5407 vkDestroySemaphore(m_device->device(), s, nullptr);
5408}
5409#endif
5410
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005411// This is a positive test. No errors should be generated.
5412TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
5413
5414 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5415 "submitted on separate queues, the second having a fence, "
5416 "followed by a WaitForFences call.");
5417
Dustin Graves48458142016-04-29 16:11:55 -06005418 if ((m_device->queue_props.empty()) ||
5419 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005420 return;
5421
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005422 m_errorMonitor->ExpectSuccess();
5423
5424 VkFence fence;
5425 VkFenceCreateInfo fence_create_info{};
5426 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5427 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5428
5429 VkSemaphore semaphore;
5430 VkSemaphoreCreateInfo semaphore_create_info{};
5431 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5432 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5433 &semaphore);
5434
5435 VkCommandPool command_pool;
5436 VkCommandPoolCreateInfo pool_create_info{};
5437 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5438 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5439 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5440 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5441 &command_pool);
5442
5443 VkCommandBuffer command_buffer[2];
5444 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5445 command_buffer_allocate_info.sType =
5446 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5447 command_buffer_allocate_info.commandPool = command_pool;
5448 command_buffer_allocate_info.commandBufferCount = 2;
5449 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5450 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5451 command_buffer);
5452
5453 VkQueue queue = VK_NULL_HANDLE;
5454 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5455 1, &queue);
5456
5457
5458 {
5459 VkCommandBufferBeginInfo begin_info{};
5460 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5461 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5462
5463 vkCmdPipelineBarrier(command_buffer[0],
5464 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5465 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5466 0, nullptr, 0, nullptr);
5467
5468 VkViewport viewport{};
5469 viewport.maxDepth = 1.0f;
5470 viewport.minDepth = 0.0f;
5471 viewport.width = 512;
5472 viewport.height = 512;
5473 viewport.x = 0;
5474 viewport.y = 0;
5475 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5476 vkEndCommandBuffer(command_buffer[0]);
5477 }
5478 {
5479 VkCommandBufferBeginInfo begin_info{};
5480 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5481 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5482
5483 VkViewport viewport{};
5484 viewport.maxDepth = 1.0f;
5485 viewport.minDepth = 0.0f;
5486 viewport.width = 512;
5487 viewport.height = 512;
5488 viewport.x = 0;
5489 viewport.y = 0;
5490 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5491 vkEndCommandBuffer(command_buffer[1]);
5492 }
5493 {
5494 VkSubmitInfo submit_info{};
5495 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5496 submit_info.commandBufferCount = 1;
5497 submit_info.pCommandBuffers = &command_buffer[0];
5498 submit_info.signalSemaphoreCount = 1;
5499 submit_info.pSignalSemaphores = &semaphore;
5500 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5501 }
5502 {
5503 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5504 VkSubmitInfo submit_info{};
5505 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5506 submit_info.commandBufferCount = 1;
5507 submit_info.pCommandBuffers = &command_buffer[1];
5508 submit_info.waitSemaphoreCount = 1;
5509 submit_info.pWaitSemaphores = &semaphore;
5510 submit_info.pWaitDstStageMask = flags;
5511 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5512 }
5513
5514 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5515
5516 vkDestroyFence(m_device->device(), fence, nullptr);
5517 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5518 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5519 &command_buffer[0]);
5520 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5521
5522 m_errorMonitor->VerifyNotFound();
5523}
5524
5525// This is a positive test. No errors should be generated.
5526TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
5527
5528 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5529 "on the same queue, sharing a signal/wait semaphore, the "
5530 "second having a fence, "
5531 "followed by a WaitForFences call.");
5532
5533 m_errorMonitor->ExpectSuccess();
5534
5535 VkFence fence;
5536 VkFenceCreateInfo fence_create_info{};
5537 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5538 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5539
5540 VkSemaphore semaphore;
5541 VkSemaphoreCreateInfo semaphore_create_info{};
5542 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5543 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5544 &semaphore);
5545
5546 VkCommandPool command_pool;
5547 VkCommandPoolCreateInfo pool_create_info{};
5548 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5549 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5550 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5551 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5552 &command_pool);
5553
5554 VkCommandBuffer command_buffer[2];
5555 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5556 command_buffer_allocate_info.sType =
5557 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5558 command_buffer_allocate_info.commandPool = command_pool;
5559 command_buffer_allocate_info.commandBufferCount = 2;
5560 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5561 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5562 command_buffer);
5563
5564 {
5565 VkCommandBufferBeginInfo begin_info{};
5566 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5567 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5568
5569 vkCmdPipelineBarrier(command_buffer[0],
5570 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5571 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5572 0, nullptr, 0, nullptr);
5573
5574 VkViewport viewport{};
5575 viewport.maxDepth = 1.0f;
5576 viewport.minDepth = 0.0f;
5577 viewport.width = 512;
5578 viewport.height = 512;
5579 viewport.x = 0;
5580 viewport.y = 0;
5581 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5582 vkEndCommandBuffer(command_buffer[0]);
5583 }
5584 {
5585 VkCommandBufferBeginInfo begin_info{};
5586 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5587 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5588
5589 VkViewport viewport{};
5590 viewport.maxDepth = 1.0f;
5591 viewport.minDepth = 0.0f;
5592 viewport.width = 512;
5593 viewport.height = 512;
5594 viewport.x = 0;
5595 viewport.y = 0;
5596 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5597 vkEndCommandBuffer(command_buffer[1]);
5598 }
5599 {
5600 VkSubmitInfo submit_info{};
5601 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5602 submit_info.commandBufferCount = 1;
5603 submit_info.pCommandBuffers = &command_buffer[0];
5604 submit_info.signalSemaphoreCount = 1;
5605 submit_info.pSignalSemaphores = &semaphore;
5606 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5607 }
5608 {
5609 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5610 VkSubmitInfo submit_info{};
5611 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5612 submit_info.commandBufferCount = 1;
5613 submit_info.pCommandBuffers = &command_buffer[1];
5614 submit_info.waitSemaphoreCount = 1;
5615 submit_info.pWaitSemaphores = &semaphore;
5616 submit_info.pWaitDstStageMask = flags;
5617 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5618 }
5619
5620 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5621
5622 vkDestroyFence(m_device->device(), fence, nullptr);
5623 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5624 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5625 &command_buffer[0]);
5626 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5627
5628 m_errorMonitor->VerifyNotFound();
5629}
5630
5631// This is a positive test. No errors should be generated.
5632TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
5633
5634 TEST_DESCRIPTION(
5635 "Two command buffers, each in a separate QueueSubmit call "
5636 "on the same queue, no fences, followed by a third QueueSubmit with NO "
5637 "SubmitInfos but with a fence, followed by a WaitForFences call.");
5638
5639 m_errorMonitor->ExpectSuccess();
5640
5641 VkFence fence;
5642 VkFenceCreateInfo fence_create_info{};
5643 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5644 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5645
5646 VkCommandPool command_pool;
5647 VkCommandPoolCreateInfo pool_create_info{};
5648 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5649 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5650 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5651 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5652 &command_pool);
5653
5654 VkCommandBuffer command_buffer[2];
5655 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5656 command_buffer_allocate_info.sType =
5657 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5658 command_buffer_allocate_info.commandPool = command_pool;
5659 command_buffer_allocate_info.commandBufferCount = 2;
5660 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5661 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5662 command_buffer);
5663
5664 {
5665 VkCommandBufferBeginInfo begin_info{};
5666 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5667 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5668
5669 vkCmdPipelineBarrier(command_buffer[0],
5670 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5671 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5672 0, nullptr, 0, nullptr);
5673
5674 VkViewport viewport{};
5675 viewport.maxDepth = 1.0f;
5676 viewport.minDepth = 0.0f;
5677 viewport.width = 512;
5678 viewport.height = 512;
5679 viewport.x = 0;
5680 viewport.y = 0;
5681 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5682 vkEndCommandBuffer(command_buffer[0]);
5683 }
5684 {
5685 VkCommandBufferBeginInfo begin_info{};
5686 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5687 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5688
5689 VkViewport viewport{};
5690 viewport.maxDepth = 1.0f;
5691 viewport.minDepth = 0.0f;
5692 viewport.width = 512;
5693 viewport.height = 512;
5694 viewport.x = 0;
5695 viewport.y = 0;
5696 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5697 vkEndCommandBuffer(command_buffer[1]);
5698 }
5699 {
5700 VkSubmitInfo submit_info{};
5701 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5702 submit_info.commandBufferCount = 1;
5703 submit_info.pCommandBuffers = &command_buffer[0];
5704 submit_info.signalSemaphoreCount = 0;
5705 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
5706 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5707 }
5708 {
5709 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5710 VkSubmitInfo submit_info{};
5711 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5712 submit_info.commandBufferCount = 1;
5713 submit_info.pCommandBuffers = &command_buffer[1];
5714 submit_info.waitSemaphoreCount = 0;
5715 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
5716 submit_info.pWaitDstStageMask = flags;
5717 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5718 }
5719
5720 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
5721
Mike Stroyancd1c3e52016-06-21 09:20:01 -06005722 VkResult err =
5723 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5724 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005725
5726 vkDestroyFence(m_device->device(), fence, nullptr);
5727 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5728 &command_buffer[0]);
5729 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5730
5731 m_errorMonitor->VerifyNotFound();
5732}
5733
5734// This is a positive test. No errors should be generated.
5735TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
5736
5737 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5738 "on the same queue, the second having a fence, followed "
5739 "by a WaitForFences call.");
5740
5741 m_errorMonitor->ExpectSuccess();
5742
5743 VkFence fence;
5744 VkFenceCreateInfo fence_create_info{};
5745 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5746 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5747
5748 VkCommandPool command_pool;
5749 VkCommandPoolCreateInfo pool_create_info{};
5750 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5751 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5752 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5753 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5754 &command_pool);
5755
5756 VkCommandBuffer command_buffer[2];
5757 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5758 command_buffer_allocate_info.sType =
5759 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5760 command_buffer_allocate_info.commandPool = command_pool;
5761 command_buffer_allocate_info.commandBufferCount = 2;
5762 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5763 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5764 command_buffer);
5765
5766 {
5767 VkCommandBufferBeginInfo begin_info{};
5768 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5769 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5770
5771 vkCmdPipelineBarrier(command_buffer[0],
5772 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5773 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5774 0, nullptr, 0, nullptr);
5775
5776 VkViewport viewport{};
5777 viewport.maxDepth = 1.0f;
5778 viewport.minDepth = 0.0f;
5779 viewport.width = 512;
5780 viewport.height = 512;
5781 viewport.x = 0;
5782 viewport.y = 0;
5783 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5784 vkEndCommandBuffer(command_buffer[0]);
5785 }
5786 {
5787 VkCommandBufferBeginInfo begin_info{};
5788 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5789 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5790
5791 VkViewport viewport{};
5792 viewport.maxDepth = 1.0f;
5793 viewport.minDepth = 0.0f;
5794 viewport.width = 512;
5795 viewport.height = 512;
5796 viewport.x = 0;
5797 viewport.y = 0;
5798 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5799 vkEndCommandBuffer(command_buffer[1]);
5800 }
5801 {
5802 VkSubmitInfo submit_info{};
5803 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5804 submit_info.commandBufferCount = 1;
5805 submit_info.pCommandBuffers = &command_buffer[0];
5806 submit_info.signalSemaphoreCount = 0;
5807 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
5808 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5809 }
5810 {
5811 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5812 VkSubmitInfo submit_info{};
5813 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5814 submit_info.commandBufferCount = 1;
5815 submit_info.pCommandBuffers = &command_buffer[1];
5816 submit_info.waitSemaphoreCount = 0;
5817 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
5818 submit_info.pWaitDstStageMask = flags;
5819 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5820 }
5821
5822 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5823
5824 vkDestroyFence(m_device->device(), fence, nullptr);
5825 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5826 &command_buffer[0]);
5827 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5828
5829 m_errorMonitor->VerifyNotFound();
5830}
5831
5832// This is a positive test. No errors should be generated.
5833TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
5834
5835 TEST_DESCRIPTION(
5836 "Two command buffers each in a separate SubmitInfo sent in a single "
5837 "QueueSubmit call followed by a WaitForFences call.");
5838
5839 m_errorMonitor->ExpectSuccess();
5840
5841 VkFence fence;
5842 VkFenceCreateInfo fence_create_info{};
5843 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5844 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5845
5846 VkSemaphore semaphore;
5847 VkSemaphoreCreateInfo semaphore_create_info{};
5848 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5849 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5850 &semaphore);
5851
5852 VkCommandPool command_pool;
5853 VkCommandPoolCreateInfo pool_create_info{};
5854 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5855 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5856 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5857 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5858 &command_pool);
5859
5860 VkCommandBuffer command_buffer[2];
5861 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5862 command_buffer_allocate_info.sType =
5863 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5864 command_buffer_allocate_info.commandPool = command_pool;
5865 command_buffer_allocate_info.commandBufferCount = 2;
5866 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5867 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5868 command_buffer);
5869
5870 {
5871 VkCommandBufferBeginInfo begin_info{};
5872 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5873 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5874
5875 vkCmdPipelineBarrier(command_buffer[0],
5876 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5877 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5878 0, nullptr, 0, nullptr);
5879
5880 VkViewport viewport{};
5881 viewport.maxDepth = 1.0f;
5882 viewport.minDepth = 0.0f;
5883 viewport.width = 512;
5884 viewport.height = 512;
5885 viewport.x = 0;
5886 viewport.y = 0;
5887 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5888 vkEndCommandBuffer(command_buffer[0]);
5889 }
5890 {
5891 VkCommandBufferBeginInfo begin_info{};
5892 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5893 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5894
5895 VkViewport viewport{};
5896 viewport.maxDepth = 1.0f;
5897 viewport.minDepth = 0.0f;
5898 viewport.width = 512;
5899 viewport.height = 512;
5900 viewport.x = 0;
5901 viewport.y = 0;
5902 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5903 vkEndCommandBuffer(command_buffer[1]);
5904 }
5905 {
5906 VkSubmitInfo submit_info[2];
5907 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5908
5909 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5910 submit_info[0].pNext = NULL;
5911 submit_info[0].commandBufferCount = 1;
5912 submit_info[0].pCommandBuffers = &command_buffer[0];
5913 submit_info[0].signalSemaphoreCount = 1;
5914 submit_info[0].pSignalSemaphores = &semaphore;
5915 submit_info[0].waitSemaphoreCount = 0;
5916 submit_info[0].pWaitSemaphores = NULL;
5917 submit_info[0].pWaitDstStageMask = 0;
5918
5919 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5920 submit_info[1].pNext = NULL;
5921 submit_info[1].commandBufferCount = 1;
5922 submit_info[1].pCommandBuffers = &command_buffer[1];
5923 submit_info[1].waitSemaphoreCount = 1;
5924 submit_info[1].pWaitSemaphores = &semaphore;
5925 submit_info[1].pWaitDstStageMask = flags;
5926 submit_info[1].signalSemaphoreCount = 0;
5927 submit_info[1].pSignalSemaphores = NULL;
5928 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
5929 }
5930
5931 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5932
5933 vkDestroyFence(m_device->device(), fence, nullptr);
5934 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5935 &command_buffer[0]);
5936 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06005937 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005938
5939 m_errorMonitor->VerifyNotFound();
5940}
5941
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005942TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005943 TEST_DESCRIPTION(
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005944 "Run a simple draw calls to validate failure when Depth Bias dynamic "
5945 "state is required but not correctly bound.");
5946
5947 // Dynamic depth bias
5948 m_errorMonitor->SetDesiredFailureMsg(
5949 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5950 "Dynamic depth bias state not set for this command buffer");
5951 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5952 BsoFailDepthBias);
5953 m_errorMonitor->VerifyFound();
5954}
5955
5956TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
5957 TEST_DESCRIPTION(
5958 "Run a simple draw calls to validate failure when Line Width dynamic "
5959 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005960
5961 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07005962 m_errorMonitor->SetDesiredFailureMsg(
5963 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005964 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005965 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5966 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005967 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005968}
5969
5970TEST_F(VkLayerTest, DynamicViewportNotBound) {
5971 TEST_DESCRIPTION(
5972 "Run a simple draw calls to validate failure when Viewport dynamic "
5973 "state is required but not correctly bound.");
5974
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005975 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07005976 m_errorMonitor->SetDesiredFailureMsg(
5977 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005978 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005979 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5980 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005981 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005982}
5983
5984TEST_F(VkLayerTest, DynamicScissorNotBound) {
5985 TEST_DESCRIPTION(
5986 "Run a simple draw calls to validate failure when Scissor dynamic "
5987 "state is required but not correctly bound.");
5988
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005989 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07005990 m_errorMonitor->SetDesiredFailureMsg(
5991 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005992 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005993 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5994 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005995 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005996}
5997
Tobin Ehlis21c88352016-05-26 06:15:45 -06005998TEST_F(VkLayerTest, DynamiBlendConstantsNotBound) {
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005999 TEST_DESCRIPTION(
Tobin Ehlis21c88352016-05-26 06:15:45 -06006000 "Run a simple draw calls to validate failure when Blend Constants "
6001 "dynamic state is required but not correctly bound.");
6002 // Dynamic blend constant state
6003 m_errorMonitor->SetDesiredFailureMsg(
6004 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6005 "Dynamic blend constants state not set for this command buffer");
6006 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6007 BsoFailBlend);
6008 m_errorMonitor->VerifyFound();
6009}
6010
6011TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
6012 TEST_DESCRIPTION(
6013 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006014 "state is required but not correctly bound.");
Tobin Ehlis21c88352016-05-26 06:15:45 -06006015 if (!m_device->phy().features().depthBounds) {
6016 printf("Device does not support depthBounds test; skipped.\n");
6017 return;
6018 }
6019 // Dynamic depth bounds
Karl Schultz6addd812016-02-02 17:17:23 -07006020 m_errorMonitor->SetDesiredFailureMsg(
6021 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006022 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006023 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6024 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006025 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006026}
6027
6028TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
6029 TEST_DESCRIPTION(
6030 "Run a simple draw calls to validate failure when Stencil Read dynamic "
6031 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006032 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07006033 m_errorMonitor->SetDesiredFailureMsg(
6034 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006035 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006036 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6037 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006038 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006039}
6040
6041TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
6042 TEST_DESCRIPTION(
6043 "Run a simple draw calls to validate failure when Stencil Write dynamic"
6044 " state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006045 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07006046 m_errorMonitor->SetDesiredFailureMsg(
6047 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006048 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006049 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6050 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006051 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06006052}
6053
6054TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
6055 TEST_DESCRIPTION(
6056 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
6057 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06006058 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07006059 m_errorMonitor->SetDesiredFailureMsg(
6060 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006061 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07006062 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
6063 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006064 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06006065}
6066
Karl Schultz6addd812016-02-02 17:17:23 -07006067TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Karl Schultz6addd812016-02-02 17:17:23 -07006068 m_errorMonitor->SetDesiredFailureMsg(
6069 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6070 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
6071 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006072
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006073 ASSERT_NO_FATAL_FAILURE(InitState());
6074 ASSERT_NO_FATAL_FAILURE(InitViewport());
6075 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6076
Karl Schultz6addd812016-02-02 17:17:23 -07006077 // We luck out b/c by default the framework creates CB w/ the
6078 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006079 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006080 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
6081 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006082 EndCommandBuffer();
6083
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006084 // Bypass framework since it does the waits automatically
6085 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006086 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08006087 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6088 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006089 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006090 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07006091 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006092 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006093 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08006094 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006095 submit_info.pSignalSemaphores = NULL;
6096
Chris Forbes40028e22016-06-13 09:59:34 +12006097 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07006098 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006099
Karl Schultz6addd812016-02-02 17:17:23 -07006100 // Cause validation error by re-submitting cmd buffer that should only be
6101 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12006102 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006103
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006104 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006105}
6106
Karl Schultz6addd812016-02-02 17:17:23 -07006107TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006108 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07006109 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006110
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006111 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006112 "Unable to allocate 1 descriptors of "
6113 "type "
6114 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006115
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006116 ASSERT_NO_FATAL_FAILURE(InitState());
6117 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006118
Karl Schultz6addd812016-02-02 17:17:23 -07006119 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
6120 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006121 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006122 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
6123 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006124
6125 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006126 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6127 ds_pool_ci.pNext = NULL;
6128 ds_pool_ci.flags = 0;
6129 ds_pool_ci.maxSets = 1;
6130 ds_pool_ci.poolSizeCount = 1;
6131 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006132
6133 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006134 err =
6135 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006136 ASSERT_VK_SUCCESS(err);
6137
6138 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006139 dsl_binding.binding = 0;
6140 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6141 dsl_binding.descriptorCount = 1;
6142 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6143 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006144
6145 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006146 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6147 ds_layout_ci.pNext = NULL;
6148 ds_layout_ci.bindingCount = 1;
6149 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006150
6151 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006152 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6153 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006154 ASSERT_VK_SUCCESS(err);
6155
6156 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006157 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006158 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006159 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006160 alloc_info.descriptorPool = ds_pool;
6161 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006162 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6163 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006164
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006165 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006166
Chia-I Wuf7458c52015-10-26 21:10:41 +08006167 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6168 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006169}
6170
Karl Schultz6addd812016-02-02 17:17:23 -07006171TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
6172 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06006173
Karl Schultz6addd812016-02-02 17:17:23 -07006174 m_errorMonitor->SetDesiredFailureMsg(
6175 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6176 "It is invalid to call vkFreeDescriptorSets() with a pool created "
6177 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006178
Tobin Ehlise735c692015-10-08 13:13:50 -06006179 ASSERT_NO_FATAL_FAILURE(InitState());
6180 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06006181
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006182 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006183 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6184 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06006185
6186 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006187 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6188 ds_pool_ci.pNext = NULL;
6189 ds_pool_ci.maxSets = 1;
6190 ds_pool_ci.poolSizeCount = 1;
6191 ds_pool_ci.flags = 0;
6192 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
6193 // app can only call vkResetDescriptorPool on this pool.;
6194 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06006195
6196 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006197 err =
6198 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06006199 ASSERT_VK_SUCCESS(err);
6200
6201 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006202 dsl_binding.binding = 0;
6203 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6204 dsl_binding.descriptorCount = 1;
6205 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6206 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06006207
6208 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006209 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6210 ds_layout_ci.pNext = NULL;
6211 ds_layout_ci.bindingCount = 1;
6212 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06006213
6214 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006215 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6216 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06006217 ASSERT_VK_SUCCESS(err);
6218
6219 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006220 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006221 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006222 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006223 alloc_info.descriptorPool = ds_pool;
6224 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006225 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6226 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06006227 ASSERT_VK_SUCCESS(err);
6228
6229 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006230 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06006231
Chia-I Wuf7458c52015-10-26 21:10:41 +08006232 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6233 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06006234}
6235
Karl Schultz6addd812016-02-02 17:17:23 -07006236TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006237 // Attempt to clear Descriptor Pool with bad object.
6238 // ObjectTracker should catch this.
6239 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6240 "Invalid VkDescriptorPool Object 0xbaad6001");
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006241 uint64_t fake_pool_handle = 0xbaad6001;
6242 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
6243 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06006244 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006245}
6246
Karl Schultz6addd812016-02-02 17:17:23 -07006247TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006248 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
6249 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006250 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06006251 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006252
6253 uint64_t fake_set_handle = 0xbaad6001;
6254 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006255 VkResult err;
6256 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6257 "Invalid VkDescriptorSet Object 0xbaad6001");
6258
6259 ASSERT_NO_FATAL_FAILURE(InitState());
6260
6261 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
6262 layout_bindings[0].binding = 0;
6263 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6264 layout_bindings[0].descriptorCount = 1;
6265 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
6266 layout_bindings[0].pImmutableSamplers = NULL;
6267
6268 VkDescriptorSetLayout descriptor_set_layout;
6269 VkDescriptorSetLayoutCreateInfo dslci = {};
6270 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6271 dslci.pNext = NULL;
6272 dslci.bindingCount = 1;
6273 dslci.pBindings = layout_bindings;
6274 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006275 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006276
6277 VkPipelineLayout pipeline_layout;
6278 VkPipelineLayoutCreateInfo plci = {};
6279 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6280 plci.pNext = NULL;
6281 plci.setLayoutCount = 1;
6282 plci.pSetLayouts = &descriptor_set_layout;
6283 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006284 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006285
6286 BeginCommandBuffer();
6287 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006288 pipeline_layout, 0, 1, &bad_set, 0, NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06006289 m_errorMonitor->VerifyFound();
6290 EndCommandBuffer();
6291 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
6292 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006293}
6294
Karl Schultz6addd812016-02-02 17:17:23 -07006295TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006296 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
6297 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006298 uint64_t fake_layout_handle = 0xbaad6001;
6299 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006300 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6301 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
6302
6303 VkPipelineLayout pipeline_layout;
6304 VkPipelineLayoutCreateInfo plci = {};
6305 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6306 plci.pNext = NULL;
6307 plci.setLayoutCount = 1;
6308 plci.pSetLayouts = &bad_layout;
6309 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
6310
6311 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006312}
6313
Mark Muellerd4914412016-06-13 17:52:06 -06006314TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
6315 TEST_DESCRIPTION("This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
6316 "1) A uniform buffer update must have a valid buffer index."
6317 "2) When using an array of descriptors in a single WriteDescriptor,"
6318 " the descriptor types and stageflags must all be the same."
6319 "3) Immutable Sampler state must match across descriptors");
6320
6321 const char *invalid_BufferInfo_ErrorMessage =
6322 "vkUpdateDescriptorSets: if pDescriptorWrites[0].descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, "
6323 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or "
6324 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pDescriptorWrites[0].pBufferInfo must not be NULL";
6325 const char *stateFlag_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06006326 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006327 const char *immutable_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06006328 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006329
Mark Muellerd4914412016-06-13 17:52:06 -06006330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_BufferInfo_ErrorMessage);
6331
6332 ASSERT_NO_FATAL_FAILURE(InitState());
6333 VkDescriptorPoolSize ds_type_count[4] = {};
6334 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6335 ds_type_count[0].descriptorCount = 1;
6336 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6337 ds_type_count[1].descriptorCount = 1;
6338 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6339 ds_type_count[2].descriptorCount = 1;
6340 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
6341 ds_type_count[3].descriptorCount = 1;
6342
6343 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6344 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6345 ds_pool_ci.maxSets = 1;
6346 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
6347 ds_pool_ci.pPoolSizes = ds_type_count;
6348
6349 VkDescriptorPool ds_pool;
6350 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6351 ASSERT_VK_SUCCESS(err);
6352
Mark Muellerb9896722016-06-16 09:54:29 -06006353 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006354 layout_binding[0].binding = 0;
6355 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6356 layout_binding[0].descriptorCount = 1;
6357 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6358 layout_binding[0].pImmutableSamplers = NULL;
6359
6360 layout_binding[1].binding = 1;
6361 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6362 layout_binding[1].descriptorCount = 1;
6363 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6364 layout_binding[1].pImmutableSamplers = NULL;
6365
6366 VkSamplerCreateInfo sampler_ci = {};
6367 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6368 sampler_ci.pNext = NULL;
6369 sampler_ci.magFilter = VK_FILTER_NEAREST;
6370 sampler_ci.minFilter = VK_FILTER_NEAREST;
6371 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6372 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6373 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6374 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6375 sampler_ci.mipLodBias = 1.0;
6376 sampler_ci.anisotropyEnable = VK_FALSE;
6377 sampler_ci.maxAnisotropy = 1;
6378 sampler_ci.compareEnable = VK_FALSE;
6379 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6380 sampler_ci.minLod = 1.0;
6381 sampler_ci.maxLod = 1.0;
6382 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6383 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6384 VkSampler sampler;
6385
6386 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6387 ASSERT_VK_SUCCESS(err);
6388
6389 layout_binding[2].binding = 2;
6390 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6391 layout_binding[2].descriptorCount = 1;
6392 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6393 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
6394
Mark Muellerd4914412016-06-13 17:52:06 -06006395 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6396 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6397 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
6398 ds_layout_ci.pBindings = layout_binding;
6399 VkDescriptorSetLayout ds_layout;
6400 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6401 ASSERT_VK_SUCCESS(err);
6402
6403 VkDescriptorSetAllocateInfo alloc_info = {};
6404 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6405 alloc_info.descriptorSetCount = 1;
6406 alloc_info.descriptorPool = ds_pool;
6407 alloc_info.pSetLayouts = &ds_layout;
6408 VkDescriptorSet descriptorSet;
6409 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6410 ASSERT_VK_SUCCESS(err);
6411
6412 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6413 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6414 pipeline_layout_ci.pNext = NULL;
6415 pipeline_layout_ci.setLayoutCount = 1;
6416 pipeline_layout_ci.pSetLayouts = &ds_layout;
6417
6418 VkPipelineLayout pipeline_layout;
6419 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6420 ASSERT_VK_SUCCESS(err);
6421
Mark Mueller5c838ce2016-06-16 09:54:29 -06006422 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006423 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6424 descriptor_write.dstSet = descriptorSet;
6425 descriptor_write.dstBinding = 0;
6426 descriptor_write.descriptorCount = 1;
6427 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6428
Mark Mueller5c838ce2016-06-16 09:54:29 -06006429 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06006430 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6431 m_errorMonitor->VerifyFound();
6432
6433 // Create a buffer to update the descriptor with
6434 uint32_t qfi = 0;
6435 VkBufferCreateInfo buffCI = {};
6436 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6437 buffCI.size = 1024;
6438 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6439 buffCI.queueFamilyIndexCount = 1;
6440 buffCI.pQueueFamilyIndices = &qfi;
6441
6442 VkBuffer dyub;
6443 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6444 ASSERT_VK_SUCCESS(err);
6445 VkDescriptorBufferInfo buffInfo = {};
6446 buffInfo.buffer = dyub;
6447 buffInfo.offset = 0;
6448 buffInfo.range = 1024;
6449
6450 descriptor_write.pBufferInfo = &buffInfo;
6451 descriptor_write.descriptorCount = 2;
6452
Mark Mueller5c838ce2016-06-16 09:54:29 -06006453 // 2) The stateFlags don't match between the first and second descriptor
Mark Muellerd4914412016-06-13 17:52:06 -06006454 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, stateFlag_ErrorMessage);
6455 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6456 m_errorMonitor->VerifyFound();
6457
Mark Mueller5c838ce2016-06-16 09:54:29 -06006458 // 3) The second descriptor has a null_ptr pImmutableSamplers and
6459 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06006460 descriptor_write.dstBinding = 1;
6461 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06006462
6463
6464 // Make pImageInfo index non-null to avoid complaints of it missing
6465 VkDescriptorImageInfo imageInfo = {};
6466 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6467 descriptor_write.pImageInfo = &imageInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06006468 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, immutable_ErrorMessage);
6469 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6470 m_errorMonitor->VerifyFound();
6471
Mark Muellerd4914412016-06-13 17:52:06 -06006472 vkDestroyBuffer(m_device->device(), dyub, NULL);
6473 vkDestroySampler(m_device->device(), sampler, NULL);
6474 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6475 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6476 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6477}
6478
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06006479TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
6480 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6481 "due to a buffer dependency being destroyed.");
6482 ASSERT_NO_FATAL_FAILURE(InitState());
6483
6484 VkImageObj image(m_device);
6485 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
6486 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
6487 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
6488 VK_IMAGE_TILING_OPTIMAL, 0);
6489 ASSERT_TRUE(image.initialized());
6490
6491 VkBuffer buffer;
6492 VkDeviceMemory mem;
6493 VkMemoryRequirements mem_reqs;
6494
6495 VkBufferCreateInfo buf_info = {};
6496 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6497 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6498 buf_info.size = 256;
6499 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6500 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
6501 ASSERT_VK_SUCCESS(err);
6502
6503 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
6504
6505 VkMemoryAllocateInfo alloc_info = {};
6506 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6507 alloc_info.allocationSize = 256;
6508 bool pass = false;
6509 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
6510 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
6511 if (!pass) {
6512 vkDestroyBuffer(m_device->device(), buffer, NULL);
6513 return;
6514 }
6515 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
6516 ASSERT_VK_SUCCESS(err);
6517
6518 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
6519 ASSERT_VK_SUCCESS(err);
6520
6521 VkBufferImageCopy region = {};
6522 region.bufferRowLength = 128;
6523 region.bufferImageHeight = 128;
6524 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6525
6526 region.imageSubresource.layerCount = 1;
6527 region.imageExtent.height = 4;
6528 region.imageExtent.width = 4;
6529 region.imageExtent.depth = 1;
6530 m_commandBuffer->BeginCommandBuffer();
6531 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer,
6532 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
6533 1, &region);
6534 m_commandBuffer->EndCommandBuffer();
6535
6536 m_errorMonitor->SetDesiredFailureMsg(
6537 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6538 " that is invalid because bound buffer ");
6539 // Destroy buffer dependency prior to submit to cause ERROR
6540 vkDestroyBuffer(m_device->device(), buffer, NULL);
6541
6542 VkSubmitInfo submit_info = {};
6543 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6544 submit_info.commandBufferCount = 1;
6545 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6546 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6547
6548 m_errorMonitor->VerifyFound();
6549 vkFreeMemory(m_device->handle(), mem, NULL);
6550}
6551
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006552TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
6553 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6554 "due to an image dependency being destroyed.");
6555 ASSERT_NO_FATAL_FAILURE(InitState());
6556
6557 VkImage image;
6558 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6559 VkImageCreateInfo image_create_info = {};
6560 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6561 image_create_info.pNext = NULL;
6562 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6563 image_create_info.format = tex_format;
6564 image_create_info.extent.width = 32;
6565 image_create_info.extent.height = 32;
6566 image_create_info.extent.depth = 1;
6567 image_create_info.mipLevels = 1;
6568 image_create_info.arrayLayers = 1;
6569 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6570 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6571 image_create_info.usage =
6572 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
6573 image_create_info.flags = 0;
6574 VkResult err =
6575 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6576 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06006577 // Have to bind memory to image before recording cmd in cmd buffer using it
6578 VkMemoryRequirements mem_reqs;
6579 VkDeviceMemory image_mem;
6580 bool pass;
6581 VkMemoryAllocateInfo mem_alloc = {};
6582 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6583 mem_alloc.pNext = NULL;
6584 mem_alloc.memoryTypeIndex = 0;
6585 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
6586 mem_alloc.allocationSize = mem_reqs.size;
6587 pass =
6588 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
6589 ASSERT_TRUE(pass);
6590 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
6591 ASSERT_VK_SUCCESS(err);
6592 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
6593 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006594
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006595 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06006596 VkClearColorValue ccv;
6597 ccv.float32[0] = 1.0f;
6598 ccv.float32[1] = 1.0f;
6599 ccv.float32[2] = 1.0f;
6600 ccv.float32[3] = 1.0f;
6601 VkImageSubresourceRange isr = {};
6602 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06006603 isr.baseArrayLayer = 0;
6604 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06006605 isr.layerCount = 1;
6606 isr.levelCount = 1;
6607 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image,
6608 VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006609 m_commandBuffer->EndCommandBuffer();
6610
6611 m_errorMonitor->SetDesiredFailureMsg(
6612 VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
6613 // Destroy image dependency prior to submit to cause ERROR
6614 vkDestroyImage(m_device->device(), image, NULL);
6615
6616 VkSubmitInfo submit_info = {};
6617 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6618 submit_info.commandBufferCount = 1;
6619 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6620 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6621
6622 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06006623 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006624}
6625
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06006626TEST_F(VkLayerTest, ImageMemoryNotBound) {
6627 TEST_DESCRIPTION(
6628 "Attempt to draw with an image which has not had memory bound to it.");
6629 ASSERT_NO_FATAL_FAILURE(InitState());
6630
6631 VkImage image;
6632 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6633 VkImageCreateInfo image_create_info = {};
6634 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6635 image_create_info.pNext = NULL;
6636 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6637 image_create_info.format = tex_format;
6638 image_create_info.extent.width = 32;
6639 image_create_info.extent.height = 32;
6640 image_create_info.extent.depth = 1;
6641 image_create_info.mipLevels = 1;
6642 image_create_info.arrayLayers = 1;
6643 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6644 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6645 image_create_info.usage =
6646 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
6647 image_create_info.flags = 0;
6648 VkResult err =
6649 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6650 ASSERT_VK_SUCCESS(err);
6651 // Have to bind memory to image before recording cmd in cmd buffer using it
6652 VkMemoryRequirements mem_reqs;
6653 VkDeviceMemory image_mem;
6654 bool pass;
6655 VkMemoryAllocateInfo mem_alloc = {};
6656 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6657 mem_alloc.pNext = NULL;
6658 mem_alloc.memoryTypeIndex = 0;
6659 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
6660 mem_alloc.allocationSize = mem_reqs.size;
6661 pass =
6662 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
6663 ASSERT_TRUE(pass);
6664 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
6665 ASSERT_VK_SUCCESS(err);
6666
6667 // Introduce error, do not call vkBindImageMemory(m_device->device(), image,
6668 // image_mem, 0);
6669 m_errorMonitor->SetDesiredFailureMsg(
6670 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6671 "used without first calling vkBindImageMemory");
6672
6673 m_commandBuffer->BeginCommandBuffer();
6674 VkClearColorValue ccv;
6675 ccv.float32[0] = 1.0f;
6676 ccv.float32[1] = 1.0f;
6677 ccv.float32[2] = 1.0f;
6678 ccv.float32[3] = 1.0f;
6679 VkImageSubresourceRange isr = {};
6680 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6681 isr.baseArrayLayer = 0;
6682 isr.baseMipLevel = 0;
6683 isr.layerCount = 1;
6684 isr.levelCount = 1;
6685 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image,
6686 VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
6687 m_commandBuffer->EndCommandBuffer();
6688
6689 m_errorMonitor->VerifyFound();
6690 vkDestroyImage(m_device->device(), image, NULL);
6691 vkFreeMemory(m_device->device(), image_mem, nullptr);
6692}
6693
6694TEST_F(VkLayerTest, BufferMemoryNotBound) {
6695 TEST_DESCRIPTION(
6696 "Attempt to copy from a buffer which has not had memory bound to it.");
6697 ASSERT_NO_FATAL_FAILURE(InitState());
6698
6699 VkImageObj image(m_device);
6700 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
6701 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
6702 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
6703 VK_IMAGE_TILING_OPTIMAL, 0);
6704 ASSERT_TRUE(image.initialized());
6705
6706 VkBuffer buffer;
6707 VkDeviceMemory mem;
6708 VkMemoryRequirements mem_reqs;
6709
6710 VkBufferCreateInfo buf_info = {};
6711 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6712 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6713 buf_info.size = 256;
6714 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6715 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
6716 ASSERT_VK_SUCCESS(err);
6717
6718 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
6719
6720 VkMemoryAllocateInfo alloc_info = {};
6721 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6722 alloc_info.allocationSize = 256;
6723 bool pass = false;
6724 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
6725 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
6726 if (!pass) {
6727 vkDestroyBuffer(m_device->device(), buffer, NULL);
6728 return;
6729 }
6730 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
6731 ASSERT_VK_SUCCESS(err);
6732
6733 // Introduce failure by not calling vkBindBufferMemory(m_device->device(),
6734 // buffer, mem, 0);
6735 m_errorMonitor->SetDesiredFailureMsg(
6736 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6737 "used without first calling vkBindBufferMemory");
6738 VkBufferImageCopy region = {};
6739 region.bufferRowLength = 128;
6740 region.bufferImageHeight = 128;
6741 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6742
6743 region.imageSubresource.layerCount = 1;
6744 region.imageExtent.height = 4;
6745 region.imageExtent.width = 4;
6746 region.imageExtent.depth = 1;
6747 m_commandBuffer->BeginCommandBuffer();
6748 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer,
6749 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
6750 1, &region);
6751 m_commandBuffer->EndCommandBuffer();
6752
6753 m_errorMonitor->VerifyFound();
6754
6755 vkDestroyBuffer(m_device->device(), buffer, NULL);
6756 vkFreeMemory(m_device->handle(), mem, NULL);
6757}
6758
Tobin Ehlis85940f52016-07-07 16:57:21 -06006759TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
6760 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6761 "due to an event dependency being destroyed.");
6762 ASSERT_NO_FATAL_FAILURE(InitState());
6763
6764 VkEvent event;
6765 VkEventCreateInfo evci = {};
6766 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
6767 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
6768 ASSERT_VK_SUCCESS(result);
6769
6770 m_commandBuffer->BeginCommandBuffer();
6771 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event,
6772 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
6773 m_commandBuffer->EndCommandBuffer();
6774
6775 m_errorMonitor->SetDesiredFailureMsg(
6776 VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
6777 // Destroy event dependency prior to submit to cause ERROR
6778 vkDestroyEvent(m_device->device(), event, NULL);
6779
6780 VkSubmitInfo submit_info = {};
6781 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6782 submit_info.commandBufferCount = 1;
6783 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6784 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6785
6786 m_errorMonitor->VerifyFound();
6787}
6788
Tobin Ehlisdbea7552016-07-08 14:33:31 -06006789TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
6790 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6791 "due to a query pool dependency being destroyed.");
6792 ASSERT_NO_FATAL_FAILURE(InitState());
6793
6794 VkQueryPool query_pool;
6795 VkQueryPoolCreateInfo qpci{};
6796 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
6797 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
6798 qpci.queryCount = 1;
6799 VkResult result =
6800 vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
6801 ASSERT_VK_SUCCESS(result);
6802
6803 m_commandBuffer->BeginCommandBuffer();
6804 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
6805 m_commandBuffer->EndCommandBuffer();
6806
6807 m_errorMonitor->SetDesiredFailureMsg(
6808 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6809 " that is invalid because bound query pool ");
6810 // Destroy query pool dependency prior to submit to cause ERROR
6811 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
6812
6813 VkSubmitInfo submit_info = {};
6814 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6815 submit_info.commandBufferCount = 1;
6816 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6817 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6818
6819 m_errorMonitor->VerifyFound();
6820}
6821
Tobin Ehlis24130d92016-07-08 15:50:53 -06006822TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
6823 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6824 "due to a pipeline dependency being destroyed.");
6825 ASSERT_NO_FATAL_FAILURE(InitState());
6826 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6827
6828 VkResult err;
6829
6830 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6831 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6832
6833 VkPipelineLayout pipeline_layout;
6834 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6835 &pipeline_layout);
6836 ASSERT_VK_SUCCESS(err);
6837
6838 VkPipelineViewportStateCreateInfo vp_state_ci = {};
6839 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
6840 vp_state_ci.viewportCount = 1;
6841 VkViewport vp = {}; // Just need dummy vp to point to
6842 vp_state_ci.pViewports = &vp; // Null vp w/ count of 1 should cause error
6843 vp_state_ci.scissorCount = 1;
6844 VkRect2D scissors = {}; // Dummy scissors to point to
6845 vp_state_ci.pScissors = &scissors;
6846 // No dynamic state
6847 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
6848 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
6849
6850 VkPipelineShaderStageCreateInfo shaderStages[2];
6851 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
6852
6853 VkShaderObj vs(m_device, bindStateVertShaderText,
6854 VK_SHADER_STAGE_VERTEX_BIT, this);
6855 VkShaderObj fs(m_device, bindStateFragShaderText,
6856 VK_SHADER_STAGE_FRAGMENT_BIT,
6857 this); // We shouldn't need a fragment shader
6858 // but add it to be able to run on more devices
6859 shaderStages[0] = vs.GetStageCreateInfo();
6860 shaderStages[1] = fs.GetStageCreateInfo();
6861
6862 VkPipelineVertexInputStateCreateInfo vi_ci = {};
6863 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
6864
6865 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
6866 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
6867 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
6868
6869 VkPipelineRasterizationStateCreateInfo rs_ci = {};
6870 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
6871
6872 VkPipelineColorBlendAttachmentState att = {};
6873 att.blendEnable = VK_FALSE;
6874 att.colorWriteMask = 0xf;
6875
6876 VkPipelineColorBlendStateCreateInfo cb_ci = {};
6877 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
6878 cb_ci.attachmentCount = 1;
6879 cb_ci.pAttachments = &att;
6880
6881 VkGraphicsPipelineCreateInfo gp_ci = {};
6882 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
6883 gp_ci.stageCount = 2;
6884 gp_ci.pStages = shaderStages;
6885 gp_ci.pVertexInputState = &vi_ci;
6886 gp_ci.pInputAssemblyState = &ia_ci;
6887 gp_ci.pViewportState = &vp_state_ci;
6888 gp_ci.pRasterizationState = &rs_ci;
6889 gp_ci.pColorBlendState = &cb_ci;
6890 gp_ci.pDynamicState = &dyn_state_ci;
6891 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
6892 gp_ci.layout = pipeline_layout;
6893 gp_ci.renderPass = renderPass();
6894
6895 VkPipelineCacheCreateInfo pc_ci = {};
6896 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
6897
6898 VkPipeline pipeline;
6899 VkPipelineCache pipelineCache;
6900 err =
6901 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
6902 ASSERT_VK_SUCCESS(err);
6903
6904 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
6905 &gp_ci, NULL, &pipeline);
6906 ASSERT_VK_SUCCESS(err);
6907
6908 m_commandBuffer->BeginCommandBuffer();
6909 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6910 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
6911 m_commandBuffer->EndCommandBuffer();
6912 // Now destroy pipeline in order to cause error when submitting
6913 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
6914
6915 m_errorMonitor->SetDesiredFailureMsg(
6916 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6917 " that is invalid because bound pipeline ");
6918
6919 VkSubmitInfo submit_info = {};
6920 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6921 submit_info.commandBufferCount = 1;
6922 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6923 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6924
6925 m_errorMonitor->VerifyFound();
6926 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
6927 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6928}
6929
Karl Schultz6addd812016-02-02 17:17:23 -07006930TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006931 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6932 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006933 // Create a valid cmd buffer
6934 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006935 uint64_t fake_pipeline_handle = 0xbaad6001;
6936 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006937 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6938 "Invalid VkPipeline Object 0xbaad6001");
6939 ASSERT_NO_FATAL_FAILURE(InitState());
6940 BeginCommandBuffer();
6941 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6942 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
6943 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006944 // Now issue a draw call with no pipeline bound
6945 m_errorMonitor->SetDesiredFailureMsg(
6946 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6947 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tony Barbourdf4c0042016-06-01 15:55:43 -06006948
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006949 BeginCommandBuffer();
6950 Draw(1, 0, 0, 0);
6951 m_errorMonitor->VerifyFound();
6952 // Finally same check once more but with Dispatch/Compute
6953 m_errorMonitor->SetDesiredFailureMsg(
6954 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6955 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006956 BeginCommandBuffer();
6957 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6958 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006959}
6960
Karl Schultz6addd812016-02-02 17:17:23 -07006961TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
6962 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
6963 // CommandBuffer
6964 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006965
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006966 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006967 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006968
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006969 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006970 ASSERT_NO_FATAL_FAILURE(InitViewport());
6971 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006972 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006973 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6974 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006975
6976 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006977 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6978 ds_pool_ci.pNext = NULL;
6979 ds_pool_ci.maxSets = 1;
6980 ds_pool_ci.poolSizeCount = 1;
6981 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006982
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006983 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006984 err =
6985 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006986 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006987
Tony Barboureb254902015-07-15 12:50:33 -06006988 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006989 dsl_binding.binding = 0;
6990 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6991 dsl_binding.descriptorCount = 1;
6992 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6993 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006994
Tony Barboureb254902015-07-15 12:50:33 -06006995 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006996 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6997 ds_layout_ci.pNext = NULL;
6998 ds_layout_ci.bindingCount = 1;
6999 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007000 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007001 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7002 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007003 ASSERT_VK_SUCCESS(err);
7004
7005 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007006 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007007 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007008 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007009 alloc_info.descriptorPool = ds_pool;
7010 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007011 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7012 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007013 ASSERT_VK_SUCCESS(err);
7014
Tony Barboureb254902015-07-15 12:50:33 -06007015 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007016 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7017 pipeline_layout_ci.pNext = NULL;
7018 pipeline_layout_ci.setLayoutCount = 1;
7019 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007020
7021 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007022 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7023 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007024 ASSERT_VK_SUCCESS(err);
7025
Karl Schultz6addd812016-02-02 17:17:23 -07007026 VkShaderObj vs(m_device, bindStateVertShaderText,
7027 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06007028 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07007029 // on more devices
7030 VkShaderObj fs(m_device, bindStateFragShaderText,
7031 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007032
Tony Barbourc95e4ac2015-08-04 17:05:26 -06007033 VkPipelineObj pipe(m_device);
7034 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06007035 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06007036 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06007037 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06007038
7039 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007040 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7041 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7042 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7043 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7044 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06007045
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007046 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007047
Chia-I Wuf7458c52015-10-26 21:10:41 +08007048 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7049 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7050 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007051}
7052
Karl Schultz6addd812016-02-02 17:17:23 -07007053TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007054 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07007055 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007056
Karl Schultz6addd812016-02-02 17:17:23 -07007057 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007058 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
7059 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007060
7061 ASSERT_NO_FATAL_FAILURE(InitState());
7062 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007063 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7064 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007065
7066 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007067 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7068 ds_pool_ci.pNext = NULL;
7069 ds_pool_ci.maxSets = 1;
7070 ds_pool_ci.poolSizeCount = 1;
7071 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007072
7073 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007074 err =
7075 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007076 ASSERT_VK_SUCCESS(err);
7077
7078 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007079 dsl_binding.binding = 0;
7080 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7081 dsl_binding.descriptorCount = 1;
7082 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7083 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007084
7085 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007086 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7087 ds_layout_ci.pNext = NULL;
7088 ds_layout_ci.bindingCount = 1;
7089 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007090 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007091 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7092 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007093 ASSERT_VK_SUCCESS(err);
7094
7095 VkDescriptorSet descriptorSet;
7096 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007097 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007098 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007099 alloc_info.descriptorPool = ds_pool;
7100 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007101 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7102 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007103 ASSERT_VK_SUCCESS(err);
7104
Karl Schultz6addd812016-02-02 17:17:23 -07007105 VkBufferView view =
7106 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007107 VkWriteDescriptorSet descriptor_write;
7108 memset(&descriptor_write, 0, sizeof(descriptor_write));
7109 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7110 descriptor_write.dstSet = descriptorSet;
7111 descriptor_write.dstBinding = 0;
7112 descriptor_write.descriptorCount = 1;
7113 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
7114 descriptor_write.pTexelBufferView = &view;
7115
7116 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7117
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007118 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07007119
7120 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7121 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7122}
7123
Mark Youngd339ba32016-05-30 13:28:35 -06007124TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
7125 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has"
7126 " no memory bound to it.");
7127
7128 VkResult err;
7129 m_errorMonitor->SetDesiredFailureMsg(
7130 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -06007131 "used without first calling vkBindBufferMemory");
Mark Youngd339ba32016-05-30 13:28:35 -06007132
7133 ASSERT_NO_FATAL_FAILURE(InitState());
7134
7135 // Create a buffer with no bound memory and then attempt to create
7136 // a buffer view.
7137 VkBufferCreateInfo buff_ci = {};
7138 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7139 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7140 buff_ci.size = 256;
7141 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7142 VkBuffer buffer;
7143 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
7144 ASSERT_VK_SUCCESS(err);
7145
7146 VkBufferViewCreateInfo buff_view_ci = {};
7147 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
7148 buff_view_ci.buffer = buffer;
7149 buff_view_ci.format = VK_FORMAT_R8_UNORM;
7150 buff_view_ci.range = VK_WHOLE_SIZE;
7151 VkBufferView buff_view;
7152 err =
7153 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
7154
7155 m_errorMonitor->VerifyFound();
7156 vkDestroyBuffer(m_device->device(), buffer, NULL);
7157 // If last error is success, it still created the view, so delete it.
7158 if (err == VK_SUCCESS) {
7159 vkDestroyBufferView(m_device->device(), buff_view, NULL);
7160 }
7161}
7162
Karl Schultz6addd812016-02-02 17:17:23 -07007163TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
7164 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
7165 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07007166 // 1. No dynamicOffset supplied
7167 // 2. Too many dynamicOffsets supplied
7168 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07007169 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007170 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007171 " requires 1 dynamicOffsets, but only "
7172 "0 dynamicOffsets are left in "
7173 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007174
7175 ASSERT_NO_FATAL_FAILURE(InitState());
7176 ASSERT_NO_FATAL_FAILURE(InitViewport());
7177 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7178
7179 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007180 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7181 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007182
7183 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007184 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7185 ds_pool_ci.pNext = NULL;
7186 ds_pool_ci.maxSets = 1;
7187 ds_pool_ci.poolSizeCount = 1;
7188 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007189
7190 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007191 err =
7192 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007193 ASSERT_VK_SUCCESS(err);
7194
7195 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007196 dsl_binding.binding = 0;
7197 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7198 dsl_binding.descriptorCount = 1;
7199 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7200 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007201
7202 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007203 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7204 ds_layout_ci.pNext = NULL;
7205 ds_layout_ci.bindingCount = 1;
7206 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007207 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007208 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7209 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007210 ASSERT_VK_SUCCESS(err);
7211
7212 VkDescriptorSet descriptorSet;
7213 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007214 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007215 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007216 alloc_info.descriptorPool = ds_pool;
7217 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007218 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7219 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007220 ASSERT_VK_SUCCESS(err);
7221
7222 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007223 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7224 pipeline_layout_ci.pNext = NULL;
7225 pipeline_layout_ci.setLayoutCount = 1;
7226 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007227
7228 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007229 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7230 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007231 ASSERT_VK_SUCCESS(err);
7232
7233 // Create a buffer to update the descriptor with
7234 uint32_t qfi = 0;
7235 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007236 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7237 buffCI.size = 1024;
7238 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7239 buffCI.queueFamilyIndexCount = 1;
7240 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007241
7242 VkBuffer dyub;
7243 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7244 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007245 // Allocate memory and bind to buffer so we can make it to the appropriate
7246 // error
7247 VkMemoryAllocateInfo mem_alloc = {};
7248 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7249 mem_alloc.pNext = NULL;
7250 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12007251 mem_alloc.memoryTypeIndex = 0;
7252
7253 VkMemoryRequirements memReqs;
7254 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
7255 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc,
7256 0);
7257 if (!pass) {
7258 vkDestroyBuffer(m_device->device(), dyub, NULL);
7259 return;
7260 }
7261
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007262 VkDeviceMemory mem;
7263 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
7264 ASSERT_VK_SUCCESS(err);
7265 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
7266 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007267 // Correctly update descriptor to avoid "NOT_UPDATED" error
7268 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007269 buffInfo.buffer = dyub;
7270 buffInfo.offset = 0;
7271 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007272
7273 VkWriteDescriptorSet descriptor_write;
7274 memset(&descriptor_write, 0, sizeof(descriptor_write));
7275 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7276 descriptor_write.dstSet = descriptorSet;
7277 descriptor_write.dstBinding = 0;
7278 descriptor_write.descriptorCount = 1;
7279 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7280 descriptor_write.pBufferInfo = &buffInfo;
7281
7282 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7283
7284 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007285 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7286 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7287 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007288 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07007289 uint32_t pDynOff[2] = {512, 756};
7290 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07007291 m_errorMonitor->SetDesiredFailureMsg(
7292 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07007293 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07007294 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7295 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7296 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12007297 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07007298 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007299 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7300 " dynamic offset 512 combined with "
7301 "offset 0 and range 1024 that "
7302 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07007303 // Create PSO to be used for draw-time errors below
7304 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007305 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007306 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007307 "out gl_PerVertex { \n"
7308 " vec4 gl_Position;\n"
7309 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007310 "void main(){\n"
7311 " gl_Position = vec4(1);\n"
7312 "}\n";
7313 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007314 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007315 "\n"
7316 "layout(location=0) out vec4 x;\n"
7317 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7318 "void main(){\n"
7319 " x = vec4(bar.y);\n"
7320 "}\n";
7321 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7322 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7323 VkPipelineObj pipe(m_device);
7324 pipe.AddShader(&vs);
7325 pipe.AddShader(&fs);
7326 pipe.AddColorAttachment();
7327 pipe.CreateVKPipeline(pipeline_layout, renderPass());
7328
Karl Schultz6addd812016-02-02 17:17:23 -07007329 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7330 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7331 // This update should succeed, but offset size of 512 will overstep buffer
7332 // /w range 1024 & size 1024
7333 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7334 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7335 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07007336 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007337 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007338
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007339 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06007340 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007341
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007342 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007343 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007344 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7345}
7346
Tobin 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,
Tobin Ehlis10fad692016-07-07 12:00:36 -06008099 "Invalid VkPipelineLayout 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();
9805 buf_barrier.size = VK_WHOLE_SIZE;
9806
9807 m_errorMonitor->SetDesiredFailureMsg(
9808 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9809 "Image is a depth and stencil format and thus must "
9810 "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
9811 "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());
9815 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9816 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9817 img_barrier.image = ds_image.handle();
9818 // Leave aspectMask at COLOR on purpose
9819 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9820 VK_PIPELINE_STAGE_HOST_BIT,
9821 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9822 nullptr, 1, &img_barrier);
9823 m_errorMonitor->VerifyFound();
9824}
9825
Karl Schultz6addd812016-02-02 17:17:23 -07009826TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009827 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009828 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009829
Karl Schultz6addd812016-02-02 17:17:23 -07009830 m_errorMonitor->SetDesiredFailureMsg(
9831 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009832 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
9833
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009834 ASSERT_NO_FATAL_FAILURE(InitState());
9835 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009836 uint32_t qfi = 0;
9837 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009838 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9839 buffCI.size = 1024;
9840 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9841 buffCI.queueFamilyIndexCount = 1;
9842 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009843
9844 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009845 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009846 ASSERT_VK_SUCCESS(err);
9847
9848 BeginCommandBuffer();
9849 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009850 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9851 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009852 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07009853 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
9854 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009855
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009856 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009857
Chia-I Wuf7458c52015-10-26 21:10:41 +08009858 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009859}
9860
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009861TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9862 // Create an out-of-range queueFamilyIndex
9863 m_errorMonitor->SetDesiredFailureMsg(
9864 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesde628532016-04-21 16:30:17 -06009865 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
9866 "of the indices specified when the device was created, via the "
9867 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009868
9869 ASSERT_NO_FATAL_FAILURE(InitState());
9870 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9871 VkBufferCreateInfo buffCI = {};
9872 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9873 buffCI.size = 1024;
9874 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9875 buffCI.queueFamilyIndexCount = 1;
9876 // Introduce failure by specifying invalid queue_family_index
9877 uint32_t qfi = 777;
9878 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06009879 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009880
9881 VkBuffer ib;
9882 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
9883
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009884 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009885 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009886}
9887
Karl Schultz6addd812016-02-02 17:17:23 -07009888TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
9889 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
9890 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009891
Karl Schultz6addd812016-02-02 17:17:23 -07009892 m_errorMonitor->SetDesiredFailureMsg(
9893 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009894 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009895
9896 ASSERT_NO_FATAL_FAILURE(InitState());
9897 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009898
9899 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009900 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009901 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
9902 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009903
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009904 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009905}
9906
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009907TEST_F(VkLayerTest, DSUsageBitsErrors) {
9908 TEST_DESCRIPTION("Attempt to update descriptor sets for images and buffers "
9909 "that do not have correct usage bits sets.");
9910 VkResult err;
9911
9912 ASSERT_NO_FATAL_FAILURE(InitState());
9913 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9914 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9915 ds_type_count[i].type = VkDescriptorType(i);
9916 ds_type_count[i].descriptorCount = 1;
9917 }
9918 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9919 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9920 ds_pool_ci.pNext = NULL;
9921 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9922 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9923 ds_pool_ci.pPoolSizes = ds_type_count;
9924
9925 VkDescriptorPool ds_pool;
9926 err =
9927 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9928 ASSERT_VK_SUCCESS(err);
9929
9930 // Create 10 layouts where each has a single descriptor of different type
9931 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] =
9932 {};
9933 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9934 dsl_binding[i].binding = 0;
9935 dsl_binding[i].descriptorType = VkDescriptorType(i);
9936 dsl_binding[i].descriptorCount = 1;
9937 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9938 dsl_binding[i].pImmutableSamplers = NULL;
9939 }
9940
9941 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9942 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9943 ds_layout_ci.pNext = NULL;
9944 ds_layout_ci.bindingCount = 1;
9945 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9946 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9947 ds_layout_ci.pBindings = dsl_binding + i;
9948 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
9949 NULL, ds_layouts + i);
9950 ASSERT_VK_SUCCESS(err);
9951 }
9952 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9953 VkDescriptorSetAllocateInfo alloc_info = {};
9954 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9955 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9956 alloc_info.descriptorPool = ds_pool;
9957 alloc_info.pSetLayouts = ds_layouts;
9958 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9959 descriptor_sets);
9960 ASSERT_VK_SUCCESS(err);
9961
9962 // Create a buffer & bufferView to be used for invalid updates
9963 VkBufferCreateInfo buff_ci = {};
9964 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9965 // This usage is not valid for any descriptor type
9966 buff_ci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
9967 buff_ci.size = 256;
9968 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9969 VkBuffer buffer;
9970 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9971 ASSERT_VK_SUCCESS(err);
9972
9973 VkBufferViewCreateInfo buff_view_ci = {};
9974 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9975 buff_view_ci.buffer = buffer;
9976 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9977 buff_view_ci.range = VK_WHOLE_SIZE;
9978 VkBufferView buff_view;
9979 err =
9980 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
9981 ASSERT_VK_SUCCESS(err);
9982
9983 // Create an image to be used for invalid updates
9984 VkImageCreateInfo image_ci = {};
9985 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9986 image_ci.imageType = VK_IMAGE_TYPE_2D;
9987 image_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
9988 image_ci.extent.width = 64;
9989 image_ci.extent.height = 64;
9990 image_ci.extent.depth = 1;
9991 image_ci.mipLevels = 1;
9992 image_ci.arrayLayers = 1;
9993 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
9994 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9995 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
9996 // This usage is not valid for any descriptor type
9997 image_ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9998 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9999 VkImage image;
10000 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10001 ASSERT_VK_SUCCESS(err);
10002 // Bind memory to image
10003 VkMemoryRequirements mem_reqs;
10004 VkDeviceMemory image_mem;
10005 bool pass;
10006 VkMemoryAllocateInfo mem_alloc = {};
10007 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10008 mem_alloc.pNext = NULL;
10009 mem_alloc.allocationSize = 0;
10010 mem_alloc.memoryTypeIndex = 0;
10011 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10012 mem_alloc.allocationSize = mem_reqs.size;
10013 pass =
10014 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10015 ASSERT_TRUE(pass);
10016 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10017 ASSERT_VK_SUCCESS(err);
10018 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10019 ASSERT_VK_SUCCESS(err);
10020 // Now create view for image
10021 VkImageViewCreateInfo image_view_ci = {};
10022 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10023 image_view_ci.image = image;
10024 image_view_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
10025 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10026 image_view_ci.subresourceRange.layerCount = 1;
10027 image_view_ci.subresourceRange.baseArrayLayer = 0;
10028 image_view_ci.subresourceRange.levelCount = 1;
10029 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10030 VkImageView image_view;
10031 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
10032 &image_view);
10033 ASSERT_VK_SUCCESS(err);
10034
10035 VkDescriptorBufferInfo buff_info = {};
10036 buff_info.buffer = buffer;
10037 VkDescriptorImageInfo img_info = {};
10038 img_info.imageView = image_view;
10039 VkWriteDescriptorSet descriptor_write = {};
10040 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10041 descriptor_write.dstBinding = 0;
10042 descriptor_write.descriptorCount = 1;
10043 descriptor_write.pTexelBufferView = &buff_view;
10044 descriptor_write.pBufferInfo = &buff_info;
10045 descriptor_write.pImageInfo = &img_info;
10046
10047 // These error messages align with VkDescriptorType struct
10048 const char *error_msgs[] = {
10049 "", // placeholder, no error for SAMPLER descriptor
10050 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
10051 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
10052 " does not have VK_IMAGE_USAGE_STORAGE_BIT set.",
10053 " does not have VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT set.",
10054 " does not have VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set.",
10055 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
10056 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
10057 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
10058 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
10059 " does not have VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set."};
10060 // Start loop at 1 as SAMPLER desc type has no usage bit error
10061 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10062 descriptor_write.descriptorType = VkDescriptorType(i);
10063 descriptor_write.dstSet = descriptor_sets[i];
10064 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10065 error_msgs[i]);
10066
10067 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
10068 NULL);
10069
10070 m_errorMonitor->VerifyFound();
10071 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
10072 }
10073 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
10074 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060010075 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010076 vkDestroyImageView(m_device->device(), image_view, NULL);
10077 vkDestroyBuffer(m_device->device(), buffer, NULL);
10078 vkDestroyBufferView(m_device->device(), buff_view, NULL);
10079 vkFreeDescriptorSets(m_device->device(), ds_pool,
10080 VK_DESCRIPTOR_TYPE_RANGE_SIZE, descriptor_sets);
10081 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10082}
10083
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010084TEST_F(VkLayerTest, DSBufferInfoErrors) {
10085 TEST_DESCRIPTION(
10086 "Attempt to update buffer descriptor set that has incorrect "
10087 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
10088 "1. offset value greater than buffer size\n"
10089 "2. range value of 0\n"
10090 "3. range value greater than buffer (size - offset)");
10091 VkResult err;
10092
10093 ASSERT_NO_FATAL_FAILURE(InitState());
10094 VkDescriptorPoolSize ds_type_count = {};
10095 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10096 ds_type_count.descriptorCount = 1;
10097
10098 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10099 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10100 ds_pool_ci.pNext = NULL;
10101 ds_pool_ci.maxSets = 1;
10102 ds_pool_ci.poolSizeCount = 1;
10103 ds_pool_ci.pPoolSizes = &ds_type_count;
10104
10105 VkDescriptorPool ds_pool;
10106 err =
10107 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10108 ASSERT_VK_SUCCESS(err);
10109
10110 // Create layout with single uniform buffer descriptor
10111 VkDescriptorSetLayoutBinding dsl_binding = {};
10112 dsl_binding.binding = 0;
10113 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10114 dsl_binding.descriptorCount = 1;
10115 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10116 dsl_binding.pImmutableSamplers = NULL;
10117
10118 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10119 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10120 ds_layout_ci.pNext = NULL;
10121 ds_layout_ci.bindingCount = 1;
10122 ds_layout_ci.pBindings = &dsl_binding;
10123 VkDescriptorSetLayout ds_layout;
10124 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10125 &ds_layout);
10126 ASSERT_VK_SUCCESS(err);
10127
10128 VkDescriptorSet descriptor_set = {};
10129 VkDescriptorSetAllocateInfo alloc_info = {};
10130 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10131 alloc_info.descriptorSetCount = 1;
10132 alloc_info.descriptorPool = ds_pool;
10133 alloc_info.pSetLayouts = &ds_layout;
10134 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10135 &descriptor_set);
10136 ASSERT_VK_SUCCESS(err);
10137
10138 // Create a buffer to be used for invalid updates
10139 VkBufferCreateInfo buff_ci = {};
10140 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10141 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
10142 buff_ci.size = 256;
10143 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10144 VkBuffer buffer;
10145 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10146 ASSERT_VK_SUCCESS(err);
10147 // Have to bind memory to buffer before descriptor update
10148 VkMemoryAllocateInfo mem_alloc = {};
10149 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10150 mem_alloc.pNext = NULL;
10151 mem_alloc.allocationSize = 256;
10152 mem_alloc.memoryTypeIndex = 0;
10153
10154 VkMemoryRequirements mem_reqs;
10155 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
10156 bool pass =
10157 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10158 if (!pass) {
10159 vkDestroyBuffer(m_device->device(), buffer, NULL);
10160 return;
10161 }
10162
10163 VkDeviceMemory mem;
10164 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
10165 ASSERT_VK_SUCCESS(err);
10166 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
10167 ASSERT_VK_SUCCESS(err);
10168
10169 VkDescriptorBufferInfo buff_info = {};
10170 buff_info.buffer = buffer;
10171 // First make offset 1 larger than buffer size
10172 buff_info.offset = 257;
10173 buff_info.range = VK_WHOLE_SIZE;
10174 VkWriteDescriptorSet descriptor_write = {};
10175 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10176 descriptor_write.dstBinding = 0;
10177 descriptor_write.descriptorCount = 1;
10178 descriptor_write.pTexelBufferView = nullptr;
10179 descriptor_write.pBufferInfo = &buff_info;
10180 descriptor_write.pImageInfo = nullptr;
10181
10182 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10183 descriptor_write.dstSet = descriptor_set;
10184 m_errorMonitor->SetDesiredFailureMsg(
10185 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10186 " offset of 257 is greater than buffer ");
10187
10188 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10189
10190 m_errorMonitor->VerifyFound();
10191 // Now cause error due to range of 0
10192 buff_info.offset = 0;
10193 buff_info.range = 0;
10194 m_errorMonitor->SetDesiredFailureMsg(
10195 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10196 " range is not VK_WHOLE_SIZE and is zero, which is not allowed.");
10197
10198 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10199
10200 m_errorMonitor->VerifyFound();
10201 // Now cause error due to range exceeding buffer size - offset
10202 buff_info.offset = 128;
10203 buff_info.range = 200;
10204 m_errorMonitor->SetDesiredFailureMsg(
10205 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10206 " range is 200 which is greater than buffer size ");
10207
10208 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10209
10210 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -060010211 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010212 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10213 vkDestroyBuffer(m_device->device(), buffer, NULL);
10214 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10215 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10216}
10217
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010218TEST_F(VkLayerTest, DSAspectBitsErrors) {
10219 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
10220 // are set, but could expand this test to hit more cases.
10221 TEST_DESCRIPTION("Attempt to update descriptor sets for images "
10222 "that do not have correct aspect bits sets.");
10223 VkResult err;
10224
10225 ASSERT_NO_FATAL_FAILURE(InitState());
10226 VkDescriptorPoolSize ds_type_count = {};
10227 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10228 ds_type_count.descriptorCount = 1;
10229
10230 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10231 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10232 ds_pool_ci.pNext = NULL;
10233 ds_pool_ci.maxSets = 5;
10234 ds_pool_ci.poolSizeCount = 1;
10235 ds_pool_ci.pPoolSizes = &ds_type_count;
10236
10237 VkDescriptorPool ds_pool;
10238 err =
10239 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10240 ASSERT_VK_SUCCESS(err);
10241
10242 VkDescriptorSetLayoutBinding dsl_binding = {};
10243 dsl_binding.binding = 0;
10244 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10245 dsl_binding.descriptorCount = 1;
10246 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10247 dsl_binding.pImmutableSamplers = NULL;
10248
10249 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10250 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10251 ds_layout_ci.pNext = NULL;
10252 ds_layout_ci.bindingCount = 1;
10253 ds_layout_ci.pBindings = &dsl_binding;
10254 VkDescriptorSetLayout ds_layout;
10255 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10256 &ds_layout);
10257 ASSERT_VK_SUCCESS(err);
10258
10259 VkDescriptorSet descriptor_set = {};
10260 VkDescriptorSetAllocateInfo alloc_info = {};
10261 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10262 alloc_info.descriptorSetCount = 1;
10263 alloc_info.descriptorPool = ds_pool;
10264 alloc_info.pSetLayouts = &ds_layout;
10265 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10266 &descriptor_set);
10267 ASSERT_VK_SUCCESS(err);
10268
10269 // Create an image to be used for invalid updates
10270 VkImageCreateInfo image_ci = {};
10271 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10272 image_ci.imageType = VK_IMAGE_TYPE_2D;
10273 image_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
10274 image_ci.extent.width = 64;
10275 image_ci.extent.height = 64;
10276 image_ci.extent.depth = 1;
10277 image_ci.mipLevels = 1;
10278 image_ci.arrayLayers = 1;
10279 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
10280 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
10281 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10282 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10283 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10284 VkImage image;
10285 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10286 ASSERT_VK_SUCCESS(err);
10287 // Bind memory to image
10288 VkMemoryRequirements mem_reqs;
10289 VkDeviceMemory image_mem;
10290 bool pass;
10291 VkMemoryAllocateInfo mem_alloc = {};
10292 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10293 mem_alloc.pNext = NULL;
10294 mem_alloc.allocationSize = 0;
10295 mem_alloc.memoryTypeIndex = 0;
10296 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10297 mem_alloc.allocationSize = mem_reqs.size;
10298 pass =
10299 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
10300 ASSERT_TRUE(pass);
10301 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10302 ASSERT_VK_SUCCESS(err);
10303 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10304 ASSERT_VK_SUCCESS(err);
10305 // Now create view for image
10306 VkImageViewCreateInfo image_view_ci = {};
10307 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10308 image_view_ci.image = image;
10309 image_view_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
10310 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10311 image_view_ci.subresourceRange.layerCount = 1;
10312 image_view_ci.subresourceRange.baseArrayLayer = 0;
10313 image_view_ci.subresourceRange.levelCount = 1;
10314 // Setting both depth & stencil aspect bits is illegal for descriptor
10315 image_view_ci.subresourceRange.aspectMask =
10316 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
10317
10318 VkImageView image_view;
10319 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
10320 &image_view);
10321 ASSERT_VK_SUCCESS(err);
10322
10323 VkDescriptorImageInfo img_info = {};
10324 img_info.imageView = image_view;
10325 VkWriteDescriptorSet descriptor_write = {};
10326 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10327 descriptor_write.dstBinding = 0;
10328 descriptor_write.descriptorCount = 1;
10329 descriptor_write.pTexelBufferView = NULL;
10330 descriptor_write.pBufferInfo = NULL;
10331 descriptor_write.pImageInfo = &img_info;
10332 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10333 descriptor_write.dstSet = descriptor_set;
10334 const char *error_msg = " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10335 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
10336 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10337 error_msg);
10338
10339 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10340
10341 m_errorMonitor->VerifyFound();
10342 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10343 vkDestroyImage(m_device->device(), image, NULL);
10344 vkFreeMemory(m_device->device(), image_mem, NULL);
10345 vkDestroyImageView(m_device->device(), image_view, NULL);
10346 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10347 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10348}
10349
Karl Schultz6addd812016-02-02 17:17:23 -070010350TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010351 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010352 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010353
Karl Schultz6addd812016-02-02 17:17:23 -070010354 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010355 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10356 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10357 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010358
Tobin Ehlis3b780662015-05-28 12:11:26 -060010359 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010360 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010361 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010362 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10363 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010364
10365 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010366 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10367 ds_pool_ci.pNext = NULL;
10368 ds_pool_ci.maxSets = 1;
10369 ds_pool_ci.poolSizeCount = 1;
10370 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010371
Tobin Ehlis3b780662015-05-28 12:11:26 -060010372 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010373 err =
10374 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010375 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010376 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010377 dsl_binding.binding = 0;
10378 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10379 dsl_binding.descriptorCount = 1;
10380 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10381 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010382
Tony Barboureb254902015-07-15 12:50:33 -060010383 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010384 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10385 ds_layout_ci.pNext = NULL;
10386 ds_layout_ci.bindingCount = 1;
10387 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010388
Tobin Ehlis3b780662015-05-28 12:11:26 -060010389 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010390 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10391 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010392 ASSERT_VK_SUCCESS(err);
10393
10394 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010395 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010396 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010397 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010398 alloc_info.descriptorPool = ds_pool;
10399 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010400 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10401 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010402 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010403
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010404 VkSamplerCreateInfo sampler_ci = {};
10405 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10406 sampler_ci.pNext = NULL;
10407 sampler_ci.magFilter = VK_FILTER_NEAREST;
10408 sampler_ci.minFilter = VK_FILTER_NEAREST;
10409 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10410 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10411 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10412 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10413 sampler_ci.mipLodBias = 1.0;
10414 sampler_ci.anisotropyEnable = VK_FALSE;
10415 sampler_ci.maxAnisotropy = 1;
10416 sampler_ci.compareEnable = VK_FALSE;
10417 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10418 sampler_ci.minLod = 1.0;
10419 sampler_ci.maxLod = 1.0;
10420 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10421 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10422 VkSampler sampler;
10423 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10424 ASSERT_VK_SUCCESS(err);
10425
10426 VkDescriptorImageInfo info = {};
10427 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010428
10429 VkWriteDescriptorSet descriptor_write;
10430 memset(&descriptor_write, 0, sizeof(descriptor_write));
10431 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010432 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010433 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010434 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010435 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010436 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010437
10438 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10439
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010440 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010441
Chia-I Wuf7458c52015-10-26 21:10:41 +080010442 vkDestroySampler(m_device->device(), sampler, NULL);
10443 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10444 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010445}
10446
Karl Schultz6addd812016-02-02 17:17:23 -070010447TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010448 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010449 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010450
Karl Schultz6addd812016-02-02 17:17:23 -070010451 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010452 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10453 " binding #0 with 1 total descriptors but update of 1 descriptors "
10454 "starting at binding offset of 0 combined with update array element "
10455 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010456
Tobin Ehlis3b780662015-05-28 12:11:26 -060010457 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010458 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010459 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010460 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10461 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010462
10463 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010464 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10465 ds_pool_ci.pNext = NULL;
10466 ds_pool_ci.maxSets = 1;
10467 ds_pool_ci.poolSizeCount = 1;
10468 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010469
Tobin Ehlis3b780662015-05-28 12:11:26 -060010470 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010471 err =
10472 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010473 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010474
Tony Barboureb254902015-07-15 12:50:33 -060010475 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010476 dsl_binding.binding = 0;
10477 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10478 dsl_binding.descriptorCount = 1;
10479 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10480 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010481
10482 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010483 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10484 ds_layout_ci.pNext = NULL;
10485 ds_layout_ci.bindingCount = 1;
10486 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010487
Tobin Ehlis3b780662015-05-28 12:11:26 -060010488 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010489 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10490 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010491 ASSERT_VK_SUCCESS(err);
10492
10493 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010494 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010495 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010496 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010497 alloc_info.descriptorPool = ds_pool;
10498 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010499 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10500 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010501 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010502
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010503 // Correctly update descriptor to avoid "NOT_UPDATED" error
10504 VkDescriptorBufferInfo buff_info = {};
10505 buff_info.buffer =
10506 VkBuffer(0); // Don't care about buffer handle for this test
10507 buff_info.offset = 0;
10508 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010509
10510 VkWriteDescriptorSet descriptor_write;
10511 memset(&descriptor_write, 0, sizeof(descriptor_write));
10512 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010513 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070010514 descriptor_write.dstArrayElement =
10515 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010516 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010517 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10518 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010519
10520 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10521
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010522 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010523
Chia-I Wuf7458c52015-10-26 21:10:41 +080010524 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10525 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010526}
10527
Karl Schultz6addd812016-02-02 17:17:23 -070010528TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
10529 // Create layout w/ count of 1 and attempt update to that layout w/ binding
10530 // index 2
10531 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010532
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010533 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10534 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010535
Tobin Ehlis3b780662015-05-28 12:11:26 -060010536 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010537 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010538 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010539 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10540 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010541
10542 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010543 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10544 ds_pool_ci.pNext = NULL;
10545 ds_pool_ci.maxSets = 1;
10546 ds_pool_ci.poolSizeCount = 1;
10547 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010548
Tobin Ehlis3b780662015-05-28 12:11:26 -060010549 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010550 err =
10551 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010552 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010553
Tony Barboureb254902015-07-15 12:50:33 -060010554 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010555 dsl_binding.binding = 0;
10556 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10557 dsl_binding.descriptorCount = 1;
10558 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10559 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010560
10561 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010562 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10563 ds_layout_ci.pNext = NULL;
10564 ds_layout_ci.bindingCount = 1;
10565 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010566 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010567 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10568 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010569 ASSERT_VK_SUCCESS(err);
10570
10571 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010572 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010573 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010574 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010575 alloc_info.descriptorPool = ds_pool;
10576 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010577 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10578 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010579 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010580
Tony Barboureb254902015-07-15 12:50:33 -060010581 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010582 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10583 sampler_ci.pNext = NULL;
10584 sampler_ci.magFilter = VK_FILTER_NEAREST;
10585 sampler_ci.minFilter = VK_FILTER_NEAREST;
10586 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10587 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10588 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10589 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10590 sampler_ci.mipLodBias = 1.0;
10591 sampler_ci.anisotropyEnable = VK_FALSE;
10592 sampler_ci.maxAnisotropy = 1;
10593 sampler_ci.compareEnable = VK_FALSE;
10594 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10595 sampler_ci.minLod = 1.0;
10596 sampler_ci.maxLod = 1.0;
10597 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10598 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010599
Tobin Ehlis3b780662015-05-28 12:11:26 -060010600 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010601 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010602 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010603
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010604 VkDescriptorImageInfo info = {};
10605 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010606
10607 VkWriteDescriptorSet descriptor_write;
10608 memset(&descriptor_write, 0, sizeof(descriptor_write));
10609 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010610 descriptor_write.dstSet = descriptorSet;
10611 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010612 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010613 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010614 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010615 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010616
10617 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10618
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010619 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010620
Chia-I Wuf7458c52015-10-26 21:10:41 +080010621 vkDestroySampler(m_device->device(), sampler, NULL);
10622 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10623 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010624}
10625
Karl Schultz6addd812016-02-02 17:17:23 -070010626TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10627 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10628 // types
10629 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010630
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070010631 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis660bcdc2016-05-17 10:39:46 -060010632 ".sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010633
Tobin Ehlis3b780662015-05-28 12:11:26 -060010634 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010635
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010636 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010637 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10638 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010639
10640 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010641 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10642 ds_pool_ci.pNext = NULL;
10643 ds_pool_ci.maxSets = 1;
10644 ds_pool_ci.poolSizeCount = 1;
10645 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010646
Tobin Ehlis3b780662015-05-28 12:11:26 -060010647 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010648 err =
10649 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010650 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010651 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010652 dsl_binding.binding = 0;
10653 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10654 dsl_binding.descriptorCount = 1;
10655 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10656 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010657
Tony Barboureb254902015-07-15 12:50:33 -060010658 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010659 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10660 ds_layout_ci.pNext = NULL;
10661 ds_layout_ci.bindingCount = 1;
10662 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010663
Tobin Ehlis3b780662015-05-28 12:11:26 -060010664 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010665 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10666 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010667 ASSERT_VK_SUCCESS(err);
10668
10669 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010670 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010671 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010672 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010673 alloc_info.descriptorPool = ds_pool;
10674 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010675 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10676 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010677 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010678
Tony Barboureb254902015-07-15 12:50:33 -060010679 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010680 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10681 sampler_ci.pNext = NULL;
10682 sampler_ci.magFilter = VK_FILTER_NEAREST;
10683 sampler_ci.minFilter = VK_FILTER_NEAREST;
10684 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10685 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10686 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10687 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10688 sampler_ci.mipLodBias = 1.0;
10689 sampler_ci.anisotropyEnable = VK_FALSE;
10690 sampler_ci.maxAnisotropy = 1;
10691 sampler_ci.compareEnable = VK_FALSE;
10692 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10693 sampler_ci.minLod = 1.0;
10694 sampler_ci.maxLod = 1.0;
10695 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10696 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010697 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010698 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010699 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010700
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010701 VkDescriptorImageInfo info = {};
10702 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010703
10704 VkWriteDescriptorSet descriptor_write;
10705 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -070010706 descriptor_write.sType =
10707 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010708 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010709 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010710 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010711 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010712 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010713
10714 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10715
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010716 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010717
Chia-I Wuf7458c52015-10-26 21:10:41 +080010718 vkDestroySampler(m_device->device(), sampler, NULL);
10719 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10720 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010721}
10722
Karl Schultz6addd812016-02-02 17:17:23 -070010723TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010724 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010725 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010726
Karl Schultz6addd812016-02-02 17:17:23 -070010727 m_errorMonitor->SetDesiredFailureMsg(
10728 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010729 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010730
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010731 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010732 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10733 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010734 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010735 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10736 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010737
10738 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010739 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10740 ds_pool_ci.pNext = NULL;
10741 ds_pool_ci.maxSets = 1;
10742 ds_pool_ci.poolSizeCount = 1;
10743 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010744
10745 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010746 err =
10747 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010748 ASSERT_VK_SUCCESS(err);
10749
10750 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010751 dsl_binding.binding = 0;
10752 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10753 dsl_binding.descriptorCount = 1;
10754 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10755 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010756
10757 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010758 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10759 ds_layout_ci.pNext = NULL;
10760 ds_layout_ci.bindingCount = 1;
10761 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010762 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010763 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10764 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010765 ASSERT_VK_SUCCESS(err);
10766
10767 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010768 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010769 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010770 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010771 alloc_info.descriptorPool = ds_pool;
10772 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010773 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10774 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010775 ASSERT_VK_SUCCESS(err);
10776
Karl Schultz6addd812016-02-02 17:17:23 -070010777 VkSampler sampler =
10778 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010779
10780 VkDescriptorImageInfo descriptor_info;
10781 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10782 descriptor_info.sampler = sampler;
10783
10784 VkWriteDescriptorSet descriptor_write;
10785 memset(&descriptor_write, 0, sizeof(descriptor_write));
10786 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010787 descriptor_write.dstSet = descriptorSet;
10788 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010789 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010790 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10791 descriptor_write.pImageInfo = &descriptor_info;
10792
10793 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10794
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010795 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010796
Chia-I Wuf7458c52015-10-26 21:10:41 +080010797 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10798 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010799}
10800
Karl Schultz6addd812016-02-02 17:17:23 -070010801TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10802 // Create a single combined Image/Sampler descriptor and send it an invalid
10803 // imageView
10804 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010805
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10807 "Attempted write update to combined "
10808 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -060010809 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010810
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010811 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010812 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010813 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10814 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010815
10816 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010817 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10818 ds_pool_ci.pNext = NULL;
10819 ds_pool_ci.maxSets = 1;
10820 ds_pool_ci.poolSizeCount = 1;
10821 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010822
10823 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010824 err =
10825 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010826 ASSERT_VK_SUCCESS(err);
10827
10828 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010829 dsl_binding.binding = 0;
10830 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10831 dsl_binding.descriptorCount = 1;
10832 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10833 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010834
10835 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010836 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10837 ds_layout_ci.pNext = NULL;
10838 ds_layout_ci.bindingCount = 1;
10839 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010840 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010841 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10842 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010843 ASSERT_VK_SUCCESS(err);
10844
10845 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010846 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010847 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010848 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010849 alloc_info.descriptorPool = ds_pool;
10850 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010851 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10852 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010853 ASSERT_VK_SUCCESS(err);
10854
10855 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010856 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10857 sampler_ci.pNext = NULL;
10858 sampler_ci.magFilter = VK_FILTER_NEAREST;
10859 sampler_ci.minFilter = VK_FILTER_NEAREST;
10860 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10861 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10862 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10863 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10864 sampler_ci.mipLodBias = 1.0;
10865 sampler_ci.anisotropyEnable = VK_FALSE;
10866 sampler_ci.maxAnisotropy = 1;
10867 sampler_ci.compareEnable = VK_FALSE;
10868 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10869 sampler_ci.minLod = 1.0;
10870 sampler_ci.maxLod = 1.0;
10871 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10872 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010873
10874 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010875 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010876 ASSERT_VK_SUCCESS(err);
10877
Karl Schultz6addd812016-02-02 17:17:23 -070010878 VkImageView view =
10879 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010880
10881 VkDescriptorImageInfo descriptor_info;
10882 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10883 descriptor_info.sampler = sampler;
10884 descriptor_info.imageView = view;
10885
10886 VkWriteDescriptorSet descriptor_write;
10887 memset(&descriptor_write, 0, sizeof(descriptor_write));
10888 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010889 descriptor_write.dstSet = descriptorSet;
10890 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010891 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010892 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10893 descriptor_write.pImageInfo = &descriptor_info;
10894
10895 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10896
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010897 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010898
Chia-I Wuf7458c52015-10-26 21:10:41 +080010899 vkDestroySampler(m_device->device(), sampler, NULL);
10900 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10901 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010902}
10903
Karl Schultz6addd812016-02-02 17:17:23 -070010904TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10905 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10906 // into the other
10907 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010908
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10910 " binding #1 with type "
10911 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10912 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010913
Tobin Ehlis04356f92015-10-27 16:35:27 -060010914 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010915 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010916 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010917 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10918 ds_type_count[0].descriptorCount = 1;
10919 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10920 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010921
10922 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010923 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10924 ds_pool_ci.pNext = NULL;
10925 ds_pool_ci.maxSets = 1;
10926 ds_pool_ci.poolSizeCount = 2;
10927 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010928
10929 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010930 err =
10931 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010932 ASSERT_VK_SUCCESS(err);
10933 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010934 dsl_binding[0].binding = 0;
10935 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10936 dsl_binding[0].descriptorCount = 1;
10937 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10938 dsl_binding[0].pImmutableSamplers = NULL;
10939 dsl_binding[1].binding = 1;
10940 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10941 dsl_binding[1].descriptorCount = 1;
10942 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10943 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010944
10945 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010946 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10947 ds_layout_ci.pNext = NULL;
10948 ds_layout_ci.bindingCount = 2;
10949 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010950
10951 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010952 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10953 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010954 ASSERT_VK_SUCCESS(err);
10955
10956 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010957 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010958 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010959 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010960 alloc_info.descriptorPool = ds_pool;
10961 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010962 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10963 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010964 ASSERT_VK_SUCCESS(err);
10965
10966 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010967 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10968 sampler_ci.pNext = NULL;
10969 sampler_ci.magFilter = VK_FILTER_NEAREST;
10970 sampler_ci.minFilter = VK_FILTER_NEAREST;
10971 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10972 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10973 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10974 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10975 sampler_ci.mipLodBias = 1.0;
10976 sampler_ci.anisotropyEnable = VK_FALSE;
10977 sampler_ci.maxAnisotropy = 1;
10978 sampler_ci.compareEnable = VK_FALSE;
10979 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10980 sampler_ci.minLod = 1.0;
10981 sampler_ci.maxLod = 1.0;
10982 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10983 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010984
10985 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010986 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010987 ASSERT_VK_SUCCESS(err);
10988
10989 VkDescriptorImageInfo info = {};
10990 info.sampler = sampler;
10991
10992 VkWriteDescriptorSet descriptor_write;
10993 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
10994 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010995 descriptor_write.dstSet = descriptorSet;
10996 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080010997 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010998 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10999 descriptor_write.pImageInfo = &info;
11000 // This write update should succeed
11001 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11002 // Now perform a copy update that fails due to type mismatch
11003 VkCopyDescriptorSet copy_ds_update;
11004 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11005 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11006 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -060011007 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011008 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070011009 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +080011010 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011011 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11012
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011013 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011014 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070011015 m_errorMonitor->SetDesiredFailureMsg(
11016 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011017 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -060011018 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11019 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11020 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070011021 copy_ds_update.srcBinding =
11022 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011023 copy_ds_update.dstSet = descriptorSet;
11024 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -060011025 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011026 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11027
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011028 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011029
Tobin Ehlis04356f92015-10-27 16:35:27 -060011030 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070011031 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060011032 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
11033 "update array offset of 0 and update of "
11034 "5 descriptors oversteps total number "
11035 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011036
Tobin Ehlis04356f92015-10-27 16:35:27 -060011037 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11038 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11039 copy_ds_update.srcSet = descriptorSet;
11040 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011041 copy_ds_update.dstSet = descriptorSet;
11042 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070011043 copy_ds_update.descriptorCount =
11044 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060011045 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11046
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011047 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011048
Chia-I Wuf7458c52015-10-26 21:10:41 +080011049 vkDestroySampler(m_device->device(), sampler, NULL);
11050 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11051 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011052}
11053
Karl Schultz6addd812016-02-02 17:17:23 -070011054TEST_F(VkLayerTest, NumSamplesMismatch) {
11055 // Create CommandBuffer where MSAA samples doesn't match RenderPass
11056 // sampleCount
11057 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011058
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011059 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011060 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011061
Tobin Ehlis3b780662015-05-28 12:11:26 -060011062 ASSERT_NO_FATAL_FAILURE(InitState());
11063 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011064 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060011065 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011066 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011067
11068 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011069 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11070 ds_pool_ci.pNext = NULL;
11071 ds_pool_ci.maxSets = 1;
11072 ds_pool_ci.poolSizeCount = 1;
11073 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011074
Tobin Ehlis3b780662015-05-28 12:11:26 -060011075 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011076 err =
11077 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011078 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011079
Tony Barboureb254902015-07-15 12:50:33 -060011080 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080011081 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060011082 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080011083 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011084 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11085 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011086
Tony Barboureb254902015-07-15 12:50:33 -060011087 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11088 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11089 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011090 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070011091 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011092
Tobin Ehlis3b780662015-05-28 12:11:26 -060011093 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011094 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11095 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011096 ASSERT_VK_SUCCESS(err);
11097
11098 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011099 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011100 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011101 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011102 alloc_info.descriptorPool = ds_pool;
11103 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011104 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11105 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011106 ASSERT_VK_SUCCESS(err);
11107
Tony Barboureb254902015-07-15 12:50:33 -060011108 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011109 pipe_ms_state_ci.sType =
11110 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11111 pipe_ms_state_ci.pNext = NULL;
11112 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11113 pipe_ms_state_ci.sampleShadingEnable = 0;
11114 pipe_ms_state_ci.minSampleShading = 1.0;
11115 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011116
Tony Barboureb254902015-07-15 12:50:33 -060011117 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011118 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11119 pipeline_layout_ci.pNext = NULL;
11120 pipeline_layout_ci.setLayoutCount = 1;
11121 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011122
11123 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011124 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11125 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011126 ASSERT_VK_SUCCESS(err);
11127
Karl Schultz6addd812016-02-02 17:17:23 -070011128 VkShaderObj vs(m_device, bindStateVertShaderText,
11129 VK_SHADER_STAGE_VERTEX_BIT, this);
11130 VkShaderObj fs(m_device, bindStateFragShaderText,
11131 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011132 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070011133 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011134 VkPipelineObj pipe(m_device);
11135 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011136 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011137 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011138 pipe.SetMSAA(&pipe_ms_state_ci);
11139 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011140
Tony Barbourfe3351b2015-07-28 10:17:20 -060011141 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070011142 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11143 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011144
Mark Young29927482016-05-04 14:38:51 -060011145 // Render triangle (the error should trigger on the attempt to draw).
11146 Draw(3, 1, 0, 0);
11147
11148 // Finalize recording of the command buffer
11149 EndCommandBuffer();
11150
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011151 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011152
Chia-I Wuf7458c52015-10-26 21:10:41 +080011153 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11154 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11155 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011156}
Mark Young29927482016-05-04 14:38:51 -060011157
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011158TEST_F(VkLayerTest, RenderPassIncompatible) {
11159 TEST_DESCRIPTION("Hit RenderPass incompatible cases. "
11160 "Initial case is drawing with an active renderpass that's "
11161 "not compatible with the bound PSO's creation renderpass");
11162 VkResult err;
11163
11164 ASSERT_NO_FATAL_FAILURE(InitState());
11165 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11166
11167 VkDescriptorSetLayoutBinding dsl_binding = {};
11168 dsl_binding.binding = 0;
11169 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11170 dsl_binding.descriptorCount = 1;
11171 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11172 dsl_binding.pImmutableSamplers = NULL;
11173
11174 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11175 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11176 ds_layout_ci.pNext = NULL;
11177 ds_layout_ci.bindingCount = 1;
11178 ds_layout_ci.pBindings = &dsl_binding;
11179
11180 VkDescriptorSetLayout ds_layout;
11181 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11182 &ds_layout);
11183 ASSERT_VK_SUCCESS(err);
11184
11185 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11186 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11187 pipeline_layout_ci.pNext = NULL;
11188 pipeline_layout_ci.setLayoutCount = 1;
11189 pipeline_layout_ci.pSetLayouts = &ds_layout;
11190
11191 VkPipelineLayout pipeline_layout;
11192 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11193 &pipeline_layout);
11194 ASSERT_VK_SUCCESS(err);
11195
11196 VkShaderObj vs(m_device, bindStateVertShaderText,
11197 VK_SHADER_STAGE_VERTEX_BIT, this);
11198 VkShaderObj fs(m_device, bindStateFragShaderText,
11199 VK_SHADER_STAGE_FRAGMENT_BIT,
11200 this); // We shouldn't need a fragment shader
11201 // but add it to be able to run on more devices
11202 // Create a renderpass that will be incompatible with default renderpass
11203 VkAttachmentReference attach = {};
11204 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11205 VkAttachmentReference color_att = {};
11206 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11207 VkSubpassDescription subpass = {};
11208 subpass.inputAttachmentCount = 1;
11209 subpass.pInputAttachments = &attach;
11210 subpass.colorAttachmentCount = 1;
11211 subpass.pColorAttachments = &color_att;
11212 VkRenderPassCreateInfo rpci = {};
11213 rpci.subpassCount = 1;
11214 rpci.pSubpasses = &subpass;
11215 rpci.attachmentCount = 1;
11216 VkAttachmentDescription attach_desc = {};
11217 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011218 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11219 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011220 rpci.pAttachments = &attach_desc;
11221 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11222 VkRenderPass rp;
11223 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11224 VkPipelineObj pipe(m_device);
11225 pipe.AddShader(&vs);
11226 pipe.AddShader(&fs);
11227 pipe.AddColorAttachment();
11228 VkViewport view_port = {};
11229 m_viewports.push_back(view_port);
11230 pipe.SetViewport(m_viewports);
11231 VkRect2D rect = {};
11232 m_scissors.push_back(rect);
11233 pipe.SetScissor(m_scissors);
11234 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11235
11236 VkCommandBufferInheritanceInfo cbii = {};
11237 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11238 cbii.renderPass = rp;
11239 cbii.subpass = 0;
11240 VkCommandBufferBeginInfo cbbi = {};
11241 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11242 cbbi.pInheritanceInfo = &cbii;
11243 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11244 VkRenderPassBeginInfo rpbi = {};
11245 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11246 rpbi.framebuffer = m_framebuffer;
11247 rpbi.renderPass = rp;
11248 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi,
11249 VK_SUBPASS_CONTENTS_INLINE);
11250 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11251 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11252
11253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11254 " is incompatible w/ gfx pipeline ");
11255 // Render triangle (the error should trigger on the attempt to draw).
11256 Draw(3, 1, 0, 0);
11257
11258 // Finalize recording of the command buffer
11259 EndCommandBuffer();
11260
11261 m_errorMonitor->VerifyFound();
11262
11263 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11264 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11265 vkDestroyRenderPass(m_device->device(), rp, NULL);
11266}
11267
Mark Youngc89c6312016-03-31 16:03:20 -060011268TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11269 // Create Pipeline where the number of blend attachments doesn't match the
11270 // number of color attachments. In this case, we don't add any color
11271 // blend attachments even though we have a color attachment.
11272 VkResult err;
11273
11274 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -060011275 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -060011276
11277 ASSERT_NO_FATAL_FAILURE(InitState());
11278 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11279 VkDescriptorPoolSize ds_type_count = {};
11280 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11281 ds_type_count.descriptorCount = 1;
11282
11283 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11284 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11285 ds_pool_ci.pNext = NULL;
11286 ds_pool_ci.maxSets = 1;
11287 ds_pool_ci.poolSizeCount = 1;
11288 ds_pool_ci.pPoolSizes = &ds_type_count;
11289
11290 VkDescriptorPool ds_pool;
11291 err =
11292 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11293 ASSERT_VK_SUCCESS(err);
11294
11295 VkDescriptorSetLayoutBinding dsl_binding = {};
11296 dsl_binding.binding = 0;
11297 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11298 dsl_binding.descriptorCount = 1;
11299 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11300 dsl_binding.pImmutableSamplers = NULL;
11301
11302 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11303 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11304 ds_layout_ci.pNext = NULL;
11305 ds_layout_ci.bindingCount = 1;
11306 ds_layout_ci.pBindings = &dsl_binding;
11307
11308 VkDescriptorSetLayout ds_layout;
11309 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11310 &ds_layout);
11311 ASSERT_VK_SUCCESS(err);
11312
11313 VkDescriptorSet descriptorSet;
11314 VkDescriptorSetAllocateInfo alloc_info = {};
11315 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11316 alloc_info.descriptorSetCount = 1;
11317 alloc_info.descriptorPool = ds_pool;
11318 alloc_info.pSetLayouts = &ds_layout;
11319 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11320 &descriptorSet);
11321 ASSERT_VK_SUCCESS(err);
11322
11323 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
11324 pipe_ms_state_ci.sType =
11325 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11326 pipe_ms_state_ci.pNext = NULL;
11327 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11328 pipe_ms_state_ci.sampleShadingEnable = 0;
11329 pipe_ms_state_ci.minSampleShading = 1.0;
11330 pipe_ms_state_ci.pSampleMask = NULL;
11331
11332 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11333 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11334 pipeline_layout_ci.pNext = NULL;
11335 pipeline_layout_ci.setLayoutCount = 1;
11336 pipeline_layout_ci.pSetLayouts = &ds_layout;
11337
11338 VkPipelineLayout pipeline_layout;
11339 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11340 &pipeline_layout);
11341 ASSERT_VK_SUCCESS(err);
11342
11343 VkShaderObj vs(m_device, bindStateVertShaderText,
11344 VK_SHADER_STAGE_VERTEX_BIT, this);
11345 VkShaderObj fs(m_device, bindStateFragShaderText,
11346 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011347 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -060011348 // but add it to be able to run on more devices
11349 VkPipelineObj pipe(m_device);
11350 pipe.AddShader(&vs);
11351 pipe.AddShader(&fs);
11352 pipe.SetMSAA(&pipe_ms_state_ci);
11353 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11354
11355 BeginCommandBuffer();
11356 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11357 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11358
Mark Young29927482016-05-04 14:38:51 -060011359 // Render triangle (the error should trigger on the attempt to draw).
11360 Draw(3, 1, 0, 0);
11361
11362 // Finalize recording of the command buffer
11363 EndCommandBuffer();
11364
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011365 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011366
11367 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11368 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11369 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11370}
Mark Young29927482016-05-04 14:38:51 -060011371
Mark Muellerd4914412016-06-13 17:52:06 -060011372TEST_F(VkLayerTest, MissingClearAttachment) {
11373 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment "
11374 "structure passed to vkCmdClearAttachments");
11375 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11376 "vkCmdClearAttachments() attachment index 1 not found in attachment "
11377 "reference array of active subpass 0");
11378
11379 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11380 m_errorMonitor->VerifyFound();
11381}
11382
Karl Schultz6addd812016-02-02 17:17:23 -070011383TEST_F(VkLayerTest, ClearCmdNoDraw) {
11384 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
11385 // to issuing a Draw
11386 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011387
Karl Schultz6addd812016-02-02 17:17:23 -070011388 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -070011389 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011390 "vkCmdClearAttachments() issued on CB object ");
11391
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011392 ASSERT_NO_FATAL_FAILURE(InitState());
11393 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011394
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011395 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011396 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11397 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011398
11399 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011400 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11401 ds_pool_ci.pNext = NULL;
11402 ds_pool_ci.maxSets = 1;
11403 ds_pool_ci.poolSizeCount = 1;
11404 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011405
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011406 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011407 err =
11408 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011409 ASSERT_VK_SUCCESS(err);
11410
Tony Barboureb254902015-07-15 12:50:33 -060011411 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011412 dsl_binding.binding = 0;
11413 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11414 dsl_binding.descriptorCount = 1;
11415 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11416 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011417
Tony Barboureb254902015-07-15 12:50:33 -060011418 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011419 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11420 ds_layout_ci.pNext = NULL;
11421 ds_layout_ci.bindingCount = 1;
11422 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011423
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011424 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011425 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11426 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011427 ASSERT_VK_SUCCESS(err);
11428
11429 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011430 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011431 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011432 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011433 alloc_info.descriptorPool = ds_pool;
11434 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011435 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11436 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011437 ASSERT_VK_SUCCESS(err);
11438
Tony Barboureb254902015-07-15 12:50:33 -060011439 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011440 pipe_ms_state_ci.sType =
11441 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11442 pipe_ms_state_ci.pNext = NULL;
11443 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11444 pipe_ms_state_ci.sampleShadingEnable = 0;
11445 pipe_ms_state_ci.minSampleShading = 1.0;
11446 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011447
Tony Barboureb254902015-07-15 12:50:33 -060011448 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011449 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11450 pipeline_layout_ci.pNext = NULL;
11451 pipeline_layout_ci.setLayoutCount = 1;
11452 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011453
11454 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011455 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11456 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011457 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011458
Karl Schultz6addd812016-02-02 17:17:23 -070011459 VkShaderObj vs(m_device, bindStateVertShaderText,
11460 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011461 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011462 // on more devices
11463 VkShaderObj fs(m_device, bindStateFragShaderText,
11464 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011465
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011466 VkPipelineObj pipe(m_device);
11467 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011468 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011469 pipe.SetMSAA(&pipe_ms_state_ci);
11470 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011471
11472 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011473
Karl Schultz6addd812016-02-02 17:17:23 -070011474 // Main thing we care about for this test is that the VkImage obj we're
11475 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011476 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011477 VkClearAttachment color_attachment;
11478 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11479 color_attachment.clearValue.color.float32[0] = 1.0;
11480 color_attachment.clearValue.color.float32[1] = 1.0;
11481 color_attachment.clearValue.color.float32[2] = 1.0;
11482 color_attachment.clearValue.color.float32[3] = 1.0;
11483 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070011484 VkClearRect clear_rect = {
11485 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011486
Karl Schultz6addd812016-02-02 17:17:23 -070011487 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
11488 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011489
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011490 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011491
Chia-I Wuf7458c52015-10-26 21:10:41 +080011492 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11493 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11494 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011495}
11496
Karl Schultz6addd812016-02-02 17:17:23 -070011497TEST_F(VkLayerTest, VtxBufferBadIndex) {
11498 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011499
Karl Schultz6addd812016-02-02 17:17:23 -070011500 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070011501 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -070011502 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011503
Tobin Ehlis502480b2015-06-24 15:53:07 -060011504 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011505 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011506 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011507
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011508 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011509 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11510 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011511
11512 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011513 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11514 ds_pool_ci.pNext = NULL;
11515 ds_pool_ci.maxSets = 1;
11516 ds_pool_ci.poolSizeCount = 1;
11517 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011518
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011519 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011520 err =
11521 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011522 ASSERT_VK_SUCCESS(err);
11523
Tony Barboureb254902015-07-15 12:50:33 -060011524 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011525 dsl_binding.binding = 0;
11526 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11527 dsl_binding.descriptorCount = 1;
11528 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11529 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011530
Tony Barboureb254902015-07-15 12:50:33 -060011531 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011532 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11533 ds_layout_ci.pNext = NULL;
11534 ds_layout_ci.bindingCount = 1;
11535 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011536
Tobin Ehlis502480b2015-06-24 15:53:07 -060011537 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011538 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11539 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011540 ASSERT_VK_SUCCESS(err);
11541
11542 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011543 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011544 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011545 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011546 alloc_info.descriptorPool = ds_pool;
11547 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011548 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11549 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011550 ASSERT_VK_SUCCESS(err);
11551
Tony Barboureb254902015-07-15 12:50:33 -060011552 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011553 pipe_ms_state_ci.sType =
11554 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11555 pipe_ms_state_ci.pNext = NULL;
11556 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11557 pipe_ms_state_ci.sampleShadingEnable = 0;
11558 pipe_ms_state_ci.minSampleShading = 1.0;
11559 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011560
Tony Barboureb254902015-07-15 12:50:33 -060011561 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011562 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11563 pipeline_layout_ci.pNext = NULL;
11564 pipeline_layout_ci.setLayoutCount = 1;
11565 pipeline_layout_ci.pSetLayouts = &ds_layout;
11566 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011567
Karl Schultz6addd812016-02-02 17:17:23 -070011568 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11569 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011570 ASSERT_VK_SUCCESS(err);
11571
Karl Schultz6addd812016-02-02 17:17:23 -070011572 VkShaderObj vs(m_device, bindStateVertShaderText,
11573 VK_SHADER_STAGE_VERTEX_BIT, this);
11574 VkShaderObj fs(m_device, bindStateFragShaderText,
11575 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011576 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070011577 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011578 VkPipelineObj pipe(m_device);
11579 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011580 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011581 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011582 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011583 pipe.SetViewport(m_viewports);
11584 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011585 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011586
11587 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070011588 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11589 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011590 // Don't care about actual data, just need to get to draw to flag error
11591 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -070011592 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
11593 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011594 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011595 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011596
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011597 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011598
Chia-I Wuf7458c52015-10-26 21:10:41 +080011599 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11600 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11601 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011602}
Mark Muellerdfe37552016-07-07 14:47:42 -060011603
11604TEST_F(VkLayerTest, VertexBufferInvalid) {
11605 TEST_DESCRIPTION("Submit a command buffer using deleted vertex buffer, "
11606 "delete a buffer twice, use an invalid offset for each "
11607 "buffer type, and attempt to bind a null buffer");
11608
11609 const char *deleted_buffer_in_command_buffer = "Cannot submit cmd buffer "
11610 "using deleted buffer ";
11611 const char *double_destroy_message = "Cannot free buffer 0x";
11612 const char *invalid_offset_message = "vkBindBufferMemory(): "
11613 "memoryOffset is 0x";
11614 const char *invalid_storage_buffer_offset_message = "vkBindBufferMemory(): "
11615 "storage memoryOffset "
11616 "is 0x";
11617 const char *invalid_texel_buffer_offset_message = "vkBindBufferMemory(): "
11618 "texel memoryOffset "
11619 "is 0x";
11620 const char *invalid_uniform_buffer_offset_message = "vkBindBufferMemory(): "
11621 "uniform memoryOffset "
11622 "is 0x";
11623 const char *bind_null_buffer_message = "In vkBindBufferMemory, attempting"
11624 " to Bind Obj(0x";
11625 const char *free_invalid_buffer_message = "Request to delete memory "
11626 "object 0x";
11627
11628 ASSERT_NO_FATAL_FAILURE(InitState());
11629 ASSERT_NO_FATAL_FAILURE(InitViewport());
11630 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11631
11632 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
11633 pipe_ms_state_ci.sType =
11634 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11635 pipe_ms_state_ci.pNext = NULL;
11636 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11637 pipe_ms_state_ci.sampleShadingEnable = 0;
11638 pipe_ms_state_ci.minSampleShading = 1.0;
11639 pipe_ms_state_ci.pSampleMask = nullptr;
11640
11641 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11642 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11643 VkPipelineLayout pipeline_layout;
11644
11645 VkResult err = vkCreatePipelineLayout(m_device->device(),
11646 &pipeline_layout_ci, nullptr,
11647 &pipeline_layout);
11648 ASSERT_VK_SUCCESS(err);
11649
11650 VkShaderObj vs(m_device, bindStateVertShaderText,
11651 VK_SHADER_STAGE_VERTEX_BIT, this);
11652 VkShaderObj fs(m_device, bindStateFragShaderText,
11653 VK_SHADER_STAGE_FRAGMENT_BIT,
11654 this);
11655 VkPipelineObj pipe(m_device);
11656 pipe.AddShader(&vs);
11657 pipe.AddShader(&fs);
11658 pipe.AddColorAttachment();
11659 pipe.SetMSAA(&pipe_ms_state_ci);
11660 pipe.SetViewport(m_viewports);
11661 pipe.SetScissor(m_scissors);
11662 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11663
11664 BeginCommandBuffer();
11665 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11666 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11667
11668 {
11669 // Create and bind a vertex buffer in a reduced scope, which will cause
11670 // it to be deleted upon leaving this scope
11671 const float vbo_data[3] = {1.f, 0.f, 1.f};
11672 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data),
11673 3, vbo_data);
11674 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11675 draw_verticies.AddVertexInputToPipe(pipe);
11676 }
11677
11678 Draw(1, 0, 0, 0);
11679
11680 EndCommandBuffer();
11681
11682 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11683 deleted_buffer_in_command_buffer);
11684 QueueCommandBuffer(false);
11685 m_errorMonitor->VerifyFound();
11686
11687 {
11688 // Create and bind a vertex buffer in a reduced scope, and delete it
11689 // twice, the second through the destructor
11690 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11691 VkBufferTest::eDoubleDelete);
11692 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11693 double_destroy_message);
11694 buffer_test.TestDoubleDestroy();
11695 }
11696 m_errorMonitor->VerifyFound();
11697
11698 if (VkBufferTest::
11699 GetTestConditionValid(m_device,
11700 VkBufferTest::eInvalidMemoryOffset)) {
11701 // Create and bind a memory buffer with an invalid offset.
11702 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11703 invalid_offset_message);
11704 VkBufferTest buffer_test(m_device,
11705 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
11706 VkBufferTest::eInvalidMemoryOffset);
11707 (void) buffer_test;
11708 m_errorMonitor->VerifyFound();
11709 }
11710
11711 if (VkBufferTest::
11712 GetTestConditionValid(m_device,
11713 VkBufferTest::eInvalidDeviceOffset,
11714 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
11715 // Create and bind a memory buffer with an invalid offset again,
11716 // but look for a texel buffer message.
11717 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11718 invalid_texel_buffer_offset_message);
11719 VkBufferTest buffer_test(m_device,
11720 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
11721 VkBufferTest::eInvalidDeviceOffset);
11722 (void) buffer_test;
11723 m_errorMonitor->VerifyFound();
11724 }
11725
11726 if (VkBufferTest::
11727 GetTestConditionValid(m_device,
11728 VkBufferTest::eInvalidDeviceOffset,
11729 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
11730 // Create and bind a memory buffer with an invalid offset again, but
11731 // look for a uniform buffer message.
11732 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11733 invalid_uniform_buffer_offset_message);
11734 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
11735 VkBufferTest::eInvalidDeviceOffset);
11736 (void) buffer_test;
11737 m_errorMonitor->VerifyFound();
11738 }
11739
11740 if (VkBufferTest::
11741 GetTestConditionValid(m_device,
11742 VkBufferTest::eInvalidDeviceOffset,
11743 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
11744 // Create and bind a memory buffer with an invalid offset again, but
11745 // look for a storage buffer message.
11746 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11747 invalid_storage_buffer_offset_message);
11748 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11749 VkBufferTest::eInvalidDeviceOffset);
11750 (void) buffer_test;
11751 m_errorMonitor->VerifyFound();
11752 }
11753
11754 {
11755 // Attempt to bind a null buffer.
11756 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11757 bind_null_buffer_message);
11758 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11759 VkBufferTest::eBindNullBuffer);
11760 (void) buffer_test;
11761 m_errorMonitor->VerifyFound();
11762 }
11763
11764 {
11765 // Attempt to use an invalid handle to delete a buffer.
11766 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11767 free_invalid_buffer_message);
11768 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11769 VkBufferTest::eFreeInvalidHandle);
11770 (void) buffer_test;
11771 }
11772 m_errorMonitor->VerifyFound();
11773
11774 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11775}
11776
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011777// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11778TEST_F(VkLayerTest, InvalidImageLayout) {
11779 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
11780 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11781 "images in the wrong layout when they're copied or transitioned.");
11782 // 3 in ValidateCmdBufImageLayouts
11783 // * -1 Attempt to submit cmd buf w/ deleted image
11784 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11785 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
11786 m_errorMonitor->SetDesiredFailureMsg(
11787 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11788 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11789
11790 ASSERT_NO_FATAL_FAILURE(InitState());
11791 // Create src & dst images to use for copy operations
11792 VkImage src_image;
11793 VkImage dst_image;
11794
11795 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11796 const int32_t tex_width = 32;
11797 const int32_t tex_height = 32;
11798
11799 VkImageCreateInfo image_create_info = {};
11800 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11801 image_create_info.pNext = NULL;
11802 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11803 image_create_info.format = tex_format;
11804 image_create_info.extent.width = tex_width;
11805 image_create_info.extent.height = tex_height;
11806 image_create_info.extent.depth = 1;
11807 image_create_info.mipLevels = 1;
11808 image_create_info.arrayLayers = 4;
11809 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11810 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11811 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
11812 image_create_info.flags = 0;
11813
11814 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11815 ASSERT_VK_SUCCESS(err);
11816 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11817 ASSERT_VK_SUCCESS(err);
11818
11819 BeginCommandBuffer();
11820 VkImageCopy copyRegion;
11821 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11822 copyRegion.srcSubresource.mipLevel = 0;
11823 copyRegion.srcSubresource.baseArrayLayer = 0;
11824 copyRegion.srcSubresource.layerCount = 1;
11825 copyRegion.srcOffset.x = 0;
11826 copyRegion.srcOffset.y = 0;
11827 copyRegion.srcOffset.z = 0;
11828 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11829 copyRegion.dstSubresource.mipLevel = 0;
11830 copyRegion.dstSubresource.baseArrayLayer = 0;
11831 copyRegion.dstSubresource.layerCount = 1;
11832 copyRegion.dstOffset.x = 0;
11833 copyRegion.dstOffset.y = 0;
11834 copyRegion.dstOffset.z = 0;
11835 copyRegion.extent.width = 1;
11836 copyRegion.extent.height = 1;
11837 copyRegion.extent.depth = 1;
11838 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11839 m_errorMonitor->VerifyFound();
11840 // Now cause error due to src image layout changing
11841 m_errorMonitor->SetDesiredFailureMsg(
11842 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11843 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
11844 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11845 m_errorMonitor->VerifyFound();
11846 // Final src error is due to bad layout type
11847 m_errorMonitor->SetDesiredFailureMsg(
11848 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11849 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
11850 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11851 m_errorMonitor->VerifyFound();
11852 // Now verify same checks for dst
11853 m_errorMonitor->SetDesiredFailureMsg(
11854 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11855 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
11856 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11857 m_errorMonitor->VerifyFound();
11858 // Now cause error due to src image layout changing
11859 m_errorMonitor->SetDesiredFailureMsg(
11860 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11861 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
11862 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
11863 m_errorMonitor->VerifyFound();
11864 m_errorMonitor->SetDesiredFailureMsg(
11865 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11866 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
11867 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
11868 m_errorMonitor->VerifyFound();
11869 // Now cause error due to bad image layout transition in PipelineBarrier
11870 VkImageMemoryBarrier image_barrier[1] = {};
11871 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11872 image_barrier[0].image = src_image;
11873 image_barrier[0].subresourceRange.layerCount = 2;
11874 image_barrier[0].subresourceRange.levelCount = 2;
11875 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11876 m_errorMonitor->SetDesiredFailureMsg(
11877 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11878 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
11879 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
11880 m_errorMonitor->VerifyFound();
11881
11882 // Finally some layout errors at RenderPass create time
11883 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
11884 VkAttachmentReference attach = {};
11885 // perf warning for GENERAL layout w/ non-DS input attachment
11886 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11887 VkSubpassDescription subpass = {};
11888 subpass.inputAttachmentCount = 1;
11889 subpass.pInputAttachments = &attach;
11890 VkRenderPassCreateInfo rpci = {};
11891 rpci.subpassCount = 1;
11892 rpci.pSubpasses = &subpass;
11893 rpci.attachmentCount = 1;
11894 VkAttachmentDescription attach_desc = {};
11895 attach_desc.format = VK_FORMAT_UNDEFINED;
11896 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011897 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011898 VkRenderPass rp;
11899 m_errorMonitor->SetDesiredFailureMsg(
11900 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11901 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
11902 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11903 m_errorMonitor->VerifyFound();
11904 // error w/ non-general layout
11905 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11906
11907 m_errorMonitor->SetDesiredFailureMsg(
11908 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11909 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
11910 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11911 m_errorMonitor->VerifyFound();
11912 subpass.inputAttachmentCount = 0;
11913 subpass.colorAttachmentCount = 1;
11914 subpass.pColorAttachments = &attach;
11915 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11916 // perf warning for GENERAL layout on color attachment
11917 m_errorMonitor->SetDesiredFailureMsg(
11918 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11919 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
11920 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11921 m_errorMonitor->VerifyFound();
11922 // error w/ non-color opt or GENERAL layout for color attachment
11923 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11924 m_errorMonitor->SetDesiredFailureMsg(
11925 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11926 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
11927 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11928 m_errorMonitor->VerifyFound();
11929 subpass.colorAttachmentCount = 0;
11930 subpass.pDepthStencilAttachment = &attach;
11931 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11932 // perf warning for GENERAL layout on DS attachment
11933 m_errorMonitor->SetDesiredFailureMsg(
11934 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11935 "Layout for depth attachment is GENERAL but should be DEPTH_STENCIL_ATTACHMENT_OPTIMAL.");
11936 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11937 m_errorMonitor->VerifyFound();
11938 // error w/ non-ds opt or GENERAL layout for color attachment
11939 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11940 m_errorMonitor->SetDesiredFailureMsg(
11941 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11942 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be DEPTH_STENCIL_ATTACHMENT_OPTIMAL or GENERAL.");
11943 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11944 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060011945 // For this error we need a valid renderpass so create default one
11946 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11947 attach.attachment = 0;
11948 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
11949 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
11950 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
11951 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
11952 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
11953 // Can't do a CLEAR load on READ_ONLY initialLayout
11954 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
11955 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11956 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11958 " with invalid first layout "
11959 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
11960 "ONLY_OPTIMAL");
11961 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11962 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011963
11964 vkDestroyImage(m_device->device(), src_image, NULL);
11965 vkDestroyImage(m_device->device(), dst_image, NULL);
11966}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060011967
11968TEST_F(VkLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
11969 TEST_DESCRIPTION("Positive test where we create a renderpass with an "
11970 "attachment that uses LOAD_OP_CLEAR, the first subpass "
11971 "has a valid layout, and a second subpass then uses a "
11972 "valid *READ_ONLY* layout.");
11973 m_errorMonitor->ExpectSuccess();
11974 ASSERT_NO_FATAL_FAILURE(InitState());
11975
11976 VkAttachmentReference attach[2] = {};
11977 attach[0].attachment = 0;
11978 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
11979 attach[1].attachment = 0;
11980 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11981 VkSubpassDescription subpasses[2] = {};
11982 // First subpass clears DS attach on load
11983 subpasses[0].pDepthStencilAttachment = &attach[0];
11984 // 2nd subpass reads in DS as input attachment
11985 subpasses[1].inputAttachmentCount = 1;
11986 subpasses[1].pInputAttachments = &attach[1];
11987 VkAttachmentDescription attach_desc = {};
11988 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
11989 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
11990 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
11991 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
11992 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
11993 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
11994 attach_desc.initialLayout =
11995 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
11996 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11997 VkRenderPassCreateInfo rpci = {};
11998 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11999 rpci.attachmentCount = 1;
12000 rpci.pAttachments = &attach_desc;
12001 rpci.subpassCount = 2;
12002 rpci.pSubpasses = subpasses;
12003
12004 // Now create RenderPass and verify no errors
12005 VkRenderPass rp;
12006 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12007 m_errorMonitor->VerifyNotFound();
12008
12009 vkDestroyRenderPass(m_device->device(), rp, NULL);
12010}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012011#endif // DRAW_STATE_TESTS
12012
Tobin Ehlis0788f522015-05-26 16:11:58 -060012013#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -060012014#if GTEST_IS_THREADSAFE
12015struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012016 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012017 VkEvent event;
12018 bool bailout;
12019};
12020
Karl Schultz6addd812016-02-02 17:17:23 -070012021extern "C" void *AddToCommandBuffer(void *arg) {
12022 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012023
Mike Stroyana6d14942016-07-13 15:10:05 -060012024 for (int i = 0; i < 80000; i++) {
Karl Schultz6addd812016-02-02 17:17:23 -070012025 vkCmdSetEvent(data->commandBuffer, data->event,
12026 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012027 if (data->bailout) {
12028 break;
12029 }
12030 }
12031 return NULL;
12032}
12033
Karl Schultz6addd812016-02-02 17:17:23 -070012034TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012035 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012036
Karl Schultz6addd812016-02-02 17:17:23 -070012037 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12038 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012039
Mike Stroyanaccf7692015-05-12 16:00:45 -060012040 ASSERT_NO_FATAL_FAILURE(InitState());
12041 ASSERT_NO_FATAL_FAILURE(InitViewport());
12042 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12043
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012044 // Calls AllocateCommandBuffers
12045 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060012046
12047 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012048 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012049
12050 VkEventCreateInfo event_info;
12051 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060012052 VkResult err;
12053
12054 memset(&event_info, 0, sizeof(event_info));
12055 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12056
Chia-I Wuf7458c52015-10-26 21:10:41 +080012057 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012058 ASSERT_VK_SUCCESS(err);
12059
Mike Stroyanaccf7692015-05-12 16:00:45 -060012060 err = vkResetEvent(device(), event);
12061 ASSERT_VK_SUCCESS(err);
12062
12063 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012064 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012065 data.event = event;
12066 data.bailout = false;
12067 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060012068
12069 // First do some correct operations using multiple threads.
12070 // Add many entries to command buffer from another thread.
12071 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
12072 // Make non-conflicting calls from this thread at the same time.
12073 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060012074 uint32_t count;
12075 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060012076 }
12077 test_platform_thread_join(thread, NULL);
12078
12079 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060012080 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012081 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012082 // Add many entries to command buffer from this thread at the same time.
12083 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060012084
Mike Stroyan4268d1f2015-07-13 14:45:35 -060012085 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012086 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012087
Mike Stroyan10b8cb72016-01-22 15:22:03 -070012088 m_errorMonitor->SetBailout(NULL);
12089
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012090 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060012091
Chia-I Wuf7458c52015-10-26 21:10:41 +080012092 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060012093}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060012094#endif // GTEST_IS_THREADSAFE
12095#endif // THREADING_TESTS
12096
Chris Forbes9f7ff632015-05-25 11:13:08 +120012097#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070012098TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012099 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
12100 "with an impossible code size");
12101
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012102 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012103 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012104
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012105 ASSERT_NO_FATAL_FAILURE(InitState());
12106 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12107
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012108 VkShaderModule module;
12109 VkShaderModuleCreateInfo moduleCreateInfo;
12110 struct icd_spv_header spv;
12111
12112 spv.magic = ICD_SPV_MAGIC;
12113 spv.version = ICD_SPV_VERSION;
12114 spv.gen_magic = 0;
12115
12116 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12117 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070012118 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012119 moduleCreateInfo.codeSize = 4;
12120 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012121 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012122
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012123 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012124}
12125
Karl Schultz6addd812016-02-02 17:17:23 -070012126TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012127 TEST_DESCRIPTION("Test that an error is produced for a spirv module "
12128 "with a bad magic number");
12129
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012131 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012132
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012133 ASSERT_NO_FATAL_FAILURE(InitState());
12134 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12135
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012136 VkShaderModule module;
12137 VkShaderModuleCreateInfo moduleCreateInfo;
12138 struct icd_spv_header spv;
12139
12140 spv.magic = ~ICD_SPV_MAGIC;
12141 spv.version = ICD_SPV_VERSION;
12142 spv.gen_magic = 0;
12143
12144 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12145 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070012146 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012147 moduleCreateInfo.codeSize = sizeof(spv) + 10;
12148 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012149 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012150
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012151 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012152}
12153
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012154#if 0
12155// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070012156TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012157 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012158 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012159
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012160 ASSERT_NO_FATAL_FAILURE(InitState());
12161 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12162
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012163 VkShaderModule module;
12164 VkShaderModuleCreateInfo moduleCreateInfo;
12165 struct icd_spv_header spv;
12166
12167 spv.magic = ICD_SPV_MAGIC;
12168 spv.version = ~ICD_SPV_VERSION;
12169 spv.gen_magic = 0;
12170
12171 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
12172 moduleCreateInfo.pNext = NULL;
12173
Karl Schultz6addd812016-02-02 17:17:23 -070012174 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012175 moduleCreateInfo.codeSize = sizeof(spv) + 10;
12176 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080012177 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012178
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012179 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012180}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120012181#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060012182
Karl Schultz6addd812016-02-02 17:17:23 -070012183TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012184 TEST_DESCRIPTION("Test that a warning is produced for a vertex output that "
12185 "is not consumed by the fragment stage");
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012186 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012187 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012188
Chris Forbes9f7ff632015-05-25 11:13:08 +120012189 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012190 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120012191
12192 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012193 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120012194 "\n"
12195 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070012196 "out gl_PerVertex {\n"
12197 " vec4 gl_Position;\n"
12198 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120012199 "void main(){\n"
12200 " gl_Position = vec4(1);\n"
12201 " x = 0;\n"
12202 "}\n";
12203 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012204 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120012205 "\n"
12206 "layout(location=0) out vec4 color;\n"
12207 "void main(){\n"
12208 " color = vec4(1);\n"
12209 "}\n";
12210
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012211 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12212 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120012213
12214 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012215 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120012216 pipe.AddShader(&vs);
12217 pipe.AddShader(&fs);
12218
Chris Forbes9f7ff632015-05-25 11:13:08 +120012219 VkDescriptorSetObj descriptorSet(m_device);
12220 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012221 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120012222
Tony Barbour5781e8f2015-08-04 16:23:11 -060012223 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120012224
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012225 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120012226}
Chris Forbes9f7ff632015-05-25 11:13:08 +120012227
Karl Schultz6addd812016-02-02 17:17:23 -070012228TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012229 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
12230 "which is not present in the outputs of the previous stage");
12231
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012233 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012234
Chris Forbes59cb88d2015-05-25 11:13:13 +120012235 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012236 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120012237
12238 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012239 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120012240 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070012241 "out gl_PerVertex {\n"
12242 " vec4 gl_Position;\n"
12243 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120012244 "void main(){\n"
12245 " gl_Position = vec4(1);\n"
12246 "}\n";
12247 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012248 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120012249 "\n"
12250 "layout(location=0) in float x;\n"
12251 "layout(location=0) out vec4 color;\n"
12252 "void main(){\n"
12253 " color = vec4(x);\n"
12254 "}\n";
12255
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012256 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12257 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120012258
12259 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012260 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120012261 pipe.AddShader(&vs);
12262 pipe.AddShader(&fs);
12263
Chris Forbes59cb88d2015-05-25 11:13:13 +120012264 VkDescriptorSetObj descriptorSet(m_device);
12265 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012266 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120012267
Tony Barbour5781e8f2015-08-04 16:23:11 -060012268 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120012269
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012270 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120012271}
12272
Karl Schultz6addd812016-02-02 17:17:23 -070012273TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012274 TEST_DESCRIPTION("Test that an error is produced for a fragment shader input "
12275 "within an interace block, which is not present in the outputs "
12276 "of the previous stage.");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012277 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012278 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012279
12280 ASSERT_NO_FATAL_FAILURE(InitState());
12281 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12282
12283 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012284 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130012285 "\n"
12286 "out gl_PerVertex {\n"
12287 " vec4 gl_Position;\n"
12288 "};\n"
12289 "void main(){\n"
12290 " gl_Position = vec4(1);\n"
12291 "}\n";
12292 char const *fsSource =
12293 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130012294 "\n"
12295 "in block { layout(location=0) float x; } ins;\n"
12296 "layout(location=0) out vec4 color;\n"
12297 "void main(){\n"
12298 " color = vec4(ins.x);\n"
12299 "}\n";
12300
12301 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12302 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12303
12304 VkPipelineObj pipe(m_device);
12305 pipe.AddColorAttachment();
12306 pipe.AddShader(&vs);
12307 pipe.AddShader(&fs);
12308
12309 VkDescriptorSetObj descriptorSet(m_device);
12310 descriptorSet.AppendDummy();
12311 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12312
12313 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12314
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012315 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130012316}
12317
Karl Schultz6addd812016-02-02 17:17:23 -070012318TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012319 TEST_DESCRIPTION("Test that an error is produced for mismatched array sizes "
12320 "across the VS->FS interface");
Chris Forbes0036fd12016-01-26 14:19:49 +130012321 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +130012322 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -070012323 "output arr[2] of float32' vs 'ptr to "
12324 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130012325
12326 ASSERT_NO_FATAL_FAILURE(InitState());
12327 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12328
12329 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012330 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130012331 "\n"
12332 "layout(location=0) out float x[2];\n"
12333 "out gl_PerVertex {\n"
12334 " vec4 gl_Position;\n"
12335 "};\n"
12336 "void main(){\n"
12337 " x[0] = 0; x[1] = 0;\n"
12338 " gl_Position = vec4(1);\n"
12339 "}\n";
12340 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012341 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130012342 "\n"
12343 "layout(location=0) in float x[3];\n"
12344 "layout(location=0) out vec4 color;\n"
12345 "void main(){\n"
12346 " color = vec4(x[0] + x[1] + x[2]);\n"
12347 "}\n";
12348
12349 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12350 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12351
12352 VkPipelineObj pipe(m_device);
12353 pipe.AddColorAttachment();
12354 pipe.AddShader(&vs);
12355 pipe.AddShader(&fs);
12356
12357 VkDescriptorSetObj descriptorSet(m_device);
12358 descriptorSet.AppendDummy();
12359 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12360
12361 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12362
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012363 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130012364}
12365
Karl Schultz6addd812016-02-02 17:17:23 -070012366TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012367 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
12368 "the VS->FS interface");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070012369 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012370 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012371
Chris Forbesb56af562015-05-25 11:13:17 +120012372 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012373 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120012374
12375 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012376 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120012377 "\n"
12378 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070012379 "out gl_PerVertex {\n"
12380 " vec4 gl_Position;\n"
12381 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +120012382 "void main(){\n"
12383 " x = 0;\n"
12384 " gl_Position = vec4(1);\n"
12385 "}\n";
12386 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012387 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120012388 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012389 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +120012390 "layout(location=0) out vec4 color;\n"
12391 "void main(){\n"
12392 " color = vec4(x);\n"
12393 "}\n";
12394
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012395 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12396 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120012397
12398 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012399 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120012400 pipe.AddShader(&vs);
12401 pipe.AddShader(&fs);
12402
Chris Forbesb56af562015-05-25 11:13:17 +120012403 VkDescriptorSetObj descriptorSet(m_device);
12404 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012405 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120012406
Tony Barbour5781e8f2015-08-04 16:23:11 -060012407 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120012408
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012409 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120012410}
12411
Karl Schultz6addd812016-02-02 17:17:23 -070012412TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012413 TEST_DESCRIPTION("Test that an error is produced for mismatched types across "
12414 "the VS->FS interface, when the variable is contained within "
12415 "an interface block");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012416 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012417 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012418
12419 ASSERT_NO_FATAL_FAILURE(InitState());
12420 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12421
12422 char const *vsSource =
12423 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130012424 "\n"
12425 "out block { layout(location=0) int x; } outs;\n"
12426 "out gl_PerVertex {\n"
12427 " vec4 gl_Position;\n"
12428 "};\n"
12429 "void main(){\n"
12430 " outs.x = 0;\n"
12431 " gl_Position = vec4(1);\n"
12432 "}\n";
12433 char const *fsSource =
12434 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130012435 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012436 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +130012437 "layout(location=0) out vec4 color;\n"
12438 "void main(){\n"
12439 " color = vec4(ins.x);\n"
12440 "}\n";
12441
12442 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12443 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12444
12445 VkPipelineObj pipe(m_device);
12446 pipe.AddColorAttachment();
12447 pipe.AddShader(&vs);
12448 pipe.AddShader(&fs);
12449
12450 VkDescriptorSetObj descriptorSet(m_device);
12451 descriptorSet.AppendDummy();
12452 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12453
12454 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12455
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012456 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130012457}
12458
12459TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012460 TEST_DESCRIPTION("Test that an error is produced for location mismatches across "
12461 "the VS->FS interface; This should manifest as a not-written/not-consumed "
12462 "pair, but flushes out broken walking of the interfaces");
Chris Forbese9928822016-02-17 14:44:52 +130012463 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12464 "location 0.0 which is not written by vertex shader");
12465
12466 ASSERT_NO_FATAL_FAILURE(InitState());
12467 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12468
12469 char const *vsSource =
12470 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130012471 "\n"
12472 "out block { layout(location=1) float x; } outs;\n"
12473 "out gl_PerVertex {\n"
12474 " vec4 gl_Position;\n"
12475 "};\n"
12476 "void main(){\n"
12477 " outs.x = 0;\n"
12478 " gl_Position = vec4(1);\n"
12479 "}\n";
12480 char const *fsSource =
12481 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130012482 "\n"
12483 "in block { layout(location=0) float x; } ins;\n"
12484 "layout(location=0) out vec4 color;\n"
12485 "void main(){\n"
12486 " color = vec4(ins.x);\n"
12487 "}\n";
12488
12489 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12490 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12491
12492 VkPipelineObj pipe(m_device);
12493 pipe.AddColorAttachment();
12494 pipe.AddShader(&vs);
12495 pipe.AddShader(&fs);
12496
12497 VkDescriptorSetObj descriptorSet(m_device);
12498 descriptorSet.AppendDummy();
12499 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12500
12501 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12502
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012503 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130012504}
12505
12506TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012507 TEST_DESCRIPTION("Test that an error is produced for component mismatches across the "
12508 "VS->FS interface. It's not enough to have the same set of locations in "
12509 "use; matching is defined in terms of spirv variables.");
Chris Forbese9928822016-02-17 14:44:52 +130012510 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12511 "location 0.1 which is not written by vertex shader");
12512
12513 ASSERT_NO_FATAL_FAILURE(InitState());
12514 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12515
12516 char const *vsSource =
12517 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130012518 "\n"
12519 "out block { layout(location=0, component=0) float x; } outs;\n"
12520 "out gl_PerVertex {\n"
12521 " vec4 gl_Position;\n"
12522 "};\n"
12523 "void main(){\n"
12524 " outs.x = 0;\n"
12525 " gl_Position = vec4(1);\n"
12526 "}\n";
12527 char const *fsSource =
12528 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130012529 "\n"
12530 "in block { layout(location=0, component=1) float x; } ins;\n"
12531 "layout(location=0) out vec4 color;\n"
12532 "void main(){\n"
12533 " color = vec4(ins.x);\n"
12534 "}\n";
12535
12536 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12537 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12538
12539 VkPipelineObj pipe(m_device);
12540 pipe.AddColorAttachment();
12541 pipe.AddShader(&vs);
12542 pipe.AddShader(&fs);
12543
12544 VkDescriptorSetObj descriptorSet(m_device);
12545 descriptorSet.AppendDummy();
12546 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12547
12548 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12549
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012550 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130012551}
12552
Karl Schultz6addd812016-02-02 17:17:23 -070012553TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012554 TEST_DESCRIPTION("Test that a warning is produced for a vertex attribute which is "
12555 "not consumed by the vertex shader");
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012556 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012557 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012558
Chris Forbesde136e02015-05-25 11:13:28 +120012559 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012560 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120012561
12562 VkVertexInputBindingDescription input_binding;
12563 memset(&input_binding, 0, sizeof(input_binding));
12564
12565 VkVertexInputAttributeDescription input_attrib;
12566 memset(&input_attrib, 0, sizeof(input_attrib));
12567 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12568
12569 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012570 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120012571 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070012572 "out gl_PerVertex {\n"
12573 " vec4 gl_Position;\n"
12574 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +120012575 "void main(){\n"
12576 " gl_Position = vec4(1);\n"
12577 "}\n";
12578 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012579 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120012580 "\n"
12581 "layout(location=0) out vec4 color;\n"
12582 "void main(){\n"
12583 " color = vec4(1);\n"
12584 "}\n";
12585
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012586 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12587 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120012588
12589 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012590 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120012591 pipe.AddShader(&vs);
12592 pipe.AddShader(&fs);
12593
12594 pipe.AddVertexInputBindings(&input_binding, 1);
12595 pipe.AddVertexInputAttribs(&input_attrib, 1);
12596
Chris Forbesde136e02015-05-25 11:13:28 +120012597 VkDescriptorSetObj descriptorSet(m_device);
12598 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012599 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120012600
Tony Barbour5781e8f2015-08-04 16:23:11 -060012601 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120012602
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012603 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120012604}
12605
Karl Schultz6addd812016-02-02 17:17:23 -070012606TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012607 TEST_DESCRIPTION("Test that a warning is produced for a location mismatch on "
12608 "vertex attributes. This flushes out bad behavior in the interface walker");
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012609 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012610 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +130012611
12612 ASSERT_NO_FATAL_FAILURE(InitState());
12613 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12614
12615 VkVertexInputBindingDescription input_binding;
12616 memset(&input_binding, 0, sizeof(input_binding));
12617
12618 VkVertexInputAttributeDescription input_attrib;
12619 memset(&input_attrib, 0, sizeof(input_attrib));
12620 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12621
12622 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012623 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130012624 "\n"
12625 "layout(location=1) in float x;\n"
12626 "out gl_PerVertex {\n"
12627 " vec4 gl_Position;\n"
12628 "};\n"
12629 "void main(){\n"
12630 " gl_Position = vec4(x);\n"
12631 "}\n";
12632 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012633 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130012634 "\n"
12635 "layout(location=0) out vec4 color;\n"
12636 "void main(){\n"
12637 " color = vec4(1);\n"
12638 "}\n";
12639
12640 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12641 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12642
12643 VkPipelineObj pipe(m_device);
12644 pipe.AddColorAttachment();
12645 pipe.AddShader(&vs);
12646 pipe.AddShader(&fs);
12647
12648 pipe.AddVertexInputBindings(&input_binding, 1);
12649 pipe.AddVertexInputAttribs(&input_attrib, 1);
12650
12651 VkDescriptorSetObj descriptorSet(m_device);
12652 descriptorSet.AppendDummy();
12653 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12654
12655 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12656
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012657 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130012658}
12659
Karl Schultz6addd812016-02-02 17:17:23 -070012660TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012661 TEST_DESCRIPTION("Test that an error is produced for a VS input which is not "
12662 "provided by a vertex attribute");
Karl Schultz6addd812016-02-02 17:17:23 -070012663 m_errorMonitor->SetDesiredFailureMsg(
12664 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012665 "VS consumes input at location 0 but not provided");
12666
Chris Forbes62e8e502015-05-25 11:13:29 +120012667 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012668 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120012669
12670 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012671 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120012672 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012673 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -070012674 "out gl_PerVertex {\n"
12675 " vec4 gl_Position;\n"
12676 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120012677 "void main(){\n"
12678 " gl_Position = x;\n"
12679 "}\n";
12680 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012681 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120012682 "\n"
12683 "layout(location=0) out vec4 color;\n"
12684 "void main(){\n"
12685 " color = vec4(1);\n"
12686 "}\n";
12687
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012688 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12689 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120012690
12691 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012692 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120012693 pipe.AddShader(&vs);
12694 pipe.AddShader(&fs);
12695
Chris Forbes62e8e502015-05-25 11:13:29 +120012696 VkDescriptorSetObj descriptorSet(m_device);
12697 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012698 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120012699
Tony Barbour5781e8f2015-08-04 16:23:11 -060012700 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120012701
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012702 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120012703}
12704
Karl Schultz6addd812016-02-02 17:17:23 -070012705TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012706 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the "
12707 "fundamental type (float/int/uint) of an attribute and the "
12708 "VS input that consumes it");
Karl Schultz6addd812016-02-02 17:17:23 -070012709 m_errorMonitor->SetDesiredFailureMsg(
12710 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012711 "location 0 does not match VS input type");
12712
Chris Forbesc97d98e2015-05-25 11:13:31 +120012713 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012714 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120012715
12716 VkVertexInputBindingDescription input_binding;
12717 memset(&input_binding, 0, sizeof(input_binding));
12718
12719 VkVertexInputAttributeDescription input_attrib;
12720 memset(&input_attrib, 0, sizeof(input_attrib));
12721 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12722
12723 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012724 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120012725 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012726 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070012727 "out gl_PerVertex {\n"
12728 " vec4 gl_Position;\n"
12729 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120012730 "void main(){\n"
12731 " gl_Position = vec4(x);\n"
12732 "}\n";
12733 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012734 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120012735 "\n"
12736 "layout(location=0) out vec4 color;\n"
12737 "void main(){\n"
12738 " color = vec4(1);\n"
12739 "}\n";
12740
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012741 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12742 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120012743
12744 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012745 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120012746 pipe.AddShader(&vs);
12747 pipe.AddShader(&fs);
12748
12749 pipe.AddVertexInputBindings(&input_binding, 1);
12750 pipe.AddVertexInputAttribs(&input_attrib, 1);
12751
Chris Forbesc97d98e2015-05-25 11:13:31 +120012752 VkDescriptorSetObj descriptorSet(m_device);
12753 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012754 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120012755
Tony Barbour5781e8f2015-08-04 16:23:11 -060012756 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120012757
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012758 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120012759}
12760
Chris Forbesc68b43c2016-04-06 11:18:47 +120012761TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012762 TEST_DESCRIPTION("Test that an error is produced for a pipeline containing multiple "
12763 "shaders for the same stage");
Chris Forbesc68b43c2016-04-06 11:18:47 +120012764 m_errorMonitor->SetDesiredFailureMsg(
12765 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12766 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
12767
12768 ASSERT_NO_FATAL_FAILURE(InitState());
12769 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12770
12771 char const *vsSource =
12772 "#version 450\n"
12773 "\n"
12774 "out gl_PerVertex {\n"
12775 " vec4 gl_Position;\n"
12776 "};\n"
12777 "void main(){\n"
12778 " gl_Position = vec4(1);\n"
12779 "}\n";
12780 char const *fsSource =
12781 "#version 450\n"
12782 "\n"
12783 "layout(location=0) out vec4 color;\n"
12784 "void main(){\n"
12785 " color = vec4(1);\n"
12786 "}\n";
12787
12788 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12789 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12790
12791 VkPipelineObj pipe(m_device);
12792 pipe.AddColorAttachment();
12793 pipe.AddShader(&vs);
12794 pipe.AddShader(&vs);
12795 pipe.AddShader(&fs);
12796
12797 VkDescriptorSetObj descriptorSet(m_device);
12798 descriptorSet.AppendDummy();
12799 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12800
12801 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12802
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012803 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120012804}
12805
Karl Schultz6addd812016-02-02 17:17:23 -070012806TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes1cc79542016-07-20 11:13:44 +120012807 TEST_DESCRIPTION("Test that pipeline validation accepts matrices passed "
12808 "as vertex attributes");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012809 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130012810
12811 ASSERT_NO_FATAL_FAILURE(InitState());
12812 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12813
12814 VkVertexInputBindingDescription input_binding;
12815 memset(&input_binding, 0, sizeof(input_binding));
12816
12817 VkVertexInputAttributeDescription input_attribs[2];
12818 memset(input_attribs, 0, sizeof(input_attribs));
12819
12820 for (int i = 0; i < 2; i++) {
12821 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
12822 input_attribs[i].location = i;
12823 }
12824
12825 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012826 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012827 "\n"
12828 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070012829 "out gl_PerVertex {\n"
12830 " vec4 gl_Position;\n"
12831 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012832 "void main(){\n"
12833 " gl_Position = x[0] + x[1];\n"
12834 "}\n";
12835 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012836 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012837 "\n"
12838 "layout(location=0) out vec4 color;\n"
12839 "void main(){\n"
12840 " color = vec4(1);\n"
12841 "}\n";
12842
12843 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12844 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12845
12846 VkPipelineObj pipe(m_device);
12847 pipe.AddColorAttachment();
12848 pipe.AddShader(&vs);
12849 pipe.AddShader(&fs);
12850
12851 pipe.AddVertexInputBindings(&input_binding, 1);
12852 pipe.AddVertexInputAttribs(input_attribs, 2);
12853
12854 VkDescriptorSetObj descriptorSet(m_device);
12855 descriptorSet.AppendDummy();
12856 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12857
12858 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12859
12860 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012861 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130012862}
12863
Chris Forbes2682b242015-11-24 11:13:14 +130012864TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
12865{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012866 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130012867
12868 ASSERT_NO_FATAL_FAILURE(InitState());
12869 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12870
12871 VkVertexInputBindingDescription input_binding;
12872 memset(&input_binding, 0, sizeof(input_binding));
12873
12874 VkVertexInputAttributeDescription input_attribs[2];
12875 memset(input_attribs, 0, sizeof(input_attribs));
12876
12877 for (int i = 0; i < 2; i++) {
12878 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
12879 input_attribs[i].location = i;
12880 }
12881
12882 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012883 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012884 "\n"
12885 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -070012886 "out gl_PerVertex {\n"
12887 " vec4 gl_Position;\n"
12888 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012889 "void main(){\n"
12890 " gl_Position = x[0] + x[1];\n"
12891 "}\n";
12892 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012893 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012894 "\n"
12895 "layout(location=0) out vec4 color;\n"
12896 "void main(){\n"
12897 " color = vec4(1);\n"
12898 "}\n";
12899
12900 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12901 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12902
12903 VkPipelineObj pipe(m_device);
12904 pipe.AddColorAttachment();
12905 pipe.AddShader(&vs);
12906 pipe.AddShader(&fs);
12907
12908 pipe.AddVertexInputBindings(&input_binding, 1);
12909 pipe.AddVertexInputAttribs(input_attribs, 2);
12910
12911 VkDescriptorSetObj descriptorSet(m_device);
12912 descriptorSet.AppendDummy();
12913 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12914
12915 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12916
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012917 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130012918}
Chris Forbes2682b242015-11-24 11:13:14 +130012919
Chris Forbesbc290ce2016-07-06 12:01:49 +120012920TEST_F(VkLayerTest, CreatePipelineAttribComponents)
12921{
Chris Forbes1cc79542016-07-20 11:13:44 +120012922 TEST_DESCRIPTION("Test that pipeline validation accepts consuming a vertex attribute "
12923 "through multiple VS inputs, each consuming a different subset of the "
12924 "components.");
Chris Forbesbc290ce2016-07-06 12:01:49 +120012925 m_errorMonitor->ExpectSuccess();
12926
12927 ASSERT_NO_FATAL_FAILURE(InitState());
12928 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12929
12930 VkVertexInputBindingDescription input_binding;
12931 memset(&input_binding, 0, sizeof(input_binding));
12932
12933 VkVertexInputAttributeDescription input_attribs[3];
12934 memset(input_attribs, 0, sizeof(input_attribs));
12935
12936 for (int i = 0; i < 3; i++) {
12937 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
12938 input_attribs[i].location = i;
12939 }
12940
12941 char const *vsSource =
12942 "#version 450\n"
12943 "\n"
12944 "layout(location=0) in vec4 x;\n"
12945 "layout(location=1) in vec3 y1;\n"
12946 "layout(location=1, component=3) in float y2;\n"
12947 "layout(location=2) in vec4 z;\n"
12948 "out gl_PerVertex {\n"
12949 " vec4 gl_Position;\n"
12950 "};\n"
12951 "void main(){\n"
12952 " gl_Position = x + vec4(y1, y2) + z;\n"
12953 "}\n";
12954 char const *fsSource =
12955 "#version 450\n"
12956 "\n"
12957 "layout(location=0) out vec4 color;\n"
12958 "void main(){\n"
12959 " color = vec4(1);\n"
12960 "}\n";
12961
12962 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12963 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12964
12965 VkPipelineObj pipe(m_device);
12966 pipe.AddColorAttachment();
12967 pipe.AddShader(&vs);
12968 pipe.AddShader(&fs);
12969
12970 pipe.AddVertexInputBindings(&input_binding, 1);
12971 pipe.AddVertexInputAttribs(input_attribs, 3);
12972
12973 VkDescriptorSetObj descriptorSet(m_device);
12974 descriptorSet.AppendDummy();
12975 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12976
12977 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12978
12979 m_errorMonitor->VerifyNotFound();
12980}
12981
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012982TEST_F(VkLayerTest, CreatePipelineSimplePositive)
12983{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012984 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012985
12986 ASSERT_NO_FATAL_FAILURE(InitState());
12987 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12988
12989 char const *vsSource =
12990 "#version 450\n"
12991 "out gl_PerVertex {\n"
12992 " vec4 gl_Position;\n"
12993 "};\n"
12994 "void main(){\n"
12995 " gl_Position = vec4(0);\n"
12996 "}\n";
12997 char const *fsSource =
12998 "#version 450\n"
12999 "\n"
13000 "layout(location=0) out vec4 color;\n"
13001 "void main(){\n"
13002 " color = vec4(1);\n"
13003 "}\n";
13004
13005 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13006 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13007
13008 VkPipelineObj pipe(m_device);
13009 pipe.AddColorAttachment();
13010 pipe.AddShader(&vs);
13011 pipe.AddShader(&fs);
13012
13013 VkDescriptorSetObj descriptorSet(m_device);
13014 descriptorSet.AppendDummy();
13015 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13016
13017 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13018
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013019 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013020}
13021
Chris Forbes912c9192016-04-05 17:50:35 +120013022TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
13023{
Chris Forbes1cc79542016-07-20 11:13:44 +120013024 TEST_DESCRIPTION("Test that pipeline validation accepts the relaxed type matching rules "
13025 "set out in 14.1.3: fundamental type must match, and producer side must "
13026 "have at least as many components");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013027 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +120013028
13029 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
13030
13031 ASSERT_NO_FATAL_FAILURE(InitState());
13032 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13033
13034 char const *vsSource =
13035 "#version 450\n"
13036 "out gl_PerVertex {\n"
13037 " vec4 gl_Position;\n"
13038 "};\n"
13039 "layout(location=0) out vec3 x;\n"
13040 "layout(location=1) out ivec3 y;\n"
13041 "layout(location=2) out vec3 z;\n"
13042 "void main(){\n"
13043 " gl_Position = vec4(0);\n"
13044 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
13045 "}\n";
13046 char const *fsSource =
13047 "#version 450\n"
13048 "\n"
13049 "layout(location=0) out vec4 color;\n"
13050 "layout(location=0) in float x;\n"
13051 "layout(location=1) flat in int y;\n"
13052 "layout(location=2) in vec2 z;\n"
13053 "void main(){\n"
13054 " color = vec4(1 + x + y + z.x);\n"
13055 "}\n";
13056
13057 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13058 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13059
13060 VkPipelineObj pipe(m_device);
13061 pipe.AddColorAttachment();
13062 pipe.AddShader(&vs);
13063 pipe.AddShader(&fs);
13064
13065 VkDescriptorSetObj descriptorSet(m_device);
13066 descriptorSet.AppendDummy();
13067 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13068
Mike Stroyan255e9582016-06-24 09:49:32 -060013069 VkResult err = VK_SUCCESS;
13070 err =
13071 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13072 ASSERT_VK_SUCCESS(err);
13073
Chris Forbes912c9192016-04-05 17:50:35 +120013074
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013075 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +120013076}
13077
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013078TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
13079{
Chris Forbes1cc79542016-07-20 11:13:44 +120013080 TEST_DESCRIPTION("Test that pipeline validation accepts per-vertex variables "
13081 "passed between the TCS and TES stages");
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013082 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013083
13084 ASSERT_NO_FATAL_FAILURE(InitState());
13085 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13086
Chris Forbesc1e852d2016-04-04 19:26:42 +120013087 if (!m_device->phy().features().tessellationShader) {
13088 printf("Device does not support tessellation shaders; skipped.\n");
13089 return;
13090 }
13091
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013092 char const *vsSource =
13093 "#version 450\n"
13094 "void main(){}\n";
13095 char const *tcsSource =
13096 "#version 450\n"
13097 "layout(location=0) out int x[];\n"
13098 "layout(vertices=3) out;\n"
13099 "void main(){\n"
13100 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
13101 " gl_TessLevelInner[0] = 1;\n"
13102 " x[gl_InvocationID] = gl_InvocationID;\n"
13103 "}\n";
13104 char const *tesSource =
13105 "#version 450\n"
13106 "layout(triangles, equal_spacing, cw) in;\n"
13107 "layout(location=0) in int x[];\n"
13108 "out gl_PerVertex { vec4 gl_Position; };\n"
13109 "void main(){\n"
13110 " gl_Position.xyz = gl_TessCoord;\n"
13111 " gl_Position.w = x[0] + x[1] + x[2];\n"
13112 "}\n";
13113 char const *fsSource =
13114 "#version 450\n"
13115 "layout(location=0) out vec4 color;\n"
13116 "void main(){\n"
13117 " color = vec4(1);\n"
13118 "}\n";
13119
13120 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13121 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
13122 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
13123 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13124
13125 VkPipelineInputAssemblyStateCreateInfo iasci{
13126 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
13127 nullptr,
13128 0,
13129 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
13130 VK_FALSE};
13131
Chris Forbesb4cacb62016-04-04 19:15:00 +120013132 VkPipelineTessellationStateCreateInfo tsci{
13133 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
13134 nullptr,
13135 0,
13136 3};
13137
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013138 VkPipelineObj pipe(m_device);
13139 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +120013140 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013141 pipe.AddColorAttachment();
13142 pipe.AddShader(&vs);
13143 pipe.AddShader(&tcs);
13144 pipe.AddShader(&tes);
13145 pipe.AddShader(&fs);
13146
13147 VkDescriptorSetObj descriptorSet(m_device);
13148 descriptorSet.AppendDummy();
13149 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13150
13151 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13152
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013153 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120013154}
13155
Chris Forbesa0ab8152016-04-20 13:34:27 +120013156TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
13157{
Chris Forbes1cc79542016-07-20 11:13:44 +120013158 TEST_DESCRIPTION("Test that pipeline validation accepts a user-defined "
13159 "interface block passed into the geometry shader. This "
13160 "is interesting because the 'extra' array level is not "
13161 "present on the member type, but on the block instance.");
Chris Forbesa0ab8152016-04-20 13:34:27 +120013162 m_errorMonitor->ExpectSuccess();
13163
13164 ASSERT_NO_FATAL_FAILURE(InitState());
13165 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13166
13167 if (!m_device->phy().features().geometryShader) {
13168 printf("Device does not support geometry shaders; skipped.\n");
13169 return;
13170 }
13171
13172 char const *vsSource =
13173 "#version 450\n"
13174 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
13175 "void main(){\n"
13176 " vs_out.x = vec4(1);\n"
13177 "}\n";
13178 char const *gsSource =
13179 "#version 450\n"
13180 "layout(triangles) in;\n"
13181 "layout(triangle_strip, max_vertices=3) out;\n"
13182 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
13183 "out gl_PerVertex { vec4 gl_Position; };\n"
13184 "void main() {\n"
13185 " gl_Position = gs_in[0].x;\n"
13186 " EmitVertex();\n"
13187 "}\n";
13188 char const *fsSource =
13189 "#version 450\n"
13190 "layout(location=0) out vec4 color;\n"
13191 "void main(){\n"
13192 " color = vec4(1);\n"
13193 "}\n";
13194
13195 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13196 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
13197 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13198
13199 VkPipelineObj pipe(m_device);
13200 pipe.AddColorAttachment();
13201 pipe.AddShader(&vs);
13202 pipe.AddShader(&gs);
13203 pipe.AddShader(&fs);
13204
13205 VkDescriptorSetObj descriptorSet(m_device);
13206 descriptorSet.AppendDummy();
13207 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13208
13209 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13210
13211 m_errorMonitor->VerifyNotFound();
13212}
13213
Chris Forbesa0193bc2016-04-04 19:19:47 +120013214TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
13215{
Chris Forbes1cc79542016-07-20 11:13:44 +120013216 TEST_DESCRIPTION("Test that an error is produced for a variable output from "
13217 "the TCS without the patch decoration, but consumed in the TES "
13218 "with the decoration.");
Chris Forbesa0193bc2016-04-04 19:19:47 +120013219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13220 "is per-vertex in tessellation control shader stage "
13221 "but per-patch in tessellation evaluation shader stage");
13222
13223 ASSERT_NO_FATAL_FAILURE(InitState());
13224 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13225
Chris Forbesc1e852d2016-04-04 19:26:42 +120013226 if (!m_device->phy().features().tessellationShader) {
13227 printf("Device does not support tessellation shaders; skipped.\n");
13228 return;
13229 }
13230
Chris Forbesa0193bc2016-04-04 19:19:47 +120013231 char const *vsSource =
13232 "#version 450\n"
13233 "void main(){}\n";
13234 char const *tcsSource =
13235 "#version 450\n"
13236 "layout(location=0) out int x[];\n"
13237 "layout(vertices=3) out;\n"
13238 "void main(){\n"
13239 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
13240 " gl_TessLevelInner[0] = 1;\n"
13241 " x[gl_InvocationID] = gl_InvocationID;\n"
13242 "}\n";
13243 char const *tesSource =
13244 "#version 450\n"
13245 "layout(triangles, equal_spacing, cw) in;\n"
13246 "layout(location=0) patch in int x;\n"
13247 "out gl_PerVertex { vec4 gl_Position; };\n"
13248 "void main(){\n"
13249 " gl_Position.xyz = gl_TessCoord;\n"
13250 " gl_Position.w = x;\n"
13251 "}\n";
13252 char const *fsSource =
13253 "#version 450\n"
13254 "layout(location=0) out vec4 color;\n"
13255 "void main(){\n"
13256 " color = vec4(1);\n"
13257 "}\n";
13258
13259 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13260 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
13261 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
13262 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13263
13264 VkPipelineInputAssemblyStateCreateInfo iasci{
13265 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
13266 nullptr,
13267 0,
13268 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
13269 VK_FALSE};
13270
13271 VkPipelineTessellationStateCreateInfo tsci{
13272 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
13273 nullptr,
13274 0,
13275 3};
13276
13277 VkPipelineObj pipe(m_device);
13278 pipe.SetInputAssembly(&iasci);
13279 pipe.SetTessellation(&tsci);
13280 pipe.AddColorAttachment();
13281 pipe.AddShader(&vs);
13282 pipe.AddShader(&tcs);
13283 pipe.AddShader(&tes);
13284 pipe.AddShader(&fs);
13285
13286 VkDescriptorSetObj descriptorSet(m_device);
13287 descriptorSet.AppendDummy();
13288 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13289
13290 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13291
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013292 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120013293}
13294
Karl Schultz6addd812016-02-02 17:17:23 -070013295TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013296 TEST_DESCRIPTION("Test that an error is produced for a vertex attribute setup where multiple "
13297 "bindings provide the same location");
Karl Schultz6addd812016-02-02 17:17:23 -070013298 m_errorMonitor->SetDesiredFailureMsg(
13299 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013300 "Duplicate vertex input binding descriptions for binding 0");
13301
Chris Forbes280ba2c2015-06-12 11:16:41 +120013302 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013303 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120013304
13305 /* Two binding descriptions for binding 0 */
13306 VkVertexInputBindingDescription input_bindings[2];
13307 memset(input_bindings, 0, sizeof(input_bindings));
13308
13309 VkVertexInputAttributeDescription input_attrib;
13310 memset(&input_attrib, 0, sizeof(input_attrib));
13311 input_attrib.format = VK_FORMAT_R32_SFLOAT;
13312
13313 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013314 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120013315 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013316 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070013317 "out gl_PerVertex {\n"
13318 " vec4 gl_Position;\n"
13319 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120013320 "void main(){\n"
13321 " gl_Position = vec4(x);\n"
13322 "}\n";
13323 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013324 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120013325 "\n"
13326 "layout(location=0) out vec4 color;\n"
13327 "void main(){\n"
13328 " color = vec4(1);\n"
13329 "}\n";
13330
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013331 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13332 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120013333
13334 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013335 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120013336 pipe.AddShader(&vs);
13337 pipe.AddShader(&fs);
13338
13339 pipe.AddVertexInputBindings(input_bindings, 2);
13340 pipe.AddVertexInputAttribs(&input_attrib, 1);
13341
Chris Forbes280ba2c2015-06-12 11:16:41 +120013342 VkDescriptorSetObj descriptorSet(m_device);
13343 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013344 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120013345
Tony Barbour5781e8f2015-08-04 16:23:11 -060013346 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120013347
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013348 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120013349}
Chris Forbes8f68b562015-05-25 11:13:32 +120013350
Chris Forbes35efec72016-04-21 14:32:08 +120013351TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013352 TEST_DESCRIPTION("Test that pipeline validation accepts basic use of 64bit vertex "
13353 "attributes. This is interesting because they consume multiple "
13354 "locations.");
Chris Forbes35efec72016-04-21 14:32:08 +120013355 m_errorMonitor->ExpectSuccess();
13356
13357 ASSERT_NO_FATAL_FAILURE(InitState());
13358 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13359
Chris Forbes91cf3a82016-06-28 17:51:35 +120013360 if (!m_device->phy().features().shaderFloat64) {
Chris Forbes35efec72016-04-21 14:32:08 +120013361 printf("Device does not support 64bit vertex attributes; skipped.\n");
13362 return;
13363 }
13364
13365 VkVertexInputBindingDescription input_bindings[1];
13366 memset(input_bindings, 0, sizeof(input_bindings));
13367
13368 VkVertexInputAttributeDescription input_attribs[4];
13369 memset(input_attribs, 0, sizeof(input_attribs));
13370 input_attribs[0].location = 0;
13371 input_attribs[0].offset = 0;
13372 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
13373 input_attribs[1].location = 2;
13374 input_attribs[1].offset = 32;
13375 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
13376 input_attribs[2].location = 4;
13377 input_attribs[2].offset = 64;
13378 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
13379 input_attribs[3].location = 6;
13380 input_attribs[3].offset = 96;
13381 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
13382
13383 char const *vsSource =
13384 "#version 450\n"
13385 "\n"
13386 "layout(location=0) in dmat4 x;\n"
13387 "out gl_PerVertex {\n"
13388 " vec4 gl_Position;\n"
13389 "};\n"
13390 "void main(){\n"
13391 " gl_Position = vec4(x[0][0]);\n"
13392 "}\n";
13393 char const *fsSource =
13394 "#version 450\n"
13395 "\n"
13396 "layout(location=0) out vec4 color;\n"
13397 "void main(){\n"
13398 " color = vec4(1);\n"
13399 "}\n";
13400
13401 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13402 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13403
13404 VkPipelineObj pipe(m_device);
13405 pipe.AddColorAttachment();
13406 pipe.AddShader(&vs);
13407 pipe.AddShader(&fs);
13408
13409 pipe.AddVertexInputBindings(input_bindings, 1);
13410 pipe.AddVertexInputAttribs(input_attribs, 4);
13411
13412 VkDescriptorSetObj descriptorSet(m_device);
13413 descriptorSet.AppendDummy();
13414 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13415
13416 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13417
13418 m_errorMonitor->VerifyNotFound();
13419}
13420
Karl Schultz6addd812016-02-02 17:17:23 -070013421TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013422 TEST_DESCRIPTION("Test that an error is produced for a FS which does not "
13423 "provide an output for one of the pipeline's color attachments");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013424 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013425 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013426
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013427 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013428
13429 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013430 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013431 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013432 "out gl_PerVertex {\n"
13433 " vec4 gl_Position;\n"
13434 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013435 "void main(){\n"
13436 " gl_Position = vec4(1);\n"
13437 "}\n";
13438 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013439 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013440 "\n"
13441 "void main(){\n"
13442 "}\n";
13443
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013444 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13445 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013446
13447 VkPipelineObj pipe(m_device);
13448 pipe.AddShader(&vs);
13449 pipe.AddShader(&fs);
13450
Chia-I Wu08accc62015-07-07 11:50:03 +080013451 /* set up CB 0, not written */
13452 pipe.AddColorAttachment();
13453 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013454
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013455 VkDescriptorSetObj descriptorSet(m_device);
13456 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013457 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013458
Tony Barbour5781e8f2015-08-04 16:23:11 -060013459 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013460
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013461 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013462}
13463
Karl Schultz6addd812016-02-02 17:17:23 -070013464TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013465 TEST_DESCRIPTION("Test that a warning is produced for a FS which provides a spurious "
13466 "output with no matching attachment");
Karl Schultz6addd812016-02-02 17:17:23 -070013467 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070013468 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013469 "FS writes to output location 1 with no matching attachment");
13470
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013471 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013472
13473 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013474 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013475 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013476 "out gl_PerVertex {\n"
13477 " vec4 gl_Position;\n"
13478 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013479 "void main(){\n"
13480 " gl_Position = vec4(1);\n"
13481 "}\n";
13482 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013483 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013484 "\n"
13485 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013486 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013487 "void main(){\n"
13488 " x = vec4(1);\n"
13489 " y = vec4(1);\n"
13490 "}\n";
13491
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013492 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13493 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013494
13495 VkPipelineObj pipe(m_device);
13496 pipe.AddShader(&vs);
13497 pipe.AddShader(&fs);
13498
Chia-I Wu08accc62015-07-07 11:50:03 +080013499 /* set up CB 0, not written */
13500 pipe.AddColorAttachment();
13501 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013502 /* FS writes CB 1, but we don't configure it */
13503
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013504 VkDescriptorSetObj descriptorSet(m_device);
13505 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013506 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013507
Tony Barbour5781e8f2015-08-04 16:23:11 -060013508 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013509
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013510 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013511}
13512
Karl Schultz6addd812016-02-02 17:17:23 -070013513TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013514 TEST_DESCRIPTION("Test that an error is produced for a mismatch between the fundamental "
13515 "type of an FS output variable, and the format of the corresponding attachment");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013516 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013517 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013518
Chris Forbesa36d69e2015-05-25 11:13:44 +120013519 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013520
13521 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013522 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120013523 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013524 "out gl_PerVertex {\n"
13525 " vec4 gl_Position;\n"
13526 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120013527 "void main(){\n"
13528 " gl_Position = vec4(1);\n"
13529 "}\n";
13530 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013531 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120013532 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013533 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +120013534 "void main(){\n"
13535 " x = ivec4(1);\n"
13536 "}\n";
13537
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013538 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13539 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120013540
13541 VkPipelineObj pipe(m_device);
13542 pipe.AddShader(&vs);
13543 pipe.AddShader(&fs);
13544
Chia-I Wu08accc62015-07-07 11:50:03 +080013545 /* set up CB 0; type is UNORM by default */
13546 pipe.AddColorAttachment();
13547 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013548
Chris Forbesa36d69e2015-05-25 11:13:44 +120013549 VkDescriptorSetObj descriptorSet(m_device);
13550 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013551 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120013552
Tony Barbour5781e8f2015-08-04 16:23:11 -060013553 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013554
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013555 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120013556}
Chris Forbes7b1b8932015-06-05 14:43:36 +120013557
Karl Schultz6addd812016-02-02 17:17:23 -070013558TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013559 TEST_DESCRIPTION("Test that an error is produced for a shader consuming a uniform "
13560 "block which has no corresponding binding in the pipeline layout");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013561 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013562 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013563
Chris Forbes556c76c2015-08-14 12:04:59 +120013564 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120013565
13566 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013567 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120013568 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013569 "out gl_PerVertex {\n"
13570 " vec4 gl_Position;\n"
13571 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120013572 "void main(){\n"
13573 " gl_Position = vec4(1);\n"
13574 "}\n";
13575 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013576 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120013577 "\n"
13578 "layout(location=0) out vec4 x;\n"
13579 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
13580 "void main(){\n"
13581 " x = vec4(bar.y);\n"
13582 "}\n";
13583
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013584 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13585 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120013586
Chris Forbes556c76c2015-08-14 12:04:59 +120013587 VkPipelineObj pipe(m_device);
13588 pipe.AddShader(&vs);
13589 pipe.AddShader(&fs);
13590
13591 /* set up CB 0; type is UNORM by default */
13592 pipe.AddColorAttachment();
13593 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13594
13595 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013596 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120013597
13598 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13599
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013600 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120013601}
13602
Chris Forbes5c59e902016-02-26 16:56:09 +130013603TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013604 TEST_DESCRIPTION("Test that an error is produced for a shader consuming push constants "
13605 "which are not provided in the pipeline layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130013606 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13607 "not declared in layout");
13608
13609 ASSERT_NO_FATAL_FAILURE(InitState());
13610
13611 char const *vsSource =
13612 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130013613 "\n"
13614 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13615 "out gl_PerVertex {\n"
13616 " vec4 gl_Position;\n"
13617 "};\n"
13618 "void main(){\n"
13619 " gl_Position = vec4(consts.x);\n"
13620 "}\n";
13621 char const *fsSource =
13622 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130013623 "\n"
13624 "layout(location=0) out vec4 x;\n"
13625 "void main(){\n"
13626 " x = vec4(1);\n"
13627 "}\n";
13628
13629 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13630 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13631
13632 VkPipelineObj pipe(m_device);
13633 pipe.AddShader(&vs);
13634 pipe.AddShader(&fs);
13635
13636 /* set up CB 0; type is UNORM by default */
13637 pipe.AddColorAttachment();
13638 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13639
13640 VkDescriptorSetObj descriptorSet(m_device);
13641 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13642
13643 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13644
13645 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013646 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130013647}
13648
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013649TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013650 TEST_DESCRIPTION("Test that an error is produced for a compute pipeline consuming a "
13651 "descriptor which is not provided in the pipeline layout");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013652 m_errorMonitor->SetDesiredFailureMsg(
13653 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13654 "Shader uses descriptor slot 0.0");
13655
13656 ASSERT_NO_FATAL_FAILURE(InitState());
13657
13658 char const *csSource =
13659 "#version 450\n"
13660 "\n"
13661 "layout(local_size_x=1) in;\n"
13662 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13663 "void main(){\n"
13664 " x = vec4(1);\n"
13665 "}\n";
13666
13667 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13668
13669 VkDescriptorSetObj descriptorSet(m_device);
13670 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13671
13672 VkComputePipelineCreateInfo cpci = {
13673 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
13674 nullptr, 0, {
13675 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
13676 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
13677 cs.handle(), "main", nullptr
13678 },
13679 descriptorSet.GetPipelineLayout(),
13680 VK_NULL_HANDLE, -1
13681 };
13682
13683 VkPipeline pipe;
13684 VkResult err = vkCreateComputePipelines(
13685 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
13686
13687 m_errorMonitor->VerifyFound();
13688
13689 if (err == VK_SUCCESS) {
13690 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13691 }
13692}
13693
13694TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013695 TEST_DESCRIPTION("Test that pipeline validation accepts a compute pipeline which declares a "
13696 "descriptor-backed resource which is not provided, but the shader does not "
13697 "statically use it. This is interesting because it requires compute pipelines "
13698 "to have a proper descriptor use walk, which they didn't for some time.");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013699 m_errorMonitor->ExpectSuccess();
13700
13701 ASSERT_NO_FATAL_FAILURE(InitState());
13702
13703 char const *csSource =
13704 "#version 450\n"
13705 "\n"
13706 "layout(local_size_x=1) in;\n"
13707 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13708 "void main(){\n"
13709 " // x is not used.\n"
13710 "}\n";
13711
13712 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13713
13714 VkDescriptorSetObj descriptorSet(m_device);
13715 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13716
13717 VkComputePipelineCreateInfo cpci = {
13718 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
13719 nullptr, 0, {
13720 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
13721 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
13722 cs.handle(), "main", nullptr
13723 },
13724 descriptorSet.GetPipelineLayout(),
13725 VK_NULL_HANDLE, -1
13726 };
13727
13728 VkPipeline pipe;
13729 VkResult err = vkCreateComputePipelines(
13730 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
13731
13732 m_errorMonitor->VerifyNotFound();
13733
13734 if (err == VK_SUCCESS) {
13735 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13736 }
13737}
13738
Chris Forbes22a9b092016-07-19 14:34:05 +120013739TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013740 TEST_DESCRIPTION("Test that an error is produced for a pipeline consuming a "
13741 "descriptor-backed resource of a mismatched type");
Chris Forbes22a9b092016-07-19 14:34:05 +120013742 m_errorMonitor->SetDesiredFailureMsg(
13743 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13744 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
13745
13746 ASSERT_NO_FATAL_FAILURE(InitState());
13747
13748 VkDescriptorSetLayoutBinding binding = {
13749 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
13750 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
13751 };
13752 VkDescriptorSetLayoutCreateInfo dslci = {
13753 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
13754 0, 1, &binding
13755 };
13756 VkDescriptorSetLayout dsl;
13757 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
13758 nullptr, &dsl);
13759 ASSERT_VK_SUCCESS(err);
13760
13761 VkPipelineLayoutCreateInfo plci = {
13762 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
13763 0, 1, &dsl, 0, nullptr
13764 };
13765 VkPipelineLayout pl;
13766 err = vkCreatePipelineLayout(m_device->device(), &plci,
13767 nullptr, &pl);
13768 ASSERT_VK_SUCCESS(err);
13769
13770 char const *csSource =
13771 "#version 450\n"
13772 "\n"
13773 "layout(local_size_x=1) in;\n"
13774 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13775 "void main() {\n"
13776 " x.x = 1.0f;\n"
13777 "}\n";
13778 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13779
13780 VkComputePipelineCreateInfo cpci = {
13781 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
13782 0, {
13783 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
13784 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
13785 cs.handle(), "main", nullptr
13786 },
13787 pl, VK_NULL_HANDLE, -1
13788 };
13789
13790 VkPipeline pipe;
13791 err = vkCreateComputePipelines(
13792 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
13793
13794 m_errorMonitor->VerifyFound();
13795
13796 if (err == VK_SUCCESS) {
13797 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13798 }
13799
13800 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
13801 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
13802}
13803
Chris Forbese10a51f2016-07-19 14:42:51 +120013804TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013805 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
13806 "sampler portion of a combined image + sampler");
Chris Forbese10a51f2016-07-19 14:42:51 +120013807 m_errorMonitor->ExpectSuccess();
13808
13809 ASSERT_NO_FATAL_FAILURE(InitState());
13810
13811 VkDescriptorSetLayoutBinding bindings[] = {
13812 {
13813 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
13814 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
13815 },
13816 {
13817 1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
13818 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
13819 },
13820 {
13821 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
13822 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
13823 },
13824 };
13825 VkDescriptorSetLayoutCreateInfo dslci = {
13826 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
13827 0, 3, bindings
13828 };
13829 VkDescriptorSetLayout dsl;
13830 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
13831 nullptr, &dsl);
13832 ASSERT_VK_SUCCESS(err);
13833
13834 VkPipelineLayoutCreateInfo plci = {
13835 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
13836 0, 1, &dsl, 0, nullptr
13837 };
13838 VkPipelineLayout pl;
13839 err = vkCreatePipelineLayout(m_device->device(), &plci,
13840 nullptr, &pl);
13841 ASSERT_VK_SUCCESS(err);
13842
13843 char const *csSource =
13844 "#version 450\n"
13845 "\n"
13846 "layout(local_size_x=1) in;\n"
13847 "layout(set=0, binding=0) uniform sampler s;\n"
13848 "layout(set=0, binding=1) uniform texture2D t;\n"
13849 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
13850 "void main() {\n"
13851 " x = texture(sampler2D(t, s), vec2(0));\n"
13852 "}\n";
13853 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13854
13855 VkComputePipelineCreateInfo cpci = {
13856 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
13857 0, {
13858 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
13859 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
13860 cs.handle(), "main", nullptr
13861 },
13862 pl, VK_NULL_HANDLE, -1
13863 };
13864
13865 VkPipeline pipe;
13866 err = vkCreateComputePipelines(
13867 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
13868
13869 m_errorMonitor->VerifyNotFound();
13870
13871 if (err == VK_SUCCESS) {
13872 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13873 }
13874
13875 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
13876 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
13877}
13878
Chris Forbes91c3b2a2016-07-19 14:46:38 +120013879TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013880 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming only the "
13881 "image portion of a combined image + sampler");
Chris Forbes91c3b2a2016-07-19 14:46:38 +120013882 m_errorMonitor->ExpectSuccess();
13883
13884 ASSERT_NO_FATAL_FAILURE(InitState());
13885
13886 VkDescriptorSetLayoutBinding bindings[] = {
13887 {
13888 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
13889 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
13890 },
13891 {
13892 1, VK_DESCRIPTOR_TYPE_SAMPLER,
13893 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
13894 },
13895 {
13896 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
13897 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
13898 },
13899 };
13900 VkDescriptorSetLayoutCreateInfo dslci = {
13901 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
13902 0, 3, bindings
13903 };
13904 VkDescriptorSetLayout dsl;
13905 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
13906 nullptr, &dsl);
13907 ASSERT_VK_SUCCESS(err);
13908
13909 VkPipelineLayoutCreateInfo plci = {
13910 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
13911 0, 1, &dsl, 0, nullptr
13912 };
13913 VkPipelineLayout pl;
13914 err = vkCreatePipelineLayout(m_device->device(), &plci,
13915 nullptr, &pl);
13916 ASSERT_VK_SUCCESS(err);
13917
13918 char const *csSource =
13919 "#version 450\n"
13920 "\n"
13921 "layout(local_size_x=1) in;\n"
13922 "layout(set=0, binding=0) uniform texture2D t;\n"
13923 "layout(set=0, binding=1) uniform sampler s;\n"
13924 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
13925 "void main() {\n"
13926 " x = texture(sampler2D(t, s), vec2(0));\n"
13927 "}\n";
13928 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13929
13930 VkComputePipelineCreateInfo cpci = {
13931 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
13932 0, {
13933 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
13934 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
13935 cs.handle(), "main", nullptr
13936 },
13937 pl, VK_NULL_HANDLE, -1
13938 };
13939
13940 VkPipeline pipe;
13941 err = vkCreateComputePipelines(
13942 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
13943
13944 m_errorMonitor->VerifyNotFound();
13945
13946 if (err == VK_SUCCESS) {
13947 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13948 }
13949
13950 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
13951 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
13952}
13953
Chris Forbes6a4991a2016-07-19 15:07:32 +120013954TEST_F(VkLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Chris Forbes1cc79542016-07-20 11:13:44 +120013955 TEST_DESCRIPTION("Test that pipeline validation accepts a shader consuming "
13956 "both the sampler and the image of a combined image+sampler "
13957 "but via separate variables");
Chris Forbes6a4991a2016-07-19 15:07:32 +120013958 m_errorMonitor->ExpectSuccess();
13959
13960 ASSERT_NO_FATAL_FAILURE(InitState());
13961
13962 VkDescriptorSetLayoutBinding bindings[] = {
13963 {
13964 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
13965 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
13966 },
13967 {
13968 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
13969 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr
13970 },
13971 };
13972 VkDescriptorSetLayoutCreateInfo dslci = {
13973 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr,
13974 0, 2, bindings
13975 };
13976 VkDescriptorSetLayout dsl;
13977 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci,
13978 nullptr, &dsl);
13979 ASSERT_VK_SUCCESS(err);
13980
13981 VkPipelineLayoutCreateInfo plci = {
13982 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr,
13983 0, 1, &dsl, 0, nullptr
13984 };
13985 VkPipelineLayout pl;
13986 err = vkCreatePipelineLayout(m_device->device(), &plci,
13987 nullptr, &pl);
13988 ASSERT_VK_SUCCESS(err);
13989
13990 char const *csSource =
13991 "#version 450\n"
13992 "\n"
13993 "layout(local_size_x=1) in;\n"
13994 "layout(set=0, binding=0) uniform texture2D t;\n"
13995 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
13996 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
13997 "void main() {\n"
13998 " x = texture(sampler2D(t, s), vec2(0));\n"
13999 "}\n";
14000 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
14001
14002 VkComputePipelineCreateInfo cpci = {
14003 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, nullptr,
14004 0, {
14005 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
14006 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
14007 cs.handle(), "main", nullptr
14008 },
14009 pl, VK_NULL_HANDLE, -1
14010 };
14011
14012 VkPipeline pipe;
14013 err = vkCreateComputePipelines(
14014 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
14015
14016 m_errorMonitor->VerifyNotFound();
14017
14018 if (err == VK_SUCCESS) {
14019 vkDestroyPipeline(m_device->device(), pipe, nullptr);
14020 }
14021
14022 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
14023 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
14024}
14025
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014026#endif // SHADER_CHECKER_TESTS
14027
14028#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -060014029TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -070014030 m_errorMonitor->SetDesiredFailureMsg(
14031 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014032 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014033
14034 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014035
14036 // Create an image
14037 VkImage image;
14038
Karl Schultz6addd812016-02-02 17:17:23 -070014039 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14040 const int32_t tex_width = 32;
14041 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014042
14043 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014044 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14045 image_create_info.pNext = NULL;
14046 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14047 image_create_info.format = tex_format;
14048 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014049 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070014050 image_create_info.extent.depth = 1;
14051 image_create_info.mipLevels = 1;
14052 image_create_info.arrayLayers = 1;
14053 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14054 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14055 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14056 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014057
14058 // Introduce error by sending down a bogus width extent
14059 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014060 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014061
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014062 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060014063}
14064
Mark Youngc48c4c12016-04-11 14:26:49 -060014065TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
14066 m_errorMonitor->SetDesiredFailureMsg(
14067 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14068 "CreateImage extents is 0 for at least one required dimension");
14069
14070 ASSERT_NO_FATAL_FAILURE(InitState());
14071
14072 // Create an image
14073 VkImage image;
14074
14075 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14076 const int32_t tex_width = 32;
14077 const int32_t tex_height = 32;
14078
14079 VkImageCreateInfo image_create_info = {};
14080 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14081 image_create_info.pNext = NULL;
14082 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14083 image_create_info.format = tex_format;
14084 image_create_info.extent.width = tex_width;
14085 image_create_info.extent.height = tex_height;
14086 image_create_info.extent.depth = 1;
14087 image_create_info.mipLevels = 1;
14088 image_create_info.arrayLayers = 1;
14089 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14090 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14091 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14092 image_create_info.flags = 0;
14093
14094 // Introduce error by sending down a bogus width extent
14095 image_create_info.extent.width = 0;
14096 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
14097
14098 m_errorMonitor->VerifyFound();
14099}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014100#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +120014101
Tobin Ehliscde08892015-09-22 10:11:37 -060014102#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070014103TEST_F(VkLayerTest, InvalidImageView) {
14104 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060014105
Karl Schultz6addd812016-02-02 17:17:23 -070014106 m_errorMonitor->SetDesiredFailureMsg(
14107 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014108 "vkCreateImageView called with baseMipLevel 10 ");
14109
Tobin Ehliscde08892015-09-22 10:11:37 -060014110 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060014111
Mike Stroyana3082432015-09-25 13:39:21 -060014112 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070014113 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060014114
Karl Schultz6addd812016-02-02 17:17:23 -070014115 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14116 const int32_t tex_width = 32;
14117 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060014118
14119 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014120 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14121 image_create_info.pNext = NULL;
14122 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14123 image_create_info.format = tex_format;
14124 image_create_info.extent.width = tex_width;
14125 image_create_info.extent.height = tex_height;
14126 image_create_info.extent.depth = 1;
14127 image_create_info.mipLevels = 1;
14128 image_create_info.arrayLayers = 1;
14129 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14130 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14131 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14132 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060014133
Chia-I Wuf7458c52015-10-26 21:10:41 +080014134 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060014135 ASSERT_VK_SUCCESS(err);
14136
14137 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014138 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14139 image_view_create_info.image = image;
14140 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14141 image_view_create_info.format = tex_format;
14142 image_view_create_info.subresourceRange.layerCount = 1;
14143 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
14144 image_view_create_info.subresourceRange.levelCount = 1;
14145 image_view_create_info.subresourceRange.aspectMask =
14146 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060014147
14148 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070014149 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
14150 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060014151
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014152 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060014153 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060014154}
Mike Stroyana3082432015-09-25 13:39:21 -060014155
Mark Youngd339ba32016-05-30 13:28:35 -060014156TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
14157 VkResult err;
14158
14159 m_errorMonitor->SetDesiredFailureMsg(
14160 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski0dcf2722016-07-14 09:54:11 -060014161 "used without first calling vkBindImageMemory");
Mark Youngd339ba32016-05-30 13:28:35 -060014162
14163 ASSERT_NO_FATAL_FAILURE(InitState());
14164
14165 // Create an image and try to create a view with no memory backing the image
14166 VkImage image;
14167
14168 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
14169 const int32_t tex_width = 32;
14170 const int32_t tex_height = 32;
14171
14172 VkImageCreateInfo image_create_info = {};
14173 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14174 image_create_info.pNext = NULL;
14175 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14176 image_create_info.format = tex_format;
14177 image_create_info.extent.width = tex_width;
14178 image_create_info.extent.height = tex_height;
14179 image_create_info.extent.depth = 1;
14180 image_create_info.mipLevels = 1;
14181 image_create_info.arrayLayers = 1;
14182 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14183 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14184 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14185 image_create_info.flags = 0;
14186
14187 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
14188 ASSERT_VK_SUCCESS(err);
14189
14190 VkImageViewCreateInfo image_view_create_info = {};
14191 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14192 image_view_create_info.image = image;
14193 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14194 image_view_create_info.format = tex_format;
14195 image_view_create_info.subresourceRange.layerCount = 1;
14196 image_view_create_info.subresourceRange.baseMipLevel = 0;
14197 image_view_create_info.subresourceRange.levelCount = 1;
14198 image_view_create_info.subresourceRange.aspectMask =
14199 VK_IMAGE_ASPECT_COLOR_BIT;
14200
14201 VkImageView view;
14202 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
14203 &view);
14204
14205 m_errorMonitor->VerifyFound();
14206 vkDestroyImage(m_device->device(), image, NULL);
14207 // If last error is success, it still created the view, so delete it.
14208 if (err == VK_SUCCESS) {
14209 vkDestroyImageView(m_device->device(), view, NULL);
14210 }
14211
14212}
14213
Karl Schultz6addd812016-02-02 17:17:23 -070014214TEST_F(VkLayerTest, InvalidImageViewAspect) {
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014215 TEST_DESCRIPTION(
14216 "Create an image and try to create a view with an invalid aspectMask");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014217 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070014218 "vkCreateImageView: Color image "
14219 "formats must have ONLY the "
14220 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014221
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014222 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014223
Karl Schultz6addd812016-02-02 17:17:23 -070014224 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014225 VkImageObj image(m_device);
14226 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT,
14227 VK_IMAGE_TILING_LINEAR, 0);
14228 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014229
14230 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014231 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014232 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070014233 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14234 image_view_create_info.format = tex_format;
14235 image_view_create_info.subresourceRange.baseMipLevel = 0;
14236 image_view_create_info.subresourceRange.levelCount = 1;
14237 // Cause an error by setting an invalid image aspect
14238 image_view_create_info.subresourceRange.aspectMask =
14239 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014240
14241 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060014242 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014243
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014244 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060014245}
14246
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014247TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070014248 VkResult err;
14249 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014250
Karl Schultz6addd812016-02-02 17:17:23 -070014251 m_errorMonitor->SetDesiredFailureMsg(
14252 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014253 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014254
Mike Stroyana3082432015-09-25 13:39:21 -060014255 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014256
14257 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014258 VkImage srcImage;
14259 VkImage dstImage;
14260 VkDeviceMemory srcMem;
14261 VkDeviceMemory destMem;
14262 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014263
14264 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014265 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14266 image_create_info.pNext = NULL;
14267 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14268 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14269 image_create_info.extent.width = 32;
14270 image_create_info.extent.height = 32;
14271 image_create_info.extent.depth = 1;
14272 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014273 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070014274 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14275 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14276 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14277 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014278
Karl Schultz6addd812016-02-02 17:17:23 -070014279 err =
14280 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014281 ASSERT_VK_SUCCESS(err);
14282
Karl Schultz6addd812016-02-02 17:17:23 -070014283 err =
14284 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014285 ASSERT_VK_SUCCESS(err);
14286
14287 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014288 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014289 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14290 memAlloc.pNext = NULL;
14291 memAlloc.allocationSize = 0;
14292 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014293
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014294 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014295 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014296 pass =
14297 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014298 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014299 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014300 ASSERT_VK_SUCCESS(err);
14301
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014302 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014303 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014304 pass =
14305 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014306 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014307 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014308 ASSERT_VK_SUCCESS(err);
14309
14310 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14311 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014312 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014313 ASSERT_VK_SUCCESS(err);
14314
14315 BeginCommandBuffer();
14316 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014317 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014318 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014319 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014320 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060014321 copyRegion.srcOffset.x = 0;
14322 copyRegion.srcOffset.y = 0;
14323 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014324 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014325 copyRegion.dstSubresource.mipLevel = 0;
14326 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014327 // Introduce failure by forcing the dst layerCount to differ from src
14328 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014329 copyRegion.dstOffset.x = 0;
14330 copyRegion.dstOffset.y = 0;
14331 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014332 copyRegion.extent.width = 1;
14333 copyRegion.extent.height = 1;
14334 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014335 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14336 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014337 EndCommandBuffer();
14338
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014339 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014340
Chia-I Wuf7458c52015-10-26 21:10:41 +080014341 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014342 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014343 vkFreeMemory(m_device->device(), srcMem, NULL);
14344 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014345}
14346
Tony Barbourd6673642016-05-05 14:46:39 -060014347TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
14348
14349 TEST_DESCRIPTION("Creating images with unsuported formats ");
14350
14351 ASSERT_NO_FATAL_FAILURE(InitState());
14352 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14353 VkImageObj image(m_device);
14354 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
14355 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
14356 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
14357 VK_IMAGE_TILING_OPTIMAL, 0);
14358 ASSERT_TRUE(image.initialized());
14359
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014360 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
14361 VkImageCreateInfo image_create_info;
14362 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14363 image_create_info.pNext = NULL;
14364 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14365 image_create_info.format = VK_FORMAT_UNDEFINED;
14366 image_create_info.extent.width = 32;
14367 image_create_info.extent.height = 32;
14368 image_create_info.extent.depth = 1;
14369 image_create_info.mipLevels = 1;
14370 image_create_info.arrayLayers = 1;
14371 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14372 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14373 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14374 image_create_info.flags = 0;
14375
14376 m_errorMonitor->SetDesiredFailureMsg(
14377 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14378 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
14379
14380 VkImage localImage;
14381 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
14382 m_errorMonitor->VerifyFound();
14383
Tony Barbourd6673642016-05-05 14:46:39 -060014384 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014385 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060014386 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
14387 VkFormat format = static_cast<VkFormat>(f);
14388 VkFormatProperties fProps = m_device->format_properties(format);
14389 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
14390 fProps.optimalTilingFeatures == 0) {
14391 unsupported = format;
14392 break;
14393 }
14394 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014395
Tony Barbourd6673642016-05-05 14:46:39 -060014396 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060014397 image_create_info.format = unsupported;
Tony Barbourd6673642016-05-05 14:46:39 -060014398 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014399 "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060014400
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060014401 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060014402 m_errorMonitor->VerifyFound();
14403 }
14404}
14405
14406TEST_F(VkLayerTest, ImageLayerViewTests) {
14407 VkResult ret;
14408 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
14409
14410 ASSERT_NO_FATAL_FAILURE(InitState());
14411
14412 VkImageObj image(m_device);
14413 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
14414 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
14415 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
14416 VK_IMAGE_TILING_OPTIMAL, 0);
14417 ASSERT_TRUE(image.initialized());
14418
14419 VkImageView imgView;
14420 VkImageViewCreateInfo imgViewInfo = {};
14421 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
14422 imgViewInfo.image = image.handle();
14423 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
14424 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
14425 imgViewInfo.subresourceRange.layerCount = 1;
14426 imgViewInfo.subresourceRange.baseMipLevel = 0;
14427 imgViewInfo.subresourceRange.levelCount = 1;
14428 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14429
14430 m_errorMonitor->SetDesiredFailureMsg(
14431 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14432 "vkCreateImageView called with baseMipLevel");
14433 // View can't have baseMipLevel >= image's mipLevels - Expect
14434 // VIEW_CREATE_ERROR
14435 imgViewInfo.subresourceRange.baseMipLevel = 1;
14436 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14437 m_errorMonitor->VerifyFound();
14438 imgViewInfo.subresourceRange.baseMipLevel = 0;
14439
14440 m_errorMonitor->SetDesiredFailureMsg(
14441 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14442 "vkCreateImageView called with baseArrayLayer");
14443 // View can't have baseArrayLayer >= image's arraySize - Expect
14444 // VIEW_CREATE_ERROR
14445 imgViewInfo.subresourceRange.baseArrayLayer = 1;
14446 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14447 m_errorMonitor->VerifyFound();
14448 imgViewInfo.subresourceRange.baseArrayLayer = 0;
14449
14450 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14451 "vkCreateImageView called with 0 in "
14452 "pCreateInfo->subresourceRange."
14453 "levelCount");
14454 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
14455 imgViewInfo.subresourceRange.levelCount = 0;
14456 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14457 m_errorMonitor->VerifyFound();
14458 imgViewInfo.subresourceRange.levelCount = 1;
14459
14460 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14461 "vkCreateImageView called with 0 in "
14462 "pCreateInfo->subresourceRange."
14463 "layerCount");
14464 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
14465 imgViewInfo.subresourceRange.layerCount = 0;
14466 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14467 m_errorMonitor->VerifyFound();
14468 imgViewInfo.subresourceRange.layerCount = 1;
14469
14470 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14471 "but both must be color formats");
14472 // Can't use depth format for view into color image - Expect INVALID_FORMAT
14473 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
14474 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14475 m_errorMonitor->VerifyFound();
14476 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
14477
14478 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14479 "Formats MUST be IDENTICAL unless "
14480 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
14481 "was set on image creation.");
14482 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
14483 // VIEW_CREATE_ERROR
14484 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
14485 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14486 m_errorMonitor->VerifyFound();
14487 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
14488
14489 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14490 "can support ImageViews with "
14491 "differing formats but they must be "
14492 "in the same compatibility class.");
14493 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
14494 // VIEW_CREATE_ERROR
14495 VkImageCreateInfo mutImgInfo = image.create_info();
14496 VkImage mutImage;
14497 mutImgInfo.format = VK_FORMAT_R8_UINT;
14498 assert(
14499 m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures &
14500 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
14501 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
14502 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14503 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
14504 ASSERT_VK_SUCCESS(ret);
14505 imgViewInfo.image = mutImage;
14506 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
14507 m_errorMonitor->VerifyFound();
14508 imgViewInfo.image = image.handle();
14509 vkDestroyImage(m_device->handle(), mutImage, NULL);
14510}
14511
14512TEST_F(VkLayerTest, MiscImageLayerTests) {
14513
14514 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
14515
14516 ASSERT_NO_FATAL_FAILURE(InitState());
14517
14518 VkImageObj image(m_device);
14519 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
14520 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
14521 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
14522 VK_IMAGE_TILING_OPTIMAL, 0);
14523 ASSERT_TRUE(image.initialized());
14524
14525 m_errorMonitor->SetDesiredFailureMsg(
14526 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14527 "number of layers in image subresource is zero");
14528 vk_testing::Buffer buffer;
14529 VkMemoryPropertyFlags reqs = 0;
14530 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
14531 VkBufferImageCopy region = {};
14532 region.bufferRowLength = 128;
14533 region.bufferImageHeight = 128;
14534 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14535 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
14536 region.imageSubresource.layerCount = 0;
14537 region.imageExtent.height = 4;
14538 region.imageExtent.width = 4;
14539 region.imageExtent.depth = 1;
14540 m_commandBuffer->BeginCommandBuffer();
14541 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
14542 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
14543 1, &region);
14544 m_errorMonitor->VerifyFound();
14545 region.imageSubresource.layerCount = 1;
14546
14547 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14548 "aspectMasks for each region must "
14549 "specify only COLOR or DEPTH or "
14550 "STENCIL");
14551 // Expect MISMATCHED_IMAGE_ASPECT
14552 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
14553 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
14554 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
14555 1, &region);
14556 m_errorMonitor->VerifyFound();
14557 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14558
14559 m_errorMonitor->SetDesiredFailureMsg(
14560 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14561 "If the format of srcImage is a depth, stencil, depth stencil or "
14562 "integer-based format then filter must be VK_FILTER_NEAREST");
14563 // Expect INVALID_FILTER
14564 VkImageObj intImage1(m_device);
14565 intImage1.init(128, 128, VK_FORMAT_R8_UINT,
14566 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
14567 0);
14568 VkImageObj intImage2(m_device);
14569 intImage2.init(128, 128, VK_FORMAT_R8_UINT,
14570 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
14571 0);
14572 VkImageBlit blitRegion = {};
14573 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14574 blitRegion.srcSubresource.baseArrayLayer = 0;
14575 blitRegion.srcSubresource.layerCount = 1;
14576 blitRegion.srcSubresource.mipLevel = 0;
14577 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14578 blitRegion.dstSubresource.baseArrayLayer = 0;
14579 blitRegion.dstSubresource.layerCount = 1;
14580 blitRegion.dstSubresource.mipLevel = 0;
14581
14582 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
14583 intImage1.layout(), intImage2.handle(), intImage2.layout(),
14584 16, &blitRegion, VK_FILTER_LINEAR);
14585 m_errorMonitor->VerifyFound();
14586
14587 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14588 "called with 0 in ppMemoryBarriers");
14589 VkImageMemoryBarrier img_barrier;
14590 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
14591 img_barrier.pNext = NULL;
14592 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
14593 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
14594 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14595 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14596 img_barrier.image = image.handle();
14597 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
14598 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
14599 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14600 img_barrier.subresourceRange.baseArrayLayer = 0;
14601 img_barrier.subresourceRange.baseMipLevel = 0;
14602 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
14603 img_barrier.subresourceRange.layerCount = 0;
14604 img_barrier.subresourceRange.levelCount = 1;
14605 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
14606 VK_PIPELINE_STAGE_HOST_BIT,
14607 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
14608 nullptr, 1, &img_barrier);
14609 m_errorMonitor->VerifyFound();
14610 img_barrier.subresourceRange.layerCount = 1;
14611}
14612
14613TEST_F(VkLayerTest, ImageFormatLimits) {
14614
14615 TEST_DESCRIPTION("Exceed the limits of image format ");
14616
14617 m_errorMonitor->SetDesiredFailureMsg(
14618 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14619 "CreateImage extents exceed allowable limits for format");
14620 VkImageCreateInfo image_create_info = {};
14621 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14622 image_create_info.pNext = NULL;
14623 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14624 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14625 image_create_info.extent.width = 32;
14626 image_create_info.extent.height = 32;
14627 image_create_info.extent.depth = 1;
14628 image_create_info.mipLevels = 1;
14629 image_create_info.arrayLayers = 1;
14630 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14631 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14632 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14633 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
14634 image_create_info.flags = 0;
14635
14636 VkImage nullImg;
14637 VkImageFormatProperties imgFmtProps;
14638 vkGetPhysicalDeviceImageFormatProperties(
14639 gpu(), image_create_info.format, image_create_info.imageType,
14640 image_create_info.tiling, image_create_info.usage,
14641 image_create_info.flags, &imgFmtProps);
14642 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
14643 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14644 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14645 m_errorMonitor->VerifyFound();
14646 image_create_info.extent.depth = 1;
14647
14648 m_errorMonitor->SetDesiredFailureMsg(
14649 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14650 "exceeds allowable maximum supported by format of");
14651 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
14652 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14653 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14654 m_errorMonitor->VerifyFound();
14655 image_create_info.mipLevels = 1;
14656
14657 m_errorMonitor->SetDesiredFailureMsg(
14658 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14659 "exceeds allowable maximum supported by format of");
14660 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
14661 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14662 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14663 m_errorMonitor->VerifyFound();
14664 image_create_info.arrayLayers = 1;
14665
14666 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14667 "is not supported by format");
14668 int samples = imgFmtProps.sampleCounts >> 1;
14669 image_create_info.samples = (VkSampleCountFlagBits)samples;
14670 // Expect INVALID_FORMAT_LIMITS_VIOLATION
14671 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14672 m_errorMonitor->VerifyFound();
14673 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14674
14675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14676 "pCreateInfo->initialLayout, must be "
14677 "VK_IMAGE_LAYOUT_UNDEFINED or "
14678 "VK_IMAGE_LAYOUT_PREINITIALIZED");
14679 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
14680 // Expect INVALID_LAYOUT
14681 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
14682 m_errorMonitor->VerifyFound();
14683 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
14684}
14685
Karl Schultz6addd812016-02-02 17:17:23 -070014686TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060014687 VkResult err;
14688 bool pass;
14689
14690 // Create color images with different format sizes and try to copy between them
14691 m_errorMonitor->SetDesiredFailureMsg(
14692 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14693 "vkCmdCopyImage called with unmatched source and dest image format sizes");
14694
14695 ASSERT_NO_FATAL_FAILURE(InitState());
14696
14697 // Create two images of different types and try to copy between them
14698 VkImage srcImage;
14699 VkImage dstImage;
14700 VkDeviceMemory srcMem;
14701 VkDeviceMemory destMem;
14702 VkMemoryRequirements memReqs;
14703
14704 VkImageCreateInfo image_create_info = {};
14705 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14706 image_create_info.pNext = NULL;
14707 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14708 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14709 image_create_info.extent.width = 32;
14710 image_create_info.extent.height = 32;
14711 image_create_info.extent.depth = 1;
14712 image_create_info.mipLevels = 1;
14713 image_create_info.arrayLayers = 1;
14714 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14715 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14716 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14717 image_create_info.flags = 0;
14718
14719 err =
14720 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
14721 ASSERT_VK_SUCCESS(err);
14722
14723 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
14724 // Introduce failure by creating second image with a different-sized format.
14725 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
14726
14727 err =
14728 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
14729 ASSERT_VK_SUCCESS(err);
14730
14731 // Allocate memory
14732 VkMemoryAllocateInfo memAlloc = {};
14733 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14734 memAlloc.pNext = NULL;
14735 memAlloc.allocationSize = 0;
14736 memAlloc.memoryTypeIndex = 0;
14737
14738 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
14739 memAlloc.allocationSize = memReqs.size;
14740 pass =
14741 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
14742 ASSERT_TRUE(pass);
14743 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
14744 ASSERT_VK_SUCCESS(err);
14745
14746 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
14747 memAlloc.allocationSize = memReqs.size;
14748 pass =
14749 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
14750 ASSERT_TRUE(pass);
14751 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
14752 ASSERT_VK_SUCCESS(err);
14753
14754 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14755 ASSERT_VK_SUCCESS(err);
14756 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
14757 ASSERT_VK_SUCCESS(err);
14758
14759 BeginCommandBuffer();
14760 VkImageCopy copyRegion;
14761 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14762 copyRegion.srcSubresource.mipLevel = 0;
14763 copyRegion.srcSubresource.baseArrayLayer = 0;
14764 copyRegion.srcSubresource.layerCount = 0;
14765 copyRegion.srcOffset.x = 0;
14766 copyRegion.srcOffset.y = 0;
14767 copyRegion.srcOffset.z = 0;
14768 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14769 copyRegion.dstSubresource.mipLevel = 0;
14770 copyRegion.dstSubresource.baseArrayLayer = 0;
14771 copyRegion.dstSubresource.layerCount = 0;
14772 copyRegion.dstOffset.x = 0;
14773 copyRegion.dstOffset.y = 0;
14774 copyRegion.dstOffset.z = 0;
14775 copyRegion.extent.width = 1;
14776 copyRegion.extent.height = 1;
14777 copyRegion.extent.depth = 1;
14778 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14779 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
14780 EndCommandBuffer();
14781
14782 m_errorMonitor->VerifyFound();
14783
14784 vkDestroyImage(m_device->device(), srcImage, NULL);
14785 vkDestroyImage(m_device->device(), dstImage, NULL);
14786 vkFreeMemory(m_device->device(), srcMem, NULL);
14787 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014788}
14789
Karl Schultz6addd812016-02-02 17:17:23 -070014790TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
14791 VkResult err;
14792 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014793
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014794 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014795 m_errorMonitor->SetDesiredFailureMsg(
14796 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014797 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014798
Mike Stroyana3082432015-09-25 13:39:21 -060014799 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014800
14801 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014802 VkImage srcImage;
14803 VkImage dstImage;
14804 VkDeviceMemory srcMem;
14805 VkDeviceMemory destMem;
14806 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014807
14808 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014809 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14810 image_create_info.pNext = NULL;
14811 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14812 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14813 image_create_info.extent.width = 32;
14814 image_create_info.extent.height = 32;
14815 image_create_info.extent.depth = 1;
14816 image_create_info.mipLevels = 1;
14817 image_create_info.arrayLayers = 1;
14818 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14819 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14820 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14821 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014822
Karl Schultz6addd812016-02-02 17:17:23 -070014823 err =
14824 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014825 ASSERT_VK_SUCCESS(err);
14826
Karl Schultzbdb75952016-04-19 11:36:49 -060014827 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
14828
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014829 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070014830 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014831 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
14832 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014833
Karl Schultz6addd812016-02-02 17:17:23 -070014834 err =
14835 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014836 ASSERT_VK_SUCCESS(err);
14837
14838 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014839 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014840 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14841 memAlloc.pNext = NULL;
14842 memAlloc.allocationSize = 0;
14843 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014844
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014845 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014846 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014847 pass =
14848 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014849 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014850 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014851 ASSERT_VK_SUCCESS(err);
14852
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014853 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014854 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014855 pass =
14856 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014857 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014858 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014859 ASSERT_VK_SUCCESS(err);
14860
14861 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14862 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014863 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014864 ASSERT_VK_SUCCESS(err);
14865
14866 BeginCommandBuffer();
14867 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014868 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014869 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014870 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014871 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014872 copyRegion.srcOffset.x = 0;
14873 copyRegion.srcOffset.y = 0;
14874 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014875 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014876 copyRegion.dstSubresource.mipLevel = 0;
14877 copyRegion.dstSubresource.baseArrayLayer = 0;
14878 copyRegion.dstSubresource.layerCount = 0;
14879 copyRegion.dstOffset.x = 0;
14880 copyRegion.dstOffset.y = 0;
14881 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014882 copyRegion.extent.width = 1;
14883 copyRegion.extent.height = 1;
14884 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014885 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14886 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014887 EndCommandBuffer();
14888
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014889 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014890
Chia-I Wuf7458c52015-10-26 21:10:41 +080014891 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014892 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014893 vkFreeMemory(m_device->device(), srcMem, NULL);
14894 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014895}
14896
Karl Schultz6addd812016-02-02 17:17:23 -070014897TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
14898 VkResult err;
14899 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014900
Karl Schultz6addd812016-02-02 17:17:23 -070014901 m_errorMonitor->SetDesiredFailureMsg(
14902 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014903 "vkCmdResolveImage called with source sample count less than 2.");
14904
Mike Stroyana3082432015-09-25 13:39:21 -060014905 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014906
14907 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070014908 VkImage srcImage;
14909 VkImage dstImage;
14910 VkDeviceMemory srcMem;
14911 VkDeviceMemory destMem;
14912 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014913
14914 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014915 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14916 image_create_info.pNext = NULL;
14917 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14918 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14919 image_create_info.extent.width = 32;
14920 image_create_info.extent.height = 1;
14921 image_create_info.extent.depth = 1;
14922 image_create_info.mipLevels = 1;
14923 image_create_info.arrayLayers = 1;
14924 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14925 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14926 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14927 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014928
Karl Schultz6addd812016-02-02 17:17:23 -070014929 err =
14930 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014931 ASSERT_VK_SUCCESS(err);
14932
Karl Schultz6addd812016-02-02 17:17:23 -070014933 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014934
Karl Schultz6addd812016-02-02 17:17:23 -070014935 err =
14936 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014937 ASSERT_VK_SUCCESS(err);
14938
14939 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014940 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014941 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14942 memAlloc.pNext = NULL;
14943 memAlloc.allocationSize = 0;
14944 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014945
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014946 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014947 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014948 pass =
14949 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014950 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014951 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014952 ASSERT_VK_SUCCESS(err);
14953
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014954 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014955 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014956 pass =
14957 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014958 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014959 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014960 ASSERT_VK_SUCCESS(err);
14961
14962 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14963 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014964 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014965 ASSERT_VK_SUCCESS(err);
14966
14967 BeginCommandBuffer();
14968 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070014969 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
14970 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060014971 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014972 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014973 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014974 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014975 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014976 resolveRegion.srcOffset.x = 0;
14977 resolveRegion.srcOffset.y = 0;
14978 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014979 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014980 resolveRegion.dstSubresource.mipLevel = 0;
14981 resolveRegion.dstSubresource.baseArrayLayer = 0;
14982 resolveRegion.dstSubresource.layerCount = 0;
14983 resolveRegion.dstOffset.x = 0;
14984 resolveRegion.dstOffset.y = 0;
14985 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014986 resolveRegion.extent.width = 1;
14987 resolveRegion.extent.height = 1;
14988 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014989 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14990 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014991 EndCommandBuffer();
14992
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014993 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014994
Chia-I Wuf7458c52015-10-26 21:10:41 +080014995 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014996 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014997 vkFreeMemory(m_device->device(), srcMem, NULL);
14998 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014999}
15000
Karl Schultz6addd812016-02-02 17:17:23 -070015001TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
15002 VkResult err;
15003 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015004
Karl Schultz6addd812016-02-02 17:17:23 -070015005 m_errorMonitor->SetDesiredFailureMsg(
15006 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015007 "vkCmdResolveImage called with dest sample count greater than 1.");
15008
Mike Stroyana3082432015-09-25 13:39:21 -060015009 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015010
Chris Forbesa7530692016-05-08 12:35:39 +120015011 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070015012 VkImage srcImage;
15013 VkImage dstImage;
15014 VkDeviceMemory srcMem;
15015 VkDeviceMemory destMem;
15016 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015017
15018 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015019 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15020 image_create_info.pNext = NULL;
15021 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15022 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15023 image_create_info.extent.width = 32;
15024 image_create_info.extent.height = 1;
15025 image_create_info.extent.depth = 1;
15026 image_create_info.mipLevels = 1;
15027 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120015028 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070015029 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15030 // Note: Some implementations expect color attachment usage for any
15031 // multisample surface
15032 image_create_info.usage =
15033 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15034 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015035
Karl Schultz6addd812016-02-02 17:17:23 -070015036 err =
15037 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015038 ASSERT_VK_SUCCESS(err);
15039
Karl Schultz6addd812016-02-02 17:17:23 -070015040 // Note: Some implementations expect color attachment usage for any
15041 // multisample surface
15042 image_create_info.usage =
15043 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015044
Karl Schultz6addd812016-02-02 17:17:23 -070015045 err =
15046 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015047 ASSERT_VK_SUCCESS(err);
15048
15049 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015050 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015051 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15052 memAlloc.pNext = NULL;
15053 memAlloc.allocationSize = 0;
15054 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015055
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015056 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015057 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015058 pass =
15059 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015060 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015061 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015062 ASSERT_VK_SUCCESS(err);
15063
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015064 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015065 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015066 pass =
15067 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015068 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015069 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015070 ASSERT_VK_SUCCESS(err);
15071
15072 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15073 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015074 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015075 ASSERT_VK_SUCCESS(err);
15076
15077 BeginCommandBuffer();
15078 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015079 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15080 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015081 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015082 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015083 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015084 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015085 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015086 resolveRegion.srcOffset.x = 0;
15087 resolveRegion.srcOffset.y = 0;
15088 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015089 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015090 resolveRegion.dstSubresource.mipLevel = 0;
15091 resolveRegion.dstSubresource.baseArrayLayer = 0;
15092 resolveRegion.dstSubresource.layerCount = 0;
15093 resolveRegion.dstOffset.x = 0;
15094 resolveRegion.dstOffset.y = 0;
15095 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015096 resolveRegion.extent.width = 1;
15097 resolveRegion.extent.height = 1;
15098 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015099 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15100 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015101 EndCommandBuffer();
15102
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015103 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015104
Chia-I Wuf7458c52015-10-26 21:10:41 +080015105 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015106 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015107 vkFreeMemory(m_device->device(), srcMem, NULL);
15108 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015109}
15110
Karl Schultz6addd812016-02-02 17:17:23 -070015111TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
15112 VkResult err;
15113 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015114
Karl Schultz6addd812016-02-02 17:17:23 -070015115 m_errorMonitor->SetDesiredFailureMsg(
15116 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015117 "vkCmdResolveImage called with unmatched source and dest formats.");
15118
Mike Stroyana3082432015-09-25 13:39:21 -060015119 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015120
15121 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015122 VkImage srcImage;
15123 VkImage dstImage;
15124 VkDeviceMemory srcMem;
15125 VkDeviceMemory destMem;
15126 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015127
15128 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015129 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15130 image_create_info.pNext = NULL;
15131 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15132 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15133 image_create_info.extent.width = 32;
15134 image_create_info.extent.height = 1;
15135 image_create_info.extent.depth = 1;
15136 image_create_info.mipLevels = 1;
15137 image_create_info.arrayLayers = 1;
15138 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
15139 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15140 // Note: Some implementations expect color attachment usage for any
15141 // multisample surface
15142 image_create_info.usage =
15143 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15144 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015145
Karl Schultz6addd812016-02-02 17:17:23 -070015146 err =
15147 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015148 ASSERT_VK_SUCCESS(err);
15149
Karl Schultz6addd812016-02-02 17:17:23 -070015150 // Set format to something other than source image
15151 image_create_info.format = VK_FORMAT_R32_SFLOAT;
15152 // Note: Some implementations expect color attachment usage for any
15153 // multisample surface
15154 image_create_info.usage =
15155 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15156 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015157
Karl Schultz6addd812016-02-02 17:17:23 -070015158 err =
15159 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015160 ASSERT_VK_SUCCESS(err);
15161
15162 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015163 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015164 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15165 memAlloc.pNext = NULL;
15166 memAlloc.allocationSize = 0;
15167 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015168
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015169 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015170 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015171 pass =
15172 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015173 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015174 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015175 ASSERT_VK_SUCCESS(err);
15176
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015177 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015178 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015179 pass =
15180 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015181 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015182 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015183 ASSERT_VK_SUCCESS(err);
15184
15185 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15186 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015187 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015188 ASSERT_VK_SUCCESS(err);
15189
15190 BeginCommandBuffer();
15191 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015192 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15193 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015194 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015195 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015196 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015197 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015198 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015199 resolveRegion.srcOffset.x = 0;
15200 resolveRegion.srcOffset.y = 0;
15201 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015202 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015203 resolveRegion.dstSubresource.mipLevel = 0;
15204 resolveRegion.dstSubresource.baseArrayLayer = 0;
15205 resolveRegion.dstSubresource.layerCount = 0;
15206 resolveRegion.dstOffset.x = 0;
15207 resolveRegion.dstOffset.y = 0;
15208 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015209 resolveRegion.extent.width = 1;
15210 resolveRegion.extent.height = 1;
15211 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015212 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15213 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015214 EndCommandBuffer();
15215
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015216 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015217
Chia-I Wuf7458c52015-10-26 21:10:41 +080015218 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015219 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015220 vkFreeMemory(m_device->device(), srcMem, NULL);
15221 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015222}
15223
Karl Schultz6addd812016-02-02 17:17:23 -070015224TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
15225 VkResult err;
15226 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015227
Karl Schultz6addd812016-02-02 17:17:23 -070015228 m_errorMonitor->SetDesiredFailureMsg(
15229 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015230 "vkCmdResolveImage called with unmatched source and dest image types.");
15231
Mike Stroyana3082432015-09-25 13:39:21 -060015232 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015233
15234 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015235 VkImage srcImage;
15236 VkImage dstImage;
15237 VkDeviceMemory srcMem;
15238 VkDeviceMemory destMem;
15239 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015240
15241 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015242 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15243 image_create_info.pNext = NULL;
15244 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15245 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15246 image_create_info.extent.width = 32;
15247 image_create_info.extent.height = 1;
15248 image_create_info.extent.depth = 1;
15249 image_create_info.mipLevels = 1;
15250 image_create_info.arrayLayers = 1;
15251 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
15252 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15253 // Note: Some implementations expect color attachment usage for any
15254 // multisample surface
15255 image_create_info.usage =
15256 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15257 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015258
Karl Schultz6addd812016-02-02 17:17:23 -070015259 err =
15260 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015261 ASSERT_VK_SUCCESS(err);
15262
Karl Schultz6addd812016-02-02 17:17:23 -070015263 image_create_info.imageType = VK_IMAGE_TYPE_1D;
15264 // Note: Some implementations expect color attachment usage for any
15265 // multisample surface
15266 image_create_info.usage =
15267 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15268 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015269
Karl Schultz6addd812016-02-02 17:17:23 -070015270 err =
15271 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015272 ASSERT_VK_SUCCESS(err);
15273
15274 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015275 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015276 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15277 memAlloc.pNext = NULL;
15278 memAlloc.allocationSize = 0;
15279 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015280
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015281 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015282 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015283 pass =
15284 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015285 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015286 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015287 ASSERT_VK_SUCCESS(err);
15288
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015289 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015290 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070015291 pass =
15292 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015293 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015294 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015295 ASSERT_VK_SUCCESS(err);
15296
15297 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15298 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015299 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015300 ASSERT_VK_SUCCESS(err);
15301
15302 BeginCommandBuffer();
15303 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070015304 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
15305 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060015306 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015307 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015308 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015309 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015310 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015311 resolveRegion.srcOffset.x = 0;
15312 resolveRegion.srcOffset.y = 0;
15313 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015314 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015315 resolveRegion.dstSubresource.mipLevel = 0;
15316 resolveRegion.dstSubresource.baseArrayLayer = 0;
15317 resolveRegion.dstSubresource.layerCount = 0;
15318 resolveRegion.dstOffset.x = 0;
15319 resolveRegion.dstOffset.y = 0;
15320 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015321 resolveRegion.extent.width = 1;
15322 resolveRegion.extent.height = 1;
15323 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015324 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
15325 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060015326 EndCommandBuffer();
15327
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015328 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015329
Chia-I Wuf7458c52015-10-26 21:10:41 +080015330 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015331 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015332 vkFreeMemory(m_device->device(), srcMem, NULL);
15333 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015334}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015335
Karl Schultz6addd812016-02-02 17:17:23 -070015336TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015337 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070015338 // to using a DS format, then cause it to hit error due to COLOR_BIT not
15339 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015340 // The image format check comes 2nd in validation so we trigger it first,
15341 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070015342 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015343
Karl Schultz6addd812016-02-02 17:17:23 -070015344 m_errorMonitor->SetDesiredFailureMsg(
15345 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015346 "Combination depth/stencil image formats can have only the ");
15347
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015348 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015349
Chia-I Wu1b99bb22015-10-27 19:25:11 +080015350 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015351 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
15352 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015353
15354 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015355 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
15356 ds_pool_ci.pNext = NULL;
15357 ds_pool_ci.maxSets = 1;
15358 ds_pool_ci.poolSizeCount = 1;
15359 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015360
15361 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070015362 err =
15363 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015364 ASSERT_VK_SUCCESS(err);
15365
15366 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015367 dsl_binding.binding = 0;
15368 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
15369 dsl_binding.descriptorCount = 1;
15370 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
15371 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015372
15373 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015374 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
15375 ds_layout_ci.pNext = NULL;
15376 ds_layout_ci.bindingCount = 1;
15377 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015378 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070015379 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
15380 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015381 ASSERT_VK_SUCCESS(err);
15382
15383 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015384 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080015385 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070015386 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015387 alloc_info.descriptorPool = ds_pool;
15388 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070015389 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
15390 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015391 ASSERT_VK_SUCCESS(err);
15392
Karl Schultz6addd812016-02-02 17:17:23 -070015393 VkImage image_bad;
15394 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015395 // One bad format and one good format for Color attachment
Tobin Ehlis269f0322016-05-25 16:24:21 -060015396 const VkFormat tex_format_bad = VK_FORMAT_D24_UNORM_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015397 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070015398 const int32_t tex_width = 32;
15399 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015400
15401 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015402 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15403 image_create_info.pNext = NULL;
15404 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15405 image_create_info.format = tex_format_bad;
15406 image_create_info.extent.width = tex_width;
15407 image_create_info.extent.height = tex_height;
15408 image_create_info.extent.depth = 1;
15409 image_create_info.mipLevels = 1;
15410 image_create_info.arrayLayers = 1;
15411 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15412 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15413 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
15414 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
15415 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015416
Karl Schultz6addd812016-02-02 17:17:23 -070015417 err =
15418 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015419 ASSERT_VK_SUCCESS(err);
15420 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -070015421 image_create_info.usage =
15422 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15423 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
15424 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015425 ASSERT_VK_SUCCESS(err);
15426
15427 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015428 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15429 image_view_create_info.image = image_bad;
15430 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15431 image_view_create_info.format = tex_format_bad;
15432 image_view_create_info.subresourceRange.baseArrayLayer = 0;
15433 image_view_create_info.subresourceRange.baseMipLevel = 0;
15434 image_view_create_info.subresourceRange.layerCount = 1;
15435 image_view_create_info.subresourceRange.levelCount = 1;
15436 image_view_create_info.subresourceRange.aspectMask =
15437 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015438
15439 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070015440 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
15441 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015442
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015443 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015444
Chia-I Wuf7458c52015-10-26 21:10:41 +080015445 vkDestroyImage(m_device->device(), image_bad, NULL);
15446 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015447 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
15448 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060015449}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015450
15451TEST_F(VkLayerTest, ClearImageErrors) {
15452 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and "
15453 "ClearDepthStencilImage with a color image.");
15454
15455 ASSERT_NO_FATAL_FAILURE(InitState());
15456 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15457
15458 // Renderpass is started here so end it as Clear cmds can't be in renderpass
15459 BeginCommandBuffer();
15460 m_commandBuffer->EndRenderPass();
15461
15462 // Color image
15463 VkClearColorValue clear_color;
15464 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
15465 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
15466 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
15467 const int32_t img_width = 32;
15468 const int32_t img_height = 32;
15469 VkImageCreateInfo image_create_info = {};
15470 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15471 image_create_info.pNext = NULL;
15472 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15473 image_create_info.format = color_format;
15474 image_create_info.extent.width = img_width;
15475 image_create_info.extent.height = img_height;
15476 image_create_info.extent.depth = 1;
15477 image_create_info.mipLevels = 1;
15478 image_create_info.arrayLayers = 1;
15479 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15480 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15481 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15482
15483 vk_testing::Image color_image;
15484 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info,
15485 reqs);
15486
15487 const VkImageSubresourceRange color_range =
15488 vk_testing::Image::subresource_range(image_create_info,
15489 VK_IMAGE_ASPECT_COLOR_BIT);
15490
15491 // Depth/Stencil image
15492 VkClearDepthStencilValue clear_value = {0};
15493 reqs = 0; // don't need HOST_VISIBLE DS image
15494 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
15495 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
15496 ds_image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
15497 ds_image_create_info.extent.width = 64;
15498 ds_image_create_info.extent.height = 64;
15499 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15500 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
15501
15502 vk_testing::Image ds_image;
15503 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info,
15504 reqs);
15505
15506 const VkImageSubresourceRange ds_range =
15507 vk_testing::Image::subresource_range(ds_image_create_info,
15508 VK_IMAGE_ASPECT_DEPTH_BIT);
15509
15510 m_errorMonitor->SetDesiredFailureMsg(
15511 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15512 "vkCmdClearColorImage called with depth/stencil image.");
15513
15514 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
15515 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
15516 &color_range);
15517
15518 m_errorMonitor->VerifyFound();
15519
Tony Barbour26434b92016-06-02 09:43:50 -060015520 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15521 "vkCmdClearColorImage called with "
15522 "image created without "
15523 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
15524
15525 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
15526 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
15527 &color_range);
15528
15529 m_errorMonitor->VerifyFound();
15530
Tobin Ehlis6e23d772016-05-19 11:08:34 -060015531 // Call CmdClearDepthStencilImage with color image
15532 m_errorMonitor->SetDesiredFailureMsg(
15533 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15534 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
15535
15536 vkCmdClearDepthStencilImage(
15537 m_commandBuffer->GetBufferHandle(), color_image.handle(),
15538 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
15539 &ds_range);
15540
15541 m_errorMonitor->VerifyFound();
15542}
Tobin Ehliscde08892015-09-22 10:11:37 -060015543#endif // IMAGE_TESTS
15544
Tony Barbour300a6082015-04-07 13:44:53 -060015545int main(int argc, char **argv) {
15546 int result;
15547
Cody Northrop8e54a402016-03-08 22:25:52 -070015548#ifdef ANDROID
15549 int vulkanSupport = InitVulkan();
15550 if (vulkanSupport == 0)
15551 return 1;
15552#endif
15553
Tony Barbour300a6082015-04-07 13:44:53 -060015554 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060015555 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060015556
15557 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
15558
15559 result = RUN_ALL_TESTS();
15560
Tony Barbour6918cd52015-04-09 12:58:51 -060015561 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060015562 return result;
15563}