blob: 225be9a8523d2d654cc721124c1626ae14673de1 [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
2 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
Michael Lentine0a369f62016-02-03 16:51:46 -06005 * Copyright (c) 2015-2016 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
20 */
Tony Barbour65c48b32015-11-17 10:02:56 -070021
Cody Northrop8e54a402016-03-08 22:25:52 -070022#ifdef ANDROID
23#include "vulkan_wrapper.h"
24#else
David Pinedo9316d3b2015-11-06 12:54:48 -070025#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070026#endif
Courtney Goeltzenleuchter58f3eff2015-10-07 13:28:58 -060027#include "test_common.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060028#include "vkrenderframework.h"
Tobin Ehlisa0cb02e2015-07-03 10:15:26 -060029#include "vk_layer_config.h"
Jon Ashburn7fa7e222016-02-02 12:08:10 -070030#include "icd-spv.h"
Tony Barbour300a6082015-04-07 13:44:53 -060031
Mark Lobodzinski3780e142015-05-14 15:08:13 -050032#define GLM_FORCE_RADIANS
33#include "glm/glm.hpp"
34#include <glm/gtc/matrix_transform.hpp>
35
Dustin Gravesffa90fa2016-05-06 11:20:38 -060036#define PARAMETER_VALIDATION_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060037#define MEM_TRACKER_TESTS 1
38#define OBJ_TRACKER_TESTS 1
39#define DRAW_STATE_TESTS 1
40#define THREADING_TESTS 1
Chris Forbes9f7ff632015-05-25 11:13:08 +120041#define SHADER_CHECKER_TESTS 1
Mark Lobodzinski209b5292015-09-17 09:44:05 -060042#define DEVICE_LIMITS_TESTS 1
Tobin Ehliscde08892015-09-22 10:11:37 -060043#define IMAGE_TESTS 1
Tobin Ehlis0788f522015-05-26 16:11:58 -060044
Mark Lobodzinski3780e142015-05-14 15:08:13 -050045//--------------------------------------------------------------------------------------
46// Mesh and VertexFormat Data
47//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070048struct Vertex {
49 float posX, posY, posZ, posW; // Position data
50 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050051};
52
Karl Schultz6addd812016-02-02 17:17:23 -070053#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050054
55typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070056 BsoFailNone = 0x00000000,
57 BsoFailLineWidth = 0x00000001,
58 BsoFailDepthBias = 0x00000002,
59 BsoFailViewport = 0x00000004,
60 BsoFailScissor = 0x00000008,
61 BsoFailBlend = 0x00000010,
62 BsoFailDepthBounds = 0x00000020,
63 BsoFailStencilReadMask = 0x00000040,
64 BsoFailStencilWriteMask = 0x00000080,
65 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060066 BsoFailCmdClearAttachments = 0x00000200,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050067} BsoFailSelect;
68
69struct vktriangle_vs_uniform {
70 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070071 float mvp[4][4];
72 float position[3][4];
73 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050074};
75
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050076static const char bindStateVertShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120077 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070078 "vec2 vertices[3];\n"
79 "out gl_PerVertex {\n"
80 " vec4 gl_Position;\n"
81 "};\n"
82 "void main() {\n"
83 " vertices[0] = vec2(-1.0, -1.0);\n"
84 " vertices[1] = vec2( 1.0, -1.0);\n"
85 " vertices[2] = vec2( 0.0, 1.0);\n"
86 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
87 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050088
Mark Lobodzinski75a97e62015-06-02 09:41:30 -050089static const char bindStateFragShaderText[] =
Chris Forbes7b342802016-04-07 13:20:10 +120090 "#version 450\n"
Karl Schultz6addd812016-02-02 17:17:23 -070091 "\n"
92 "layout(location = 0) out vec4 uFragColor;\n"
93 "void main(){\n"
94 " uFragColor = vec4(0,1,0,1);\n"
95 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050096
Karl Schultz6addd812016-02-02 17:17:23 -070097static VKAPI_ATTR VkBool32 VKAPI_CALL
98myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
99 uint64_t srcObject, size_t location, int32_t msgCode,
100 const char *pLayerPrefix, const char *pMsg, void *pUserData);
Tony Barbour300a6082015-04-07 13:44:53 -0600101
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600102// ********************************************************
103// ErrorMonitor Usage:
104//
105// Call SetDesiredFailureMsg with a string to be compared against all
106// encountered log messages. Passing NULL will match all log messages.
107// logMsg will return true for skipCall only if msg is matched or NULL.
108//
109// Call DesiredMsgFound to determine if the desired failure message
110// was encountered.
111
Tony Barbour300a6082015-04-07 13:44:53 -0600112class ErrorMonitor {
Karl Schultz6addd812016-02-02 17:17:23 -0700113 public:
114 ErrorMonitor() {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600115 test_platform_thread_create_mutex(&m_mutex);
116 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700117 m_msgFlags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
Karl Schultz6addd812016-02-02 17:17:23 -0700118 m_bailout = NULL;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600119 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600120 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600121
Dustin Graves48458142016-04-29 16:11:55 -0600122 ~ErrorMonitor() { test_platform_thread_delete_mutex(&m_mutex); }
123
Karl Schultz6addd812016-02-02 17:17:23 -0700124 void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200125 // also discard all collected messages to this point
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600126 test_platform_thread_lock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600127 m_failureMsg.clear();
128 m_otherMsgs.clear();
129 m_desiredMsg = msgString;
Karl Schultz6addd812016-02-02 17:17:23 -0700130 m_msgFound = VK_FALSE;
131 m_msgFlags = msgFlags;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600132 test_platform_thread_unlock_mutex(&m_mutex);
Tony Barbour300a6082015-04-07 13:44:53 -0600133 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600134
Karl Schultz6addd812016-02-02 17:17:23 -0700135 VkBool32 CheckForDesiredMsg(VkFlags msgFlags, const char *msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600136 VkBool32 result = VK_FALSE;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600137 test_platform_thread_lock_mutex(&m_mutex);
Mike Stroyanaccf7692015-05-12 16:00:45 -0600138 if (m_bailout != NULL) {
139 *m_bailout = true;
140 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600141 string errorString(msgString);
142 if (msgFlags & m_msgFlags) {
143 if (errorString.find(m_desiredMsg) != string::npos) {
Chris Forbesc7b8ad72016-04-04 18:50:38 +1200144 if (m_msgFound) { /* if multiple matches, don't lose all but the last! */
145 m_otherMsgs.push_back(m_failureMsg);
146 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600147 m_failureMsg = errorString;
Karl Schultz6addd812016-02-02 17:17:23 -0700148 m_msgFound = VK_TRUE;
149 result = VK_TRUE;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600150 } else {
151 m_otherMsgs.push_back(errorString);
152 }
153 }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600154 test_platform_thread_unlock_mutex(&m_mutex);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600155 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600156 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600157
Karl Schultz6addd812016-02-02 17:17:23 -0700158 vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600159
Karl Schultz6addd812016-02-02 17:17:23 -0700160 string GetFailureMsg(void) { return m_failureMsg; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600161
Karl Schultz6addd812016-02-02 17:17:23 -0700162 VkBool32 DesiredMsgFound(void) { return m_msgFound; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600163
Karl Schultz6addd812016-02-02 17:17:23 -0700164 void SetBailout(bool *bailout) { m_bailout = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600165
Karl Schultz6addd812016-02-02 17:17:23 -0700166 void DumpFailureMsgs(void) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600167 vector<string> otherMsgs = GetOtherFailureMsgs();
168 cout << "Other error messages logged for this test were:" << endl;
169 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
170 cout << " " << *iter << endl;
171 }
172 }
173
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200174 /* helpers */
175
176 void ExpectSuccess() {
177 // match anything
178 SetDesiredFailureMsg(~0u, "");
179 }
180
181 void VerifyFound() {
182 // Not seeing the desired message is a failure. /Before/ throwing, dump
183 // any other messages.
184 if (!DesiredMsgFound()) {
185 DumpFailureMsgs();
186 FAIL() << "Did not receive expected error '" << m_desiredMsg << "'";
187 }
188 }
189
190 void VerifyNotFound() {
191 // ExpectSuccess() configured us to match anything. Any error is a
192 // failure.
193 if (DesiredMsgFound()) {
194 DumpFailureMsgs();
195 FAIL() << "Expected to succeed but got error: " << GetFailureMsg();
196 }
197 }
198
Karl Schultz6addd812016-02-02 17:17:23 -0700199 private:
200 VkFlags m_msgFlags;
201 string m_desiredMsg;
202 string m_failureMsg;
203 vector<string> m_otherMsgs;
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600204 test_platform_thread_mutex m_mutex;
Karl Schultz6addd812016-02-02 17:17:23 -0700205 bool *m_bailout;
206 VkBool32 m_msgFound;
Tony Barbour300a6082015-04-07 13:44:53 -0600207};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500208
Karl Schultz6addd812016-02-02 17:17:23 -0700209static VKAPI_ATTR VkBool32 VKAPI_CALL
210myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
211 uint64_t srcObject, size_t location, int32_t msgCode,
212 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
213 if (msgFlags &
Mark Lobodzinski510e20d2016-02-11 09:26:16 -0700214 (VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT |
Karl Schultz6addd812016-02-02 17:17:23 -0700215 VK_DEBUG_REPORT_ERROR_BIT_EXT)) {
Tony Barbour0b4d9562015-04-09 10:48:04 -0600216 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600217 return errMonitor->CheckForDesiredMsg(msgFlags, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600218 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600219 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600220}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500221
Karl Schultz6addd812016-02-02 17:17:23 -0700222class VkLayerTest : public VkRenderFramework {
223 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800224 VkResult BeginCommandBuffer(VkCommandBufferObj &commandBuffer);
225 VkResult EndCommandBuffer(VkCommandBufferObj &commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700226 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText,
227 BsoFailSelect failMask);
228 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
229 VkPipelineObj &pipelineobj,
230 VkDescriptorSetObj &descriptorSet,
231 BsoFailSelect failMask);
232 void GenericDrawPreparation(VkPipelineObj &pipelineobj,
233 VkDescriptorSetObj &descriptorSet,
234 BsoFailSelect failMask) {
235 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet,
236 failMask);
237 }
Tony Barbour300a6082015-04-07 13:44:53 -0600238
Tony Barbourfe3351b2015-07-28 10:17:20 -0600239 /* Convenience functions that use built-in command buffer */
Karl Schultz6addd812016-02-02 17:17:23 -0700240 VkResult BeginCommandBuffer() {
241 return BeginCommandBuffer(*m_commandBuffer);
242 }
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800243 VkResult EndCommandBuffer() { return EndCommandBuffer(*m_commandBuffer); }
Karl Schultz6addd812016-02-02 17:17:23 -0700244 void Draw(uint32_t vertexCount, uint32_t instanceCount,
245 uint32_t firstVertex, uint32_t firstInstance) {
246 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex,
247 firstInstance);
248 }
249 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
250 uint32_t firstIndex, int32_t vertexOffset,
251 uint32_t firstInstance) {
252 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex,
253 vertexOffset, firstInstance);
254 }
Mark Muellerdfe37552016-07-07 14:47:42 -0600255 void QueueCommandBuffer(bool checkSuccess = true) {
256 m_commandBuffer->QueueCommandBuffer(checkSuccess); }
Karl Schultz6addd812016-02-02 17:17:23 -0700257 void QueueCommandBuffer(const VkFence &fence) {
258 m_commandBuffer->QueueCommandBuffer(fence);
259 }
260 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
261 VkDeviceSize offset, uint32_t binding) {
262 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
263 }
264 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
265 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
266 }
267
268 protected:
269 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600270 bool m_enableWSI;
Tony Barbour300a6082015-04-07 13:44:53 -0600271
272 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600273 std::vector<const char *> instance_layer_names;
274 std::vector<const char *> device_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600275 std::vector<const char *> instance_extension_names;
276 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600277
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700278 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600279 /*
280 * Since CreateDbgMsgCallback is an instance level extension call
281 * any extension / layer that utilizes that feature also needs
282 * to be enabled at create instance time.
283 */
Karl Schultz6addd812016-02-02 17:17:23 -0700284 // Use Threading layer first to protect others from
285 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700286 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600287 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800288 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700289 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800290 instance_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600291 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700292 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600293
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700294 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600295 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800296 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700297 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800298 device_layer_names.push_back("VK_LAYER_LUNARG_image");
Ian Elliotte48a1382016-04-28 14:22:58 -0600299 device_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700300 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Tony Barbour300a6082015-04-07 13:44:53 -0600301
Ian Elliott2c1daf52016-05-12 09:41:46 -0600302 if (m_enableWSI) {
303 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
304 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
305#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
306#if defined(VK_USE_PLATFORM_ANDROID_KHR)
307 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
308#endif // VK_USE_PLATFORM_ANDROID_KHR
309#if defined(VK_USE_PLATFORM_MIR_KHR)
310 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
311#endif // VK_USE_PLATFORM_MIR_KHR
312#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
313 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
314#endif // VK_USE_PLATFORM_WAYLAND_KHR
315#if defined(VK_USE_PLATFORM_WIN32_KHR)
316 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
317#endif // VK_USE_PLATFORM_WIN32_KHR
318#endif // NEED_TO_TEST_THIS_ON_PLATFORM
319#if defined(VK_USE_PLATFORM_XCB_KHR)
320 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
321#elif defined(VK_USE_PLATFORM_XLIB_KHR)
322 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
323#endif // VK_USE_PLATFORM_XLIB_KHR
324 }
325
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600326 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600327 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800328 this->app_info.pApplicationName = "layer_tests";
329 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600330 this->app_info.pEngineName = "unittest";
331 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600332 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600333
Tony Barbour15524c32015-04-29 17:34:29 -0600334 m_errorMonitor = new ErrorMonitor;
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600335 InitFramework(instance_layer_names, device_layer_names,
336 instance_extension_names, device_extension_names,
337 myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600338 }
339
340 virtual void TearDown() {
341 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600342 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600343 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600344 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600345
346 VkLayerTest() {
347 m_enableWSI = false;
348 }
Tony Barbour300a6082015-04-07 13:44:53 -0600349};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500350
Karl Schultz6addd812016-02-02 17:17:23 -0700351VkResult VkLayerTest::BeginCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600352 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600353
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800354 result = commandBuffer.BeginCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600355
356 /*
357 * For render test all drawing happens in a single render pass
358 * on a single command buffer.
359 */
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200360 if (VK_SUCCESS == result && renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800361 commandBuffer.BeginRenderPass(renderPassBeginInfo());
Tony Barbour300a6082015-04-07 13:44:53 -0600362 }
363
364 return result;
365}
366
Karl Schultz6addd812016-02-02 17:17:23 -0700367VkResult VkLayerTest::EndCommandBuffer(VkCommandBufferObj &commandBuffer) {
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600368 VkResult result;
Tony Barbour300a6082015-04-07 13:44:53 -0600369
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200370 if (renderPass()) {
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800371 commandBuffer.EndRenderPass();
Chris Forbes76a5eeb2015-06-16 14:05:59 +1200372 }
Tony Barbour300a6082015-04-07 13:44:53 -0600373
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800374 result = commandBuffer.EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -0600375
376 return result;
377}
378
Karl Schultz6addd812016-02-02 17:17:23 -0700379void VkLayerTest::VKTriangleTest(const char *vertShaderText,
380 const char *fragShaderText,
381 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500382 // Create identity matrix
383 int i;
384 struct vktriangle_vs_uniform data;
385
386 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700387 glm::mat4 View = glm::mat4(1.0f);
388 glm::mat4 Model = glm::mat4(1.0f);
389 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500390 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700391 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500392
393 memcpy(&data.mvp, &MVP[0][0], matrixSize);
394
Karl Schultz6addd812016-02-02 17:17:23 -0700395 static const Vertex tri_data[] = {
396 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)},
397 {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)},
398 {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500399 };
400
Karl Schultz6addd812016-02-02 17:17:23 -0700401 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500402 data.position[i][0] = tri_data[i].posX;
403 data.position[i][1] = tri_data[i].posY;
404 data.position[i][2] = tri_data[i].posZ;
405 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700406 data.color[i][0] = tri_data[i].r;
407 data.color[i][1] = tri_data[i].g;
408 data.color[i][2] = tri_data[i].b;
409 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500410 }
411
412 ASSERT_NO_FATAL_FAILURE(InitState());
413 ASSERT_NO_FATAL_FAILURE(InitViewport());
414
Karl Schultz6addd812016-02-02 17:17:23 -0700415 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float),
416 (const void *)&data);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500417
Karl Schultz6addd812016-02-02 17:17:23 -0700418 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
419 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
420 this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500421
422 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800423 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500424 pipelineobj.AddShader(&vs);
425 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600426 if (failMask & BsoFailLineWidth) {
427 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600428 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
429 ia_state.sType =
430 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
431 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
432 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600433 }
434 if (failMask & BsoFailDepthBias) {
435 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600436 VkPipelineRasterizationStateCreateInfo rs_state = {};
437 rs_state.sType =
438 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
439 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600440 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600441 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600442 }
Karl Schultz6addd812016-02-02 17:17:23 -0700443 // Viewport and scissors must stay in synch or other errors will occur than
444 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600445 if (failMask & BsoFailViewport) {
446 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600447 m_viewports.clear();
448 m_scissors.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600449 }
450 if (failMask & BsoFailScissor) {
451 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600452 m_scissors.clear();
453 m_viewports.clear();
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600454 }
455 if (failMask & BsoFailBlend) {
456 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600457 VkPipelineColorBlendAttachmentState att_state = {};
458 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
459 att_state.blendEnable = VK_TRUE;
460 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600461 }
462 if (failMask & BsoFailDepthBounds) {
463 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
464 }
465 if (failMask & BsoFailStencilReadMask) {
466 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
467 }
468 if (failMask & BsoFailStencilWriteMask) {
469 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
470 }
471 if (failMask & BsoFailStencilReference) {
472 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
473 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500474
475 VkDescriptorSetObj descriptorSet(m_device);
Karl Schultz6addd812016-02-02 17:17:23 -0700476 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
477 constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500478
479 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourfe3351b2015-07-28 10:17:20 -0600480 ASSERT_VK_SUCCESS(BeginCommandBuffer());
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500481
Tony Barbourfe3351b2015-07-28 10:17:20 -0600482 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500483
484 // render triangle
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -0600485 Draw(3, 1, 0, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500486
Mark Muellerd4914412016-06-13 17:52:06 -0600487 if (failMask & BsoFailCmdClearAttachments) {
488 VkClearAttachment color_attachment = {};
489 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
490 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
491 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
492
493 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
494 &color_attachment, 1, &clear_rect);
495 }
496
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500497 // finalize recording of the command buffer
Tony Barbourfe3351b2015-07-28 10:17:20 -0600498 EndCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500499
Tony Barbourfe3351b2015-07-28 10:17:20 -0600500 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500501}
502
Karl Schultz6addd812016-02-02 17:17:23 -0700503void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer,
504 VkPipelineObj &pipelineobj,
505 VkDescriptorSetObj &descriptorSet,
506 BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500507 if (m_depthStencil->Initialized()) {
Karl Schultz6addd812016-02-02 17:17:23 -0700508 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
509 m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500510 } else {
Karl Schultz6addd812016-02-02 17:17:23 -0700511 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
512 m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500513 }
514
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800515 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700516 // Make sure depthWriteEnable is set so that Depth fail test will work
517 // correctly
518 // Make sure stencilTestEnable is set so that Stencil fail test will work
519 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600520 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800521 stencil.failOp = VK_STENCIL_OP_KEEP;
522 stencil.passOp = VK_STENCIL_OP_KEEP;
523 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
524 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600525
526 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
527 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600528 ds_ci.pNext = NULL;
529 ds_ci.depthTestEnable = VK_FALSE;
530 ds_ci.depthWriteEnable = VK_TRUE;
531 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
532 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600533 if (failMask & BsoFailDepthBounds) {
534 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600535 ds_ci.maxDepthBounds = 0.0f;
536 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600537 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600538 ds_ci.stencilTestEnable = VK_TRUE;
539 ds_ci.front = stencil;
540 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600541
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600542 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600543 pipelineobj.SetViewport(m_viewports);
544 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800545 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Karl Schultz6addd812016-02-02 17:17:23 -0700546 VkResult err = pipelineobj.CreateVKPipeline(
547 descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600548 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800549 commandBuffer->BindPipeline(pipelineobj);
550 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500551}
552
Ian Elliott2c1daf52016-05-12 09:41:46 -0600553class VkWsiEnabledLayerTest : public VkLayerTest {
554 public:
555protected:
556 VkWsiEnabledLayerTest() {
557 m_enableWSI = true;
558 }
559};
560
Mark Muellerdfe37552016-07-07 14:47:42 -0600561class VkBufferTest {
562public:
563 enum eTestEnFlags {
564 eDoubleDelete,
565 eInvalidDeviceOffset,
566 eInvalidMemoryOffset,
567 eBindNullBuffer,
568 eFreeInvalidHandle,
569 };
570
571 enum eTestConditions {
572 eOffsetAlignment = 1
573 };
574
575 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice,
576 eTestEnFlags aTestFlag,
577 VkBufferUsageFlags aBufferUsage = 0) {
578 if (eInvalidDeviceOffset != aTestFlag &&
579 eInvalidMemoryOffset != aTestFlag) {
580 return true;
581 }
582 VkDeviceSize offset_limit = 0;
583 if (eInvalidMemoryOffset == aTestFlag) {
584 VkBuffer vulkanBuffer;
585 VkBufferCreateInfo buffer_create_info = {};
586 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
587 buffer_create_info.size = 32;
588 buffer_create_info.usage = aBufferUsage;
589
590 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr,
591 &vulkanBuffer);
592 VkMemoryRequirements memory_reqs = {0};
593
594 vkGetBufferMemoryRequirements(aVulkanDevice->device(),
595 vulkanBuffer, &memory_reqs);
596 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
597 offset_limit = memory_reqs.alignment;
598 }
599 else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT |
600 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
601 offset_limit =
602 aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
603 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
604 offset_limit =
605 aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
606 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
607 offset_limit =
608 aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
609 }
610 if (eOffsetAlignment < offset_limit) {
611 return true;
612 }
613 return false;
614 }
615
616 // A constructor which performs validation tests within construction.
617 VkBufferTest(VkDeviceObj *aVulkanDevice,
618 VkBufferUsageFlags aBufferUsage,
619 eTestEnFlags aTestFlag)
620 : AllocateCurrent(false), BoundCurrent(false),
621 CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
622
623 if (eBindNullBuffer == aTestFlag) {
624 VulkanMemory = 0;
625 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
626 } else {
627 VkBufferCreateInfo buffer_create_info = {};
628 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
629 buffer_create_info.size = 32;
630 buffer_create_info.usage = aBufferUsage;
631
632 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr,
633 &VulkanBuffer);
634
635 CreateCurrent = true;
636
637 VkMemoryRequirements memory_requirements;
638 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer,
639 &memory_requirements);
640
641 VkMemoryAllocateInfo memory_allocate_info = {};
642 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
643 memory_allocate_info.allocationSize = memory_requirements.size;
644 bool pass = aVulkanDevice->phy().
645 set_memory_type(memory_requirements.memoryTypeBits,
646 &memory_allocate_info,
647 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
648 if (!pass) {
649 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
650 return;
651 }
652
653 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL,
654 &VulkanMemory);
655 AllocateCurrent = true;
656 // NB: 1 is intentionally an invalid offset value
657 const bool offset_en = eInvalidDeviceOffset == aTestFlag ||
658 eInvalidMemoryOffset == aTestFlag;
659 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory,
660 offset_en ? eOffsetAlignment : 0);
661 BoundCurrent = true;
662
663 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
664 }
665 }
666
667 ~VkBufferTest() {
668 if (CreateCurrent) {
669 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
670 }
671 if (AllocateCurrent) {
672 if (InvalidDeleteEn) {
673 union {
674 VkDeviceMemory device_memory;
675 unsigned long long index_access;
676 } bad_index;
677
678 bad_index.device_memory = VulkanMemory;
679 bad_index.index_access++;
680
681 vkFreeMemory(VulkanDevice,
682 bad_index.device_memory,
683 nullptr);
684 }
685 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
686 }
687 }
688
689 bool GetBufferCurrent() {
690 return AllocateCurrent && BoundCurrent && CreateCurrent;
691 }
692
693 const VkBuffer &GetBuffer() {
694 return VulkanBuffer;
695 }
696
697 void TestDoubleDestroy() {
698 // Destroy the buffer but leave the flag set, which will cause
699 // the buffer to be destroyed again in the destructor.
700 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
701 }
702
703protected:
704 bool AllocateCurrent;
705 bool BoundCurrent;
706 bool CreateCurrent;
707 bool InvalidDeleteEn;
708
709 VkBuffer VulkanBuffer;
710 VkDevice VulkanDevice;
711 VkDeviceMemory VulkanMemory;
712
713};
714
715class VkVerticesObj {
716public:
717 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount,
718 unsigned aBindingCount, unsigned aByteStride,
719 VkDeviceSize aVertexCount, const float *aVerticies)
720 : BoundCurrent(false),
721 AttributeCount(aAttributeCount),
722 BindingCount(aBindingCount),
723 BindId(BindIdGenerator),
724 PipelineVertexInputStateCreateInfo(),
725 VulkanMemoryBuffer(aVulkanDevice, 1,
726 static_cast<int>(aByteStride * aVertexCount),
727 reinterpret_cast<const void *>(aVerticies),
728 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
729 BindIdGenerator++; // NB: This can wrap w/misuse
730
731 VertexInputAttributeDescription =
732 new VkVertexInputAttributeDescription[AttributeCount];
733 VertexInputBindingDescription =
734 new VkVertexInputBindingDescription[BindingCount];
735
736 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions =
737 VertexInputAttributeDescription;
738 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount =
739 AttributeCount;
740 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions =
741 VertexInputBindingDescription;
742 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount =
743 BindingCount;
744 PipelineVertexInputStateCreateInfo.sType =
745 VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
746
747 unsigned i = 0;
748 do {
749 VertexInputAttributeDescription[i].binding = BindId;
750 VertexInputAttributeDescription[i].location = i;
751 VertexInputAttributeDescription[i].format =
752 VK_FORMAT_R32G32B32_SFLOAT;
753 VertexInputAttributeDescription[i].offset =
754 sizeof(float) * aByteStride;
755 i++;
756 } while (AttributeCount < i);
757
758 i = 0;
759 do {
760 VertexInputBindingDescription[i].binding = BindId;
761 VertexInputBindingDescription[i].stride = aByteStride;
762 VertexInputBindingDescription[i].inputRate =
763 VK_VERTEX_INPUT_RATE_VERTEX;
764 i++;
765 } while (BindingCount < i);
766 }
767
768 ~VkVerticesObj() {
769 if (VertexInputAttributeDescription) {
770 delete[] VertexInputAttributeDescription;
771 }
772 if (VertexInputBindingDescription) {
773 delete[] VertexInputBindingDescription;
774 }
775 }
776
777 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
778 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription,
779 AttributeCount);
780 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription,
781 BindingCount);
782 return true;
783 }
784
785 void BindVertexBuffers(VkCommandBuffer aCommandBuffer,
786 unsigned aOffsetCount = 0,
787 VkDeviceSize *aOffsetList = nullptr) {
788 VkDeviceSize *offsetList;
789 unsigned offsetCount;
790
791 if (aOffsetCount) {
792 offsetList = aOffsetList;
793 offsetCount = aOffsetCount;
794 } else {
795 offsetList = new VkDeviceSize[1]();
796 offsetCount = 1;
797 }
798
799 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount,
800 &VulkanMemoryBuffer.handle(), offsetList);
801 BoundCurrent = true;
802
803 if (!aOffsetCount) {
804 delete [] offsetList;
805 }
806 }
807
808protected:
809 static uint32_t BindIdGenerator;
810
811 bool BoundCurrent;
812 unsigned AttributeCount;
813 unsigned BindingCount;
814 uint32_t BindId;
815
816 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
817 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
818 VkVertexInputBindingDescription *VertexInputBindingDescription;
819 VkConstantBufferObj VulkanMemoryBuffer;
820};
821
822uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500823// ********************************************************************************************************************
824// ********************************************************************************************************************
825// ********************************************************************************************************************
826// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600827#if PARAMETER_VALIDATION_TESTS
828TEST_F(VkLayerTest, RequiredParameter) {
829 TEST_DESCRIPTION("Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
830 "pointer, array, and array count parameters");
831
832 ASSERT_NO_FATAL_FAILURE(InitState());
833
834 m_errorMonitor->SetDesiredFailureMsg(
835 VK_DEBUG_REPORT_ERROR_BIT_EXT,
836 "required parameter pFeatures specified as NULL");
837 // Specify NULL for a pointer to a handle
838 // Expected to trigger an error with
839 // parameter_validation::validate_required_pointer
840 vkGetPhysicalDeviceFeatures(gpu(), NULL);
841 m_errorMonitor->VerifyFound();
842
843 m_errorMonitor->SetDesiredFailureMsg(
844 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600845 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600846 // Specify NULL for pointer to array count
847 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600848 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600849 m_errorMonitor->VerifyFound();
850
851 m_errorMonitor->SetDesiredFailureMsg(
852 VK_DEBUG_REPORT_ERROR_BIT_EXT,
853 "parameter viewportCount must be greater than 0");
854 // Specify 0 for a required array count
855 // Expected to trigger an error with parameter_validation::validate_array
856 VkViewport view_port = {};
857 m_commandBuffer->SetViewport(0, 0, &view_port);
858 m_errorMonitor->VerifyFound();
859
860 m_errorMonitor->SetDesiredFailureMsg(
861 VK_DEBUG_REPORT_ERROR_BIT_EXT,
862 "required parameter pViewports specified as NULL");
863 // Specify NULL for a required array
864 // Expected to trigger an error with parameter_validation::validate_array
865 m_commandBuffer->SetViewport(0, 1, NULL);
866 m_errorMonitor->VerifyFound();
867
868 m_errorMonitor->SetDesiredFailureMsg(
869 VK_DEBUG_REPORT_ERROR_BIT_EXT,
870 "required parameter memory specified as VK_NULL_HANDLE");
871 // Specify VK_NULL_HANDLE for a required handle
872 // Expected to trigger an error with
873 // parameter_validation::validate_required_handle
874 vkUnmapMemory(device(), VK_NULL_HANDLE);
875 m_errorMonitor->VerifyFound();
876
877 m_errorMonitor->SetDesiredFailureMsg(
878 VK_DEBUG_REPORT_ERROR_BIT_EXT,
879 "required parameter pFences[0] specified as VK_NULL_HANDLE");
880 // Specify VK_NULL_HANDLE for a required handle array entry
881 // Expected to trigger an error with
882 // parameter_validation::validate_required_handle_array
883 VkFence fence = VK_NULL_HANDLE;
884 vkResetFences(device(), 1, &fence);
885 m_errorMonitor->VerifyFound();
886
887 m_errorMonitor->SetDesiredFailureMsg(
888 VK_DEBUG_REPORT_ERROR_BIT_EXT,
889 "required parameter pAllocateInfo specified as NULL");
890 // Specify NULL for a required struct pointer
891 // Expected to trigger an error with
892 // parameter_validation::validate_struct_type
893 VkDeviceMemory memory = VK_NULL_HANDLE;
894 vkAllocateMemory(device(), NULL, NULL, &memory);
895 m_errorMonitor->VerifyFound();
896
897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
898 "value of faceMask must not be 0");
899 // Specify 0 for a required VkFlags parameter
900 // Expected to trigger an error with parameter_validation::validate_flags
901 m_commandBuffer->SetStencilReference(0, 0);
902 m_errorMonitor->VerifyFound();
903
904 m_errorMonitor->SetDesiredFailureMsg(
905 VK_DEBUG_REPORT_ERROR_BIT_EXT,
906 "value of pSubmits[i].pWaitDstStageMask[0] must not be 0");
907 // Specify 0 for a required VkFlags array entry
908 // Expected to trigger an error with
909 // parameter_validation::validate_flags_array
910 VkSemaphore semaphore = VK_NULL_HANDLE;
911 VkPipelineStageFlags stageFlags = 0;
912 VkSubmitInfo submitInfo = {};
913 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
914 submitInfo.waitSemaphoreCount = 1;
915 submitInfo.pWaitSemaphores = &semaphore;
916 submitInfo.pWaitDstStageMask = &stageFlags;
917 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
918 m_errorMonitor->VerifyFound();
919}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600920
Dustin Gravesfce74c02016-05-10 11:42:58 -0600921TEST_F(VkLayerTest, ReservedParameter) {
922 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
923
924 ASSERT_NO_FATAL_FAILURE(InitState());
925
926 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
927 " must be 0");
928 // Specify 0 for a reserved VkFlags parameter
929 // Expected to trigger an error with
930 // parameter_validation::validate_reserved_flags
931 VkEvent event_handle = VK_NULL_HANDLE;
932 VkEventCreateInfo event_info = {};
933 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
934 event_info.flags = 1;
935 vkCreateEvent(device(), &event_info, NULL, &event_handle);
936 m_errorMonitor->VerifyFound();
937}
938
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600939TEST_F(VkLayerTest, InvalidStructSType) {
940 TEST_DESCRIPTION("Specify an invalid VkStructureType for a Vulkan "
941 "structure's sType field");
942
943 ASSERT_NO_FATAL_FAILURE(InitState());
944
945 m_errorMonitor->SetDesiredFailureMsg(
946 VK_DEBUG_REPORT_ERROR_BIT_EXT,
947 "parameter pAllocateInfo->sType must be");
948 // Zero struct memory, effectively setting sType to
949 // VK_STRUCTURE_TYPE_APPLICATION_INFO
950 // Expected to trigger an error with
951 // parameter_validation::validate_struct_type
952 VkMemoryAllocateInfo alloc_info = {};
953 VkDeviceMemory memory = VK_NULL_HANDLE;
954 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
955 m_errorMonitor->VerifyFound();
956
957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
958 "parameter pSubmits[0].sType must be");
959 // Zero struct memory, effectively setting sType to
960 // VK_STRUCTURE_TYPE_APPLICATION_INFO
961 // Expected to trigger an error with
962 // parameter_validation::validate_struct_type_array
963 VkSubmitInfo submit_info = {};
964 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
965 m_errorMonitor->VerifyFound();
966}
967
968TEST_F(VkLayerTest, InvalidStructPNext) {
969 TEST_DESCRIPTION(
970 "Specify an invalid value for a Vulkan structure's pNext field");
971
972 ASSERT_NO_FATAL_FAILURE(InitState());
973
974 m_errorMonitor->SetDesiredFailureMsg(
975 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz38b50992016-07-11 16:09:09 -0600976 "value of pCreateInfo->pNext must be NULL");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600977 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be
Karl Schultz38b50992016-07-11 16:09:09 -0600978 // NULL.
979 // Need to pick a function that has no allowed pNext structure types.
980 // Expected to trigger an error with
981 // parameter_validation::validate_struct_pnext
982 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600983 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600984 // Zero-initialization will provide the correct sType
985 VkApplicationInfo app_info = {};
986 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
987 event_alloc_info.pNext = &app_info;
988 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
989 m_errorMonitor->VerifyFound();
990
991 m_errorMonitor->SetDesiredFailureMsg(
992 VK_DEBUG_REPORT_ERROR_BIT_EXT,
993 " chain includes a structure with unexpected VkStructureType ");
994 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
995 // a function that has allowed pNext structure types and specify
996 // a structure type that is not allowed.
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600997 // Expected to trigger an error with
998 // parameter_validation::validate_struct_pnext
999 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -06001000 VkMemoryAllocateInfo memory_alloc_info = {};
1001 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1002 memory_alloc_info.pNext = &app_info;
1003 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -06001004 m_errorMonitor->VerifyFound();
1005
Dustin Graves47b6cba2016-05-10 17:34:38 -06001006 m_errorMonitor->SetDesiredFailureMsg(
1007 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1008 " chain includes a structure with unexpected VkStructureType ");
1009 // Set VkGraphicsPipelineCreateInfo::VkPipelineRasterizationStateCreateInfo::pNext to an invalid structure, when pNext is allowed to be a non-NULL value
1010 // Expected to trigger an error with
1011 // parameter_validation::validate_struct_pnext
1012 VkDescriptorPoolSize ds_type_count = {};
1013 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1014 ds_type_count.descriptorCount = 1;
1015
1016 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1017 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1018 ds_pool_ci.pNext = NULL;
1019 ds_pool_ci.maxSets = 1;
1020 ds_pool_ci.poolSizeCount = 1;
1021 ds_pool_ci.pPoolSizes = &ds_type_count;
1022
1023 VkDescriptorPool ds_pool;
1024 VkResult err =
1025 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
1026 ASSERT_VK_SUCCESS(err);
1027
1028 VkDescriptorSetLayoutBinding dsl_binding = {};
1029 dsl_binding.binding = 0;
1030 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1031 dsl_binding.descriptorCount = 1;
1032 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1033 dsl_binding.pImmutableSamplers = NULL;
1034
1035 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1036 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1037 ds_layout_ci.pNext = NULL;
1038 ds_layout_ci.bindingCount = 1;
1039 ds_layout_ci.pBindings = &dsl_binding;
1040
1041 VkDescriptorSetLayout ds_layout;
1042 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
1043 &ds_layout);
1044 ASSERT_VK_SUCCESS(err);
1045
1046 VkDescriptorSet descriptorSet;
1047 VkDescriptorSetAllocateInfo ds_alloc_info = {};
1048 ds_alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1049 ds_alloc_info.descriptorSetCount = 1;
1050 ds_alloc_info.descriptorPool = ds_pool;
1051 ds_alloc_info.pSetLayouts = &ds_layout;
1052 err = vkAllocateDescriptorSets(m_device->device(), &ds_alloc_info,
1053 &descriptorSet);
1054 ASSERT_VK_SUCCESS(err);
1055
1056 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1057 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1058 pipeline_layout_ci.setLayoutCount = 1;
1059 pipeline_layout_ci.pSetLayouts = &ds_layout;
1060
1061 VkPipelineLayout pipeline_layout;
1062 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
1063 &pipeline_layout);
1064 ASSERT_VK_SUCCESS(err);
1065
1066 VkViewport vp = {}; // Just need dummy vp to point to
1067 VkRect2D sc = {}; // dummy scissor to point to
1068
1069 VkPipelineViewportStateCreateInfo vp_state_ci = {};
1070 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
1071 vp_state_ci.scissorCount = 1;
1072 vp_state_ci.pScissors = &sc;
1073 vp_state_ci.viewportCount = 1;
1074 vp_state_ci.pViewports = &vp;
1075
1076 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
1077 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1078 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
1079 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
1080 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
1081 rs_state_ci.depthClampEnable = VK_FALSE;
1082 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
1083 rs_state_ci.depthBiasEnable = VK_FALSE;
1084
1085 VkGraphicsPipelineCreateInfo gp_ci = {};
1086 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
1087 gp_ci.pViewportState = &vp_state_ci;
1088 gp_ci.pRasterizationState = &rs_state_ci;
1089 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
1090 gp_ci.layout = pipeline_layout;
1091 gp_ci.renderPass = renderPass();
1092
1093 VkPipelineCacheCreateInfo pc_ci = {};
1094 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
1095 pc_ci.initialDataSize = 0;
1096 pc_ci.pInitialData = 0;
1097
1098 VkPipeline pipeline;
1099 VkPipelineCache pipelineCache;
1100
1101 err =
1102 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
1103 ASSERT_VK_SUCCESS(err);
1104
1105 // Set VkPipelineRasterizationStateCreateInfo::pNext to an invalid value
1106 VkApplicationInfo invalid_pnext_struct = {};
1107 rs_state_ci.pNext = &invalid_pnext_struct;
1108
1109 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
1110 &gp_ci, NULL, &pipeline);
1111 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06001112 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
1113 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
1114 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1115 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1116
Dustin Gravesc99cf5a2016-05-09 14:40:29 -06001117}
Dustin Graves5d33d532016-05-09 16:21:12 -06001118
1119TEST_F(VkLayerTest, UnrecognizedValue) {
1120 TEST_DESCRIPTION(
1121 "Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
1122
1123 ASSERT_NO_FATAL_FAILURE(InitState());
1124
1125 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1126 "does not fall within the begin..end "
1127 "range of the core VkFormat "
1128 "enumeration tokens");
1129 // Specify an invalid VkFormat value
1130 // Expected to trigger an error with
1131 // parameter_validation::validate_ranged_enum
1132 VkFormatProperties format_properties;
1133 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000),
1134 &format_properties);
1135 m_errorMonitor->VerifyFound();
1136
1137 m_errorMonitor->SetDesiredFailureMsg(
1138 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1139 "contains flag bits that are not recognized members of");
1140 // Specify an invalid VkFlags bitmask value
1141 // Expected to trigger an error with parameter_validation::validate_flags
1142 VkImageFormatProperties image_format_properties;
1143 vkGetPhysicalDeviceImageFormatProperties(
1144 gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D,
1145 VK_IMAGE_TILING_OPTIMAL, static_cast<VkImageUsageFlags>(1 << 25), 0,
1146 &image_format_properties);
1147 m_errorMonitor->VerifyFound();
1148
1149 m_errorMonitor->SetDesiredFailureMsg(
1150 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1151 "contains flag bits that are not recognized members of");
1152 // Specify an invalid VkFlags array entry
1153 // Expected to trigger an error with
1154 // parameter_validation::validate_flags_array
1155 VkSemaphore semaphore = VK_NULL_HANDLE;
1156 VkPipelineStageFlags stage_flags =
1157 static_cast<VkPipelineStageFlags>(1 << 25);
1158 VkSubmitInfo submit_info = {};
1159 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1160 submit_info.waitSemaphoreCount = 1;
1161 submit_info.pWaitSemaphores = &semaphore;
1162 submit_info.pWaitDstStageMask = &stage_flags;
1163 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1164 m_errorMonitor->VerifyFound();
1165
1166 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1167 "is neither VK_TRUE nor VK_FALSE");
1168 // Specify an invalid VkBool32 value
1169 // Expected to trigger a warning with
1170 // parameter_validation::validate_bool32
1171 VkSampler sampler = VK_NULL_HANDLE;
1172 VkSamplerCreateInfo sampler_info = {};
1173 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1174 sampler_info.pNext = NULL;
1175 sampler_info.magFilter = VK_FILTER_NEAREST;
1176 sampler_info.minFilter = VK_FILTER_NEAREST;
1177 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1178 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1179 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1180 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1181 sampler_info.mipLodBias = 1.0;
1182 sampler_info.maxAnisotropy = 1;
1183 sampler_info.compareEnable = VK_FALSE;
1184 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1185 sampler_info.minLod = 1.0;
1186 sampler_info.maxLod = 1.0;
1187 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1188 sampler_info.unnormalizedCoordinates = VK_FALSE;
1189 // Not VK_TRUE or VK_FALSE
1190 sampler_info.anisotropyEnable = 3;
1191 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1192 m_errorMonitor->VerifyFound();
1193}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001194
1195TEST_F(VkLayerTest, FailedReturnValue) {
1196 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1197
1198 ASSERT_NO_FATAL_FAILURE(InitState());
1199
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001200 // Find an unsupported image format
1201 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1202 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1203 VkFormat format = static_cast<VkFormat>(f);
1204 VkFormatProperties fProps = m_device->format_properties(format);
1205 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
1206 fProps.optimalTilingFeatures == 0) {
1207 unsupported = format;
1208 break;
1209 }
1210 }
1211
1212 if (unsupported != VK_FORMAT_UNDEFINED) {
1213 m_errorMonitor->SetDesiredFailureMsg(
1214 VK_DEBUG_REPORT_WARNING_BIT_EXT,
1215 "the requested format is not supported on this device");
1216 // Specify an unsupported VkFormat value to generate a
1217 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1218 // Expected to trigger a warning from
1219 // parameter_validation::validate_result
1220 VkImageFormatProperties image_format_properties;
1221 VkResult err = vkGetPhysicalDeviceImageFormatProperties(
1222 gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1223 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
1224 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1225 m_errorMonitor->VerifyFound();
1226 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001227}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001228
1229TEST_F(VkLayerTest, UpdateBufferAlignment) {
1230 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
1231 uint32_t updateData[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
1232
1233 ASSERT_NO_FATAL_FAILURE(InitState());
1234
1235 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1236 vk_testing::Buffer buffer;
1237 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1238
1239 BeginCommandBuffer();
1240 // Introduce failure by using dstOffset that is not multiple of 4
1241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1242 " is not a multiple of 4");
1243 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1244 m_errorMonitor->VerifyFound();
1245
1246 // Introduce failure by using dataSize that is not multiple of 4
1247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1248 " is not a multiple of 4");
1249 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1250 m_errorMonitor->VerifyFound();
1251
1252 // Introduce failure by using dataSize that is < 0
1253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1254 "must be greater than zero and less than or equal to 65536");
1255 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1256 m_errorMonitor->VerifyFound();
1257
1258 // Introduce failure by using dataSize that is > 65536
1259 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1260 "must be greater than zero and less than or equal to 65536");
1261 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1262 m_errorMonitor->VerifyFound();
1263
1264 EndCommandBuffer();
1265}
1266
1267TEST_F(VkLayerTest, FillBufferAlignment) {
1268 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1269
1270 ASSERT_NO_FATAL_FAILURE(InitState());
1271
1272 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1273 vk_testing::Buffer buffer;
1274 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1275
1276 BeginCommandBuffer();
1277
1278 // Introduce failure by using dstOffset that is not multiple of 4
1279 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1280 " is not a multiple of 4");
1281 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1282 m_errorMonitor->VerifyFound();
1283
1284 // Introduce failure by using size that is not multiple of 4
1285 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1286 " is not a multiple of 4");
1287 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1288 m_errorMonitor->VerifyFound();
1289
1290 // Introduce failure by using size that is zero
1291 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1292 "must be greater than zero");
1293 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1294 m_errorMonitor->VerifyFound();
1295
1296 EndCommandBuffer();
1297}
Dustin Graves40f35822016-06-23 11:12:53 -06001298
1299// This is a positive test. No failures are expected.
1300TEST_F(VkLayerTest, IgnoreUnrelatedDescriptor) {
1301 TEST_DESCRIPTION("Ensure that the vkUpdateDescriptorSet validation code "
1302 "is ignoring VkWriteDescriptorSet members that are not "
1303 "related to the descriptor type specified by "
1304 "VkWriteDescriptorSet::descriptorType. Correct "
1305 "validation behavior will result in the test running to "
1306 "completion without validation errors.");
1307
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001308 const uintptr_t invalid_ptr = 0xcdcdcdcd;
1309
Dustin Graves40f35822016-06-23 11:12:53 -06001310 ASSERT_NO_FATAL_FAILURE(InitState());
1311
1312 // Image Case
1313 {
1314 m_errorMonitor->ExpectSuccess();
1315
1316 VkImage image;
1317 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1318 const int32_t tex_width = 32;
1319 const int32_t tex_height = 32;
1320 VkImageCreateInfo image_create_info = {};
1321 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1322 image_create_info.pNext = NULL;
1323 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1324 image_create_info.format = tex_format;
1325 image_create_info.extent.width = tex_width;
1326 image_create_info.extent.height = tex_height;
1327 image_create_info.extent.depth = 1;
1328 image_create_info.mipLevels = 1;
1329 image_create_info.arrayLayers = 1;
1330 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis51cde412016-07-11 16:08:30 -06001331 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Dustin Graves40f35822016-06-23 11:12:53 -06001332 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1333 image_create_info.flags = 0;
1334 VkResult err =
1335 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1336 ASSERT_VK_SUCCESS(err);
1337
1338 VkMemoryRequirements memory_reqs;
1339 VkDeviceMemory image_memory;
1340 bool pass;
1341 VkMemoryAllocateInfo memory_info = {};
1342 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1343 memory_info.pNext = NULL;
1344 memory_info.allocationSize = 0;
1345 memory_info.memoryTypeIndex = 0;
1346 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
1347 memory_info.allocationSize = memory_reqs.size;
1348 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1349 &memory_info, 0);
1350 ASSERT_TRUE(pass);
1351 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1352 &image_memory);
1353 ASSERT_VK_SUCCESS(err);
1354 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
1355 ASSERT_VK_SUCCESS(err);
1356
1357 VkImageViewCreateInfo image_view_create_info = {};
1358 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
1359 image_view_create_info.image = image;
1360 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
1361 image_view_create_info.format = tex_format;
1362 image_view_create_info.subresourceRange.layerCount = 1;
1363 image_view_create_info.subresourceRange.baseMipLevel = 0;
1364 image_view_create_info.subresourceRange.levelCount = 1;
1365 image_view_create_info.subresourceRange.aspectMask =
1366 VK_IMAGE_ASPECT_COLOR_BIT;
1367
1368 VkImageView view;
1369 err = vkCreateImageView(m_device->device(), &image_view_create_info,
1370 NULL, &view);
1371 ASSERT_VK_SUCCESS(err);
1372
1373 VkDescriptorPoolSize ds_type_count = {};
1374 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1375 ds_type_count.descriptorCount = 1;
1376
1377 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1378 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1379 ds_pool_ci.pNext = NULL;
1380 ds_pool_ci.maxSets = 1;
1381 ds_pool_ci.poolSizeCount = 1;
1382 ds_pool_ci.pPoolSizes = &ds_type_count;
1383
1384 VkDescriptorPool ds_pool;
1385 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL,
1386 &ds_pool);
1387 ASSERT_VK_SUCCESS(err);
1388
1389 VkDescriptorSetLayoutBinding dsl_binding = {};
1390 dsl_binding.binding = 0;
1391 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1392 dsl_binding.descriptorCount = 1;
1393 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1394 dsl_binding.pImmutableSamplers = NULL;
1395
1396 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1397 ds_layout_ci.sType =
1398 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1399 ds_layout_ci.pNext = NULL;
1400 ds_layout_ci.bindingCount = 1;
1401 ds_layout_ci.pBindings = &dsl_binding;
1402 VkDescriptorSetLayout ds_layout;
1403 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
1404 NULL, &ds_layout);
1405 ASSERT_VK_SUCCESS(err);
1406
1407 VkDescriptorSet descriptor_set;
1408 VkDescriptorSetAllocateInfo alloc_info = {};
1409 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1410 alloc_info.descriptorSetCount = 1;
1411 alloc_info.descriptorPool = ds_pool;
1412 alloc_info.pSetLayouts = &ds_layout;
1413 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1414 &descriptor_set);
1415 ASSERT_VK_SUCCESS(err);
1416
1417 VkDescriptorImageInfo image_info = {};
1418 image_info.imageView = view;
1419 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
1420
1421 VkWriteDescriptorSet descriptor_write;
1422 memset(&descriptor_write, 0, sizeof(descriptor_write));
1423 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1424 descriptor_write.dstSet = descriptor_set;
1425 descriptor_write.dstBinding = 0;
1426 descriptor_write.descriptorCount = 1;
1427 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1428 descriptor_write.pImageInfo = &image_info;
1429
1430 // Set pBufferInfo and pTexelBufferView to invalid values, which should
1431 // be
1432 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
1433 // This will most likely produce a crash if the parameter_validation
1434 // layer
1435 // does not correctly ignore pBufferInfo.
1436 descriptor_write.pBufferInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001437 reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001438 descriptor_write.pTexelBufferView =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001439 reinterpret_cast<const VkBufferView *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001440
1441 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
1442 NULL);
1443
1444 m_errorMonitor->VerifyNotFound();
1445
1446 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
1447 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1448 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1449 vkDestroyImageView(m_device->device(), view, NULL);
1450 vkDestroyImage(m_device->device(), image, NULL);
1451 vkFreeMemory(m_device->device(), image_memory, NULL);
1452 }
1453
1454 // Buffer Case
1455 {
1456 m_errorMonitor->ExpectSuccess();
1457
1458 VkBuffer buffer;
1459 uint32_t queue_family_index = 0;
1460 VkBufferCreateInfo buffer_create_info = {};
1461 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1462 buffer_create_info.size = 1024;
1463 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1464 buffer_create_info.queueFamilyIndexCount = 1;
1465 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1466
1467 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info,
1468 NULL, &buffer);
1469 ASSERT_VK_SUCCESS(err);
1470
1471 VkMemoryRequirements memory_reqs;
1472 VkDeviceMemory buffer_memory;
1473 bool pass;
1474 VkMemoryAllocateInfo memory_info = {};
1475 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1476 memory_info.pNext = NULL;
1477 memory_info.allocationSize = 0;
1478 memory_info.memoryTypeIndex = 0;
1479
1480 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1481 memory_info.allocationSize = memory_reqs.size;
1482 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1483 &memory_info, 0);
1484 ASSERT_TRUE(pass);
1485
1486 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1487 &buffer_memory);
1488 ASSERT_VK_SUCCESS(err);
1489 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1490 ASSERT_VK_SUCCESS(err);
1491
1492 VkDescriptorPoolSize ds_type_count = {};
1493 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1494 ds_type_count.descriptorCount = 1;
1495
1496 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1497 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1498 ds_pool_ci.pNext = NULL;
1499 ds_pool_ci.maxSets = 1;
1500 ds_pool_ci.poolSizeCount = 1;
1501 ds_pool_ci.pPoolSizes = &ds_type_count;
1502
1503 VkDescriptorPool ds_pool;
1504 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL,
1505 &ds_pool);
1506 ASSERT_VK_SUCCESS(err);
1507
1508 VkDescriptorSetLayoutBinding dsl_binding = {};
1509 dsl_binding.binding = 0;
1510 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1511 dsl_binding.descriptorCount = 1;
1512 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1513 dsl_binding.pImmutableSamplers = NULL;
1514
1515 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1516 ds_layout_ci.sType =
1517 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1518 ds_layout_ci.pNext = NULL;
1519 ds_layout_ci.bindingCount = 1;
1520 ds_layout_ci.pBindings = &dsl_binding;
1521 VkDescriptorSetLayout ds_layout;
1522 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
1523 NULL, &ds_layout);
1524 ASSERT_VK_SUCCESS(err);
1525
1526 VkDescriptorSet descriptor_set;
1527 VkDescriptorSetAllocateInfo alloc_info = {};
1528 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1529 alloc_info.descriptorSetCount = 1;
1530 alloc_info.descriptorPool = ds_pool;
1531 alloc_info.pSetLayouts = &ds_layout;
1532 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1533 &descriptor_set);
1534 ASSERT_VK_SUCCESS(err);
1535
1536 VkDescriptorBufferInfo buffer_info = {};
1537 buffer_info.buffer = buffer;
1538 buffer_info.offset = 0;
1539 buffer_info.range = 1024;
1540
1541 VkWriteDescriptorSet descriptor_write;
1542 memset(&descriptor_write, 0, sizeof(descriptor_write));
1543 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1544 descriptor_write.dstSet = descriptor_set;
1545 descriptor_write.dstBinding = 0;
1546 descriptor_write.descriptorCount = 1;
1547 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
1548 descriptor_write.pBufferInfo = &buffer_info;
1549
1550 // Set pImageInfo and pTexelBufferView to invalid values, which should
1551 // be
1552 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
1553 // This will most likely produce a crash if the parameter_validation
1554 // layer
1555 // does not correctly ignore pImageInfo.
1556 descriptor_write.pImageInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001557 reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001558 descriptor_write.pTexelBufferView =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001559 reinterpret_cast<const VkBufferView *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001560
1561 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
1562 NULL);
1563
1564 m_errorMonitor->VerifyNotFound();
1565
1566 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
1567 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1568 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1569 vkDestroyBuffer(m_device->device(), buffer, NULL);
1570 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1571 }
1572
1573 // Texel Buffer Case
1574 {
1575 m_errorMonitor->ExpectSuccess();
1576
1577 VkBuffer buffer;
1578 uint32_t queue_family_index = 0;
1579 VkBufferCreateInfo buffer_create_info = {};
1580 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1581 buffer_create_info.size = 1024;
1582 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
1583 buffer_create_info.queueFamilyIndexCount = 1;
1584 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
1585
1586 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info,
1587 NULL, &buffer);
1588 ASSERT_VK_SUCCESS(err);
1589
1590 VkMemoryRequirements memory_reqs;
1591 VkDeviceMemory buffer_memory;
1592 bool pass;
1593 VkMemoryAllocateInfo memory_info = {};
1594 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1595 memory_info.pNext = NULL;
1596 memory_info.allocationSize = 0;
1597 memory_info.memoryTypeIndex = 0;
1598
1599 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
1600 memory_info.allocationSize = memory_reqs.size;
1601 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits,
1602 &memory_info, 0);
1603 ASSERT_TRUE(pass);
1604
1605 err = vkAllocateMemory(m_device->device(), &memory_info, NULL,
1606 &buffer_memory);
1607 ASSERT_VK_SUCCESS(err);
1608 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
1609 ASSERT_VK_SUCCESS(err);
1610
1611 VkBufferViewCreateInfo buff_view_ci = {};
1612 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
1613 buff_view_ci.buffer = buffer;
1614 buff_view_ci.format = VK_FORMAT_R8_UNORM;
1615 buff_view_ci.range = VK_WHOLE_SIZE;
1616 VkBufferView buffer_view;
1617 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL,
1618 &buffer_view);
1619
1620 VkDescriptorPoolSize ds_type_count = {};
1621 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1622 ds_type_count.descriptorCount = 1;
1623
1624 VkDescriptorPoolCreateInfo ds_pool_ci = {};
1625 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1626 ds_pool_ci.pNext = NULL;
1627 ds_pool_ci.maxSets = 1;
1628 ds_pool_ci.poolSizeCount = 1;
1629 ds_pool_ci.pPoolSizes = &ds_type_count;
1630
1631 VkDescriptorPool ds_pool;
1632 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL,
1633 &ds_pool);
1634 ASSERT_VK_SUCCESS(err);
1635
1636 VkDescriptorSetLayoutBinding dsl_binding = {};
1637 dsl_binding.binding = 0;
1638 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1639 dsl_binding.descriptorCount = 1;
1640 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
1641 dsl_binding.pImmutableSamplers = NULL;
1642
1643 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
1644 ds_layout_ci.sType =
1645 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
1646 ds_layout_ci.pNext = NULL;
1647 ds_layout_ci.bindingCount = 1;
1648 ds_layout_ci.pBindings = &dsl_binding;
1649 VkDescriptorSetLayout ds_layout;
1650 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
1651 NULL, &ds_layout);
1652 ASSERT_VK_SUCCESS(err);
1653
1654 VkDescriptorSet descriptor_set;
1655 VkDescriptorSetAllocateInfo alloc_info = {};
1656 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1657 alloc_info.descriptorSetCount = 1;
1658 alloc_info.descriptorPool = ds_pool;
1659 alloc_info.pSetLayouts = &ds_layout;
1660 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
1661 &descriptor_set);
1662 ASSERT_VK_SUCCESS(err);
1663
1664 VkWriteDescriptorSet descriptor_write;
1665 memset(&descriptor_write, 0, sizeof(descriptor_write));
1666 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1667 descriptor_write.dstSet = descriptor_set;
1668 descriptor_write.dstBinding = 0;
1669 descriptor_write.descriptorCount = 1;
1670 descriptor_write.descriptorType =
1671 VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
1672 descriptor_write.pTexelBufferView = &buffer_view;
1673
1674 // Set pImageInfo and pBufferInfo to invalid values, which should be
1675 // ignored for descriptorType ==
1676 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
1677 // This will most likely produce a crash if the parameter_validation
1678 // layer
1679 // does not correctly ignore pImageInfo and pBufferInfo.
1680 descriptor_write.pImageInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001681 reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001682 descriptor_write.pBufferInfo =
Dustin Graves5e2d8fc2016-07-07 16:18:49 -06001683 reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
Dustin Graves40f35822016-06-23 11:12:53 -06001684
1685 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
1686 NULL);
1687
1688 m_errorMonitor->VerifyNotFound();
1689
1690 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
1691 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
1692 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
1693 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
1694 vkDestroyBuffer(m_device->device(), buffer, NULL);
1695 vkFreeMemory(m_device->device(), buffer_memory, NULL);
1696 }
1697}
Dustin Gravesffa90fa2016-05-06 11:20:38 -06001698#endif // PARAMETER_VALIDATION_TESTS
1699
Tobin Ehlis0788f522015-05-26 16:11:58 -06001700#if MEM_TRACKER_TESTS
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001701#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001702TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001703{
1704 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001705 VkFenceCreateInfo fenceInfo = {};
1706 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1707 fenceInfo.pNext = NULL;
1708 fenceInfo.flags = 0;
1709
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001710 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001711
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001712 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001713
1714 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1715 vk_testing::Buffer buffer;
1716 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001717
Tony Barbourfe3351b2015-07-28 10:17:20 -06001718 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001719 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001720 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001721
1722 testFence.init(*m_device, fenceInfo);
1723
1724 // Bypass framework since it does the waits automatically
1725 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001726 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001727 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1728 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001729 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001730 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001731 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001732 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001733 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001734 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001735 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001736
1737 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001738 ASSERT_VK_SUCCESS( err );
1739
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001740 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001741 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001742
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001743 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001744}
1745
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001746TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001747{
1748 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001749 VkFenceCreateInfo fenceInfo = {};
1750 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1751 fenceInfo.pNext = NULL;
1752 fenceInfo.flags = 0;
1753
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07001754 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active CB");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001755
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001756 ASSERT_NO_FATAL_FAILURE(InitState());
1757 ASSERT_NO_FATAL_FAILURE(InitViewport());
1758 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1759
Tony Barbourfe3351b2015-07-28 10:17:20 -06001760 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001761 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001762 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001763
1764 testFence.init(*m_device, fenceInfo);
1765
1766 // Bypass framework since it does the waits automatically
1767 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001768 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001769 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1770 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001771 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001772 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001773 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001774 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001775 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001776 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001777 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001778
1779 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001780 ASSERT_VK_SUCCESS( err );
1781
Jon Ashburnf19916e2016-01-11 13:12:43 -07001782 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001783 VkCommandBufferBeginInfo info = {};
1784 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1785 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001786 info.renderPass = VK_NULL_HANDLE;
1787 info.subpass = 0;
1788 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001789 info.occlusionQueryEnable = VK_FALSE;
1790 info.queryFlags = 0;
1791 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001792
1793 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001794 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001795
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001796 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001797}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001798#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001799
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001800// This is a positive test. No failures are expected.
1801TEST_F(VkLayerTest, TestAliasedMemoryTracking) {
1802 VkResult err;
1803 bool pass;
1804
1805 TEST_DESCRIPTION("Create a buffer, allocate memory, bind memory, destroy "
1806 "the buffer, create an image, and bind the same memory to "
1807 "it");
1808
1809 m_errorMonitor->ExpectSuccess();
1810
1811 ASSERT_NO_FATAL_FAILURE(InitState());
1812
1813 VkBuffer buffer;
1814 VkImage image;
1815 VkDeviceMemory mem;
1816 VkMemoryRequirements mem_reqs;
1817
1818 VkBufferCreateInfo buf_info = {};
1819 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1820 buf_info.pNext = NULL;
1821 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1822 buf_info.size = 256;
1823 buf_info.queueFamilyIndexCount = 0;
1824 buf_info.pQueueFamilyIndices = NULL;
1825 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1826 buf_info.flags = 0;
1827 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1828 ASSERT_VK_SUCCESS(err);
1829
1830 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1831
1832 VkMemoryAllocateInfo alloc_info = {};
1833 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1834 alloc_info.pNext = NULL;
1835 alloc_info.memoryTypeIndex = 0;
1836
1837 // Ensure memory is big enough for both bindings
1838 alloc_info.allocationSize = 0x10000;
1839
1840 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
1841 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1842 if (!pass) {
1843 vkDestroyBuffer(m_device->device(), buffer, NULL);
1844 return;
1845 }
1846
1847 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1848 ASSERT_VK_SUCCESS(err);
1849
1850 uint8_t *pData;
1851 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
1852 (void **)&pData);
1853 ASSERT_VK_SUCCESS(err);
1854
Mark Lobodzinski2abefa92016-05-05 11:45:57 -06001855 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001856
1857 vkUnmapMemory(m_device->device(), mem);
1858
1859 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1860 ASSERT_VK_SUCCESS(err);
1861
1862 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
1863 // memory. In fact, it was never used by the GPU.
1864 // Just be be sure, wait for idle.
1865 vkDestroyBuffer(m_device->device(), buffer, NULL);
1866 vkDeviceWaitIdle(m_device->device());
1867
1868 VkImageCreateInfo image_create_info = {};
1869 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1870 image_create_info.pNext = NULL;
1871 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1872 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1873 image_create_info.extent.width = 64;
1874 image_create_info.extent.height = 64;
1875 image_create_info.extent.depth = 1;
1876 image_create_info.mipLevels = 1;
1877 image_create_info.arrayLayers = 1;
1878 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1879 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1880 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1881 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1882 image_create_info.queueFamilyIndexCount = 0;
1883 image_create_info.pQueueFamilyIndices = NULL;
1884 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1885 image_create_info.flags = 0;
1886
1887 VkMemoryAllocateInfo mem_alloc = {};
1888 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1889 mem_alloc.pNext = NULL;
1890 mem_alloc.allocationSize = 0;
1891 mem_alloc.memoryTypeIndex = 0;
1892
1893 /* Create a mappable image. It will be the texture if linear images are ok
1894 * to be textures or it will be the staging image if they are not.
1895 */
1896 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1897 ASSERT_VK_SUCCESS(err);
1898
1899 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
1900
1901 mem_alloc.allocationSize = mem_reqs.size;
1902
1903 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc,
1904 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
1905 if (!pass) {
1906 vkDestroyImage(m_device->device(), image, NULL);
1907 return;
1908 }
1909
Tobin Ehlis077ded32016-05-12 17:39:13 -06001910 // VALIDATION FAILURE:
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001911 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1912 ASSERT_VK_SUCCESS(err);
1913
1914 m_errorMonitor->VerifyNotFound();
1915
Tony Barbourdf4c0042016-06-01 15:55:43 -06001916 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski152fe252016-05-03 16:49:15 -06001917 vkDestroyBuffer(m_device->device(), buffer, NULL);
1918 vkDestroyImage(m_device->device(), image, NULL);
1919}
1920
Tobin Ehlisf11be982016-05-11 13:52:53 -06001921TEST_F(VkLayerTest, InvalidMemoryAliasing) {
1922 TEST_DESCRIPTION("Create a buffer and image, allocate memory, and bind the "
1923 "buffer and image to memory such that they will alias.");
1924 VkResult err;
1925 bool pass;
1926 ASSERT_NO_FATAL_FAILURE(InitState());
1927
Tobin Ehlis077ded32016-05-12 17:39:13 -06001928 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001929 VkImage image;
1930 VkDeviceMemory mem; // buffer will be bound first
1931 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001932 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001933
1934 VkBufferCreateInfo buf_info = {};
1935 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1936 buf_info.pNext = NULL;
1937 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1938 buf_info.size = 256;
1939 buf_info.queueFamilyIndexCount = 0;
1940 buf_info.pQueueFamilyIndices = NULL;
1941 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1942 buf_info.flags = 0;
1943 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1944 ASSERT_VK_SUCCESS(err);
1945
Tobin Ehlis077ded32016-05-12 17:39:13 -06001946 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001947
1948 VkImageCreateInfo image_create_info = {};
1949 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1950 image_create_info.pNext = NULL;
1951 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1952 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1953 image_create_info.extent.width = 64;
1954 image_create_info.extent.height = 64;
1955 image_create_info.extent.depth = 1;
1956 image_create_info.mipLevels = 1;
1957 image_create_info.arrayLayers = 1;
1958 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1959 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1960 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1961 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1962 image_create_info.queueFamilyIndexCount = 0;
1963 image_create_info.pQueueFamilyIndices = NULL;
1964 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1965 image_create_info.flags = 0;
1966
Tobin Ehlisf11be982016-05-11 13:52:53 -06001967 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1968 ASSERT_VK_SUCCESS(err);
1969
Tobin Ehlis077ded32016-05-12 17:39:13 -06001970 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1971
1972 VkMemoryAllocateInfo alloc_info = {};
1973 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1974 alloc_info.pNext = NULL;
1975 alloc_info.memoryTypeIndex = 0;
1976 // Ensure memory is big enough for both bindings
1977 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
1978 pass = m_device->phy().set_memory_type(
1979 buff_mem_reqs.memoryTypeBits | img_mem_reqs.memoryTypeBits, &alloc_info,
1980 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001981 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001982 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001983 vkDestroyImage(m_device->device(), image, NULL);
1984 return;
1985 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001986 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1987 ASSERT_VK_SUCCESS(err);
1988 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1989 ASSERT_VK_SUCCESS(err);
1990
Tobin Ehlisf11be982016-05-11 13:52:53 -06001991 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1992 " is aliased with buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001993 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001994 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1995 m_errorMonitor->VerifyFound();
1996
1997 // Now correctly bind image to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001998 // aliasing buffer2
1999 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
2000 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002001 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
2002 ASSERT_VK_SUCCESS(err);
2003 err = vkBindImageMemory(m_device->device(), image, mem_img, 0);
2004 ASSERT_VK_SUCCESS(err);
2005 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2006 " is aliased with image 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06002007 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002008 m_errorMonitor->VerifyFound();
2009
2010 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06002011 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06002012 vkDestroyImage(m_device->device(), image, NULL);
2013 vkFreeMemory(m_device->device(), mem, NULL);
2014 vkFreeMemory(m_device->device(), mem_img, NULL);
2015}
2016
Tobin Ehlis35372522016-05-12 08:32:31 -06002017TEST_F(VkLayerTest, InvalidMemoryMapping) {
2018 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
2019 VkResult err;
2020 bool pass;
2021 ASSERT_NO_FATAL_FAILURE(InitState());
2022
2023 VkBuffer buffer;
2024 VkDeviceMemory mem;
2025 VkMemoryRequirements mem_reqs;
2026
2027 VkBufferCreateInfo buf_info = {};
2028 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2029 buf_info.pNext = NULL;
2030 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
2031 buf_info.size = 256;
2032 buf_info.queueFamilyIndexCount = 0;
2033 buf_info.pQueueFamilyIndices = NULL;
2034 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2035 buf_info.flags = 0;
2036 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
2037 ASSERT_VK_SUCCESS(err);
2038
2039 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
2040 VkMemoryAllocateInfo alloc_info = {};
2041 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2042 alloc_info.pNext = NULL;
2043 alloc_info.memoryTypeIndex = 0;
2044
2045 // Ensure memory is big enough for both bindings
2046 static const VkDeviceSize allocation_size = 0x10000;
2047 alloc_info.allocationSize = allocation_size;
2048 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
2049 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
2050 if (!pass) {
2051 vkDestroyBuffer(m_device->device(), buffer, NULL);
2052 return;
2053 }
2054 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
2055 ASSERT_VK_SUCCESS(err);
2056
2057 uint8_t *pData;
2058 // Attempt to map memory size 0 is invalid
2059 m_errorMonitor->SetDesiredFailureMsg(
2060 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2061 "VkMapMemory: Attempting to map memory range of size zero");
2062 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
2063 m_errorMonitor->VerifyFound();
2064 // Map memory twice
2065 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
2066 (void **)&pData);
2067 ASSERT_VK_SUCCESS(err);
2068 m_errorMonitor->SetDesiredFailureMsg(
2069 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2070 "VkMapMemory: Attempting to map memory on an already-mapped object ");
2071 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0,
2072 (void **)&pData);
2073 m_errorMonitor->VerifyFound();
2074
2075 // Unmap the memory to avoid re-map error
2076 vkUnmapMemory(m_device->device(), mem);
2077 // overstep allocation with VK_WHOLE_SIZE
2078 m_errorMonitor->SetDesiredFailureMsg(
2079 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2080 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
2081 err = vkMapMemory(m_device->device(), mem, allocation_size + 1,
2082 VK_WHOLE_SIZE, 0, (void **)&pData);
2083 m_errorMonitor->VerifyFound();
2084 // overstep allocation w/o VK_WHOLE_SIZE
2085 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2086 " oversteps total array size 0x");
2087 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0,
2088 (void **)&pData);
2089 m_errorMonitor->VerifyFound();
2090 // Now error due to unmapping memory that's not mapped
2091 m_errorMonitor->SetDesiredFailureMsg(
2092 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2093 "Unmapping Memory without memory being mapped: ");
2094 vkUnmapMemory(m_device->device(), mem);
2095 m_errorMonitor->VerifyFound();
2096 // Now map memory and cause errors due to flushing invalid ranges
2097 err = vkMapMemory(m_device->device(), mem, 16, VK_WHOLE_SIZE, 0,
2098 (void **)&pData);
2099 ASSERT_VK_SUCCESS(err);
2100 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12002101 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06002102 mmr.memory = mem;
2103 mmr.offset = 15; // Error b/c offset less than offset of mapped mem
2104 m_errorMonitor->SetDesiredFailureMsg(
2105 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2106 ") is less than Memory Object's offset (");
2107 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2108 m_errorMonitor->VerifyFound();
2109 // Now flush range that oversteps mapped range
2110 vkUnmapMemory(m_device->device(), mem);
2111 err = vkMapMemory(m_device->device(), mem, 0, 256, 0, (void **)&pData);
2112 ASSERT_VK_SUCCESS(err);
2113 mmr.offset = 16;
2114 mmr.size = 256; // flushing bounds (272) exceed mapped bounds (256)
2115 m_errorMonitor->SetDesiredFailureMsg(
2116 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2117 ") exceeds the Memory Object's upper-bound (");
2118 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
2119 m_errorMonitor->VerifyFound();
2120
2121 pass =
2122 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
2123 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
2124 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
2125 if (!pass) {
2126 vkFreeMemory(m_device->device(), mem, NULL);
2127 vkDestroyBuffer(m_device->device(), buffer, NULL);
2128 return;
2129 }
2130 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
2131 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
2132
2133 vkDestroyBuffer(m_device->device(), buffer, NULL);
2134 vkFreeMemory(m_device->device(), mem, NULL);
2135}
2136
Ian Elliott1c32c772016-04-28 14:47:13 -06002137TEST_F(VkLayerTest, EnableWsiBeforeUse) {
2138 VkResult err;
2139 bool pass;
2140
Ian Elliott489eec02016-05-05 14:12:44 -06002141// FIXME: After we turn on this code for non-Linux platforms, uncomment the
2142// following declaration (which is temporarily being moved below):
2143// VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002144 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2145 VkSwapchainCreateInfoKHR swapchain_create_info = {};
2146 uint32_t swapchain_image_count = 0;
2147// VkImage swapchain_images[1] = {VK_NULL_HANDLE};
2148 uint32_t image_index = 0;
2149// VkPresentInfoKHR present_info = {};
2150
2151 ASSERT_NO_FATAL_FAILURE(InitState());
2152
Ian Elliott3f06ce52016-04-29 14:46:21 -06002153#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
2154#if defined(VK_USE_PLATFORM_ANDROID_KHR)
2155 // Use the functions from the VK_KHR_android_surface extension without
2156 // enabling that extension:
2157
2158 // Create a surface:
2159 VkAndroidSurfaceCreateInfoKHR android_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002160 m_errorMonitor->SetDesiredFailureMsg(
2161 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2162 "extension was not enabled for this");
2163 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL,
2164 &surface);
2165 pass = (err != VK_SUCCESS);
2166 ASSERT_TRUE(pass);
2167 m_errorMonitor->VerifyFound();
2168#endif // VK_USE_PLATFORM_ANDROID_KHR
2169
2170
2171#if defined(VK_USE_PLATFORM_MIR_KHR)
2172 // Use the functions from the VK_KHR_mir_surface extension without enabling
2173 // that extension:
2174
2175 // Create a surface:
2176 VkMirSurfaceCreateInfoKHR mir_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002177 m_errorMonitor->SetDesiredFailureMsg(
2178 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2179 "extension was not enabled for this");
2180 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
2181 pass = (err != VK_SUCCESS);
2182 ASSERT_TRUE(pass);
2183 m_errorMonitor->VerifyFound();
2184
2185 // Tell whether an mir_connection supports presentation:
2186 MirConnection *mir_connection = NULL;
2187 m_errorMonitor->SetDesiredFailureMsg(
2188 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2189 "extension was not enabled for this");
2190 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection,
2191 visual_id);
2192 m_errorMonitor->VerifyFound();
2193#endif // VK_USE_PLATFORM_MIR_KHR
2194
2195
2196#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
2197 // Use the functions from the VK_KHR_wayland_surface extension without
2198 // enabling that extension:
2199
2200 // Create a surface:
2201 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002202 m_errorMonitor->SetDesiredFailureMsg(
2203 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2204 "extension was not enabled for this");
2205 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL,
2206 &surface);
2207 pass = (err != VK_SUCCESS);
2208 ASSERT_TRUE(pass);
2209 m_errorMonitor->VerifyFound();
2210
2211 // Tell whether an wayland_display supports presentation:
2212 struct wl_display wayland_display = {};
2213 m_errorMonitor->SetDesiredFailureMsg(
2214 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2215 "extension was not enabled for this");
2216 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0,
2217 &wayland_display);
2218 m_errorMonitor->VerifyFound();
2219#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott489eec02016-05-05 14:12:44 -06002220#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06002221
2222
2223#if defined(VK_USE_PLATFORM_WIN32_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06002224// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2225// TO NON-LINUX PLATFORMS:
2226VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06002227 // Use the functions from the VK_KHR_win32_surface extension without
2228 // enabling that extension:
2229
2230 // Create a surface:
2231 VkWin32SurfaceCreateInfoKHR win32_create_info = {};
Ian Elliott3f06ce52016-04-29 14:46:21 -06002232 m_errorMonitor->SetDesiredFailureMsg(
2233 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2234 "extension was not enabled for this");
2235 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL,
2236 &surface);
2237 pass = (err != VK_SUCCESS);
2238 ASSERT_TRUE(pass);
2239 m_errorMonitor->VerifyFound();
2240
2241 // Tell whether win32 supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06002242 m_errorMonitor->SetDesiredFailureMsg(
2243 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2244 "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06002245 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06002246 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002247// Set this (for now, until all platforms are supported and tested):
2248#define NEED_TO_TEST_THIS_ON_PLATFORM
2249#endif // VK_USE_PLATFORM_WIN32_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06002250
2251
Ian Elliott1c32c772016-04-28 14:47:13 -06002252#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott489eec02016-05-05 14:12:44 -06002253// FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
2254// TO NON-LINUX PLATFORMS:
2255VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06002256 // Use the functions from the VK_KHR_xcb_surface extension without enabling
2257 // that extension:
2258
2259 // Create a surface:
2260 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06002261 m_errorMonitor->SetDesiredFailureMsg(
2262 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2263 "extension was not enabled for this");
2264 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2265 pass = (err != VK_SUCCESS);
2266 ASSERT_TRUE(pass);
2267 m_errorMonitor->VerifyFound();
2268
2269 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06002270 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06002271 xcb_visualid_t visual_id = 0;
2272 m_errorMonitor->SetDesiredFailureMsg(
2273 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2274 "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06002275 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection,
Ian Elliott1c32c772016-04-28 14:47:13 -06002276 visual_id);
2277 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002278// Set this (for now, until all platforms are supported and tested):
2279#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002280#endif // VK_USE_PLATFORM_XCB_KHR
2281
2282
Ian Elliott12630812016-04-29 14:35:43 -06002283#if defined(VK_USE_PLATFORM_XLIB_KHR)
2284 // Use the functions from the VK_KHR_xlib_surface extension without enabling
2285 // that extension:
2286
2287 // Create a surface:
2288 VkXlibSurfaceCreateInfoKHR xlib_create_info = {};
Ian Elliott12630812016-04-29 14:35:43 -06002289 m_errorMonitor->SetDesiredFailureMsg(
2290 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2291 "extension was not enabled for this");
2292 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
2293 pass = (err != VK_SUCCESS);
2294 ASSERT_TRUE(pass);
2295 m_errorMonitor->VerifyFound();
2296
2297 // Tell whether an Xlib VisualID supports presentation:
2298 Display *dpy = NULL;
2299 VisualID visual = 0;
2300 m_errorMonitor->SetDesiredFailureMsg(
2301 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2302 "extension was not enabled for this");
2303 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
2304 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002305// Set this (for now, until all platforms are supported and tested):
2306#define NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott12630812016-04-29 14:35:43 -06002307#endif // VK_USE_PLATFORM_XLIB_KHR
2308
2309
Ian Elliott1c32c772016-04-28 14:47:13 -06002310 // Use the functions from the VK_KHR_surface extension without enabling
2311 // that extension:
2312
Ian Elliott489eec02016-05-05 14:12:44 -06002313#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002314 // Destroy a surface:
2315 m_errorMonitor->SetDesiredFailureMsg(
2316 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2317 "extension was not enabled for this");
2318 vkDestroySurfaceKHR(instance(), surface, NULL);
2319 m_errorMonitor->VerifyFound();
2320
2321 // Check if surface supports presentation:
2322 VkBool32 supported = false;
2323 m_errorMonitor->SetDesiredFailureMsg(
2324 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2325 "extension was not enabled for this");
2326 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2327 pass = (err != VK_SUCCESS);
2328 ASSERT_TRUE(pass);
2329 m_errorMonitor->VerifyFound();
2330
2331 // Check surface capabilities:
2332 VkSurfaceCapabilitiesKHR capabilities = {};
2333 m_errorMonitor->SetDesiredFailureMsg(
2334 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2335 "extension was not enabled for this");
2336 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
2337 &capabilities);
2338 pass = (err != VK_SUCCESS);
2339 ASSERT_TRUE(pass);
2340 m_errorMonitor->VerifyFound();
2341
2342 // Check surface formats:
2343 uint32_t format_count = 0;
2344 VkSurfaceFormatKHR *formats = NULL;
2345 m_errorMonitor->SetDesiredFailureMsg(
2346 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2347 "extension was not enabled for this");
2348 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
2349 &format_count, formats);
2350 pass = (err != VK_SUCCESS);
2351 ASSERT_TRUE(pass);
2352 m_errorMonitor->VerifyFound();
2353
2354 // Check surface present modes:
2355 uint32_t present_mode_count = 0;
2356 VkSurfaceFormatKHR *present_modes = NULL;
2357 m_errorMonitor->SetDesiredFailureMsg(
2358 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2359 "extension was not enabled for this");
2360 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface,
2361 &present_mode_count, present_modes);
2362 pass = (err != VK_SUCCESS);
2363 ASSERT_TRUE(pass);
2364 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06002365#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06002366
2367
2368 // Use the functions from the VK_KHR_swapchain extension without enabling
2369 // that extension:
2370
2371 // Create a swapchain:
2372 m_errorMonitor->SetDesiredFailureMsg(
2373 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2374 "extension was not enabled for this");
2375 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2376 swapchain_create_info.pNext = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06002377 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info,
2378 NULL, &swapchain);
2379 pass = (err != VK_SUCCESS);
2380 ASSERT_TRUE(pass);
2381 m_errorMonitor->VerifyFound();
2382
2383 // Get the images from the swapchain:
2384 m_errorMonitor->SetDesiredFailureMsg(
2385 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2386 "extension was not enabled for this");
2387 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain,
2388 &swapchain_image_count, NULL);
2389 pass = (err != VK_SUCCESS);
2390 ASSERT_TRUE(pass);
2391 m_errorMonitor->VerifyFound();
2392
2393 // Try to acquire an image:
2394 m_errorMonitor->SetDesiredFailureMsg(
2395 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2396 "extension was not enabled for this");
2397 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0,
2398 VK_NULL_HANDLE, VK_NULL_HANDLE, &image_index);
2399 pass = (err != VK_SUCCESS);
2400 ASSERT_TRUE(pass);
2401 m_errorMonitor->VerifyFound();
2402
2403 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002404 //
2405 // NOTE: Currently can't test this because a real swapchain is needed (as
2406 // opposed to the fake one we created) in order for the layer to lookup the
2407 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06002408
2409 // Destroy the swapchain:
2410 m_errorMonitor->SetDesiredFailureMsg(
2411 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2412 "extension was not enabled for this");
2413 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
2414 m_errorMonitor->VerifyFound();
2415}
2416
Ian Elliott2c1daf52016-05-12 09:41:46 -06002417TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
Ian Elliott2c1daf52016-05-12 09:41:46 -06002418
Dustin Graves6c6d8982016-05-17 10:09:21 -06002419#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott2c1daf52016-05-12 09:41:46 -06002420 VkSurfaceKHR surface = VK_NULL_HANDLE;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002421
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002422 VkResult err;
2423 bool pass;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002424 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
2425 VkSwapchainCreateInfoKHR swapchain_create_info = {};
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002426 // uint32_t swapchain_image_count = 0;
2427 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
2428 // uint32_t image_index = 0;
2429 // VkPresentInfoKHR present_info = {};
Ian Elliott2c1daf52016-05-12 09:41:46 -06002430
2431 ASSERT_NO_FATAL_FAILURE(InitState());
2432
2433 // Use the create function from one of the VK_KHR_*_surface extension in
2434 // order to create a surface, testing all known errors in the process,
2435 // before successfully creating a surface:
2436 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002437 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2438 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002439 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
2440 pass = (err != VK_SUCCESS);
2441 ASSERT_TRUE(pass);
2442 m_errorMonitor->VerifyFound();
2443
2444 // Next, try to create a surface with the wrong
2445 // VkXcbSurfaceCreateInfoKHR::sType:
2446 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
2447 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002448 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2449 "called with the wrong value for");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002450 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2451 pass = (err != VK_SUCCESS);
2452 ASSERT_TRUE(pass);
2453 m_errorMonitor->VerifyFound();
2454
Ian Elliott2c1daf52016-05-12 09:41:46 -06002455 // Create a native window, and then correctly create a surface:
2456 xcb_connection_t *connection;
2457 xcb_screen_t *screen;
2458 xcb_window_t xcb_window;
2459 xcb_intern_atom_reply_t *atom_wm_delete_window;
2460
2461 const xcb_setup_t *setup;
2462 xcb_screen_iterator_t iter;
2463 int scr;
2464 uint32_t value_mask, value_list[32];
2465 int width = 1;
2466 int height = 1;
2467
2468 connection = xcb_connect(NULL, &scr);
2469 ASSERT_TRUE(connection != NULL);
2470 setup = xcb_get_setup(connection);
2471 iter = xcb_setup_roots_iterator(setup);
2472 while (scr-- > 0)
2473 xcb_screen_next(&iter);
2474 screen = iter.data;
2475
2476 xcb_window = xcb_generate_id(connection);
2477
2478 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
2479 value_list[0] = screen->black_pixel;
2480 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE |
2481 XCB_EVENT_MASK_STRUCTURE_NOTIFY;
2482
2483 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window,
2484 screen->root, 0, 0, width, height, 0,
2485 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual,
2486 value_mask, value_list);
2487
2488 /* Magic code that will send notification when window is destroyed */
2489 xcb_intern_atom_cookie_t cookie =
2490 xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
2491 xcb_intern_atom_reply_t *reply =
2492 xcb_intern_atom_reply(connection, cookie, 0);
2493
2494 xcb_intern_atom_cookie_t cookie2 =
2495 xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002496 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002497 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window,
2498 (*reply).atom, 4, 32, 1,
2499 &(*atom_wm_delete_window).atom);
2500 free(reply);
2501
2502 xcb_map_window(connection, xcb_window);
2503
2504 // Force the x/y coordinates to 100,100 results are identical in consecutive
2505 // runs
2506 const uint32_t coords[] = {100, 100};
2507 xcb_configure_window(connection, xcb_window,
2508 XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
2509
Ian Elliott2c1daf52016-05-12 09:41:46 -06002510 // Finally, try to correctly create a surface:
2511 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
2512 xcb_create_info.pNext = NULL;
2513 xcb_create_info.flags = 0;
2514 xcb_create_info.connection = connection;
2515 xcb_create_info.window = xcb_window;
2516 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
2517 pass = (err == VK_SUCCESS);
2518 ASSERT_TRUE(pass);
2519
Ian Elliott2c1daf52016-05-12 09:41:46 -06002520 // Check if surface supports presentation:
2521
2522 // 1st, do so without having queried the queue families:
2523 VkBool32 supported = false;
2524 // TODO: Get the following error to come out:
2525 m_errorMonitor->SetDesiredFailureMsg(
2526 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2527 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
2528 "function");
2529 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2530 pass = (err != VK_SUCCESS);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002531 // ASSERT_TRUE(pass);
2532 // m_errorMonitor->VerifyFound();
Ian Elliott2c1daf52016-05-12 09:41:46 -06002533
2534 // Next, query a queue family index that's too large:
2535 m_errorMonitor->SetDesiredFailureMsg(
2536 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2537 "called with a queueFamilyIndex that is too large");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002538 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface,
2539 &supported);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002540 pass = (err != VK_SUCCESS);
2541 ASSERT_TRUE(pass);
2542 m_errorMonitor->VerifyFound();
2543
2544 // Finally, do so correctly:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002545 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2546 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002547 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
2548 pass = (err == VK_SUCCESS);
2549 ASSERT_TRUE(pass);
2550
Ian Elliott2c1daf52016-05-12 09:41:46 -06002551 // Before proceeding, try to create a swapchain without having called
2552 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
2553 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2554 swapchain_create_info.pNext = NULL;
2555 swapchain_create_info.flags = 0;
2556 m_errorMonitor->SetDesiredFailureMsg(
2557 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2558 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002559 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2560 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002561 pass = (err != VK_SUCCESS);
2562 ASSERT_TRUE(pass);
2563 m_errorMonitor->VerifyFound();
2564
Ian Elliott2c1daf52016-05-12 09:41:46 -06002565 // Get the surface capabilities:
2566 VkSurfaceCapabilitiesKHR surface_capabilities;
2567
2568 // Do so correctly (only error logged by this entrypoint is if the
2569 // extension isn't enabled):
2570 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface,
2571 &surface_capabilities);
2572 pass = (err == VK_SUCCESS);
2573 ASSERT_TRUE(pass);
2574
Ian Elliott2c1daf52016-05-12 09:41:46 -06002575 // Get the surface formats:
2576 uint32_t surface_format_count;
2577
2578 // First, try without a pointer to surface_format_count:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002579 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2580 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002581 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
2582 pass = (err == VK_SUCCESS);
2583 ASSERT_TRUE(pass);
2584 m_errorMonitor->VerifyFound();
2585
2586 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
2587 // correctly done a 1st try (to get the count):
2588 m_errorMonitor->SetDesiredFailureMsg(
2589 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2590 "but no prior positive value has been seen for");
2591 surface_format_count = 0;
2592 vkGetPhysicalDeviceSurfaceFormatsKHR(
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002593 gpu(), surface, &surface_format_count,
2594 (VkSurfaceFormatKHR *)&surface_format_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002595 pass = (err == VK_SUCCESS);
2596 ASSERT_TRUE(pass);
2597 m_errorMonitor->VerifyFound();
2598
2599 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002600 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
2601 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002602 pass = (err == VK_SUCCESS);
2603 ASSERT_TRUE(pass);
2604
2605 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002606 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(
2607 surface_format_count * sizeof(VkSurfaceFormatKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002608
2609 // Next, do a 2nd try with surface_format_count being set too high:
2610 surface_format_count += 5;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002611 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2612 "that is greater than the value");
2613 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002614 surface_formats);
2615 pass = (err == VK_SUCCESS);
2616 ASSERT_TRUE(pass);
2617 m_errorMonitor->VerifyFound();
2618
2619 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002620 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
2621 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002622 pass = (err == VK_SUCCESS);
2623 ASSERT_TRUE(pass);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002624 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count,
Ian Elliott2c1daf52016-05-12 09:41:46 -06002625 surface_formats);
2626 pass = (err == VK_SUCCESS);
2627 ASSERT_TRUE(pass);
2628
Ian Elliott2c1daf52016-05-12 09:41:46 -06002629 // Get the surface present modes:
2630 uint32_t surface_present_mode_count;
2631
2632 // First, try without a pointer to surface_format_count:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002633 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2634 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002635 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
2636 pass = (err == VK_SUCCESS);
2637 ASSERT_TRUE(pass);
2638 m_errorMonitor->VerifyFound();
2639
2640 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
2641 // correctly done a 1st try (to get the count):
2642 m_errorMonitor->SetDesiredFailureMsg(
2643 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2644 "but no prior positive value has been seen for");
2645 surface_present_mode_count = 0;
2646 vkGetPhysicalDeviceSurfacePresentModesKHR(
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002647 gpu(), surface, &surface_present_mode_count,
2648 (VkPresentModeKHR *)&surface_present_mode_count);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002649 pass = (err == VK_SUCCESS);
2650 ASSERT_TRUE(pass);
2651 m_errorMonitor->VerifyFound();
2652
2653 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002654 vkGetPhysicalDeviceSurfacePresentModesKHR(
2655 gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002656 pass = (err == VK_SUCCESS);
2657 ASSERT_TRUE(pass);
2658
2659 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002660 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(
2661 surface_present_mode_count * sizeof(VkPresentModeKHR));
Ian Elliott2c1daf52016-05-12 09:41:46 -06002662
2663 // Next, do a 2nd try with surface_format_count being set too high:
2664 surface_present_mode_count += 5;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002665 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2666 "that is greater than the value");
2667 vkGetPhysicalDeviceSurfacePresentModesKHR(
2668 gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002669 pass = (err == VK_SUCCESS);
2670 ASSERT_TRUE(pass);
2671 m_errorMonitor->VerifyFound();
2672
2673 // Finally, do a correct 1st and 2nd try:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002674 vkGetPhysicalDeviceSurfacePresentModesKHR(
2675 gpu(), surface, &surface_present_mode_count, NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002676 pass = (err == VK_SUCCESS);
2677 ASSERT_TRUE(pass);
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002678 vkGetPhysicalDeviceSurfacePresentModesKHR(
2679 gpu(), surface, &surface_present_mode_count, surface_present_modes);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002680 pass = (err == VK_SUCCESS);
2681 ASSERT_TRUE(pass);
2682
Ian Elliott2c1daf52016-05-12 09:41:46 -06002683 // Create a swapchain:
2684
2685 // First, try without a pointer to swapchain_create_info:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002686 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2687 "called with NULL pointer");
Ian Elliott2c1daf52016-05-12 09:41:46 -06002688 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
2689 pass = (err != VK_SUCCESS);
2690 ASSERT_TRUE(pass);
2691 m_errorMonitor->VerifyFound();
2692
2693 // Next, call with a non-NULL swapchain_create_info, that has the wrong
2694 // sType:
2695 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002696 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2697 "called with the wrong value for");
2698 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2699 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002700 pass = (err != VK_SUCCESS);
2701 ASSERT_TRUE(pass);
2702 m_errorMonitor->VerifyFound();
2703
2704 // Next, call with a NULL swapchain pointer:
2705 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2706 swapchain_create_info.pNext = NULL;
2707 swapchain_create_info.flags = 0;
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002708 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2709 "called with NULL pointer");
2710 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2711 NULL);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002712 pass = (err != VK_SUCCESS);
2713 ASSERT_TRUE(pass);
2714 m_errorMonitor->VerifyFound();
2715
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002716 // TODO: Enhance swapchain layer so that
2717 // swapchain_create_info.queueFamilyIndexCount is checked against something?
Ian Elliott2c1daf52016-05-12 09:41:46 -06002718
2719 // Next, call with a queue family index that's too large:
2720 uint32_t queueFamilyIndex[2] = {100000, 0};
2721 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2722 swapchain_create_info.queueFamilyIndexCount = 2;
2723 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
2724 m_errorMonitor->SetDesiredFailureMsg(
2725 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2726 "called with a queueFamilyIndex that is too large");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002727 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2728 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002729 pass = (err != VK_SUCCESS);
2730 ASSERT_TRUE(pass);
2731 m_errorMonitor->VerifyFound();
2732
2733 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
2734 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
2735 swapchain_create_info.queueFamilyIndexCount = 1;
2736 m_errorMonitor->SetDesiredFailureMsg(
2737 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2738 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
2739 "pCreateInfo->pQueueFamilyIndices).");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002740 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2741 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002742 pass = (err != VK_SUCCESS);
2743 ASSERT_TRUE(pass);
2744 m_errorMonitor->VerifyFound();
2745
2746 // Next, call with an invalid imageSharingMode:
2747 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
2748 swapchain_create_info.queueFamilyIndexCount = 1;
2749 m_errorMonitor->SetDesiredFailureMsg(
2750 VK_DEBUG_REPORT_ERROR_BIT_EXT,
2751 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002752 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL,
2753 &swapchain);
Ian Elliott2c1daf52016-05-12 09:41:46 -06002754 pass = (err != VK_SUCCESS);
2755 ASSERT_TRUE(pass);
2756 m_errorMonitor->VerifyFound();
2757 // Fix for the future:
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002758 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
2759 // SUPPORTED
Ian Elliott2c1daf52016-05-12 09:41:46 -06002760 swapchain_create_info.queueFamilyIndexCount = 0;
2761 queueFamilyIndex[0] = 0;
2762 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
2763
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002764 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
Ian Elliott2c1daf52016-05-12 09:41:46 -06002765 // Get the images from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002766 // Acquire an image from a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002767 // Present an image to a swapchain:
Ian Elliott2c1daf52016-05-12 09:41:46 -06002768 // Destroy the swapchain:
2769
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002770 // TODOs:
2771 //
2772 // - Try destroying the device without first destroying the swapchain
2773 //
2774 // - Try destroying the device without first destroying the surface
2775 //
2776 // - Try destroying the surface without first destroying the swapchain
Ian Elliott2c1daf52016-05-12 09:41:46 -06002777
2778 // Destroy the surface:
2779 vkDestroySurfaceKHR(instance(), surface, NULL);
2780
Ian Elliott2c1daf52016-05-12 09:41:46 -06002781 // Tear down the window:
2782 xcb_destroy_window(connection, xcb_window);
2783 xcb_disconnect(connection);
2784
2785#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski085d27a2016-05-17 09:34:26 -06002786 return;
Ian Elliott2c1daf52016-05-12 09:41:46 -06002787#endif // VK_USE_PLATFORM_XCB_KHR
2788}
2789
Karl Schultz6addd812016-02-02 17:17:23 -07002790TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
2791 VkResult err;
2792 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002793
Karl Schultz6addd812016-02-02 17:17:23 -07002794 m_errorMonitor->SetDesiredFailureMsg(
2795 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002796 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
2797
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002798 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002799
2800 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002801 VkImage image;
2802 VkDeviceMemory mem;
2803 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002804
Karl Schultz6addd812016-02-02 17:17:23 -07002805 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2806 const int32_t tex_width = 32;
2807 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002808
Tony Barboureb254902015-07-15 12:50:33 -06002809 VkImageCreateInfo image_create_info = {};
2810 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002811 image_create_info.pNext = NULL;
2812 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2813 image_create_info.format = tex_format;
2814 image_create_info.extent.width = tex_width;
2815 image_create_info.extent.height = tex_height;
2816 image_create_info.extent.depth = 1;
2817 image_create_info.mipLevels = 1;
2818 image_create_info.arrayLayers = 1;
2819 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2820 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2821 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2822 image_create_info.flags = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002823
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002824 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002825 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002826 mem_alloc.pNext = NULL;
2827 mem_alloc.allocationSize = 0;
2828 // Introduce failure, do NOT set memProps to
2829 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
2830 mem_alloc.memoryTypeIndex = 1;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002831
Chia-I Wuf7458c52015-10-26 21:10:41 +08002832 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002833 ASSERT_VK_SUCCESS(err);
2834
Karl Schultz6addd812016-02-02 17:17:23 -07002835 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002836
Mark Lobodzinski23065352015-05-29 09:32:35 -05002837 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002838
Karl Schultz6addd812016-02-02 17:17:23 -07002839 pass =
2840 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0,
2841 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
2842 if (!pass) { // If we can't find any unmappable memory this test doesn't
2843 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002844 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002845 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002846 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002847
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002848 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002849 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002850 ASSERT_VK_SUCCESS(err);
2851
2852 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002853 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002854 ASSERT_VK_SUCCESS(err);
2855
2856 // Map memory as if to initialize the image
2857 void *mappedAddress = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07002858 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0,
2859 &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002860
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002861 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002862
Chia-I Wuf7458c52015-10-26 21:10:41 +08002863 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002864 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002865}
2866
Karl Schultz6addd812016-02-02 17:17:23 -07002867TEST_F(VkLayerTest, RebindMemory) {
2868 VkResult err;
2869 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002870
Karl Schultz6addd812016-02-02 17:17:23 -07002871 m_errorMonitor->SetDesiredFailureMsg(
2872 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002873 "which has already been bound to mem object");
2874
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002875 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002876
2877 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002878 VkImage image;
2879 VkDeviceMemory mem1;
2880 VkDeviceMemory mem2;
2881 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002882
Karl Schultz6addd812016-02-02 17:17:23 -07002883 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2884 const int32_t tex_width = 32;
2885 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002886
Tony Barboureb254902015-07-15 12:50:33 -06002887 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002888 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2889 image_create_info.pNext = NULL;
2890 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2891 image_create_info.format = tex_format;
2892 image_create_info.extent.width = tex_width;
2893 image_create_info.extent.height = tex_height;
2894 image_create_info.extent.depth = 1;
2895 image_create_info.mipLevels = 1;
2896 image_create_info.arrayLayers = 1;
2897 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2898 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2899 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2900 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002901
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002902 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002903 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2904 mem_alloc.pNext = NULL;
2905 mem_alloc.allocationSize = 0;
2906 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002907
Karl Schultz6addd812016-02-02 17:17:23 -07002908 // Introduce failure, do NOT set memProps to
2909 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002910 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002911 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002912 ASSERT_VK_SUCCESS(err);
2913
Karl Schultz6addd812016-02-02 17:17:23 -07002914 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002915
2916 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07002917 pass =
2918 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002919 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002920
2921 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002922 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002923 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002924 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002925 ASSERT_VK_SUCCESS(err);
2926
2927 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002928 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002929 ASSERT_VK_SUCCESS(err);
2930
Karl Schultz6addd812016-02-02 17:17:23 -07002931 // Introduce validation failure, try to bind a different memory object to
2932 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002933 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002934
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002935 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002936
Chia-I Wuf7458c52015-10-26 21:10:41 +08002937 vkDestroyImage(m_device->device(), image, NULL);
2938 vkFreeMemory(m_device->device(), mem1, NULL);
2939 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002940}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002941
Karl Schultz6addd812016-02-02 17:17:23 -07002942TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002943 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002944
Karl Schultz6addd812016-02-02 17:17:23 -07002945 m_errorMonitor->SetDesiredFailureMsg(
2946 VK_DEBUG_REPORT_ERROR_BIT_EXT, "submitted in SIGNALED state. Fences "
2947 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002948
2949 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002950 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2951 fenceInfo.pNext = NULL;
2952 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002953
Tony Barbour300a6082015-04-07 13:44:53 -06002954 ASSERT_NO_FATAL_FAILURE(InitState());
2955 ASSERT_NO_FATAL_FAILURE(InitViewport());
2956 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2957
Tony Barbourfe3351b2015-07-28 10:17:20 -06002958 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07002959 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
2960 m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06002961 EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002962
2963 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002964
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002965 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002966 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2967 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002968 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002969 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002970 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002971 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002972 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002973 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002974 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002975
2976 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002977 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002978
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002979 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002980}
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002981// This is a positive test. We used to expect error in this case but spec now
2982// allows it
Karl Schultz6addd812016-02-02 17:17:23 -07002983TEST_F(VkLayerTest, ResetUnsignaledFence) {
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002984 m_errorMonitor->ExpectSuccess();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002985 vk_testing::Fence testFence;
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002986 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002987 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2988 fenceInfo.pNext = NULL;
2989
Tony Barbour0b4d9562015-04-09 10:48:04 -06002990 ASSERT_NO_FATAL_FAILURE(InitState());
2991 testFence.init(*m_device, fenceInfo);
Chia-I Wud9e8e822015-07-03 11:45:55 +08002992 VkFence fences[1] = {testFence.handle()};
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002993 VkResult result = vkResetFences(m_device->device(), 1, fences);
2994 ASSERT_VK_SUCCESS(result);
Tony Barbour300a6082015-04-07 13:44:53 -06002995
Tobin Ehlisaff7ae92016-04-18 15:45:20 -06002996 m_errorMonitor->VerifyNotFound();
Tony Barbour300a6082015-04-07 13:44:53 -06002997}
Tobin Ehlis41376e12015-07-03 08:45:14 -06002998
Chris Forbese70b7d32016-06-15 15:49:12 +12002999#if 0
3000TEST_F(VkLayerTest, LongFenceChain)
3001{
3002 m_errorMonitor->ExpectSuccess();
3003
3004 ASSERT_NO_FATAL_FAILURE(InitState());
3005 VkResult err;
3006
3007 std::vector<VkFence> fences;
3008
3009 const int chainLength = 32768;
3010
3011 for (int i = 0; i < chainLength; i++) {
3012 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3013 VkFence fence;
3014 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
3015 ASSERT_VK_SUCCESS(err);
3016
3017 fences.push_back(fence);
3018
3019 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3020 0, nullptr, 0, nullptr };
3021 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
3022 ASSERT_VK_SUCCESS(err);
3023
3024 }
3025
3026 // BOOM, stack overflow.
3027 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
3028
3029 for (auto fence : fences)
3030 vkDestroyFence(m_device->device(), fence, nullptr);
3031
3032 m_errorMonitor->VerifyNotFound();
3033}
3034#endif
3035
Chris Forbes18127d12016-06-08 16:52:28 +12003036TEST_F(VkLayerTest, CommandBufferSimultaneousUseSync)
3037{
3038 m_errorMonitor->ExpectSuccess();
3039
3040 ASSERT_NO_FATAL_FAILURE(InitState());
3041 VkResult err;
3042
3043 // Record (empty!) command buffer that can be submitted multiple times
3044 // simultaneously.
3045 VkCommandBufferBeginInfo cbbi = {
3046 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
3047 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr
3048 };
3049 m_commandBuffer->BeginCommandBuffer(&cbbi);
3050 m_commandBuffer->EndCommandBuffer();
3051
3052 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3053 VkFence fence;
3054 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
3055 ASSERT_VK_SUCCESS(err);
3056
3057 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
3058 VkSemaphore s1, s2;
3059 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
3060 ASSERT_VK_SUCCESS(err);
3061 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
3062 ASSERT_VK_SUCCESS(err);
3063
3064 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
3065 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3066 1, &m_commandBuffer->handle(), 1, &s1 };
3067 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
3068 ASSERT_VK_SUCCESS(err);
3069
3070 // Submit CB again, signaling s2.
3071 si.pSignalSemaphores = &s2;
3072 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
3073 ASSERT_VK_SUCCESS(err);
3074
3075 // Wait for fence.
3076 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
3077 ASSERT_VK_SUCCESS(err);
3078
3079 // CB is still in flight from second submission, but semaphore s1 is no
3080 // longer in flight. delete it.
3081 vkDestroySemaphore(m_device->device(), s1, nullptr);
3082
3083 m_errorMonitor->VerifyNotFound();
3084
3085 // Force device idle and clean up remaining objects
3086 vkDeviceWaitIdle(m_device->device());
3087 vkDestroySemaphore(m_device->device(), s2, nullptr);
3088 vkDestroyFence(m_device->device(), fence, nullptr);
3089}
3090
Chris Forbes4e44c912016-06-16 10:20:00 +12003091TEST_F(VkLayerTest, FenceCreateSignaledWaitHandling)
3092{
3093 m_errorMonitor->ExpectSuccess();
3094
3095 ASSERT_NO_FATAL_FAILURE(InitState());
3096 VkResult err;
3097
3098 // A fence created signaled
3099 VkFenceCreateInfo fci1 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT };
3100 VkFence f1;
3101 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
3102 ASSERT_VK_SUCCESS(err);
3103
3104 // A fence created not
3105 VkFenceCreateInfo fci2 = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
3106 VkFence f2;
3107 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
3108 ASSERT_VK_SUCCESS(err);
3109
3110 // Submit the unsignaled fence
3111 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
3112 0, nullptr, 0, nullptr };
3113 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
3114
3115 // Wait on both fences, with signaled first.
3116 VkFence fences[] = { f1, f2 };
3117 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
3118
3119 // Should have both retired!
3120 vkDestroyFence(m_device->device(), f1, nullptr);
3121 vkDestroyFence(m_device->device(), f2, nullptr);
3122
3123 m_errorMonitor->VerifyNotFound();
3124}
3125
Tobin Ehlis41376e12015-07-03 08:45:14 -06003126TEST_F(VkLayerTest, InvalidUsageBits)
3127{
Tony Barbourf92621a2016-05-02 14:28:12 -06003128 TEST_DESCRIPTION(
Karl Schultzb5bc11e2016-05-04 08:36:08 -06003129 "Specify wrong usage for image then create conflicting view of image "
Tony Barbourf92621a2016-05-02 14:28:12 -06003130 "Initialize buffer with wrong usage then perform copy expecting errors "
3131 "from both the image and the buffer (2 calls)");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003132 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003133 "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06003134
3135 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf92621a2016-05-02 14:28:12 -06003136 VkImageObj image(m_device);
3137 // Initialize image with USAGE_INPUT_ATTACHMENT
Tobin Ehlis8b313c02016-05-25 15:01:52 -06003138 image.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT,
Karl Schultzb5bc11e2016-05-04 08:36:08 -06003139 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
3140 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06003141
Tony Barbourf92621a2016-05-02 14:28:12 -06003142 VkImageView dsv;
3143 VkImageViewCreateInfo dsvci = {};
3144 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3145 dsvci.image = image.handle();
3146 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3147 dsvci.format = VK_FORMAT_D32_SFLOAT_S8_UINT;
3148 dsvci.subresourceRange.layerCount = 1;
3149 dsvci.subresourceRange.baseMipLevel = 0;
3150 dsvci.subresourceRange.levelCount = 1;
3151 dsvci.subresourceRange.aspectMask =
3152 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06003153
Tony Barbourf92621a2016-05-02 14:28:12 -06003154 // Create a view with depth / stencil aspect for image with different usage
3155 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003156
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003157 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06003158
3159 // Initialize buffer with TRANSFER_DST usage
3160 vk_testing::Buffer buffer;
3161 VkMemoryPropertyFlags reqs = 0;
3162 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3163 VkBufferImageCopy region = {};
3164 region.bufferRowLength = 128;
3165 region.bufferImageHeight = 128;
3166 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3167 region.imageSubresource.layerCount = 1;
3168 region.imageExtent.height = 16;
3169 region.imageExtent.width = 16;
3170 region.imageExtent.depth = 1;
3171
3172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3173 "Invalid usage flag for buffer ");
3174 // Buffer usage not set to TRANSFER_SRC and image usage not set to
3175 // TRANSFER_DST
3176 BeginCommandBuffer();
3177 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
3178 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
3179 1, &region);
3180 m_errorMonitor->VerifyFound();
3181
3182 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3183 "Invalid usage flag for image ");
3184 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
3185 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
3186 1, &region);
3187 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06003188}
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003189#endif // MEM_TRACKER_TESTS
3190
Tobin Ehlis4bf96d12015-06-25 11:58:41 -06003191#if OBJ_TRACKER_TESTS
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003192
3193TEST_F(VkLayerTest, LeakAnObject) {
3194 VkResult err;
3195
3196 TEST_DESCRIPTION(
3197 "Create a fence and destroy its device without first destroying the fence.");
3198
3199 // Note that we have to create a new device since destroying the
3200 // framework's device causes Teardown() to fail and just calling Teardown
3201 // will destroy the errorMonitor.
3202
3203 m_errorMonitor->SetDesiredFailureMsg(
3204 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3205 "OBJ ERROR : VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT object");
3206
3207 ASSERT_NO_FATAL_FAILURE(InitState());
3208
3209 const std::vector<VkQueueFamilyProperties> queue_props =
3210 m_device->queue_props;
3211 std::vector<VkDeviceQueueCreateInfo> queue_info;
3212 queue_info.reserve(queue_props.size());
3213 std::vector<std::vector<float>> queue_priorities;
3214 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
3215 VkDeviceQueueCreateInfo qi = {};
3216 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
3217 qi.pNext = NULL;
3218 qi.queueFamilyIndex = i;
3219 qi.queueCount = queue_props[i].queueCount;
3220 queue_priorities.emplace_back(qi.queueCount, 0.0f);
3221 qi.pQueuePriorities = queue_priorities[i].data();
3222 queue_info.push_back(qi);
3223 }
3224
3225 std::vector<const char *> device_layer_names;
3226 std::vector<const char *> device_extension_names;
3227 device_layer_names.push_back("VK_LAYER_GOOGLE_threading");
3228 device_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
3229 device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
3230 device_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003231 device_layer_names.push_back("VK_LAYER_LUNARG_image");
3232 device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
3233
3234 // The sacrificial device object
3235 VkDevice testDevice;
3236 VkDeviceCreateInfo device_create_info = {};
3237 auto features = m_device->phy().features();
3238 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
3239 device_create_info.pNext = NULL;
3240 device_create_info.queueCreateInfoCount = queue_info.size();
3241 device_create_info.pQueueCreateInfos = queue_info.data();
3242 device_create_info.enabledLayerCount = device_layer_names.size();
3243 device_create_info.ppEnabledLayerNames = device_layer_names.data();
3244 device_create_info.pEnabledFeatures = &features;
3245 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
3246 ASSERT_VK_SUCCESS(err);
3247
3248 VkFence fence;
3249 VkFenceCreateInfo fence_create_info = {};
3250 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
3251 fence_create_info.pNext = NULL;
3252 fence_create_info.flags = 0;
3253 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
3254 ASSERT_VK_SUCCESS(err);
3255
3256 // Induce failure by not calling vkDestroyFence
3257 vkDestroyDevice(testDevice, NULL);
3258 m_errorMonitor->VerifyFound();
3259}
3260
3261TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
3262
3263 TEST_DESCRIPTION("Allocate command buffers from one command pool and "
3264 "attempt to delete them from another.");
3265
3266 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3267 "FreeCommandBuffers is attempting to free Command Buffer");
3268
3269 VkCommandPool command_pool_one;
3270 VkCommandPool command_pool_two;
3271
3272 VkCommandPoolCreateInfo pool_create_info{};
3273 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
3274 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
3275 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
3276
3277 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3278 &command_pool_one);
3279
3280 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
3281 &command_pool_two);
3282
3283 VkCommandBuffer command_buffer[9];
3284 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
3285 command_buffer_allocate_info.sType =
3286 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
3287 command_buffer_allocate_info.commandPool = command_pool_one;
3288 command_buffer_allocate_info.commandBufferCount = 9;
3289 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
3290 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
3291 command_buffer);
3292
3293 vkFreeCommandBuffers(m_device->device(), command_pool_two, 4,
3294 &command_buffer[3]);
3295
3296 m_errorMonitor->VerifyFound();
3297
3298 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
3299 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
3300}
3301
3302TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
3303 VkResult err;
3304
3305 TEST_DESCRIPTION("Allocate descriptor sets from one DS pool and "
3306 "attempt to delete them from another.");
3307
3308 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3309 "FreeDescriptorSets is attempting to free descriptorSet");
3310
3311 ASSERT_NO_FATAL_FAILURE(InitState());
3312 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3313
3314 VkDescriptorPoolSize ds_type_count = {};
3315 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
3316 ds_type_count.descriptorCount = 1;
3317
3318 VkDescriptorPoolCreateInfo ds_pool_ci = {};
3319 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3320 ds_pool_ci.pNext = NULL;
3321 ds_pool_ci.flags = 0;
3322 ds_pool_ci.maxSets = 1;
3323 ds_pool_ci.poolSizeCount = 1;
3324 ds_pool_ci.pPoolSizes = &ds_type_count;
3325
3326 VkDescriptorPool ds_pool_one;
3327 err =
3328 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
3329 ASSERT_VK_SUCCESS(err);
3330
3331 // Create a second descriptor pool
3332 VkDescriptorPool ds_pool_two;
3333 err =
3334 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
3335 ASSERT_VK_SUCCESS(err);
3336
3337 VkDescriptorSetLayoutBinding dsl_binding = {};
3338 dsl_binding.binding = 0;
3339 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
3340 dsl_binding.descriptorCount = 1;
3341 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3342 dsl_binding.pImmutableSamplers = NULL;
3343
3344 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
3345 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3346 ds_layout_ci.pNext = NULL;
3347 ds_layout_ci.bindingCount = 1;
3348 ds_layout_ci.pBindings = &dsl_binding;
3349
3350 VkDescriptorSetLayout ds_layout;
3351 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3352 &ds_layout);
3353 ASSERT_VK_SUCCESS(err);
3354
3355 VkDescriptorSet descriptorSet;
3356 VkDescriptorSetAllocateInfo alloc_info = {};
3357 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3358 alloc_info.descriptorSetCount = 1;
3359 alloc_info.descriptorPool = ds_pool_one;
3360 alloc_info.pSetLayouts = &ds_layout;
3361 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3362 &descriptorSet);
3363 ASSERT_VK_SUCCESS(err);
3364
3365 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
3366
3367 m_errorMonitor->VerifyFound();
3368
3369 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3370 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
3371 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
3372}
3373
3374TEST_F(VkLayerTest, CreateUnknownObject) {
3375 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3376 "Invalid VkImage Object ");
3377
3378 TEST_DESCRIPTION(
3379 "Pass an invalid image object handle into a Vulkan API call.");
3380
3381 ASSERT_NO_FATAL_FAILURE(InitState());
3382
3383 // Pass bogus handle into GetImageMemoryRequirements
3384 VkMemoryRequirements mem_reqs;
3385 uint64_t fakeImageHandle = 0xCADECADE;
3386 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
3387
3388 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
3389
3390 m_errorMonitor->VerifyFound();
3391}
3392
Karl Schultz6addd812016-02-02 17:17:23 -07003393TEST_F(VkLayerTest, PipelineNotBound) {
3394 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003395
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06003396 TEST_DESCRIPTION(
3397 "Pass in an invalid pipeline object handle into a Vulkan API call.");
3398
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003399 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003400 "Invalid VkPipeline Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003401
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003402 ASSERT_NO_FATAL_FAILURE(InitState());
3403 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003404
Chia-I Wu1b99bb22015-10-27 19:25:11 +08003405 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003406 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3407 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003408
3409 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003410 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3411 ds_pool_ci.pNext = NULL;
3412 ds_pool_ci.maxSets = 1;
3413 ds_pool_ci.poolSizeCount = 1;
3414 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003415
3416 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07003417 err =
3418 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003419 ASSERT_VK_SUCCESS(err);
3420
3421 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003422 dsl_binding.binding = 0;
3423 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3424 dsl_binding.descriptorCount = 1;
3425 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
3426 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003427
3428 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003429 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3430 ds_layout_ci.pNext = NULL;
3431 ds_layout_ci.bindingCount = 1;
3432 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003433
3434 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003435 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
3436 &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003437 ASSERT_VK_SUCCESS(err);
3438
3439 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003440 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08003441 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07003442 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06003443 alloc_info.descriptorPool = ds_pool;
3444 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003445 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
3446 &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003447 ASSERT_VK_SUCCESS(err);
3448
3449 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003450 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3451 pipeline_layout_ci.pNext = NULL;
3452 pipeline_layout_ci.setLayoutCount = 1;
3453 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003454
3455 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07003456 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
3457 &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003458 ASSERT_VK_SUCCESS(err);
3459
Mark Youngad779052016-01-06 14:26:04 -07003460 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003461
3462 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07003463 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
3464 VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003465
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003466 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003467
Chia-I Wuf7458c52015-10-26 21:10:41 +08003468 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
3469 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
3470 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003471}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003472
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003473TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
3474 VkResult err;
3475
3476 TEST_DESCRIPTION("Test validation check for an invalid memory type index "
3477 "during bind[Buffer|Image]Memory time");
3478
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003479 ASSERT_NO_FATAL_FAILURE(InitState());
3480
3481 // Create an image, allocate memory, set a bad typeIndex and then try to
3482 // bind it
3483 VkImage image;
3484 VkDeviceMemory mem;
3485 VkMemoryRequirements mem_reqs;
3486 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3487 const int32_t tex_width = 32;
3488 const int32_t tex_height = 32;
3489
3490 VkImageCreateInfo image_create_info = {};
3491 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3492 image_create_info.pNext = NULL;
3493 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3494 image_create_info.format = tex_format;
3495 image_create_info.extent.width = tex_width;
3496 image_create_info.extent.height = tex_height;
3497 image_create_info.extent.depth = 1;
3498 image_create_info.mipLevels = 1;
3499 image_create_info.arrayLayers = 1;
3500 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3501 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3502 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3503 image_create_info.flags = 0;
3504
3505 VkMemoryAllocateInfo mem_alloc = {};
3506 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3507 mem_alloc.pNext = NULL;
3508 mem_alloc.allocationSize = 0;
3509 mem_alloc.memoryTypeIndex = 0;
3510
3511 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
3512 ASSERT_VK_SUCCESS(err);
3513
3514 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
3515 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003516
3517 // Introduce Failure, select invalid TypeIndex
3518 VkPhysicalDeviceMemoryProperties memory_info;
3519
3520 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
3521 unsigned int i;
3522 for (i = 0; i < memory_info.memoryTypeCount; i++) {
3523 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
3524 mem_alloc.memoryTypeIndex = i;
3525 break;
3526 }
3527 }
3528 if (i >= memory_info.memoryTypeCount) {
3529 printf("No invalid memory type index could be found; skipped.\n");
3530 vkDestroyImage(m_device->device(), image, NULL);
3531 return;
3532 }
3533
3534 m_errorMonitor->SetDesiredFailureMsg(
3535 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3536 "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06003537
3538 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
3539 ASSERT_VK_SUCCESS(err);
3540
3541 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3542 (void)err;
3543
3544 m_errorMonitor->VerifyFound();
3545
3546 vkDestroyImage(m_device->device(), image, NULL);
3547 vkFreeMemory(m_device->device(), mem, NULL);
3548}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06003549
Karl Schultz6addd812016-02-02 17:17:23 -07003550TEST_F(VkLayerTest, BindInvalidMemory) {
3551 VkResult err;
3552 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003553
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07003554 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07003555 "Invalid VkDeviceMemory Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003556
Tobin Ehlisec598302015-09-15 15:02:17 -06003557 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003558
3559 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07003560 VkImage image;
3561 VkDeviceMemory mem;
3562 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003563
Karl Schultz6addd812016-02-02 17:17:23 -07003564 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3565 const int32_t tex_width = 32;
3566 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003567
3568 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003569 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3570 image_create_info.pNext = NULL;
3571 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3572 image_create_info.format = tex_format;
3573 image_create_info.extent.width = tex_width;
3574 image_create_info.extent.height = tex_height;
3575 image_create_info.extent.depth = 1;
3576 image_create_info.mipLevels = 1;
3577 image_create_info.arrayLayers = 1;
3578 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3579 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3580 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3581 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003582
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003583 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003584 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3585 mem_alloc.pNext = NULL;
3586 mem_alloc.allocationSize = 0;
3587 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003588
Chia-I Wuf7458c52015-10-26 21:10:41 +08003589 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003590 ASSERT_VK_SUCCESS(err);
3591
Karl Schultz6addd812016-02-02 17:17:23 -07003592 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003593
3594 mem_alloc.allocationSize = mem_reqs.size;
3595
Karl Schultz6addd812016-02-02 17:17:23 -07003596 pass =
3597 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003598 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003599
3600 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003601 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003602 ASSERT_VK_SUCCESS(err);
3603
3604 // Introduce validation failure, free memory before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003605 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003606
3607 // Try to bind free memory that has been freed
3608 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3609 // This may very well return an error.
3610 (void)err;
3611
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003612 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003613
Chia-I Wuf7458c52015-10-26 21:10:41 +08003614 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003615}
3616
Karl Schultz6addd812016-02-02 17:17:23 -07003617TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
3618 VkResult err;
3619 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06003620
Karl Schultz6addd812016-02-02 17:17:23 -07003621 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3622 "Invalid VkImage Object ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06003623
Tobin Ehlisec598302015-09-15 15:02:17 -06003624 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06003625
Karl Schultz6addd812016-02-02 17:17:23 -07003626 // Create an image object, allocate memory, destroy the object and then try
3627 // to bind it
3628 VkImage image;
3629 VkDeviceMemory mem;
3630 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06003631
Karl Schultz6addd812016-02-02 17:17:23 -07003632 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
3633 const int32_t tex_width = 32;
3634 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06003635
3636 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003637 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3638 image_create_info.pNext = NULL;
3639 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3640 image_create_info.format = tex_format;
3641 image_create_info.extent.width = tex_width;
3642 image_create_info.extent.height = tex_height;
3643 image_create_info.extent.depth = 1;
3644 image_create_info.mipLevels = 1;
3645 image_create_info.arrayLayers = 1;
3646 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3647 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
3648 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
3649 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003650
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003651 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07003652 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3653 mem_alloc.pNext = NULL;
3654 mem_alloc.allocationSize = 0;
3655 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06003656
Chia-I Wuf7458c52015-10-26 21:10:41 +08003657 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06003658 ASSERT_VK_SUCCESS(err);
3659
Karl Schultz6addd812016-02-02 17:17:23 -07003660 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06003661
3662 mem_alloc.allocationSize = mem_reqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07003663 pass =
3664 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003665 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003666
3667 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003668 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003669 ASSERT_VK_SUCCESS(err);
3670
3671 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003672 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003673 ASSERT_VK_SUCCESS(err);
3674
3675 // Now Try to bind memory to this destroyed object
3676 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3677 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07003678 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06003679
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003680 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003681
Chia-I Wuf7458c52015-10-26 21:10:41 +08003682 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003683}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003684
Mark Lobodzinski209b5292015-09-17 09:44:05 -06003685#endif // OBJ_TRACKER_TESTS
3686
Tobin Ehlis0788f522015-05-26 16:11:58 -06003687#if DRAW_STATE_TESTS
Mark Lobodzinskic808d442016-04-14 10:57:23 -06003688
Chris Forbes48a53902016-06-30 11:46:27 +12003689TEST_F(VkLayerTest, RenderPassInitialLayoutUndefined) {
3690 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass with an attachment's "
3691 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
3692 "the command buffer has prior knowledge of that "
3693 "attachment's layout.");
3694
3695 m_errorMonitor->ExpectSuccess();
3696
3697 ASSERT_NO_FATAL_FAILURE(InitState());
3698
3699 // A renderpass with one color attachment.
3700 VkAttachmentDescription attachment = {
3701 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3702 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3703 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3704 VK_IMAGE_LAYOUT_UNDEFINED,
3705 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3706 };
3707
3708 VkAttachmentReference att_ref = {
3709 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3710 };
3711
3712 VkSubpassDescription subpass = {
3713 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3714 1, &att_ref, nullptr, nullptr, 0, nullptr
3715 };
3716
3717 VkRenderPassCreateInfo rpci = {
3718 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3719 0, 1, &attachment, 1, &subpass, 0, nullptr
3720 };
3721
3722 VkRenderPass rp;
3723 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3724 ASSERT_VK_SUCCESS(err);
3725
3726 // A compatible framebuffer.
3727 VkImageObj image(m_device);
3728 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3729 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3730 VK_IMAGE_TILING_OPTIMAL, 0);
3731 ASSERT_TRUE(image.initialized());
3732
3733 VkImageViewCreateInfo ivci = {
3734 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3735 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3736 {
3737 VK_COMPONENT_SWIZZLE_IDENTITY,
3738 VK_COMPONENT_SWIZZLE_IDENTITY,
3739 VK_COMPONENT_SWIZZLE_IDENTITY,
3740 VK_COMPONENT_SWIZZLE_IDENTITY
3741 },
3742 {
3743 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3744 },
3745 };
3746 VkImageView view;
3747 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3748 ASSERT_VK_SUCCESS(err);
3749
3750 VkFramebufferCreateInfo fci = {
3751 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3752 0, rp, 1, &view,
3753 32, 32, 1
3754 };
3755 VkFramebuffer fb;
3756 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3757 ASSERT_VK_SUCCESS(err);
3758
3759 // Record a single command buffer which uses this renderpass twice. The
3760 // bug is triggered at the beginning of the second renderpass, when the
3761 // command buffer already has a layout recorded for the attachment.
3762 VkRenderPassBeginInfo rpbi = {
3763 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06003764 rp, fb, { { 0, 0 } , { 32, 32 } },
Chris Forbes48a53902016-06-30 11:46:27 +12003765 0, nullptr
3766 };
3767 BeginCommandBuffer();
3768 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3769 VK_SUBPASS_CONTENTS_INLINE);
3770 vkCmdEndRenderPass(m_commandBuffer->handle());
3771 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3772 VK_SUBPASS_CONTENTS_INLINE);
3773
3774 m_errorMonitor->VerifyNotFound();
3775
3776 vkCmdEndRenderPass(m_commandBuffer->handle());
3777 EndCommandBuffer();
3778
3779 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3780 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3781 vkDestroyImageView(m_device->device(), view, nullptr);
3782}
3783
Chris Forbes51bf7c92016-06-30 15:22:08 +12003784TEST_F(VkLayerTest, RenderPassSubpassZeroTransitionsApplied) {
3785 TEST_DESCRIPTION("Ensure that CmdBeginRenderPass applies the layout "
3786 "transitions for the first subpass");
3787
3788 m_errorMonitor->ExpectSuccess();
3789
3790 ASSERT_NO_FATAL_FAILURE(InitState());
3791
3792 // A renderpass with one color attachment.
3793 VkAttachmentDescription attachment = {
3794 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
3795 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
3796 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3797 VK_IMAGE_LAYOUT_UNDEFINED,
3798 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3799 };
3800
3801 VkAttachmentReference att_ref = {
3802 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3803 };
3804
3805 VkSubpassDescription subpass = {
3806 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3807 1, &att_ref, nullptr, nullptr, 0, nullptr
3808 };
3809
3810 VkSubpassDependency dep = {
Chris Forbescb4c7ad2016-07-06 10:28:18 +12003811 0, 0, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3812 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Chris Forbes51bf7c92016-06-30 15:22:08 +12003813 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3814 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3815 VK_DEPENDENCY_BY_REGION_BIT
3816 };
3817
3818 VkRenderPassCreateInfo rpci = {
3819 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3820 0, 1, &attachment, 1, &subpass, 1, &dep
3821 };
3822
3823 VkResult err;
3824 VkRenderPass rp;
3825 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3826 ASSERT_VK_SUCCESS(err);
3827
3828 // A compatible framebuffer.
3829 VkImageObj image(m_device);
3830 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM,
3831 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
3832 VK_IMAGE_TILING_OPTIMAL, 0);
3833 ASSERT_TRUE(image.initialized());
3834
3835 VkImageViewCreateInfo ivci = {
3836 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, nullptr,
3837 0, image.handle(), VK_IMAGE_VIEW_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM,
3838 {
3839 VK_COMPONENT_SWIZZLE_IDENTITY,
3840 VK_COMPONENT_SWIZZLE_IDENTITY,
3841 VK_COMPONENT_SWIZZLE_IDENTITY,
3842 VK_COMPONENT_SWIZZLE_IDENTITY
3843 },
3844 {
3845 VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1
3846 },
3847 };
3848 VkImageView view;
3849 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
3850 ASSERT_VK_SUCCESS(err);
3851
3852 VkFramebufferCreateInfo fci = {
3853 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3854 0, rp, 1, &view,
3855 32, 32, 1
3856 };
3857 VkFramebuffer fb;
3858 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3859 ASSERT_VK_SUCCESS(err);
3860
3861 // Record a single command buffer which issues a pipeline barrier w/
3862 // image memory barrier for the attachment. This detects the previously
3863 // missing tracking of the subpass layout by throwing a validation error
3864 // if it doesn't occur.
3865 VkRenderPassBeginInfo rpbi = {
3866 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06003867 rp, fb, { { 0, 0 }, { 32, 32 } },
Chris Forbes51bf7c92016-06-30 15:22:08 +12003868 0, nullptr
3869 };
3870 BeginCommandBuffer();
3871 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3872 VK_SUBPASS_CONTENTS_INLINE);
3873
3874 VkImageMemoryBarrier imb = {
3875 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, nullptr,
3876 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3877 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3878 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3879 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3880 VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
3881 image.handle(),
3882 { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }
3883 };
3884 vkCmdPipelineBarrier(m_commandBuffer->handle(),
Chris Forbescb4c7ad2016-07-06 10:28:18 +12003885 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3886 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Chris Forbes51bf7c92016-06-30 15:22:08 +12003887 VK_DEPENDENCY_BY_REGION_BIT,
3888 0, nullptr, 0, nullptr, 1, &imb);
3889
3890 vkCmdEndRenderPass(m_commandBuffer->handle());
3891 m_errorMonitor->VerifyNotFound();
3892 EndCommandBuffer();
3893
3894 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3895 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3896 vkDestroyImageView(m_device->device(), view, nullptr);
3897}
3898
Chris Forbes6b3d3f42016-06-30 16:09:47 +12003899TEST_F(VkLayerTest, RenderPassTransitionsAttachmentUnused) {
3900 TEST_DESCRIPTION("Ensure that layout transitions work correctly without "
3901 "errors, when an attachment reference is "
3902 "VK_ATTACHMENT_UNUSED");
3903
3904 m_errorMonitor->ExpectSuccess();
3905
3906 ASSERT_NO_FATAL_FAILURE(InitState());
3907
3908 // A renderpass with no attachments
3909 VkAttachmentReference att_ref = {
3910 VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
3911 };
3912
3913 VkSubpassDescription subpass = {
3914 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr,
3915 1, &att_ref, nullptr, nullptr, 0, nullptr
3916 };
3917
3918 VkRenderPassCreateInfo rpci = {
3919 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
3920 0, 0, nullptr, 1, &subpass, 0, nullptr
3921 };
3922
3923 VkRenderPass rp;
3924 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3925 ASSERT_VK_SUCCESS(err);
3926
3927 // A compatible framebuffer.
3928 VkFramebufferCreateInfo fci = {
3929 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr,
3930 0, rp, 0, nullptr,
3931 32, 32, 1
3932 };
3933 VkFramebuffer fb;
3934 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
3935 ASSERT_VK_SUCCESS(err);
3936
3937 // Record a command buffer which just begins and ends the renderpass. The
3938 // bug manifests in BeginRenderPass.
3939 VkRenderPassBeginInfo rpbi = {
3940 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr,
Tobin Ehlis0f9aa402016-07-01 08:47:12 -06003941 rp, fb, { { 0, 0 }, { 32, 32 } },
Chris Forbes6b3d3f42016-06-30 16:09:47 +12003942 0, nullptr
3943 };
3944 BeginCommandBuffer();
3945 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
3946 VK_SUBPASS_CONTENTS_INLINE);
3947 vkCmdEndRenderPass(m_commandBuffer->handle());
3948 m_errorMonitor->VerifyNotFound();
3949 EndCommandBuffer();
3950
3951 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3952 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3953}
3954
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06003955// This is a positive test. No errors are expected.
3956TEST_F(VkLayerTest, StencilLoadOp) {
3957 TEST_DESCRIPTION("Create a stencil-only attachment with a LOAD_OP set to "
3958 "CLEAR. stencil[Load|Store]Op used to be ignored.");
3959 VkResult result = VK_SUCCESS;
3960 VkImageFormatProperties formatProps;
3961 vkGetPhysicalDeviceImageFormatProperties(
3962 gpu(), VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_TYPE_2D,
3963 VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
3964 VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
3965 0, &formatProps);
3966 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
3967 return;
3968 }
3969
3970 ASSERT_NO_FATAL_FAILURE(InitState());
3971 VkFormat depth_stencil_fmt = VK_FORMAT_D24_UNORM_S8_UINT;
3972 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
3973 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
3974 VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
3975 VkAttachmentDescription att = {};
3976 VkAttachmentReference ref = {};
3977 att.format = depth_stencil_fmt;
3978 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
3979 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
3980 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
3981 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
3982 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3983 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3984
3985 VkClearValue clear;
3986 clear.depthStencil.depth = 1.0;
3987 clear.depthStencil.stencil = 0;
3988 ref.attachment = 0;
3989 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3990
3991 VkSubpassDescription subpass = {};
3992 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
3993 subpass.flags = 0;
3994 subpass.inputAttachmentCount = 0;
3995 subpass.pInputAttachments = NULL;
3996 subpass.colorAttachmentCount = 0;
3997 subpass.pColorAttachments = NULL;
3998 subpass.pResolveAttachments = NULL;
3999 subpass.pDepthStencilAttachment = &ref;
4000 subpass.preserveAttachmentCount = 0;
4001 subpass.pPreserveAttachments = NULL;
4002
4003 VkRenderPass rp;
4004 VkRenderPassCreateInfo rp_info = {};
4005 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4006 rp_info.attachmentCount = 1;
4007 rp_info.pAttachments = &att;
4008 rp_info.subpassCount = 1;
4009 rp_info.pSubpasses = &subpass;
4010 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
4011 ASSERT_VK_SUCCESS(result);
4012
4013 VkImageView *depthView = m_depthStencil->BindInfo();
4014 VkFramebufferCreateInfo fb_info = {};
4015 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4016 fb_info.pNext = NULL;
4017 fb_info.renderPass = rp;
4018 fb_info.attachmentCount = 1;
4019 fb_info.pAttachments = depthView;
4020 fb_info.width = 100;
4021 fb_info.height = 100;
4022 fb_info.layers = 1;
4023 VkFramebuffer fb;
4024 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4025 ASSERT_VK_SUCCESS(result);
4026
4027
4028 VkRenderPassBeginInfo rpbinfo = {};
4029 rpbinfo.clearValueCount = 1;
4030 rpbinfo.pClearValues = &clear;
4031 rpbinfo.pNext = NULL;
4032 rpbinfo.renderPass = rp;
4033 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
4034 rpbinfo.renderArea.extent.width = 100;
4035 rpbinfo.renderArea.extent.height = 100;
4036 rpbinfo.renderArea.offset.x = 0;
4037 rpbinfo.renderArea.offset.y = 0;
4038 rpbinfo.framebuffer = fb;
4039
4040 VkFence fence = {};
4041 VkFenceCreateInfo fence_ci = {};
4042 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4043 fence_ci.pNext = nullptr;
4044 fence_ci.flags = 0;
4045 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
4046 ASSERT_VK_SUCCESS(result);
4047
4048
4049 m_commandBuffer->BeginCommandBuffer();
4050 m_commandBuffer->BeginRenderPass(rpbinfo);
4051 m_commandBuffer->EndRenderPass();
4052 m_commandBuffer->EndCommandBuffer();
4053 m_commandBuffer->QueueCommandBuffer(fence);
4054
4055 VkImageObj destImage(m_device);
4056 destImage.init(100, 100, depth_stencil_fmt,
4057 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
4058 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4059 VK_IMAGE_TILING_OPTIMAL, 0);
4060 VkImageMemoryBarrier barrier = {};
4061 VkImageSubresourceRange range;
4062 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
4063 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
4064 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4065 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT |
4066 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
4067 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4068 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
4069 barrier.image = m_depthStencil->handle();
4070 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4071 range.baseMipLevel = 0;
4072 range.levelCount = 1;
4073 range.baseArrayLayer = 0;
4074 range.layerCount = 1;
4075 barrier.subresourceRange = range;
4076 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
4077 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
4078 cmdbuf.BeginCommandBuffer();
4079 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4080 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
4081 nullptr, 1, &barrier);
4082 barrier.srcAccessMask = 0;
4083 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4084 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
4085 barrier.image = destImage.handle();
4086 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT |
4087 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
4088 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4089 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0,
4090 nullptr, 1, &barrier);
4091 VkImageCopy cregion;
4092 cregion.srcSubresource.aspectMask =
4093 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4094 cregion.srcSubresource.mipLevel = 0;
4095 cregion.srcSubresource.baseArrayLayer = 0;
4096 cregion.srcSubresource.layerCount = 1;
4097 cregion.srcOffset.x = 0;
4098 cregion.srcOffset.y = 0;
4099 cregion.srcOffset.z = 0;
4100 cregion.dstSubresource.aspectMask =
4101 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
4102 cregion.dstSubresource.mipLevel = 0;
4103 cregion.dstSubresource.baseArrayLayer = 0;
4104 cregion.dstSubresource.layerCount = 1;
4105 cregion.dstOffset.x = 0;
4106 cregion.dstOffset.y = 0;
4107 cregion.dstOffset.z = 0;
4108 cregion.extent.width = 100;
4109 cregion.extent.height = 100;
4110 cregion.extent.depth = 1;
4111 cmdbuf.CopyImage(m_depthStencil->handle(),
4112 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
4113 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
4114 cmdbuf.EndCommandBuffer();
4115
4116 VkSubmitInfo submit_info;
4117 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4118 submit_info.pNext = NULL;
4119 submit_info.waitSemaphoreCount = 0;
4120 submit_info.pWaitSemaphores = NULL;
4121 submit_info.pWaitDstStageMask = NULL;
4122 submit_info.commandBufferCount = 1;
4123 submit_info.pCommandBuffers = &cmdbuf.handle();
4124 submit_info.signalSemaphoreCount = 0;
4125 submit_info.pSignalSemaphores = NULL;
4126
4127 m_errorMonitor->ExpectSuccess();
4128 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4129 m_errorMonitor->VerifyNotFound();
4130
Mark Lobodzinskid0440da2016-06-17 15:10:03 -06004131 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinskice7eee72016-06-14 16:33:29 -06004132 vkDestroyFence(m_device->device(), fence, nullptr);
4133 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4134 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
4135}
4136
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004137TEST_F(VkLayerTest, UnusedPreserveAttachment) {
4138 TEST_DESCRIPTION("Create a framebuffer where a subpass has a preserve "
4139 "attachment reference of VK_ATTACHMENT_UNUSED");
4140
4141 ASSERT_NO_FATAL_FAILURE(InitState());
4142 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4143
4144 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4145 "must not be VK_ATTACHMENT_UNUSED");
4146
4147 VkAttachmentReference color_attach = {};
4148 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4149 color_attach.attachment = 0;
4150 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
4151 VkSubpassDescription subpass = {};
4152 subpass.colorAttachmentCount = 1;
4153 subpass.pColorAttachments = &color_attach;
4154 subpass.preserveAttachmentCount = 1;
4155 subpass.pPreserveAttachments = &preserve_attachment;
4156
4157 VkRenderPassCreateInfo rpci = {};
4158 rpci.subpassCount = 1;
4159 rpci.pSubpasses = &subpass;
4160 rpci.attachmentCount = 1;
4161 VkAttachmentDescription attach_desc = {};
4162 attach_desc.format = VK_FORMAT_UNDEFINED;
4163 rpci.pAttachments = &attach_desc;
4164 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4165 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004166 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004167
4168 m_errorMonitor->VerifyFound();
4169
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06004170 if (result == VK_SUCCESS) {
4171 vkDestroyRenderPass(m_device->device(), rp, NULL);
4172 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004173}
4174
Chris Forbesc5389742016-06-29 11:49:23 +12004175TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004176 TEST_DESCRIPTION("Ensure that CreateRenderPass produces a validation error "
4177 "when the source of a subpass multisample resolve "
4178 "does not have multiple samples.");
4179
Chris Forbesc5389742016-06-29 11:49:23 +12004180 ASSERT_NO_FATAL_FAILURE(InitState());
4181
4182 m_errorMonitor->SetDesiredFailureMsg(
4183 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbes6655bb32016-07-01 18:27:30 +12004184 "Subpass 0 requests multisample resolve from attachment 0 which has "
4185 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12004186
4187 VkAttachmentDescription attachments[] = {
4188 {
4189 0, VK_FORMAT_R8G8B8A8_UNORM,
4190 VK_SAMPLE_COUNT_1_BIT,
4191 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4192 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4193 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4194 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4195 },
4196 {
4197 0, VK_FORMAT_R8G8B8A8_UNORM,
4198 VK_SAMPLE_COUNT_1_BIT,
4199 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4200 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4201 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4202 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4203 },
4204 };
4205
4206 VkAttachmentReference color = {
4207 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4208 };
4209
4210 VkAttachmentReference resolve = {
4211 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4212 };
4213
4214 VkSubpassDescription subpass = {
4215 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4216 0, nullptr,
4217 1, &color,
4218 &resolve,
4219 nullptr,
4220 0, nullptr
4221 };
4222
4223 VkRenderPassCreateInfo rpci = {
4224 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4225 0, 2, attachments, 1, &subpass, 0, nullptr
4226 };
4227
4228 VkRenderPass rp;
4229 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4230
4231 m_errorMonitor->VerifyFound();
4232
4233 if (err == VK_SUCCESS)
4234 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4235}
4236
4237TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004238 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4239 "when a subpass multisample resolve operation is "
4240 "requested, and the destination of that resolve has "
4241 "multiple samples.");
4242
Chris Forbesc5389742016-06-29 11:49:23 +12004243 ASSERT_NO_FATAL_FAILURE(InitState());
4244
4245 m_errorMonitor->SetDesiredFailureMsg(
4246 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4247 "Subpass 0 requests multisample resolve into attachment 1, which "
4248 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
4249
4250 VkAttachmentDescription attachments[] = {
4251 {
4252 0, VK_FORMAT_R8G8B8A8_UNORM,
4253 VK_SAMPLE_COUNT_4_BIT,
4254 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4255 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4256 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4257 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4258 },
4259 {
4260 0, VK_FORMAT_R8G8B8A8_UNORM,
4261 VK_SAMPLE_COUNT_4_BIT,
4262 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4263 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4264 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4265 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4266 },
4267 };
4268
4269 VkAttachmentReference color = {
4270 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4271 };
4272
4273 VkAttachmentReference resolve = {
4274 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4275 };
4276
4277 VkSubpassDescription subpass = {
4278 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4279 0, nullptr,
4280 1, &color,
4281 &resolve,
4282 nullptr,
4283 0, nullptr
4284 };
4285
4286 VkRenderPassCreateInfo rpci = {
4287 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4288 0, 2, attachments, 1, &subpass, 0, nullptr
4289 };
4290
4291 VkRenderPass rp;
4292 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4293
4294 m_errorMonitor->VerifyFound();
4295
4296 if (err == VK_SUCCESS)
4297 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4298}
4299
Chris Forbes3f128ef2016-06-29 14:58:53 +12004300TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Chris Forbes6655bb32016-07-01 18:27:30 +12004301 TEST_DESCRIPTION("Ensure CreateRenderPass produces a validation error "
4302 "when the color and depth attachments used by a subpass "
4303 "have inconsistent sample counts");
4304
Chris Forbes3f128ef2016-06-29 14:58:53 +12004305 ASSERT_NO_FATAL_FAILURE(InitState());
4306
4307 m_errorMonitor->SetDesiredFailureMsg(
4308 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4309 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
4310
4311 VkAttachmentDescription attachments[] = {
4312 {
4313 0, VK_FORMAT_R8G8B8A8_UNORM,
4314 VK_SAMPLE_COUNT_1_BIT,
4315 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4316 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4317 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4318 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4319 },
4320 {
4321 0, VK_FORMAT_R8G8B8A8_UNORM,
4322 VK_SAMPLE_COUNT_4_BIT,
4323 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4324 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
4325 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4326 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
4327 },
4328 };
4329
4330 VkAttachmentReference color[] = {
4331 {
4332 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4333 },
4334 {
4335 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4336 },
4337 };
4338
4339 VkSubpassDescription subpass = {
4340 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
4341 0, nullptr,
4342 2, color,
4343 nullptr,
4344 nullptr,
4345 0, nullptr
4346 };
4347
4348 VkRenderPassCreateInfo rpci = {
4349 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
4350 0, 2, attachments, 1, &subpass, 0, nullptr
4351 };
4352
4353 VkRenderPass rp;
4354 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
4355
4356 m_errorMonitor->VerifyFound();
4357
4358 if (err == VK_SUCCESS)
4359 vkDestroyRenderPass(m_device->device(), rp, nullptr);
4360}
4361
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004362TEST_F(VkLayerTest, FramebufferCreateErrors) {
4363 TEST_DESCRIPTION("Hit errors when attempting to create a framebuffer :\n"
4364 " 1. Mismatch between fb & renderPass attachmentCount\n"
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004365 " 2. Use a color image as depthStencil attachment\n"
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004366 " 3. Mismatch fb & renderPass attachment formats\n"
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004367 " 4. Mismatch fb & renderPass attachment #samples\n"
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004368 " 5. FB attachment w/ non-1 mip-levels\n"
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004369 " 6. FB attachment where dimensions don't match\n"
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004370 " 7. FB attachment w/o identity swizzle\n"
4371 " 8. FB dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004372
4373 ASSERT_NO_FATAL_FAILURE(InitState());
4374 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4375
4376 m_errorMonitor->SetDesiredFailureMsg(
4377 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004378 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 "
4379 "does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004380
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004381 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004382 VkAttachmentReference attach = {};
4383 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
4384 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004385 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004386 VkRenderPassCreateInfo rpci = {};
4387 rpci.subpassCount = 1;
4388 rpci.pSubpasses = &subpass;
4389 rpci.attachmentCount = 1;
4390 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004391 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004392 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004393 rpci.pAttachments = &attach_desc;
4394 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
4395 VkRenderPass rp;
4396 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4397 ASSERT_VK_SUCCESS(err);
4398
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004399 VkImageView ivs[2];
4400 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
4401 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004402 VkFramebufferCreateInfo fb_info = {};
4403 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
4404 fb_info.pNext = NULL;
4405 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004406 // Set mis-matching attachmentCount
4407 fb_info.attachmentCount = 2;
4408 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004409 fb_info.width = 100;
4410 fb_info.height = 100;
4411 fb_info.layers = 1;
4412
4413 VkFramebuffer fb;
4414 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4415
4416 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004417 if (err == VK_SUCCESS) {
4418 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4419 }
4420 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06004421
4422 // Create a renderPass with a depth-stencil attachment created with
4423 // IMAGE_USAGE_COLOR_ATTACHMENT
4424 // Add our color attachment to pDepthStencilAttachment
4425 subpass.pDepthStencilAttachment = &attach;
4426 subpass.pColorAttachments = NULL;
4427 VkRenderPass rp_ds;
4428 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
4429 ASSERT_VK_SUCCESS(err);
4430 // Set correct attachment count, but attachment has COLOR usage bit set
4431 fb_info.attachmentCount = 1;
4432 fb_info.renderPass = rp_ds;
4433
4434 m_errorMonitor->SetDesiredFailureMsg(
4435 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4436 " conflicts with the image's IMAGE_USAGE flags ");
4437 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4438
4439 m_errorMonitor->VerifyFound();
4440 if (err == VK_SUCCESS) {
4441 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4442 }
4443 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004444
4445 // Create new renderpass with alternate attachment format from fb
4446 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
4447 subpass.pDepthStencilAttachment = NULL;
4448 subpass.pColorAttachments = &attach;
4449 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4450 ASSERT_VK_SUCCESS(err);
4451
4452 // Cause error due to mis-matched formats between rp & fb
4453 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
4454 fb_info.renderPass = rp;
4455 m_errorMonitor->SetDesiredFailureMsg(
4456 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4457 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
4458 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4459
4460 m_errorMonitor->VerifyFound();
4461 if (err == VK_SUCCESS) {
4462 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4463 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06004464 vkDestroyRenderPass(m_device->device(), rp, NULL);
4465
4466 // Create new renderpass with alternate sample count from fb
4467 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
4468 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
4469 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4470 ASSERT_VK_SUCCESS(err);
4471
4472 // Cause error due to mis-matched sample count between rp & fb
4473 fb_info.renderPass = rp;
4474 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4475 " has VK_SAMPLE_COUNT_1_BIT samples "
4476 "that do not match the "
4477 "VK_SAMPLE_COUNT_4_BIT ");
4478 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4479
4480 m_errorMonitor->VerifyFound();
4481 if (err == VK_SUCCESS) {
4482 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4483 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06004484
4485 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004486
4487 // Create a custom imageView with non-1 mip levels
4488 VkImageObj image(m_device);
4489 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
4490 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4491 ASSERT_TRUE(image.initialized());
4492
4493 VkImageView view;
4494 VkImageViewCreateInfo ivci = {};
4495 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4496 ivci.image = image.handle();
4497 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4498 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4499 ivci.subresourceRange.layerCount = 1;
4500 ivci.subresourceRange.baseMipLevel = 0;
4501 // Set level count 2 (only 1 is allowed for FB attachment)
4502 ivci.subresourceRange.levelCount = 2;
4503 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4504 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4505 ASSERT_VK_SUCCESS(err);
4506 // Re-create renderpass to have matching sample count
4507 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4508 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4509 ASSERT_VK_SUCCESS(err);
4510
4511 fb_info.renderPass = rp;
4512 fb_info.pAttachments = &view;
4513 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4514 " has mip levelCount of 2 but only ");
4515 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4516
4517 m_errorMonitor->VerifyFound();
4518 if (err == VK_SUCCESS) {
4519 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4520 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004521 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004522 // Update view to original color buffer and grow FB dimensions too big
4523 fb_info.pAttachments = ivs;
4524 fb_info.height = 1024;
4525 fb_info.width = 1024;
4526 fb_info.layers = 2;
4527 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4528 " Attachment dimensions must be at "
4529 "least as large. ");
4530 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4531
4532 m_errorMonitor->VerifyFound();
4533 if (err == VK_SUCCESS) {
4534 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4535 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004536 // Create view attachment with non-identity swizzle
4537 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4538 ivci.image = image.handle();
4539 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4540 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4541 ivci.subresourceRange.layerCount = 1;
4542 ivci.subresourceRange.baseMipLevel = 0;
4543 ivci.subresourceRange.levelCount = 1;
4544 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4545 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4546 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4547 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4548 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4549 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4550 ASSERT_VK_SUCCESS(err);
4551
4552 fb_info.pAttachments = &view;
4553 fb_info.height = 100;
4554 fb_info.width = 100;
4555 fb_info.layers = 1;
4556 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4557 " has non-identy swizzle. All "
4558 "framebuffer attachments must have "
4559 "been created with the identity "
4560 "swizzle. ");
4561 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4562
4563 m_errorMonitor->VerifyFound();
4564 if (err == VK_SUCCESS) {
4565 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4566 }
4567 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004568 // Request fb that exceeds max dimensions
4569 // reset attachment to color attachment
4570 fb_info.pAttachments = ivs;
4571 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
4572 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
4573 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
4574 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4575 " Requested VkFramebufferCreateInfo "
4576 "dimensions exceed physical device "
4577 "limits. ");
4578 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4579
4580 m_errorMonitor->VerifyFound();
4581 if (err == VK_SUCCESS) {
4582 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4583 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004584
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004585 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004586}
4587
Mark Lobodzinskic808d442016-04-14 10:57:23 -06004588// This is a positive test. No errors should be generated.
Michael Lentine860b0fe2016-05-20 10:14:00 -05004589TEST_F(VkLayerTest, WaitEventThenSet) {
4590 TEST_DESCRIPTION(
4591 "Wait on a event then set it after the wait has been submitted.");
4592
Michael Lentine860b0fe2016-05-20 10:14:00 -05004593 m_errorMonitor->ExpectSuccess();
4594
4595 VkEvent event;
4596 VkEventCreateInfo event_create_info{};
4597 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4598 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
4599
4600 VkCommandPool command_pool;
4601 VkCommandPoolCreateInfo pool_create_info{};
4602 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4603 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4604 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4605 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4606 &command_pool);
4607
4608 VkCommandBuffer command_buffer;
4609 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4610 command_buffer_allocate_info.sType =
4611 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4612 command_buffer_allocate_info.commandPool = command_pool;
4613 command_buffer_allocate_info.commandBufferCount = 1;
4614 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4615 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4616 &command_buffer);
4617
4618 VkQueue queue = VK_NULL_HANDLE;
4619 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06004620 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05004621
4622 {
4623 VkCommandBufferBeginInfo begin_info{};
4624 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4625 vkBeginCommandBuffer(command_buffer, &begin_info);
4626
4627 vkCmdWaitEvents(command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT,
4628 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
4629 nullptr, 0, nullptr);
4630 vkCmdResetEvent(command_buffer, event,
4631 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
4632 vkEndCommandBuffer(command_buffer);
4633 }
4634 {
4635 VkSubmitInfo submit_info{};
4636 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4637 submit_info.commandBufferCount = 1;
4638 submit_info.pCommandBuffers = &command_buffer;
4639 submit_info.signalSemaphoreCount = 0;
4640 submit_info.pSignalSemaphores = nullptr;
4641 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4642 }
4643 { vkSetEvent(m_device->device(), event); }
4644
4645 vkQueueWaitIdle(queue);
4646
4647 vkDestroyEvent(m_device->device(), event, nullptr);
4648 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
4649 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
4650
4651 m_errorMonitor->VerifyNotFound();
4652}
Michael Lentine5627e692016-05-20 17:45:02 -05004653// This is a positive test. No errors should be generated.
4654TEST_F(VkLayerTest, QueryAndCopyMultipleCommandBuffers) {
4655 TEST_DESCRIPTION(
4656 "Issue a query and copy from it on a second command buffer.");
4657
4658 if ((m_device->queue_props.empty()) ||
4659 (m_device->queue_props[0].queueCount < 2))
4660 return;
4661
4662 m_errorMonitor->ExpectSuccess();
4663
4664 VkQueryPool query_pool;
4665 VkQueryPoolCreateInfo query_pool_create_info{};
4666 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
4667 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
4668 query_pool_create_info.queryCount = 1;
4669 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr,
4670 &query_pool);
4671
4672 VkCommandPool command_pool;
4673 VkCommandPoolCreateInfo pool_create_info{};
4674 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4675 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4676 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4677 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4678 &command_pool);
4679
4680 VkCommandBuffer command_buffer[2];
4681 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4682 command_buffer_allocate_info.sType =
4683 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4684 command_buffer_allocate_info.commandPool = command_pool;
4685 command_buffer_allocate_info.commandBufferCount = 2;
4686 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4687 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4688 command_buffer);
4689
4690 VkQueue queue = VK_NULL_HANDLE;
4691 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
4692 1, &queue);
4693
4694 uint32_t qfi = 0;
4695 VkBufferCreateInfo buff_create_info = {};
4696 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4697 buff_create_info.size = 1024;
4698 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
4699 buff_create_info.queueFamilyIndexCount = 1;
4700 buff_create_info.pQueueFamilyIndices = &qfi;
4701
4702 VkResult err;
4703 VkBuffer buffer;
4704 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
4705 ASSERT_VK_SUCCESS(err);
4706 VkMemoryAllocateInfo mem_alloc = {};
4707 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4708 mem_alloc.pNext = NULL;
4709 mem_alloc.allocationSize = 1024;
4710 mem_alloc.memoryTypeIndex = 0;
4711
4712 VkMemoryRequirements memReqs;
4713 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
4714 bool pass =
4715 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
4716 if (!pass) {
4717 vkDestroyBuffer(m_device->device(), buffer, NULL);
4718 return;
4719 }
4720
4721 VkDeviceMemory mem;
4722 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
4723 ASSERT_VK_SUCCESS(err);
4724 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4725 ASSERT_VK_SUCCESS(err);
4726
4727 {
4728 VkCommandBufferBeginInfo begin_info{};
4729 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4730 vkBeginCommandBuffer(command_buffer[0], &begin_info);
4731
4732 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
4733 vkCmdWriteTimestamp(command_buffer[0],
4734 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
4735
4736 vkEndCommandBuffer(command_buffer[0]);
4737
4738 vkBeginCommandBuffer(command_buffer[1], &begin_info);
4739
4740 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer,
4741 0, 0, 0);
4742
4743 vkEndCommandBuffer(command_buffer[1]);
4744 }
4745 {
4746 VkSubmitInfo submit_info{};
4747 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4748 submit_info.commandBufferCount = 2;
4749 submit_info.pCommandBuffers = command_buffer;
4750 submit_info.signalSemaphoreCount = 0;
4751 submit_info.pSignalSemaphores = nullptr;
4752 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4753 }
4754
4755 vkQueueWaitIdle(queue);
4756
4757 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
4758 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
4759 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06004760 vkDestroyBuffer(m_device->device(), buffer, NULL);
4761 vkFreeMemory(m_device->device(), mem, NULL);
Michael Lentine5627e692016-05-20 17:45:02 -05004762
4763 m_errorMonitor->VerifyNotFound();
4764}
Michael Lentine860b0fe2016-05-20 10:14:00 -05004765
4766TEST_F(VkLayerTest, ResetEventThenSet) {
4767 TEST_DESCRIPTION(
4768 "Reset an event then set it after the reset has been submitted.");
4769
Michael Lentine860b0fe2016-05-20 10:14:00 -05004770 m_errorMonitor->ExpectSuccess();
4771
4772 VkEvent event;
4773 VkEventCreateInfo event_create_info{};
4774 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
4775 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
4776
4777 VkCommandPool command_pool;
4778 VkCommandPoolCreateInfo pool_create_info{};
4779 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4780 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4781 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4782 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4783 &command_pool);
4784
4785 VkCommandBuffer command_buffer;
4786 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4787 command_buffer_allocate_info.sType =
4788 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4789 command_buffer_allocate_info.commandPool = command_pool;
4790 command_buffer_allocate_info.commandBufferCount = 1;
4791 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4792 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4793 &command_buffer);
4794
4795 VkQueue queue = VK_NULL_HANDLE;
4796 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
Tony Barbourfe302c02016-06-06 13:05:19 -06004797 0, &queue);
Michael Lentine860b0fe2016-05-20 10:14:00 -05004798
4799 {
4800 VkCommandBufferBeginInfo begin_info{};
4801 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4802 vkBeginCommandBuffer(command_buffer, &begin_info);
4803
4804 vkCmdResetEvent(command_buffer, event,
4805 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
4806 vkCmdWaitEvents(command_buffer, 1, &event,
4807 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4808 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
4809 nullptr, 0, nullptr);
4810 vkEndCommandBuffer(command_buffer);
4811 }
4812 {
4813 VkSubmitInfo submit_info{};
4814 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4815 submit_info.commandBufferCount = 1;
4816 submit_info.pCommandBuffers = &command_buffer;
4817 submit_info.signalSemaphoreCount = 0;
4818 submit_info.pSignalSemaphores = nullptr;
4819 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4820 }
4821 {
4822 m_errorMonitor->SetDesiredFailureMsg(
4823 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkSetEvent() on event "
4824 "0x1 that is already in use by a "
4825 "command buffer.");
4826 vkSetEvent(m_device->device(), event);
4827 m_errorMonitor->VerifyFound();
4828 }
4829
4830 vkQueueWaitIdle(queue);
4831
4832 vkDestroyEvent(m_device->device(), event, nullptr);
4833 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
4834 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
4835}
4836
4837// This is a positive test. No errors should be generated.
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004838TEST_F(VkLayerTest, TwoFencesThreeFrames) {
4839 TEST_DESCRIPTION("Two command buffers with two separate fences are each "
4840 "run through a Submit & WaitForFences cycle 3 times. This "
4841 "previously revealed a bug so running this positive test "
4842 "to prevent a regression.");
4843 m_errorMonitor->ExpectSuccess();
4844
4845 ASSERT_NO_FATAL_FAILURE(InitState());
4846 VkQueue queue = VK_NULL_HANDLE;
4847 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
4848 0, &queue);
4849
4850 static const uint32_t NUM_OBJECTS = 2;
4851 static const uint32_t NUM_FRAMES = 3;
4852 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
4853 VkFence fences[NUM_OBJECTS] = {};
4854
4855 VkCommandPool cmd_pool;
4856 VkCommandPoolCreateInfo cmd_pool_ci = {};
4857 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4858 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
4859 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4860 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci,
4861 nullptr, &cmd_pool);
4862 ASSERT_VK_SUCCESS(err);
4863
4864 VkCommandBufferAllocateInfo cmd_buf_info = {};
4865 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4866 cmd_buf_info.commandPool = cmd_pool;
4867 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4868 cmd_buf_info.commandBufferCount = 1;
4869
4870 VkFenceCreateInfo fence_ci = {};
4871 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
4872 fence_ci.pNext = nullptr;
4873 fence_ci.flags = 0;
4874
4875 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
4876 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info,
4877 &cmd_buffers[i]);
4878 ASSERT_VK_SUCCESS(err);
4879 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
4880 ASSERT_VK_SUCCESS(err);
4881 }
4882
4883 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
Tobin Ehlisf9025162016-05-26 06:55:21 -06004884 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
4885 // Create empty cmd buffer
4886 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
4887 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004888
Tobin Ehlisf9025162016-05-26 06:55:21 -06004889 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
4890 ASSERT_VK_SUCCESS(err);
4891 err = vkEndCommandBuffer(cmd_buffers[obj]);
4892 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004893
Tobin Ehlisf9025162016-05-26 06:55:21 -06004894 VkSubmitInfo submit_info = {};
4895 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4896 submit_info.commandBufferCount = 1;
4897 submit_info.pCommandBuffers = &cmd_buffers[obj];
4898 // Submit cmd buffer and wait for fence
4899 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
4900 ASSERT_VK_SUCCESS(err);
4901 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE,
4902 UINT64_MAX);
4903 ASSERT_VK_SUCCESS(err);
4904 err = vkResetFences(m_device->device(), 1, &fences[obj]);
4905 ASSERT_VK_SUCCESS(err);
4906 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004907 }
4908 m_errorMonitor->VerifyNotFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06004909 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
4910 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
4911 vkDestroyFence(m_device->device(), fences[i], nullptr);
4912 }
Tobin Ehlis0bb263b2016-05-10 12:13:02 -06004913}
4914// This is a positive test. No errors should be generated.
Mark Lobodzinskic808d442016-04-14 10:57:23 -06004915TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
4916
4917 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
4918 "submitted on separate queues followed by a QueueWaitIdle.");
4919
Dustin Graves48458142016-04-29 16:11:55 -06004920 if ((m_device->queue_props.empty()) ||
4921 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06004922 return;
4923
Mark Lobodzinskic808d442016-04-14 10:57:23 -06004924 m_errorMonitor->ExpectSuccess();
4925
4926 VkSemaphore semaphore;
4927 VkSemaphoreCreateInfo semaphore_create_info{};
4928 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
4929 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
4930 &semaphore);
4931
4932 VkCommandPool command_pool;
4933 VkCommandPoolCreateInfo pool_create_info{};
4934 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
4935 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
4936 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
4937 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
4938 &command_pool);
4939
4940 VkCommandBuffer command_buffer[2];
4941 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
4942 command_buffer_allocate_info.sType =
4943 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4944 command_buffer_allocate_info.commandPool = command_pool;
4945 command_buffer_allocate_info.commandBufferCount = 2;
4946 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
4947 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
4948 command_buffer);
4949
4950 VkQueue queue = VK_NULL_HANDLE;
4951 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
4952 1, &queue);
4953
4954 {
4955 VkCommandBufferBeginInfo begin_info{};
4956 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4957 vkBeginCommandBuffer(command_buffer[0], &begin_info);
4958
4959 vkCmdPipelineBarrier(command_buffer[0],
4960 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
4961 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
4962 0, nullptr, 0, nullptr);
4963
4964 VkViewport viewport{};
4965 viewport.maxDepth = 1.0f;
4966 viewport.minDepth = 0.0f;
4967 viewport.width = 512;
4968 viewport.height = 512;
4969 viewport.x = 0;
4970 viewport.y = 0;
4971 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
4972 vkEndCommandBuffer(command_buffer[0]);
4973 }
4974 {
4975 VkCommandBufferBeginInfo begin_info{};
4976 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4977 vkBeginCommandBuffer(command_buffer[1], &begin_info);
4978
4979 VkViewport viewport{};
4980 viewport.maxDepth = 1.0f;
4981 viewport.minDepth = 0.0f;
4982 viewport.width = 512;
4983 viewport.height = 512;
4984 viewport.x = 0;
4985 viewport.y = 0;
4986 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
4987 vkEndCommandBuffer(command_buffer[1]);
4988 }
4989 {
4990 VkSubmitInfo submit_info{};
4991 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4992 submit_info.commandBufferCount = 1;
4993 submit_info.pCommandBuffers = &command_buffer[0];
4994 submit_info.signalSemaphoreCount = 1;
4995 submit_info.pSignalSemaphores = &semaphore;
4996 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
4997 }
4998 {
4999 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5000 VkSubmitInfo submit_info{};
5001 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5002 submit_info.commandBufferCount = 1;
5003 submit_info.pCommandBuffers = &command_buffer[1];
5004 submit_info.waitSemaphoreCount = 1;
5005 submit_info.pWaitSemaphores = &semaphore;
5006 submit_info.pWaitDstStageMask = flags;
5007 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5008 }
5009
5010 vkQueueWaitIdle(m_device->m_queue);
5011
5012 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5013 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5014 &command_buffer[0]);
5015 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5016
5017 m_errorMonitor->VerifyNotFound();
5018}
5019
5020// This is a positive test. No errors should be generated.
5021TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
5022
5023 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5024 "submitted on separate queues, the second having a fence"
5025 "followed by a QueueWaitIdle.");
5026
Dustin Graves48458142016-04-29 16:11:55 -06005027 if ((m_device->queue_props.empty()) ||
5028 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005029 return;
5030
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005031 m_errorMonitor->ExpectSuccess();
5032
5033 VkFence fence;
5034 VkFenceCreateInfo fence_create_info{};
5035 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5036 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5037
5038 VkSemaphore semaphore;
5039 VkSemaphoreCreateInfo semaphore_create_info{};
5040 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5041 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5042 &semaphore);
5043
5044 VkCommandPool command_pool;
5045 VkCommandPoolCreateInfo pool_create_info{};
5046 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5047 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5048 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5049 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5050 &command_pool);
5051
5052 VkCommandBuffer command_buffer[2];
5053 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5054 command_buffer_allocate_info.sType =
5055 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5056 command_buffer_allocate_info.commandPool = command_pool;
5057 command_buffer_allocate_info.commandBufferCount = 2;
5058 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5059 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5060 command_buffer);
5061
5062 VkQueue queue = VK_NULL_HANDLE;
5063 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5064 1, &queue);
5065
5066 {
5067 VkCommandBufferBeginInfo begin_info{};
5068 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5069 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5070
5071 vkCmdPipelineBarrier(command_buffer[0],
5072 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5073 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5074 0, nullptr, 0, nullptr);
5075
5076 VkViewport viewport{};
5077 viewport.maxDepth = 1.0f;
5078 viewport.minDepth = 0.0f;
5079 viewport.width = 512;
5080 viewport.height = 512;
5081 viewport.x = 0;
5082 viewport.y = 0;
5083 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5084 vkEndCommandBuffer(command_buffer[0]);
5085 }
5086 {
5087 VkCommandBufferBeginInfo begin_info{};
5088 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5089 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5090
5091 VkViewport viewport{};
5092 viewport.maxDepth = 1.0f;
5093 viewport.minDepth = 0.0f;
5094 viewport.width = 512;
5095 viewport.height = 512;
5096 viewport.x = 0;
5097 viewport.y = 0;
5098 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5099 vkEndCommandBuffer(command_buffer[1]);
5100 }
5101 {
5102 VkSubmitInfo submit_info{};
5103 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5104 submit_info.commandBufferCount = 1;
5105 submit_info.pCommandBuffers = &command_buffer[0];
5106 submit_info.signalSemaphoreCount = 1;
5107 submit_info.pSignalSemaphores = &semaphore;
5108 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5109 }
5110 {
5111 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5112 VkSubmitInfo submit_info{};
5113 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5114 submit_info.commandBufferCount = 1;
5115 submit_info.pCommandBuffers = &command_buffer[1];
5116 submit_info.waitSemaphoreCount = 1;
5117 submit_info.pWaitSemaphores = &semaphore;
5118 submit_info.pWaitDstStageMask = flags;
5119 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5120 }
5121
5122 vkQueueWaitIdle(m_device->m_queue);
5123
5124 vkDestroyFence(m_device->device(), fence, nullptr);
5125 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5126 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5127 &command_buffer[0]);
5128 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5129
5130 m_errorMonitor->VerifyNotFound();
5131}
5132
5133// This is a positive test. No errors should be generated.
5134TEST_F(VkLayerTest,
5135 TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
5136
5137 TEST_DESCRIPTION(
5138 "Two command buffers, each in a separate QueueSubmit call "
5139 "submitted on separate queues, the second having a fence"
5140 "followed by two consecutive WaitForFences calls on the same fence.");
5141
Dustin Graves48458142016-04-29 16:11:55 -06005142 if ((m_device->queue_props.empty()) ||
5143 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005144 return;
5145
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005146 m_errorMonitor->ExpectSuccess();
5147
5148 VkFence fence;
5149 VkFenceCreateInfo fence_create_info{};
5150 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5151 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5152
5153 VkSemaphore semaphore;
5154 VkSemaphoreCreateInfo semaphore_create_info{};
5155 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5156 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5157 &semaphore);
5158
5159 VkCommandPool command_pool;
5160 VkCommandPoolCreateInfo pool_create_info{};
5161 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5162 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5163 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5164 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5165 &command_pool);
5166
5167 VkCommandBuffer command_buffer[2];
5168 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5169 command_buffer_allocate_info.sType =
5170 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5171 command_buffer_allocate_info.commandPool = command_pool;
5172 command_buffer_allocate_info.commandBufferCount = 2;
5173 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5174 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5175 command_buffer);
5176
5177 VkQueue queue = VK_NULL_HANDLE;
5178 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5179 1, &queue);
5180
5181 {
5182 VkCommandBufferBeginInfo begin_info{};
5183 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5184 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5185
5186 vkCmdPipelineBarrier(command_buffer[0],
5187 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5188 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5189 0, nullptr, 0, nullptr);
5190
5191 VkViewport viewport{};
5192 viewport.maxDepth = 1.0f;
5193 viewport.minDepth = 0.0f;
5194 viewport.width = 512;
5195 viewport.height = 512;
5196 viewport.x = 0;
5197 viewport.y = 0;
5198 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5199 vkEndCommandBuffer(command_buffer[0]);
5200 }
5201 {
5202 VkCommandBufferBeginInfo begin_info{};
5203 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5204 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5205
5206 VkViewport viewport{};
5207 viewport.maxDepth = 1.0f;
5208 viewport.minDepth = 0.0f;
5209 viewport.width = 512;
5210 viewport.height = 512;
5211 viewport.x = 0;
5212 viewport.y = 0;
5213 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5214 vkEndCommandBuffer(command_buffer[1]);
5215 }
5216 {
5217 VkSubmitInfo submit_info{};
5218 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5219 submit_info.commandBufferCount = 1;
5220 submit_info.pCommandBuffers = &command_buffer[0];
5221 submit_info.signalSemaphoreCount = 1;
5222 submit_info.pSignalSemaphores = &semaphore;
5223 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5224 }
5225 {
5226 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5227 VkSubmitInfo submit_info{};
5228 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5229 submit_info.commandBufferCount = 1;
5230 submit_info.pCommandBuffers = &command_buffer[1];
5231 submit_info.waitSemaphoreCount = 1;
5232 submit_info.pWaitSemaphores = &semaphore;
5233 submit_info.pWaitDstStageMask = flags;
5234 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5235 }
5236
5237 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5238 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5239
5240 vkDestroyFence(m_device->device(), fence, nullptr);
5241 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5242 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5243 &command_buffer[0]);
5244 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5245
5246 m_errorMonitor->VerifyNotFound();
5247}
5248
Chris Forbes0f8126b2016-06-20 17:48:22 +12005249#if 0
5250TEST_F(VkLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
5251 if ((m_device->queue_props.empty()) ||
5252 (m_device->queue_props[0].queueCount < 2)) {
5253 printf("Test requires two queues, skipping\n");
5254 return;
5255 }
5256
5257 VkResult err;
5258
5259 m_errorMonitor->ExpectSuccess();
5260
5261 VkQueue q0 = m_device->m_queue;
5262 VkQueue q1 = nullptr;
5263 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
5264 ASSERT_NE(q1, nullptr);
5265
5266 // An (empty) command buffer. We must have work in the first submission --
5267 // the layer treats unfenced work differently from fenced work.
5268 VkCommandPoolCreateInfo cpci = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0 };
5269 VkCommandPool pool;
5270 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
5271 ASSERT_VK_SUCCESS(err);
5272 VkCommandBufferAllocateInfo cbai = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr,
5273 pool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1
5274 };
5275 VkCommandBuffer cb;
5276 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
5277 ASSERT_VK_SUCCESS(err);
5278 VkCommandBufferBeginInfo cbbi = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
5279 0, nullptr
5280 };
5281 err = vkBeginCommandBuffer(cb, &cbbi);
5282 ASSERT_VK_SUCCESS(err);
5283 err = vkEndCommandBuffer(cb);
5284 ASSERT_VK_SUCCESS(err);
5285
5286 // A semaphore
5287 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
5288 VkSemaphore s;
5289 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
5290 ASSERT_VK_SUCCESS(err);
5291
5292 // First submission, to q0
5293 VkSubmitInfo s0 = {
5294 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
5295 0, nullptr, nullptr,
5296 1, &cb,
5297 1, &s
5298 };
5299
5300 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
5301 ASSERT_VK_SUCCESS(err);
5302
5303 // Second submission, to q1, waiting on s
5304 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
5305 VkSubmitInfo s1 = {
5306 VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr,
5307 1, &s, &waitmask,
5308 0, nullptr,
5309 0, nullptr
5310 };
5311
5312 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
5313 ASSERT_VK_SUCCESS(err);
5314
5315 // Wait for q0 idle
5316 err = vkQueueWaitIdle(q0);
5317 ASSERT_VK_SUCCESS(err);
5318
5319 // Command buffer should have been completed (it was on q0); reset the pool.
5320 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
5321
5322 m_errorMonitor->VerifyNotFound();
5323
5324 // Force device completely idle and clean up resources
5325 vkDeviceWaitIdle(m_device->device());
5326 vkDestroyCommandPool(m_device->device(), pool, nullptr);
5327 vkDestroySemaphore(m_device->device(), s, nullptr);
5328}
5329#endif
5330
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005331// This is a positive test. No errors should be generated.
5332TEST_F(VkLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
5333
5334 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5335 "submitted on separate queues, the second having a fence, "
5336 "followed by a WaitForFences call.");
5337
Dustin Graves48458142016-04-29 16:11:55 -06005338 if ((m_device->queue_props.empty()) ||
5339 (m_device->queue_props[0].queueCount < 2))
Tony Barbourdc18b262016-04-22 14:49:48 -06005340 return;
5341
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005342 m_errorMonitor->ExpectSuccess();
5343
5344 VkFence fence;
5345 VkFenceCreateInfo fence_create_info{};
5346 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5347 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5348
5349 VkSemaphore semaphore;
5350 VkSemaphoreCreateInfo semaphore_create_info{};
5351 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5352 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5353 &semaphore);
5354
5355 VkCommandPool command_pool;
5356 VkCommandPoolCreateInfo pool_create_info{};
5357 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5358 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5359 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5360 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5361 &command_pool);
5362
5363 VkCommandBuffer command_buffer[2];
5364 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5365 command_buffer_allocate_info.sType =
5366 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5367 command_buffer_allocate_info.commandPool = command_pool;
5368 command_buffer_allocate_info.commandBufferCount = 2;
5369 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5370 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5371 command_buffer);
5372
5373 VkQueue queue = VK_NULL_HANDLE;
5374 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_,
5375 1, &queue);
5376
5377
5378 {
5379 VkCommandBufferBeginInfo begin_info{};
5380 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5381 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5382
5383 vkCmdPipelineBarrier(command_buffer[0],
5384 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5385 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5386 0, nullptr, 0, nullptr);
5387
5388 VkViewport viewport{};
5389 viewport.maxDepth = 1.0f;
5390 viewport.minDepth = 0.0f;
5391 viewport.width = 512;
5392 viewport.height = 512;
5393 viewport.x = 0;
5394 viewport.y = 0;
5395 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5396 vkEndCommandBuffer(command_buffer[0]);
5397 }
5398 {
5399 VkCommandBufferBeginInfo begin_info{};
5400 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5401 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5402
5403 VkViewport viewport{};
5404 viewport.maxDepth = 1.0f;
5405 viewport.minDepth = 0.0f;
5406 viewport.width = 512;
5407 viewport.height = 512;
5408 viewport.x = 0;
5409 viewport.y = 0;
5410 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5411 vkEndCommandBuffer(command_buffer[1]);
5412 }
5413 {
5414 VkSubmitInfo submit_info{};
5415 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5416 submit_info.commandBufferCount = 1;
5417 submit_info.pCommandBuffers = &command_buffer[0];
5418 submit_info.signalSemaphoreCount = 1;
5419 submit_info.pSignalSemaphores = &semaphore;
5420 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
5421 }
5422 {
5423 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5424 VkSubmitInfo submit_info{};
5425 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5426 submit_info.commandBufferCount = 1;
5427 submit_info.pCommandBuffers = &command_buffer[1];
5428 submit_info.waitSemaphoreCount = 1;
5429 submit_info.pWaitSemaphores = &semaphore;
5430 submit_info.pWaitDstStageMask = flags;
5431 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5432 }
5433
5434 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5435
5436 vkDestroyFence(m_device->device(), fence, nullptr);
5437 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5438 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5439 &command_buffer[0]);
5440 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5441
5442 m_errorMonitor->VerifyNotFound();
5443}
5444
5445// This is a positive test. No errors should be generated.
5446TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
5447
5448 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5449 "on the same queue, sharing a signal/wait semaphore, the "
5450 "second having a fence, "
5451 "followed by a WaitForFences call.");
5452
5453 m_errorMonitor->ExpectSuccess();
5454
5455 VkFence fence;
5456 VkFenceCreateInfo fence_create_info{};
5457 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5458 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5459
5460 VkSemaphore semaphore;
5461 VkSemaphoreCreateInfo semaphore_create_info{};
5462 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5463 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5464 &semaphore);
5465
5466 VkCommandPool command_pool;
5467 VkCommandPoolCreateInfo pool_create_info{};
5468 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5469 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5470 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5471 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5472 &command_pool);
5473
5474 VkCommandBuffer command_buffer[2];
5475 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5476 command_buffer_allocate_info.sType =
5477 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5478 command_buffer_allocate_info.commandPool = command_pool;
5479 command_buffer_allocate_info.commandBufferCount = 2;
5480 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5481 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5482 command_buffer);
5483
5484 {
5485 VkCommandBufferBeginInfo begin_info{};
5486 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5487 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5488
5489 vkCmdPipelineBarrier(command_buffer[0],
5490 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5491 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5492 0, nullptr, 0, nullptr);
5493
5494 VkViewport viewport{};
5495 viewport.maxDepth = 1.0f;
5496 viewport.minDepth = 0.0f;
5497 viewport.width = 512;
5498 viewport.height = 512;
5499 viewport.x = 0;
5500 viewport.y = 0;
5501 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5502 vkEndCommandBuffer(command_buffer[0]);
5503 }
5504 {
5505 VkCommandBufferBeginInfo begin_info{};
5506 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5507 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5508
5509 VkViewport viewport{};
5510 viewport.maxDepth = 1.0f;
5511 viewport.minDepth = 0.0f;
5512 viewport.width = 512;
5513 viewport.height = 512;
5514 viewport.x = 0;
5515 viewport.y = 0;
5516 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5517 vkEndCommandBuffer(command_buffer[1]);
5518 }
5519 {
5520 VkSubmitInfo submit_info{};
5521 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5522 submit_info.commandBufferCount = 1;
5523 submit_info.pCommandBuffers = &command_buffer[0];
5524 submit_info.signalSemaphoreCount = 1;
5525 submit_info.pSignalSemaphores = &semaphore;
5526 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5527 }
5528 {
5529 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5530 VkSubmitInfo submit_info{};
5531 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5532 submit_info.commandBufferCount = 1;
5533 submit_info.pCommandBuffers = &command_buffer[1];
5534 submit_info.waitSemaphoreCount = 1;
5535 submit_info.pWaitSemaphores = &semaphore;
5536 submit_info.pWaitDstStageMask = flags;
5537 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5538 }
5539
5540 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5541
5542 vkDestroyFence(m_device->device(), fence, nullptr);
5543 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
5544 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5545 &command_buffer[0]);
5546 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5547
5548 m_errorMonitor->VerifyNotFound();
5549}
5550
5551// This is a positive test. No errors should be generated.
5552TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
5553
5554 TEST_DESCRIPTION(
5555 "Two command buffers, each in a separate QueueSubmit call "
5556 "on the same queue, no fences, followed by a third QueueSubmit with NO "
5557 "SubmitInfos but with a fence, followed by a WaitForFences call.");
5558
5559 m_errorMonitor->ExpectSuccess();
5560
5561 VkFence fence;
5562 VkFenceCreateInfo fence_create_info{};
5563 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5564 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5565
5566 VkCommandPool command_pool;
5567 VkCommandPoolCreateInfo pool_create_info{};
5568 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5569 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5570 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5571 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5572 &command_pool);
5573
5574 VkCommandBuffer command_buffer[2];
5575 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5576 command_buffer_allocate_info.sType =
5577 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5578 command_buffer_allocate_info.commandPool = command_pool;
5579 command_buffer_allocate_info.commandBufferCount = 2;
5580 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5581 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5582 command_buffer);
5583
5584 {
5585 VkCommandBufferBeginInfo begin_info{};
5586 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5587 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5588
5589 vkCmdPipelineBarrier(command_buffer[0],
5590 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5591 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5592 0, nullptr, 0, nullptr);
5593
5594 VkViewport viewport{};
5595 viewport.maxDepth = 1.0f;
5596 viewport.minDepth = 0.0f;
5597 viewport.width = 512;
5598 viewport.height = 512;
5599 viewport.x = 0;
5600 viewport.y = 0;
5601 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5602 vkEndCommandBuffer(command_buffer[0]);
5603 }
5604 {
5605 VkCommandBufferBeginInfo begin_info{};
5606 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5607 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5608
5609 VkViewport viewport{};
5610 viewport.maxDepth = 1.0f;
5611 viewport.minDepth = 0.0f;
5612 viewport.width = 512;
5613 viewport.height = 512;
5614 viewport.x = 0;
5615 viewport.y = 0;
5616 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5617 vkEndCommandBuffer(command_buffer[1]);
5618 }
5619 {
5620 VkSubmitInfo submit_info{};
5621 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5622 submit_info.commandBufferCount = 1;
5623 submit_info.pCommandBuffers = &command_buffer[0];
5624 submit_info.signalSemaphoreCount = 0;
5625 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
5626 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5627 }
5628 {
5629 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5630 VkSubmitInfo submit_info{};
5631 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5632 submit_info.commandBufferCount = 1;
5633 submit_info.pCommandBuffers = &command_buffer[1];
5634 submit_info.waitSemaphoreCount = 0;
5635 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
5636 submit_info.pWaitDstStageMask = flags;
5637 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5638 }
5639
5640 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
5641
Mike Stroyancd1c3e52016-06-21 09:20:01 -06005642 VkResult err =
5643 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5644 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005645
5646 vkDestroyFence(m_device->device(), fence, nullptr);
5647 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5648 &command_buffer[0]);
5649 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5650
5651 m_errorMonitor->VerifyNotFound();
5652}
5653
5654// This is a positive test. No errors should be generated.
5655TEST_F(VkLayerTest, TwoQueueSubmitsOneQueueOneFence) {
5656
5657 TEST_DESCRIPTION("Two command buffers, each in a separate QueueSubmit call "
5658 "on the same queue, the second having a fence, followed "
5659 "by a WaitForFences call.");
5660
5661 m_errorMonitor->ExpectSuccess();
5662
5663 VkFence fence;
5664 VkFenceCreateInfo fence_create_info{};
5665 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5666 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5667
5668 VkCommandPool command_pool;
5669 VkCommandPoolCreateInfo pool_create_info{};
5670 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5671 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5672 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5673 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5674 &command_pool);
5675
5676 VkCommandBuffer command_buffer[2];
5677 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5678 command_buffer_allocate_info.sType =
5679 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5680 command_buffer_allocate_info.commandPool = command_pool;
5681 command_buffer_allocate_info.commandBufferCount = 2;
5682 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5683 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5684 command_buffer);
5685
5686 {
5687 VkCommandBufferBeginInfo begin_info{};
5688 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5689 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5690
5691 vkCmdPipelineBarrier(command_buffer[0],
5692 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5693 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5694 0, nullptr, 0, nullptr);
5695
5696 VkViewport viewport{};
5697 viewport.maxDepth = 1.0f;
5698 viewport.minDepth = 0.0f;
5699 viewport.width = 512;
5700 viewport.height = 512;
5701 viewport.x = 0;
5702 viewport.y = 0;
5703 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5704 vkEndCommandBuffer(command_buffer[0]);
5705 }
5706 {
5707 VkCommandBufferBeginInfo begin_info{};
5708 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5709 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5710
5711 VkViewport viewport{};
5712 viewport.maxDepth = 1.0f;
5713 viewport.minDepth = 0.0f;
5714 viewport.width = 512;
5715 viewport.height = 512;
5716 viewport.x = 0;
5717 viewport.y = 0;
5718 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5719 vkEndCommandBuffer(command_buffer[1]);
5720 }
5721 {
5722 VkSubmitInfo submit_info{};
5723 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5724 submit_info.commandBufferCount = 1;
5725 submit_info.pCommandBuffers = &command_buffer[0];
5726 submit_info.signalSemaphoreCount = 0;
5727 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
5728 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5729 }
5730 {
5731 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5732 VkSubmitInfo submit_info{};
5733 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5734 submit_info.commandBufferCount = 1;
5735 submit_info.pCommandBuffers = &command_buffer[1];
5736 submit_info.waitSemaphoreCount = 0;
5737 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
5738 submit_info.pWaitDstStageMask = flags;
5739 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
5740 }
5741
5742 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5743
5744 vkDestroyFence(m_device->device(), fence, nullptr);
5745 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5746 &command_buffer[0]);
5747 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
5748
5749 m_errorMonitor->VerifyNotFound();
5750}
5751
5752// This is a positive test. No errors should be generated.
5753TEST_F(VkLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
5754
5755 TEST_DESCRIPTION(
5756 "Two command buffers each in a separate SubmitInfo sent in a single "
5757 "QueueSubmit call followed by a WaitForFences call.");
5758
5759 m_errorMonitor->ExpectSuccess();
5760
5761 VkFence fence;
5762 VkFenceCreateInfo fence_create_info{};
5763 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
5764 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
5765
5766 VkSemaphore semaphore;
5767 VkSemaphoreCreateInfo semaphore_create_info{};
5768 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5769 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr,
5770 &semaphore);
5771
5772 VkCommandPool command_pool;
5773 VkCommandPoolCreateInfo pool_create_info{};
5774 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5775 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
5776 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
5777 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr,
5778 &command_pool);
5779
5780 VkCommandBuffer command_buffer[2];
5781 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5782 command_buffer_allocate_info.sType =
5783 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5784 command_buffer_allocate_info.commandPool = command_pool;
5785 command_buffer_allocate_info.commandBufferCount = 2;
5786 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5787 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info,
5788 command_buffer);
5789
5790 {
5791 VkCommandBufferBeginInfo begin_info{};
5792 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5793 vkBeginCommandBuffer(command_buffer[0], &begin_info);
5794
5795 vkCmdPipelineBarrier(command_buffer[0],
5796 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
5797 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5798 0, nullptr, 0, nullptr);
5799
5800 VkViewport viewport{};
5801 viewport.maxDepth = 1.0f;
5802 viewport.minDepth = 0.0f;
5803 viewport.width = 512;
5804 viewport.height = 512;
5805 viewport.x = 0;
5806 viewport.y = 0;
5807 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
5808 vkEndCommandBuffer(command_buffer[0]);
5809 }
5810 {
5811 VkCommandBufferBeginInfo begin_info{};
5812 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5813 vkBeginCommandBuffer(command_buffer[1], &begin_info);
5814
5815 VkViewport viewport{};
5816 viewport.maxDepth = 1.0f;
5817 viewport.minDepth = 0.0f;
5818 viewport.width = 512;
5819 viewport.height = 512;
5820 viewport.x = 0;
5821 viewport.y = 0;
5822 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
5823 vkEndCommandBuffer(command_buffer[1]);
5824 }
5825 {
5826 VkSubmitInfo submit_info[2];
5827 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
5828
5829 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5830 submit_info[0].pNext = NULL;
5831 submit_info[0].commandBufferCount = 1;
5832 submit_info[0].pCommandBuffers = &command_buffer[0];
5833 submit_info[0].signalSemaphoreCount = 1;
5834 submit_info[0].pSignalSemaphores = &semaphore;
5835 submit_info[0].waitSemaphoreCount = 0;
5836 submit_info[0].pWaitSemaphores = NULL;
5837 submit_info[0].pWaitDstStageMask = 0;
5838
5839 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5840 submit_info[1].pNext = NULL;
5841 submit_info[1].commandBufferCount = 1;
5842 submit_info[1].pCommandBuffers = &command_buffer[1];
5843 submit_info[1].waitSemaphoreCount = 1;
5844 submit_info[1].pWaitSemaphores = &semaphore;
5845 submit_info[1].pWaitDstStageMask = flags;
5846 submit_info[1].signalSemaphoreCount = 0;
5847 submit_info[1].pSignalSemaphores = NULL;
5848 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
5849 }
5850
5851 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
5852
5853 vkDestroyFence(m_device->device(), fence, nullptr);
5854 vkFreeCommandBuffers(m_device->device(), command_pool, 2,
5855 &command_buffer[0]);
5856 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06005857 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Mark Lobodzinskic808d442016-04-14 10:57:23 -06005858
5859 m_errorMonitor->VerifyNotFound();
5860}
5861
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005862TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005863 TEST_DESCRIPTION(
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005864 "Run a simple draw calls to validate failure when Depth Bias dynamic "
5865 "state is required but not correctly bound.");
5866
5867 // Dynamic depth bias
5868 m_errorMonitor->SetDesiredFailureMsg(
5869 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5870 "Dynamic depth bias state not set for this command buffer");
5871 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5872 BsoFailDepthBias);
5873 m_errorMonitor->VerifyFound();
5874}
5875
5876TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
5877 TEST_DESCRIPTION(
5878 "Run a simple draw calls to validate failure when Line Width dynamic "
5879 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005880
5881 // Dynamic line width
Karl Schultz6addd812016-02-02 17:17:23 -07005882 m_errorMonitor->SetDesiredFailureMsg(
5883 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005884 "Dynamic line width state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005885 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5886 BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005887 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005888}
5889
5890TEST_F(VkLayerTest, DynamicViewportNotBound) {
5891 TEST_DESCRIPTION(
5892 "Run a simple draw calls to validate failure when Viewport dynamic "
5893 "state is required but not correctly bound.");
5894
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005895 // Dynamic viewport state
Karl Schultz6addd812016-02-02 17:17:23 -07005896 m_errorMonitor->SetDesiredFailureMsg(
5897 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005898 "Dynamic viewport state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005899 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5900 BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005901 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005902}
5903
5904TEST_F(VkLayerTest, DynamicScissorNotBound) {
5905 TEST_DESCRIPTION(
5906 "Run a simple draw calls to validate failure when Scissor dynamic "
5907 "state is required but not correctly bound.");
5908
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005909 // Dynamic scissor state
Karl Schultz6addd812016-02-02 17:17:23 -07005910 m_errorMonitor->SetDesiredFailureMsg(
5911 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005912 "Dynamic scissor state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005913 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5914 BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005915 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005916}
5917
Tobin Ehlis21c88352016-05-26 06:15:45 -06005918TEST_F(VkLayerTest, DynamiBlendConstantsNotBound) {
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005919 TEST_DESCRIPTION(
Tobin Ehlis21c88352016-05-26 06:15:45 -06005920 "Run a simple draw calls to validate failure when Blend Constants "
5921 "dynamic state is required but not correctly bound.");
5922 // Dynamic blend constant state
5923 m_errorMonitor->SetDesiredFailureMsg(
5924 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5925 "Dynamic blend constants state not set for this command buffer");
5926 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5927 BsoFailBlend);
5928 m_errorMonitor->VerifyFound();
5929}
5930
5931TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
5932 TEST_DESCRIPTION(
5933 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005934 "state is required but not correctly bound.");
Tobin Ehlis21c88352016-05-26 06:15:45 -06005935 if (!m_device->phy().features().depthBounds) {
5936 printf("Device does not support depthBounds test; skipped.\n");
5937 return;
5938 }
5939 // Dynamic depth bounds
Karl Schultz6addd812016-02-02 17:17:23 -07005940 m_errorMonitor->SetDesiredFailureMsg(
5941 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005942 "Dynamic depth bounds state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005943 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5944 BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005945 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005946}
5947
5948TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
5949 TEST_DESCRIPTION(
5950 "Run a simple draw calls to validate failure when Stencil Read dynamic "
5951 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005952 // Dynamic stencil read mask
Karl Schultz6addd812016-02-02 17:17:23 -07005953 m_errorMonitor->SetDesiredFailureMsg(
5954 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005955 "Dynamic stencil read mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005956 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5957 BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005958 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005959}
5960
5961TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
5962 TEST_DESCRIPTION(
5963 "Run a simple draw calls to validate failure when Stencil Write dynamic"
5964 " state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005965 // Dynamic stencil write mask
Karl Schultz6addd812016-02-02 17:17:23 -07005966 m_errorMonitor->SetDesiredFailureMsg(
5967 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005968 "Dynamic stencil write mask state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005969 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5970 BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005971 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06005972}
5973
5974TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
5975 TEST_DESCRIPTION(
5976 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
5977 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06005978 // Dynamic stencil reference
Karl Schultz6addd812016-02-02 17:17:23 -07005979 m_errorMonitor->SetDesiredFailureMsg(
5980 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06005981 "Dynamic stencil reference state not set for this command buffer");
Karl Schultz6addd812016-02-02 17:17:23 -07005982 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText,
5983 BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12005984 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06005985}
5986
Karl Schultz6addd812016-02-02 17:17:23 -07005987TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Karl Schultz6addd812016-02-02 17:17:23 -07005988 m_errorMonitor->SetDesiredFailureMsg(
5989 VK_DEBUG_REPORT_ERROR_BIT_EXT,
5990 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
5991 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06005992
Tobin Ehlis59278bf2015-08-18 07:10:58 -06005993 ASSERT_NO_FATAL_FAILURE(InitState());
5994 ASSERT_NO_FATAL_FAILURE(InitViewport());
5995 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5996
Karl Schultz6addd812016-02-02 17:17:23 -07005997 // We luck out b/c by default the framework creates CB w/ the
5998 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tobin Ehlis59278bf2015-08-18 07:10:58 -06005999 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006000 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color,
6001 m_stencil_clear_color, NULL);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006002 EndCommandBuffer();
6003
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006004 // Bypass framework since it does the waits automatically
6005 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006006 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08006007 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6008 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006009 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006010 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07006011 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08006012 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006013 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08006014 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06006015 submit_info.pSignalSemaphores = NULL;
6016
Chris Forbes40028e22016-06-13 09:59:34 +12006017 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07006018 ASSERT_VK_SUCCESS(err);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006019
Karl Schultz6addd812016-02-02 17:17:23 -07006020 // Cause validation error by re-submitting cmd buffer that should only be
6021 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12006022 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006023
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006024 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06006025}
6026
Karl Schultz6addd812016-02-02 17:17:23 -07006027TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006028 // Initiate Draw w/o a PSO bound
Karl Schultz6addd812016-02-02 17:17:23 -07006029 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006030
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006031 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006032 "Unable to allocate 1 descriptors of "
6033 "type "
6034 "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006035
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006036 ASSERT_NO_FATAL_FAILURE(InitState());
6037 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006038
Karl Schultz6addd812016-02-02 17:17:23 -07006039 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
6040 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006041 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006042 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
6043 ds_type_count.descriptorCount = 1;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006044
6045 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006046 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6047 ds_pool_ci.pNext = NULL;
6048 ds_pool_ci.flags = 0;
6049 ds_pool_ci.maxSets = 1;
6050 ds_pool_ci.poolSizeCount = 1;
6051 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006052
6053 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006054 err =
6055 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006056 ASSERT_VK_SUCCESS(err);
6057
6058 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006059 dsl_binding.binding = 0;
6060 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6061 dsl_binding.descriptorCount = 1;
6062 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6063 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006064
6065 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006066 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6067 ds_layout_ci.pNext = NULL;
6068 ds_layout_ci.bindingCount = 1;
6069 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006070
6071 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006072 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6073 &ds_layout);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006074 ASSERT_VK_SUCCESS(err);
6075
6076 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006077 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006078 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006079 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006080 alloc_info.descriptorPool = ds_pool;
6081 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006082 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6083 &descriptorSet);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006084
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006085 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006086
Chia-I Wuf7458c52015-10-26 21:10:41 +08006087 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6088 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06006089}
6090
Karl Schultz6addd812016-02-02 17:17:23 -07006091TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
6092 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06006093
Karl Schultz6addd812016-02-02 17:17:23 -07006094 m_errorMonitor->SetDesiredFailureMsg(
6095 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6096 "It is invalid to call vkFreeDescriptorSets() with a pool created "
6097 "without setting VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006098
Tobin Ehlise735c692015-10-08 13:13:50 -06006099 ASSERT_NO_FATAL_FAILURE(InitState());
6100 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06006101
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006102 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006103 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6104 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06006105
6106 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006107 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6108 ds_pool_ci.pNext = NULL;
6109 ds_pool_ci.maxSets = 1;
6110 ds_pool_ci.poolSizeCount = 1;
6111 ds_pool_ci.flags = 0;
6112 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
6113 // app can only call vkResetDescriptorPool on this pool.;
6114 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06006115
6116 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006117 err =
6118 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06006119 ASSERT_VK_SUCCESS(err);
6120
6121 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006122 dsl_binding.binding = 0;
6123 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6124 dsl_binding.descriptorCount = 1;
6125 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6126 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06006127
6128 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006129 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6130 ds_layout_ci.pNext = NULL;
6131 ds_layout_ci.bindingCount = 1;
6132 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06006133
6134 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006135 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6136 &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06006137 ASSERT_VK_SUCCESS(err);
6138
6139 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006140 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006141 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006142 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006143 alloc_info.descriptorPool = ds_pool;
6144 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006145 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6146 &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06006147 ASSERT_VK_SUCCESS(err);
6148
6149 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006150 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06006151
Chia-I Wuf7458c52015-10-26 21:10:41 +08006152 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6153 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06006154}
6155
Karl Schultz6addd812016-02-02 17:17:23 -07006156TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006157 // Attempt to clear Descriptor Pool with bad object.
6158 // ObjectTracker should catch this.
6159 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6160 "Invalid VkDescriptorPool Object 0xbaad6001");
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006161 uint64_t fake_pool_handle = 0xbaad6001;
6162 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
6163 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06006164 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006165}
6166
Karl Schultz6addd812016-02-02 17:17:23 -07006167TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006168 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
6169 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006170 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06006171 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006172
6173 uint64_t fake_set_handle = 0xbaad6001;
6174 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006175 VkResult err;
6176 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6177 "Invalid VkDescriptorSet Object 0xbaad6001");
6178
6179 ASSERT_NO_FATAL_FAILURE(InitState());
6180
6181 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
6182 layout_bindings[0].binding = 0;
6183 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6184 layout_bindings[0].descriptorCount = 1;
6185 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
6186 layout_bindings[0].pImmutableSamplers = NULL;
6187
6188 VkDescriptorSetLayout descriptor_set_layout;
6189 VkDescriptorSetLayoutCreateInfo dslci = {};
6190 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6191 dslci.pNext = NULL;
6192 dslci.bindingCount = 1;
6193 dslci.pBindings = layout_bindings;
6194 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006195 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006196
6197 VkPipelineLayout pipeline_layout;
6198 VkPipelineLayoutCreateInfo plci = {};
6199 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6200 plci.pNext = NULL;
6201 plci.setLayoutCount = 1;
6202 plci.pSetLayouts = &descriptor_set_layout;
6203 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06006204 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06006205
6206 BeginCommandBuffer();
6207 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006208 pipeline_layout, 0, 1, &bad_set, 0, NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06006209 m_errorMonitor->VerifyFound();
6210 EndCommandBuffer();
6211 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
6212 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006213}
6214
Karl Schultz6addd812016-02-02 17:17:23 -07006215TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006216 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
6217 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006218 uint64_t fake_layout_handle = 0xbaad6001;
6219 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006220 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6221 "Invalid VkDescriptorSetLayout Object 0xbaad6001");
6222
6223 VkPipelineLayout pipeline_layout;
6224 VkPipelineLayoutCreateInfo plci = {};
6225 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6226 plci.pNext = NULL;
6227 plci.setLayoutCount = 1;
6228 plci.pSetLayouts = &bad_layout;
6229 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
6230
6231 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006232}
6233
Mark Muellerd4914412016-06-13 17:52:06 -06006234TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
6235 TEST_DESCRIPTION("This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
6236 "1) A uniform buffer update must have a valid buffer index."
6237 "2) When using an array of descriptors in a single WriteDescriptor,"
6238 " the descriptor types and stageflags must all be the same."
6239 "3) Immutable Sampler state must match across descriptors");
6240
6241 const char *invalid_BufferInfo_ErrorMessage =
6242 "vkUpdateDescriptorSets: if pDescriptorWrites[0].descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, "
6243 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or "
6244 "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pDescriptorWrites[0].pBufferInfo must not be NULL";
6245 const char *stateFlag_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06006246 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006247 const char *immutable_ErrorMessage =
Mark Mueller5c838ce2016-06-16 09:54:29 -06006248 "Attempting write update to descriptor set ";
Mark Muellerd4914412016-06-13 17:52:06 -06006249
Mark Muellerd4914412016-06-13 17:52:06 -06006250 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_BufferInfo_ErrorMessage);
6251
6252 ASSERT_NO_FATAL_FAILURE(InitState());
6253 VkDescriptorPoolSize ds_type_count[4] = {};
6254 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6255 ds_type_count[0].descriptorCount = 1;
6256 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6257 ds_type_count[1].descriptorCount = 1;
6258 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6259 ds_type_count[2].descriptorCount = 1;
6260 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
6261 ds_type_count[3].descriptorCount = 1;
6262
6263 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6264 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6265 ds_pool_ci.maxSets = 1;
6266 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
6267 ds_pool_ci.pPoolSizes = ds_type_count;
6268
6269 VkDescriptorPool ds_pool;
6270 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6271 ASSERT_VK_SUCCESS(err);
6272
Mark Muellerb9896722016-06-16 09:54:29 -06006273 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006274 layout_binding[0].binding = 0;
6275 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6276 layout_binding[0].descriptorCount = 1;
6277 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
6278 layout_binding[0].pImmutableSamplers = NULL;
6279
6280 layout_binding[1].binding = 1;
6281 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6282 layout_binding[1].descriptorCount = 1;
6283 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6284 layout_binding[1].pImmutableSamplers = NULL;
6285
6286 VkSamplerCreateInfo sampler_ci = {};
6287 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6288 sampler_ci.pNext = NULL;
6289 sampler_ci.magFilter = VK_FILTER_NEAREST;
6290 sampler_ci.minFilter = VK_FILTER_NEAREST;
6291 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6292 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6293 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6294 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6295 sampler_ci.mipLodBias = 1.0;
6296 sampler_ci.anisotropyEnable = VK_FALSE;
6297 sampler_ci.maxAnisotropy = 1;
6298 sampler_ci.compareEnable = VK_FALSE;
6299 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6300 sampler_ci.minLod = 1.0;
6301 sampler_ci.maxLod = 1.0;
6302 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6303 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6304 VkSampler sampler;
6305
6306 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6307 ASSERT_VK_SUCCESS(err);
6308
6309 layout_binding[2].binding = 2;
6310 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
6311 layout_binding[2].descriptorCount = 1;
6312 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
6313 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
6314
Mark Muellerd4914412016-06-13 17:52:06 -06006315 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6316 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6317 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
6318 ds_layout_ci.pBindings = layout_binding;
6319 VkDescriptorSetLayout ds_layout;
6320 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6321 ASSERT_VK_SUCCESS(err);
6322
6323 VkDescriptorSetAllocateInfo alloc_info = {};
6324 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6325 alloc_info.descriptorSetCount = 1;
6326 alloc_info.descriptorPool = ds_pool;
6327 alloc_info.pSetLayouts = &ds_layout;
6328 VkDescriptorSet descriptorSet;
6329 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6330 ASSERT_VK_SUCCESS(err);
6331
6332 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6333 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6334 pipeline_layout_ci.pNext = NULL;
6335 pipeline_layout_ci.setLayoutCount = 1;
6336 pipeline_layout_ci.pSetLayouts = &ds_layout;
6337
6338 VkPipelineLayout pipeline_layout;
6339 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6340 ASSERT_VK_SUCCESS(err);
6341
Mark Mueller5c838ce2016-06-16 09:54:29 -06006342 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06006343 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6344 descriptor_write.dstSet = descriptorSet;
6345 descriptor_write.dstBinding = 0;
6346 descriptor_write.descriptorCount = 1;
6347 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6348
Mark Mueller5c838ce2016-06-16 09:54:29 -06006349 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06006350 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6351 m_errorMonitor->VerifyFound();
6352
6353 // Create a buffer to update the descriptor with
6354 uint32_t qfi = 0;
6355 VkBufferCreateInfo buffCI = {};
6356 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6357 buffCI.size = 1024;
6358 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6359 buffCI.queueFamilyIndexCount = 1;
6360 buffCI.pQueueFamilyIndices = &qfi;
6361
6362 VkBuffer dyub;
6363 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6364 ASSERT_VK_SUCCESS(err);
6365 VkDescriptorBufferInfo buffInfo = {};
6366 buffInfo.buffer = dyub;
6367 buffInfo.offset = 0;
6368 buffInfo.range = 1024;
6369
6370 descriptor_write.pBufferInfo = &buffInfo;
6371 descriptor_write.descriptorCount = 2;
6372
Mark Mueller5c838ce2016-06-16 09:54:29 -06006373 // 2) The stateFlags don't match between the first and second descriptor
Mark Muellerd4914412016-06-13 17:52:06 -06006374 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, stateFlag_ErrorMessage);
6375 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6376 m_errorMonitor->VerifyFound();
6377
Mark Mueller5c838ce2016-06-16 09:54:29 -06006378 // 3) The second descriptor has a null_ptr pImmutableSamplers and
6379 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06006380 descriptor_write.dstBinding = 1;
6381 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06006382
6383
6384 // Make pImageInfo index non-null to avoid complaints of it missing
6385 VkDescriptorImageInfo imageInfo = {};
6386 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6387 descriptor_write.pImageInfo = &imageInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06006388 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, immutable_ErrorMessage);
6389 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6390 m_errorMonitor->VerifyFound();
6391
Mark Muellerd4914412016-06-13 17:52:06 -06006392 vkDestroyBuffer(m_device->device(), dyub, NULL);
6393 vkDestroySampler(m_device->device(), sampler, NULL);
6394 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6395 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6396 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6397}
6398
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06006399TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
6400 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6401 "due to a buffer dependency being destroyed.");
6402 ASSERT_NO_FATAL_FAILURE(InitState());
6403
6404 VkImageObj image(m_device);
6405 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
6406 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
6407 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
6408 VK_IMAGE_TILING_OPTIMAL, 0);
6409 ASSERT_TRUE(image.initialized());
6410
6411 VkBuffer buffer;
6412 VkDeviceMemory mem;
6413 VkMemoryRequirements mem_reqs;
6414
6415 VkBufferCreateInfo buf_info = {};
6416 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6417 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6418 buf_info.size = 256;
6419 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6420 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
6421 ASSERT_VK_SUCCESS(err);
6422
6423 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
6424
6425 VkMemoryAllocateInfo alloc_info = {};
6426 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6427 alloc_info.allocationSize = 256;
6428 bool pass = false;
6429 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
6430 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
6431 if (!pass) {
6432 vkDestroyBuffer(m_device->device(), buffer, NULL);
6433 return;
6434 }
6435 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
6436 ASSERT_VK_SUCCESS(err);
6437
6438 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
6439 ASSERT_VK_SUCCESS(err);
6440
6441 VkBufferImageCopy region = {};
6442 region.bufferRowLength = 128;
6443 region.bufferImageHeight = 128;
6444 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6445
6446 region.imageSubresource.layerCount = 1;
6447 region.imageExtent.height = 4;
6448 region.imageExtent.width = 4;
6449 region.imageExtent.depth = 1;
6450 m_commandBuffer->BeginCommandBuffer();
6451 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer,
6452 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
6453 1, &region);
6454 m_commandBuffer->EndCommandBuffer();
6455
6456 m_errorMonitor->SetDesiredFailureMsg(
6457 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6458 " that is invalid because bound buffer ");
6459 // Destroy buffer dependency prior to submit to cause ERROR
6460 vkDestroyBuffer(m_device->device(), buffer, NULL);
6461
6462 VkSubmitInfo submit_info = {};
6463 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6464 submit_info.commandBufferCount = 1;
6465 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6466 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6467
6468 m_errorMonitor->VerifyFound();
6469 vkFreeMemory(m_device->handle(), mem, NULL);
6470}
6471
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006472TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
6473 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6474 "due to an image dependency being destroyed.");
6475 ASSERT_NO_FATAL_FAILURE(InitState());
6476
6477 VkImage image;
6478 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6479 VkImageCreateInfo image_create_info = {};
6480 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6481 image_create_info.pNext = NULL;
6482 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6483 image_create_info.format = tex_format;
6484 image_create_info.extent.width = 32;
6485 image_create_info.extent.height = 32;
6486 image_create_info.extent.depth = 1;
6487 image_create_info.mipLevels = 1;
6488 image_create_info.arrayLayers = 1;
6489 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6490 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6491 image_create_info.usage =
6492 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
6493 image_create_info.flags = 0;
6494 VkResult err =
6495 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6496 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06006497 // Have to bind memory to image before recording cmd in cmd buffer using it
6498 VkMemoryRequirements mem_reqs;
6499 VkDeviceMemory image_mem;
6500 bool pass;
6501 VkMemoryAllocateInfo mem_alloc = {};
6502 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6503 mem_alloc.pNext = NULL;
6504 mem_alloc.memoryTypeIndex = 0;
6505 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
6506 mem_alloc.allocationSize = mem_reqs.size;
6507 pass =
6508 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
6509 ASSERT_TRUE(pass);
6510 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
6511 ASSERT_VK_SUCCESS(err);
6512 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
6513 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006514
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006515 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06006516 VkClearColorValue ccv;
6517 ccv.float32[0] = 1.0f;
6518 ccv.float32[1] = 1.0f;
6519 ccv.float32[2] = 1.0f;
6520 ccv.float32[3] = 1.0f;
6521 VkImageSubresourceRange isr = {};
6522 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06006523 isr.baseArrayLayer = 0;
6524 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06006525 isr.layerCount = 1;
6526 isr.levelCount = 1;
6527 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image,
6528 VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006529 m_commandBuffer->EndCommandBuffer();
6530
6531 m_errorMonitor->SetDesiredFailureMsg(
6532 VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
6533 // Destroy image dependency prior to submit to cause ERROR
6534 vkDestroyImage(m_device->device(), image, NULL);
6535
6536 VkSubmitInfo submit_info = {};
6537 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6538 submit_info.commandBufferCount = 1;
6539 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6540 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6541
6542 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06006543 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06006544}
6545
Tobin Ehlis85940f52016-07-07 16:57:21 -06006546TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
6547 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6548 "due to an event dependency being destroyed.");
6549 ASSERT_NO_FATAL_FAILURE(InitState());
6550
6551 VkEvent event;
6552 VkEventCreateInfo evci = {};
6553 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
6554 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
6555 ASSERT_VK_SUCCESS(result);
6556
6557 m_commandBuffer->BeginCommandBuffer();
6558 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event,
6559 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
6560 m_commandBuffer->EndCommandBuffer();
6561
6562 m_errorMonitor->SetDesiredFailureMsg(
6563 VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
6564 // Destroy event dependency prior to submit to cause ERROR
6565 vkDestroyEvent(m_device->device(), event, NULL);
6566
6567 VkSubmitInfo submit_info = {};
6568 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6569 submit_info.commandBufferCount = 1;
6570 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6571 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6572
6573 m_errorMonitor->VerifyFound();
6574}
6575
Tobin Ehlisdbea7552016-07-08 14:33:31 -06006576TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
6577 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6578 "due to a query pool dependency being destroyed.");
6579 ASSERT_NO_FATAL_FAILURE(InitState());
6580
6581 VkQueryPool query_pool;
6582 VkQueryPoolCreateInfo qpci{};
6583 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
6584 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
6585 qpci.queryCount = 1;
6586 VkResult result =
6587 vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
6588 ASSERT_VK_SUCCESS(result);
6589
6590 m_commandBuffer->BeginCommandBuffer();
6591 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
6592 m_commandBuffer->EndCommandBuffer();
6593
6594 m_errorMonitor->SetDesiredFailureMsg(
6595 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6596 " that is invalid because bound query pool ");
6597 // Destroy query pool dependency prior to submit to cause ERROR
6598 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
6599
6600 VkSubmitInfo submit_info = {};
6601 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6602 submit_info.commandBufferCount = 1;
6603 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6604 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6605
6606 m_errorMonitor->VerifyFound();
6607}
6608
Tobin Ehlis24130d92016-07-08 15:50:53 -06006609TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
6610 TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid "
6611 "due to a pipeline dependency being destroyed.");
6612 ASSERT_NO_FATAL_FAILURE(InitState());
6613 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6614
6615 VkResult err;
6616
6617 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6618 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6619
6620 VkPipelineLayout pipeline_layout;
6621 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6622 &pipeline_layout);
6623 ASSERT_VK_SUCCESS(err);
6624
6625 VkPipelineViewportStateCreateInfo vp_state_ci = {};
6626 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
6627 vp_state_ci.viewportCount = 1;
6628 VkViewport vp = {}; // Just need dummy vp to point to
6629 vp_state_ci.pViewports = &vp; // Null vp w/ count of 1 should cause error
6630 vp_state_ci.scissorCount = 1;
6631 VkRect2D scissors = {}; // Dummy scissors to point to
6632 vp_state_ci.pScissors = &scissors;
6633 // No dynamic state
6634 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
6635 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
6636
6637 VkPipelineShaderStageCreateInfo shaderStages[2];
6638 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
6639
6640 VkShaderObj vs(m_device, bindStateVertShaderText,
6641 VK_SHADER_STAGE_VERTEX_BIT, this);
6642 VkShaderObj fs(m_device, bindStateFragShaderText,
6643 VK_SHADER_STAGE_FRAGMENT_BIT,
6644 this); // We shouldn't need a fragment shader
6645 // but add it to be able to run on more devices
6646 shaderStages[0] = vs.GetStageCreateInfo();
6647 shaderStages[1] = fs.GetStageCreateInfo();
6648
6649 VkPipelineVertexInputStateCreateInfo vi_ci = {};
6650 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
6651
6652 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
6653 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
6654 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
6655
6656 VkPipelineRasterizationStateCreateInfo rs_ci = {};
6657 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
6658
6659 VkPipelineColorBlendAttachmentState att = {};
6660 att.blendEnable = VK_FALSE;
6661 att.colorWriteMask = 0xf;
6662
6663 VkPipelineColorBlendStateCreateInfo cb_ci = {};
6664 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
6665 cb_ci.attachmentCount = 1;
6666 cb_ci.pAttachments = &att;
6667
6668 VkGraphicsPipelineCreateInfo gp_ci = {};
6669 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
6670 gp_ci.stageCount = 2;
6671 gp_ci.pStages = shaderStages;
6672 gp_ci.pVertexInputState = &vi_ci;
6673 gp_ci.pInputAssemblyState = &ia_ci;
6674 gp_ci.pViewportState = &vp_state_ci;
6675 gp_ci.pRasterizationState = &rs_ci;
6676 gp_ci.pColorBlendState = &cb_ci;
6677 gp_ci.pDynamicState = &dyn_state_ci;
6678 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
6679 gp_ci.layout = pipeline_layout;
6680 gp_ci.renderPass = renderPass();
6681
6682 VkPipelineCacheCreateInfo pc_ci = {};
6683 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
6684
6685 VkPipeline pipeline;
6686 VkPipelineCache pipelineCache;
6687 err =
6688 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
6689 ASSERT_VK_SUCCESS(err);
6690
6691 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
6692 &gp_ci, NULL, &pipeline);
6693 ASSERT_VK_SUCCESS(err);
6694
6695 m_commandBuffer->BeginCommandBuffer();
6696 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6697 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
6698 m_commandBuffer->EndCommandBuffer();
6699 // Now destroy pipeline in order to cause error when submitting
6700 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
6701
6702 m_errorMonitor->SetDesiredFailureMsg(
6703 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6704 " that is invalid because bound pipeline ");
6705
6706 VkSubmitInfo submit_info = {};
6707 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6708 submit_info.commandBufferCount = 1;
6709 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6710 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6711
6712 m_errorMonitor->VerifyFound();
6713 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
6714 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6715}
6716
Karl Schultz6addd812016-02-02 17:17:23 -07006717TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006718 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6719 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006720 // Create a valid cmd buffer
6721 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006722 uint64_t fake_pipeline_handle = 0xbaad6001;
6723 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006724 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6725 "Invalid VkPipeline Object 0xbaad6001");
6726 ASSERT_NO_FATAL_FAILURE(InitState());
6727 BeginCommandBuffer();
6728 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6729 VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
6730 m_errorMonitor->VerifyFound();
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006731 // Now issue a draw call with no pipeline bound
6732 m_errorMonitor->SetDesiredFailureMsg(
6733 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6734 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tony Barbourdf4c0042016-06-01 15:55:43 -06006735
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006736 BeginCommandBuffer();
6737 Draw(1, 0, 0, 0);
6738 m_errorMonitor->VerifyFound();
6739 // Finally same check once more but with Dispatch/Compute
6740 m_errorMonitor->SetDesiredFailureMsg(
6741 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6742 "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006743 BeginCommandBuffer();
6744 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6745 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006746}
6747
Karl Schultz6addd812016-02-02 17:17:23 -07006748TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
6749 // Create and update CommandBuffer then call QueueSubmit w/o calling End on
6750 // CommandBuffer
6751 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006752
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07006753 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006754 " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006755
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006756 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006757 ASSERT_NO_FATAL_FAILURE(InitViewport());
6758 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006759 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006760 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6761 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006762
6763 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006764 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6765 ds_pool_ci.pNext = NULL;
6766 ds_pool_ci.maxSets = 1;
6767 ds_pool_ci.poolSizeCount = 1;
6768 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006769
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006770 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006771 err =
6772 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006773 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006774
Tony Barboureb254902015-07-15 12:50:33 -06006775 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006776 dsl_binding.binding = 0;
6777 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6778 dsl_binding.descriptorCount = 1;
6779 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6780 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006781
Tony Barboureb254902015-07-15 12:50:33 -06006782 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006783 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6784 ds_layout_ci.pNext = NULL;
6785 ds_layout_ci.bindingCount = 1;
6786 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006787 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006788 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6789 &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006790 ASSERT_VK_SUCCESS(err);
6791
6792 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006793 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006794 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006795 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006796 alloc_info.descriptorPool = ds_pool;
6797 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006798 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6799 &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006800 ASSERT_VK_SUCCESS(err);
6801
Tony Barboureb254902015-07-15 12:50:33 -06006802 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006803 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6804 pipeline_layout_ci.pNext = NULL;
6805 pipeline_layout_ci.setLayoutCount = 1;
6806 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006807
6808 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006809 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
6810 &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006811 ASSERT_VK_SUCCESS(err);
6812
Karl Schultz6addd812016-02-02 17:17:23 -07006813 VkShaderObj vs(m_device, bindStateVertShaderText,
6814 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006815 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006816 // on more devices
6817 VkShaderObj fs(m_device, bindStateFragShaderText,
6818 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006819
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006820 VkPipelineObj pipe(m_device);
6821 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006822 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006823 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006824 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006825
6826 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07006827 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
6828 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6829 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
6830 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
6831 1, &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006832
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006833 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006834
Chia-I Wuf7458c52015-10-26 21:10:41 +08006835 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6836 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6837 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006838}
6839
Karl Schultz6addd812016-02-02 17:17:23 -07006840TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006841 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006842 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006843
Karl Schultz6addd812016-02-02 17:17:23 -07006844 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006845 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempted write update to texel buffer "
6846 "descriptor with invalid buffer view");
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006847
6848 ASSERT_NO_FATAL_FAILURE(InitState());
6849 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006850 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6851 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006852
6853 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006854 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6855 ds_pool_ci.pNext = NULL;
6856 ds_pool_ci.maxSets = 1;
6857 ds_pool_ci.poolSizeCount = 1;
6858 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006859
6860 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006861 err =
6862 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006863 ASSERT_VK_SUCCESS(err);
6864
6865 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006866 dsl_binding.binding = 0;
6867 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6868 dsl_binding.descriptorCount = 1;
6869 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6870 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006871
6872 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006873 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6874 ds_layout_ci.pNext = NULL;
6875 ds_layout_ci.bindingCount = 1;
6876 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006877 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006878 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6879 &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006880 ASSERT_VK_SUCCESS(err);
6881
6882 VkDescriptorSet descriptorSet;
6883 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006884 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006885 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006886 alloc_info.descriptorPool = ds_pool;
6887 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006888 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
6889 &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006890 ASSERT_VK_SUCCESS(err);
6891
Karl Schultz6addd812016-02-02 17:17:23 -07006892 VkBufferView view =
6893 (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006894 VkWriteDescriptorSet descriptor_write;
6895 memset(&descriptor_write, 0, sizeof(descriptor_write));
6896 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6897 descriptor_write.dstSet = descriptorSet;
6898 descriptor_write.dstBinding = 0;
6899 descriptor_write.descriptorCount = 1;
6900 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6901 descriptor_write.pTexelBufferView = &view;
6902
6903 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6904
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006905 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006906
6907 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6908 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6909}
6910
Mark Youngd339ba32016-05-30 13:28:35 -06006911TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
6912 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has"
6913 " no memory bound to it.");
6914
6915 VkResult err;
6916 m_errorMonitor->SetDesiredFailureMsg(
6917 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6918 "vkCreateBufferView called with invalid memory ");
6919
6920 ASSERT_NO_FATAL_FAILURE(InitState());
6921
6922 // Create a buffer with no bound memory and then attempt to create
6923 // a buffer view.
6924 VkBufferCreateInfo buff_ci = {};
6925 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6926 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6927 buff_ci.size = 256;
6928 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6929 VkBuffer buffer;
6930 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6931 ASSERT_VK_SUCCESS(err);
6932
6933 VkBufferViewCreateInfo buff_view_ci = {};
6934 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6935 buff_view_ci.buffer = buffer;
6936 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6937 buff_view_ci.range = VK_WHOLE_SIZE;
6938 VkBufferView buff_view;
6939 err =
6940 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
6941
6942 m_errorMonitor->VerifyFound();
6943 vkDestroyBuffer(m_device->device(), buffer, NULL);
6944 // If last error is success, it still created the view, so delete it.
6945 if (err == VK_SUCCESS) {
6946 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6947 }
6948}
6949
Karl Schultz6addd812016-02-02 17:17:23 -07006950TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6951 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6952 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006953 // 1. No dynamicOffset supplied
6954 // 2. Too many dynamicOffsets supplied
6955 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006956 VkResult err;
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07006957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07006958 " requires 1 dynamicOffsets, but only "
6959 "0 dynamicOffsets are left in "
6960 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006961
6962 ASSERT_NO_FATAL_FAILURE(InitState());
6963 ASSERT_NO_FATAL_FAILURE(InitViewport());
6964 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6965
6966 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006967 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6968 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006969
6970 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006971 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6972 ds_pool_ci.pNext = NULL;
6973 ds_pool_ci.maxSets = 1;
6974 ds_pool_ci.poolSizeCount = 1;
6975 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006976
6977 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07006978 err =
6979 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006980 ASSERT_VK_SUCCESS(err);
6981
6982 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006983 dsl_binding.binding = 0;
6984 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6985 dsl_binding.descriptorCount = 1;
6986 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6987 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006988
6989 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006990 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6991 ds_layout_ci.pNext = NULL;
6992 ds_layout_ci.bindingCount = 1;
6993 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006994 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07006995 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
6996 &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006997 ASSERT_VK_SUCCESS(err);
6998
6999 VkDescriptorSet descriptorSet;
7000 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007001 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007002 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007003 alloc_info.descriptorPool = ds_pool;
7004 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007005 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7006 &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007007 ASSERT_VK_SUCCESS(err);
7008
7009 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007010 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7011 pipeline_layout_ci.pNext = NULL;
7012 pipeline_layout_ci.setLayoutCount = 1;
7013 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007014
7015 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007016 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7017 &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007018 ASSERT_VK_SUCCESS(err);
7019
7020 // Create a buffer to update the descriptor with
7021 uint32_t qfi = 0;
7022 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007023 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7024 buffCI.size = 1024;
7025 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7026 buffCI.queueFamilyIndexCount = 1;
7027 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007028
7029 VkBuffer dyub;
7030 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7031 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007032 // Allocate memory and bind to buffer so we can make it to the appropriate
7033 // error
7034 VkMemoryAllocateInfo mem_alloc = {};
7035 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7036 mem_alloc.pNext = NULL;
7037 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12007038 mem_alloc.memoryTypeIndex = 0;
7039
7040 VkMemoryRequirements memReqs;
7041 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
7042 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc,
7043 0);
7044 if (!pass) {
7045 vkDestroyBuffer(m_device->device(), dyub, NULL);
7046 return;
7047 }
7048
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007049 VkDeviceMemory mem;
7050 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
7051 ASSERT_VK_SUCCESS(err);
7052 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
7053 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007054 // Correctly update descriptor to avoid "NOT_UPDATED" error
7055 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007056 buffInfo.buffer = dyub;
7057 buffInfo.offset = 0;
7058 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007059
7060 VkWriteDescriptorSet descriptor_write;
7061 memset(&descriptor_write, 0, sizeof(descriptor_write));
7062 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7063 descriptor_write.dstSet = descriptorSet;
7064 descriptor_write.dstBinding = 0;
7065 descriptor_write.descriptorCount = 1;
7066 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7067 descriptor_write.pBufferInfo = &buffInfo;
7068
7069 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7070
7071 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07007072 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7073 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7074 1, &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007075 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07007076 uint32_t pDynOff[2] = {512, 756};
7077 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Karl Schultz6addd812016-02-02 17:17:23 -07007078 m_errorMonitor->SetDesiredFailureMsg(
7079 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlisf6585052015-12-17 11:48:42 -07007080 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
Karl Schultz6addd812016-02-02 17:17:23 -07007081 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7082 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7083 1, &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12007084 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07007085 // Finally cause error due to dynamicOffset being too big
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007086 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7087 " dynamic offset 512 combined with "
7088 "offset 0 and range 1024 that "
7089 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07007090 // Create PSO to be used for draw-time errors below
7091 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007092 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007093 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007094 "out gl_PerVertex { \n"
7095 " vec4 gl_Position;\n"
7096 "};\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007097 "void main(){\n"
7098 " gl_Position = vec4(1);\n"
7099 "}\n";
7100 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007101 "#version 450\n"
Tobin Ehlisf6585052015-12-17 11:48:42 -07007102 "\n"
7103 "layout(location=0) out vec4 x;\n"
7104 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7105 "void main(){\n"
7106 " x = vec4(bar.y);\n"
7107 "}\n";
7108 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7109 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7110 VkPipelineObj pipe(m_device);
7111 pipe.AddShader(&vs);
7112 pipe.AddShader(&fs);
7113 pipe.AddColorAttachment();
7114 pipe.CreateVKPipeline(pipeline_layout, renderPass());
7115
Karl Schultz6addd812016-02-02 17:17:23 -07007116 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7117 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7118 // This update should succeed, but offset size of 512 will overstep buffer
7119 // /w range 1024 & size 1024
7120 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7121 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7122 1, &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07007123 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007124 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007125
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007126 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06007127 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06007128
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007129 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007130 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07007131 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7132}
7133
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007134TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007135 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007136 ASSERT_NO_FATAL_FAILURE(InitState());
7137 ASSERT_NO_FATAL_FAILURE(InitViewport());
7138 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7139
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007140 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007141 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007142 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7143 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7144 pipeline_layout_ci.pushConstantRangeCount = 1;
7145 pipeline_layout_ci.pPushConstantRanges = &pc_range;
7146
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007147 //
7148 // Check for invalid push constant ranges in pipeline layouts.
7149 //
7150 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007151 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007152 char const *msg;
7153 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007154
Karl Schultzc81037d2016-05-12 08:11:23 -06007155 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
7156 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
7157 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7158 "vkCreatePipelineLayout() call has push constants index 0 with "
7159 "size 0."},
7160 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7161 "vkCreatePipelineLayout() call has push constants index 0 with "
7162 "size 1."},
7163 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
7164 "vkCreatePipelineLayout() call has push constants index 0 with "
7165 "size 1."},
7166 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
7167 "vkCreatePipelineLayout() call has push constants index 0 with "
7168 "size 0."},
7169 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7170 "vkCreatePipelineLayout() call has push constants index 0 with "
7171 "offset 1. Offset must"},
7172 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
7173 "vkCreatePipelineLayout() call has push constants index 0 "
7174 "with offset "},
7175 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
7176 "vkCreatePipelineLayout() call has push constants "
7177 "index 0 with offset "},
7178 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
7179 "vkCreatePipelineLayout() call has push constants index 0 "
7180 "with offset "},
7181 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
7182 "vkCreatePipelineLayout() call has push "
7183 "constants index 0 with offset "},
7184 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
7185 "vkCreatePipelineLayout() call has push "
7186 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007187 }};
7188
7189 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06007190 for (const auto &iter : range_tests) {
7191 pc_range = iter.range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007192 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7193 iter.msg);
7194 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7195 NULL, &pipeline_layout);
7196 m_errorMonitor->VerifyFound();
7197 if (VK_SUCCESS == err) {
7198 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7199 }
7200 }
7201
7202 // Check for invalid stage flag
7203 pc_range.offset = 0;
7204 pc_range.size = 16;
7205 pc_range.stageFlags = 0;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007206 m_errorMonitor->SetDesiredFailureMsg(
7207 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007208 "vkCreatePipelineLayout() call has no stageFlags set.");
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007209 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7210 &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007211 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007212 if (VK_SUCCESS == err) {
7213 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7214 }
7215
7216 // Check for overlapping ranges
Karl Schultzc81037d2016-05-12 08:11:23 -06007217 const uint32_t ranges_per_test = 5;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007218 struct OverlappingRangeTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007219 VkPushConstantRange const ranges[ranges_per_test];
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007220 char const *msg;
7221 };
7222
Karl Schultzc81037d2016-05-12 08:11:23 -06007223 const std::array<OverlappingRangeTestCase, 5> overlapping_range_tests = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007224 {{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7225 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7226 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7227 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7228 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7229 "vkCreatePipelineLayout() call has push constants with overlapping "
7230 "ranges: 0:[0, 4), 1:[0, 4)"},
7231 {
7232 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7233 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7234 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7235 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7236 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
7237 "vkCreatePipelineLayout() call has push constants with "
7238 "overlapping "
7239 "ranges: 3:[12, 20), 4:[16, 20)",
7240 },
7241 {
7242 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7243 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7244 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7245 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7246 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7247 "vkCreatePipelineLayout() call has push constants with "
7248 "overlapping "
7249 "ranges: 0:[16, 20), 1:[12, 20)",
7250 },
7251 {
7252 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7253 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7254 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7255 {VK_SHADER_STAGE_VERTEX_BIT, 12, 8},
7256 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7257 "vkCreatePipelineLayout() call has push constants with "
7258 "overlapping "
7259 "ranges: 0:[16, 20), 3:[12, 20)",
7260 },
7261 {
7262 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7263 {VK_SHADER_STAGE_VERTEX_BIT, 32, 4},
7264 {VK_SHADER_STAGE_VERTEX_BIT, 4, 96},
7265 {VK_SHADER_STAGE_VERTEX_BIT, 40, 8},
7266 {VK_SHADER_STAGE_VERTEX_BIT, 52, 4}},
7267 "vkCreatePipelineLayout() call has push constants with "
7268 "overlapping "
7269 "ranges: 0:[16, 20), 2:[4, 100)",
7270 }}};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007271
Karl Schultzc81037d2016-05-12 08:11:23 -06007272 for (const auto &iter : overlapping_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007273 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06007274 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
7275 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007276 iter.msg);
7277 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7278 NULL, &pipeline_layout);
7279 m_errorMonitor->VerifyFound();
7280 if (VK_SUCCESS == err) {
7281 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7282 }
7283 }
7284
7285 // Run some positive tests to make sure overlap checking in the layer is OK
Karl Schultzc81037d2016-05-12 08:11:23 -06007286 const std::array<OverlappingRangeTestCase, 2> overlapping_range_tests_pos =
7287 {{{{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7288 {VK_SHADER_STAGE_VERTEX_BIT, 4, 4},
7289 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
7290 {VK_SHADER_STAGE_VERTEX_BIT, 12, 4},
7291 {VK_SHADER_STAGE_VERTEX_BIT, 16, 4}},
7292 ""},
7293 {{{VK_SHADER_STAGE_VERTEX_BIT, 92, 24},
7294 {VK_SHADER_STAGE_VERTEX_BIT, 80, 4},
7295 {VK_SHADER_STAGE_VERTEX_BIT, 64, 8},
7296 {VK_SHADER_STAGE_VERTEX_BIT, 4, 16},
7297 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
7298 ""}}};
7299 for (const auto &iter : overlapping_range_tests_pos) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007300 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
7301 m_errorMonitor->ExpectSuccess();
7302 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci,
7303 NULL, &pipeline_layout);
7304 m_errorMonitor->VerifyNotFound();
7305 if (VK_SUCCESS == err) {
7306 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7307 }
7308 }
7309
7310 //
7311 // CmdPushConstants tests
7312 //
Karl Schultzc81037d2016-05-12 08:11:23 -06007313 const uint8_t dummy_values[100] = {};
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007314
7315 // Check for invalid offset and size and if range is within layout range(s)
Karl Schultzc81037d2016-05-12 08:11:23 -06007316 const std::array<PipelineLayoutTestCase, 16> cmd_range_tests = {{
7317 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7318 "vkCmdPushConstants() call has push constants with size 0. Size "
7319 "must be greater than zero and a multiple of 4."},
7320 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7321 "vkCmdPushConstants() call has push constants with size 1. Size "
7322 "must be greater than zero and a multiple of 4."},
7323 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 1},
7324 "vkCmdPushConstants() call has push constants with size 1. Size "
7325 "must be greater than zero and a multiple of 4."},
7326 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 0},
7327 "vkCmdPushConstants() call has push constants with offset 1. "
7328 "Offset must be a multiple of 4."},
7329 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7330 "vkCmdPushConstants() call has push constants with offset 1. "
7331 "Offset must be a multiple of 4."},
7332 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
7333 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
7334 "0x1 not within flag-matching ranges in pipeline layout"},
7335 {{VK_SHADER_STAGE_VERTEX_BIT, 60, 8},
7336 "vkCmdPushConstants() Push constant range [60, 68) with stageFlags = "
7337 "0x1 not within flag-matching ranges in pipeline layout"},
7338 {{VK_SHADER_STAGE_VERTEX_BIT, 76, 8},
7339 "vkCmdPushConstants() Push constant range [76, 84) with stageFlags = "
7340 "0x1 not within flag-matching ranges in pipeline layout"},
7341 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 80},
7342 "vkCmdPushConstants() Push constant range [0, 80) with stageFlags = "
7343 "0x1 not within flag-matching ranges in pipeline layout"},
7344 {{VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
7345 "vkCmdPushConstants() stageFlags = 0x2 do not match the stageFlags in "
7346 "any of the ranges in pipeline layout"},
7347 {{VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7348 0, 16},
7349 "vkCmdPushConstants() stageFlags = 0x3 do not match the stageFlags in "
7350 "any of the ranges in pipeline layout"},
7351 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007352 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007353 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007354 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007355 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007356 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007357 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007358 "vkCmdPushConstants() call has push constants with offset "},
Karl Schultzc81037d2016-05-12 08:11:23 -06007359 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007360 "vkCmdPushConstants() call has push constants with offset "},
7361 }};
7362
7363 // Two ranges for testing robustness
Karl Schultzc81037d2016-05-12 08:11:23 -06007364 const VkPushConstantRange pc_range2[] = {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007365 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16},
Karl Schultzc81037d2016-05-12 08:11:23 -06007366 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007367 };
Karl Schultzc81037d2016-05-12 08:11:23 -06007368 pipeline_layout_ci.pushConstantRangeCount =
7369 sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007370 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007371 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7372 &pipeline_layout);
7373 ASSERT_VK_SUCCESS(err);
7374 BeginCommandBuffer();
Karl Schultzc81037d2016-05-12 08:11:23 -06007375 for (const auto &iter : cmd_range_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007376 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7377 iter.msg);
7378 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
Karl Schultzc81037d2016-05-12 08:11:23 -06007379 iter.range.stageFlags, iter.range.offset,
7380 iter.range.size, dummy_values);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007381 m_errorMonitor->VerifyFound();
7382 }
7383
7384 // Check for invalid stage flag
7385 m_errorMonitor->SetDesiredFailureMsg(
7386 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7387 "vkCmdPushConstants() call has no stageFlags set.");
7388 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0,
Karl Schultzc81037d2016-05-12 08:11:23 -06007389 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007390 m_errorMonitor->VerifyFound();
Karl Schultzc81037d2016-05-12 08:11:23 -06007391 EndCommandBuffer();
7392 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
7393 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007394
Karl Schultzc81037d2016-05-12 08:11:23 -06007395 // overlapping range tests with cmd
7396 const std::array<PipelineLayoutTestCase, 3> cmd_overlap_tests = {{
7397 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 20},
7398 "vkCmdPushConstants() Push constant range [0, 20) with stageFlags = "
7399 "0x1 not within flag-matching ranges in pipeline layout"},
7400 {{VK_SHADER_STAGE_VERTEX_BIT, 16, 4},
7401 "vkCmdPushConstants() Push constant range [16, 20) with stageFlags = "
7402 "0x1 not within flag-matching ranges in pipeline layout"},
7403 {{VK_SHADER_STAGE_VERTEX_BIT, 40, 16},
7404 "vkCmdPushConstants() Push constant range [40, 56) with stageFlags = "
7405 "0x1 not within flag-matching ranges in pipeline layout"},
7406 }};
7407 const VkPushConstantRange pc_range3[] = {
7408 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
7409 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7410 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7411 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
7412 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
7413 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
7414 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
7415 };
7416 pipeline_layout_ci.pushConstantRangeCount =
7417 sizeof(pc_range3) / sizeof(VkPushConstantRange);
7418 pipeline_layout_ci.pPushConstantRanges = pc_range3;
7419 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7420 &pipeline_layout);
7421 ASSERT_VK_SUCCESS(err);
7422 BeginCommandBuffer();
7423 for (const auto &iter : cmd_overlap_tests) {
7424 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7425 iter.msg);
7426 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
7427 iter.range.stageFlags, iter.range.offset,
7428 iter.range.size, dummy_values);
7429 m_errorMonitor->VerifyFound();
7430 }
7431 EndCommandBuffer();
7432 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
7433 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7434
7435 // positive overlapping range tests with cmd
7436 const std::array<PipelineLayoutTestCase, 4> cmd_overlap_tests_pos = {{
7437 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 16}, ""},
7438 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 4}, ""},
7439 {{VK_SHADER_STAGE_VERTEX_BIT, 20, 12}, ""},
7440 {{VK_SHADER_STAGE_VERTEX_BIT, 56, 36}, ""},
7441 }};
7442 const VkPushConstantRange pc_range4[] = {
7443 {VK_SHADER_STAGE_VERTEX_BIT, 0, 64},
7444 {VK_SHADER_STAGE_VERTEX_BIT, 20, 16},
7445 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7446 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7447 {VK_SHADER_STAGE_VERTEX_BIT, 44, 8},
7448 {VK_SHADER_STAGE_VERTEX_BIT, 80, 12},
7449 {VK_SHADER_STAGE_VERTEX_BIT, 36, 8},
7450 {VK_SHADER_STAGE_VERTEX_BIT, 56, 28},
7451 };
7452 pipeline_layout_ci.pushConstantRangeCount =
7453 sizeof(pc_range4) / sizeof(VkPushConstantRange);
7454 pipeline_layout_ci.pPushConstantRanges = pc_range4;
7455 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7456 &pipeline_layout);
7457 ASSERT_VK_SUCCESS(err);
7458 BeginCommandBuffer();
7459 for (const auto &iter : cmd_overlap_tests_pos) {
7460 m_errorMonitor->ExpectSuccess();
7461 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout,
7462 iter.range.stageFlags, iter.range.offset,
7463 iter.range.size, dummy_values);
7464 m_errorMonitor->VerifyNotFound();
7465 }
7466 EndCommandBuffer();
7467 vkResetCommandBuffer(m_commandBuffer->GetBufferHandle(), 0);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007468 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7469}
7470
Karl Schultz6addd812016-02-02 17:17:23 -07007471TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007472 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007473 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007474
7475 ASSERT_NO_FATAL_FAILURE(InitState());
7476 ASSERT_NO_FATAL_FAILURE(InitViewport());
7477 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7478
Mike Stroyanb8a61002016-06-20 16:00:28 -06007479 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
7480 VkImageTiling tiling;
7481 VkFormatProperties format_properties;
7482 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
7483 if (format_properties.linearTilingFeatures &
7484 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
7485 tiling = VK_IMAGE_TILING_LINEAR;
7486 } else if (format_properties.optimalTilingFeatures &
7487 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
7488 tiling = VK_IMAGE_TILING_OPTIMAL;
7489 } else {
7490 printf("Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; "
7491 "skipped.\n");
7492 return;
7493 }
7494
Tobin Ehlis559c6382015-11-05 09:52:49 -07007495 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7496 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007497 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7498 ds_type_count[0].descriptorCount = 10;
7499 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7500 ds_type_count[1].descriptorCount = 2;
7501 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7502 ds_type_count[2].descriptorCount = 2;
7503 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7504 ds_type_count[3].descriptorCount = 5;
7505 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7506 // type
7507 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7508 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7509 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007510
7511 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007512 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7513 ds_pool_ci.pNext = NULL;
7514 ds_pool_ci.maxSets = 5;
7515 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7516 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007517
7518 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007519 err =
7520 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007521 ASSERT_VK_SUCCESS(err);
7522
7523 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7524 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007525 dsl_binding[0].binding = 0;
7526 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7527 dsl_binding[0].descriptorCount = 5;
7528 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7529 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007530
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007531 // Create layout identical to set0 layout but w/ different stageFlags
7532 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007533 dsl_fs_stage_only.binding = 0;
7534 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7535 dsl_fs_stage_only.descriptorCount = 5;
7536 dsl_fs_stage_only.stageFlags =
7537 VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7538 // bind time
7539 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007540 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007541 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7542 ds_layout_ci.pNext = NULL;
7543 ds_layout_ci.bindingCount = 1;
7544 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007545 static const uint32_t NUM_LAYOUTS = 4;
7546 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007547 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007548 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7549 // layout for error case
7550 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7551 &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007552 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007553 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Karl Schultz6addd812016-02-02 17:17:23 -07007554 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7555 &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007556 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007557 dsl_binding[0].binding = 0;
7558 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007559 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007560 dsl_binding[1].binding = 1;
7561 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7562 dsl_binding[1].descriptorCount = 2;
7563 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7564 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007565 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007566 ds_layout_ci.bindingCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07007567 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7568 &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007569 ASSERT_VK_SUCCESS(err);
7570 dsl_binding[0].binding = 0;
7571 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007572 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007573 ds_layout_ci.bindingCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007574 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7575 &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007576 ASSERT_VK_SUCCESS(err);
7577 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007578 dsl_binding[0].descriptorCount = 2;
Karl Schultz6addd812016-02-02 17:17:23 -07007579 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7580 &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007581 ASSERT_VK_SUCCESS(err);
7582
7583 static const uint32_t NUM_SETS = 4;
7584 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7585 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007586 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007587 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007588 alloc_info.descriptorPool = ds_pool;
7589 alloc_info.pSetLayouts = ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007590 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
7591 descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007592 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007593 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007594 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007595 alloc_info.pSetLayouts = &ds_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07007596 err =
7597 vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007598 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007599
7600 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007601 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7602 pipeline_layout_ci.pNext = NULL;
7603 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7604 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007605
7606 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007607 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7608 &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007609 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007610 // Create pipelineLayout with only one setLayout
7611 pipeline_layout_ci.setLayoutCount = 1;
7612 VkPipelineLayout single_pipe_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007613 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7614 &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007615 ASSERT_VK_SUCCESS(err);
7616 // Create pipelineLayout with 2 descriptor setLayout at index 0
7617 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7618 VkPipelineLayout pipe_layout_one_desc;
Karl Schultz6addd812016-02-02 17:17:23 -07007619 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7620 &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007621 ASSERT_VK_SUCCESS(err);
7622 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7623 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7624 VkPipelineLayout pipe_layout_five_samp;
Karl Schultz6addd812016-02-02 17:17:23 -07007625 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7626 &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007627 ASSERT_VK_SUCCESS(err);
7628 // Create pipelineLayout with UB type, but stageFlags for FS only
7629 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7630 VkPipelineLayout pipe_layout_fs_only;
Karl Schultz6addd812016-02-02 17:17:23 -07007631 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7632 &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007633 ASSERT_VK_SUCCESS(err);
7634 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7635 VkDescriptorSetLayout pl_bad_s0[2] = {};
7636 pl_bad_s0[0] = ds_layout_fs_only;
7637 pl_bad_s0[1] = ds_layout[1];
7638 pipeline_layout_ci.setLayoutCount = 2;
7639 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7640 VkPipelineLayout pipe_layout_bad_set0;
Karl Schultz6addd812016-02-02 17:17:23 -07007641 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7642 &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007643 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007644
7645 // Create a buffer to update the descriptor with
7646 uint32_t qfi = 0;
7647 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007648 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7649 buffCI.size = 1024;
7650 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7651 buffCI.queueFamilyIndexCount = 1;
7652 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007653
7654 VkBuffer dyub;
7655 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7656 ASSERT_VK_SUCCESS(err);
7657 // Correctly update descriptor to avoid "NOT_UPDATED" error
7658 static const uint32_t NUM_BUFFS = 5;
7659 VkDescriptorBufferInfo buffInfo[NUM_BUFFS] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007660 for (uint32_t i = 0; i < NUM_BUFFS; ++i) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007661 buffInfo[i].buffer = dyub;
7662 buffInfo[i].offset = 0;
7663 buffInfo[i].range = 1024;
7664 }
Karl Schultz6addd812016-02-02 17:17:23 -07007665 VkImage image;
Karl Schultz6addd812016-02-02 17:17:23 -07007666 const int32_t tex_width = 32;
7667 const int32_t tex_height = 32;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007668 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007669 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7670 image_create_info.pNext = NULL;
7671 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7672 image_create_info.format = tex_format;
7673 image_create_info.extent.width = tex_width;
7674 image_create_info.extent.height = tex_height;
7675 image_create_info.extent.depth = 1;
7676 image_create_info.mipLevels = 1;
7677 image_create_info.arrayLayers = 1;
7678 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyanb8a61002016-06-20 16:00:28 -06007679 image_create_info.tiling = tiling;
7680 image_create_info.usage =
7681 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -07007682 image_create_info.flags = 0;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007683 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
7684 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007685
Karl Schultz6addd812016-02-02 17:17:23 -07007686 VkMemoryRequirements memReqs;
7687 VkDeviceMemory imageMem;
7688 bool pass;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007689 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007690 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7691 memAlloc.pNext = NULL;
7692 memAlloc.allocationSize = 0;
7693 memAlloc.memoryTypeIndex = 0;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007694 vkGetImageMemoryRequirements(m_device->device(), image, &memReqs);
7695 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -07007696 pass =
7697 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007698 ASSERT_TRUE(pass);
7699 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &imageMem);
7700 ASSERT_VK_SUCCESS(err);
7701 err = vkBindImageMemory(m_device->device(), image, imageMem, 0);
7702 ASSERT_VK_SUCCESS(err);
7703
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007704 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007705 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
7706 image_view_create_info.image = image;
7707 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
7708 image_view_create_info.format = tex_format;
7709 image_view_create_info.subresourceRange.layerCount = 1;
7710 image_view_create_info.subresourceRange.baseMipLevel = 0;
7711 image_view_create_info.subresourceRange.levelCount = 1;
7712 image_view_create_info.subresourceRange.aspectMask =
7713 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007714
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007715 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -07007716 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
7717 &view);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007718 ASSERT_VK_SUCCESS(err);
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007719 VkDescriptorImageInfo imageInfo[4] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007720 imageInfo[0].imageView = view;
7721 imageInfo[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
7722 imageInfo[1].imageView = view;
7723 imageInfo[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007724 imageInfo[2].imageView = view;
7725 imageInfo[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
7726 imageInfo[3].imageView = view;
7727 imageInfo[3].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007728
7729 static const uint32_t NUM_SET_UPDATES = 3;
7730 VkWriteDescriptorSet descriptor_write[NUM_SET_UPDATES] = {};
7731 descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7732 descriptor_write[0].dstSet = descriptorSet[0];
7733 descriptor_write[0].dstBinding = 0;
7734 descriptor_write[0].descriptorCount = 5;
7735 descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7736 descriptor_write[0].pBufferInfo = buffInfo;
7737 descriptor_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7738 descriptor_write[1].dstSet = descriptorSet[1];
7739 descriptor_write[1].dstBinding = 0;
7740 descriptor_write[1].descriptorCount = 2;
7741 descriptor_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7742 descriptor_write[1].pImageInfo = imageInfo;
7743 descriptor_write[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7744 descriptor_write[2].dstSet = descriptorSet[1];
7745 descriptor_write[2].dstBinding = 1;
7746 descriptor_write[2].descriptorCount = 2;
7747 descriptor_write[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007748 descriptor_write[2].pImageInfo = &imageInfo[2];
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007749
7750 vkUpdateDescriptorSets(m_device->device(), 3, descriptor_write, 0, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007751
Tobin Ehlis88452832015-12-03 09:40:56 -07007752 // Create PSO to be used for draw-time errors below
7753 char const *vsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007754 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07007755 "\n"
Tony Barboure804d202016-01-05 13:37:45 -07007756 "out gl_PerVertex {\n"
7757 " vec4 gl_Position;\n"
7758 "};\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07007759 "void main(){\n"
7760 " gl_Position = vec4(1);\n"
7761 "}\n";
7762 char const *fsSource =
Chris Forbes7b342802016-04-07 13:20:10 +12007763 "#version 450\n"
Tobin Ehlis88452832015-12-03 09:40:56 -07007764 "\n"
7765 "layout(location=0) out vec4 x;\n"
7766 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7767 "void main(){\n"
7768 " x = vec4(bar.y);\n"
7769 "}\n";
7770 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7771 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007772 VkPipelineObj pipe(m_device);
7773 pipe.AddShader(&vs);
7774 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007775 pipe.AddColorAttachment();
7776 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007777
7778 BeginCommandBuffer();
Tobin Ehlis88452832015-12-03 09:40:56 -07007779
Karl Schultz6addd812016-02-02 17:17:23 -07007780 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
7781 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
7782 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7783 // of PSO
7784 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7785 // cmd_pipeline.c
7786 // due to the fact that cmd_alloc_dset_data() has not been called in
7787 // cmd_bind_graphics_pipeline()
7788 // TODO : Want to cause various binding incompatibility issues here to test
7789 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007790 // First cause various verify_layout_compatibility() fails
7791 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007792 // verify_set_layout_compatibility fail cases:
7793 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultz6addd812016-02-02 17:17:23 -07007794 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis10fad692016-07-07 12:00:36 -06007795 "Invalid VkPipelineLayout Object ");
Karl Schultz6addd812016-02-02 17:17:23 -07007796 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7797 VK_PIPELINE_BIND_POINT_GRAPHICS,
7798 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1,
7799 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007800 m_errorMonitor->VerifyFound();
7801
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007802 // 2. layoutIndex exceeds # of layouts in layout
Karl Schultz6addd812016-02-02 17:17:23 -07007803 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7804 " attempting to bind set to index 1");
7805 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7806 VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout,
7807 0, 2, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007808 m_errorMonitor->VerifyFound();
7809
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007810 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007811 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7812 // descriptors
7813 m_errorMonitor->SetDesiredFailureMsg(
7814 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06007815 " has 2 descriptors, but DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07007816 vkCmdBindDescriptorSets(
7817 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7818 pipe_layout_one_desc, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007819 m_errorMonitor->VerifyFound();
7820
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007821 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7822 // 4. same # of descriptors but mismatch in type
Karl Schultz6addd812016-02-02 17:17:23 -07007823 m_errorMonitor->SetDesiredFailureMsg(
7824 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06007825 " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
Karl Schultz6addd812016-02-02 17:17:23 -07007826 vkCmdBindDescriptorSets(
7827 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7828 pipe_layout_five_samp, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007829 m_errorMonitor->VerifyFound();
7830
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007831 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7832 // 5. same # of descriptors but mismatch in stageFlags
Karl Schultz6addd812016-02-02 17:17:23 -07007833 m_errorMonitor->SetDesiredFailureMsg(
7834 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis2d9deec2016-04-21 14:19:26 -06007835 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
Karl Schultz6addd812016-02-02 17:17:23 -07007836 vkCmdBindDescriptorSets(
7837 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7838 pipe_layout_fs_only, 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007839 m_errorMonitor->VerifyFound();
7840
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007841 // Cause INFO messages due to disturbing previously bound Sets
7842 // First bind sets 0 & 1
Karl Schultz6addd812016-02-02 17:17:23 -07007843 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7844 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7845 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007846 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Karl Schultz6addd812016-02-02 17:17:23 -07007847 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007848 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007849 " previously bound as set #0 was disturbed ");
7850 vkCmdBindDescriptorSets(
7851 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7852 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007853 m_errorMonitor->VerifyFound();
7854
Karl Schultz6addd812016-02-02 17:17:23 -07007855 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7856 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7857 2, &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007858 // 2. Disturb set after last bound set
Mark Lobodzinski510e20d2016-02-11 09:26:16 -07007859 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007860 " newly bound as set #0 so set #1 and "
7861 "any subsequent sets were disturbed ");
7862 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7863 VK_PIPELINE_BIND_POINT_GRAPHICS,
7864 pipe_layout_fs_only, 0, 1, &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007865 m_errorMonitor->VerifyFound();
7866
Tobin Ehlis10fad692016-07-07 12:00:36 -06007867 // Now that we're done actively using the pipelineLayout that gfx pipeline
7868 // was created with, we should be able to delete it. Do that now to verify
7869 // that validation obeys pipelineLayout lifetime
7870 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7871
Tobin Ehlis88452832015-12-03 09:40:56 -07007872 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007873 // 1. Error due to not binding required set (we actually use same code as
7874 // above to disturb set0)
7875 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7876 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7877 2, &descriptorSet[0], 0, NULL);
7878 vkCmdBindDescriptorSets(
7879 m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7880 pipe_layout_bad_set0, 1, 1, &descriptorSet[1], 0, NULL);
7881 m_errorMonitor->SetDesiredFailureMsg(
7882 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7883 " uses set #0 but that set is not bound.");
Tobin Ehlis88452832015-12-03 09:40:56 -07007884 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007885 m_errorMonitor->VerifyFound();
7886
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007887 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007888 // 2. Error due to bound set not being compatible with PSO's
7889 // VkPipelineLayout (diff stageFlags in this case)
7890 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(),
7891 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0,
7892 2, &descriptorSet[0], 0, NULL);
7893 m_errorMonitor->SetDesiredFailureMsg(
7894 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7895 " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007896 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007897 m_errorMonitor->VerifyFound();
7898
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007899 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007900 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007901 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7902 }
7903 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis9bfd4492016-05-05 15:09:11 -06007904 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &ds0_fs_only);
7905 vkFreeDescriptorSets(m_device->device(), ds_pool, NUM_SETS, descriptorSet);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007906 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007907 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7908 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06007909 vkFreeMemory(m_device->device(), imageMem, NULL);
7910 vkDestroyImage(m_device->device(), image, NULL);
7911 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007912}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007913
Karl Schultz6addd812016-02-02 17:17:23 -07007914TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007915
Karl Schultz6addd812016-02-02 17:17:23 -07007916 m_errorMonitor->SetDesiredFailureMsg(
7917 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007918 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007919
7920 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007921 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007922 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007923 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007924
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007925 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007926}
7927
Karl Schultz6addd812016-02-02 17:17:23 -07007928TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7929 VkResult err;
7930 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007931
Karl Schultz6addd812016-02-02 17:17:23 -07007932 m_errorMonitor->SetDesiredFailureMsg(
7933 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis61b36f32015-12-16 08:19:42 -07007934 " must specify a valid renderpass parameter.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007935
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007936 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007937
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007938 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007939 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007940 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007941 cmd.commandPool = m_commandPool;
7942 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007943 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007944
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007945 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007946 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007947
7948 // Force the failure by not setting the Renderpass and Framebuffer fields
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007949 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007950 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007951 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007952 cmd_buf_info.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007953 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
7954 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007955 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007956
7957 // The error should be caught by validation of the BeginCommandBuffer call
7958 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7959
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007960 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007961 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007962}
7963
Karl Schultz6addd812016-02-02 17:17:23 -07007964TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007965 // Cause error due to Begin while recording CB
7966 // Then cause 2 errors for attempting to reset CB w/o having
7967 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7968 // which CBs were allocated. Note that this bit is off by default.
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007970 "Cannot call Begin on CB");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007971
7972 ASSERT_NO_FATAL_FAILURE(InitState());
7973
7974 // Calls AllocateCommandBuffers
7975 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7976
Karl Schultz6addd812016-02-02 17:17:23 -07007977 // Force the failure by setting the Renderpass and Framebuffer fields with
7978 // (fake) data
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007979 VkCommandBufferBeginInfo cmd_buf_info = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007980 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007981 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7982 cmd_buf_info.pNext = NULL;
7983 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007984 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007985
7986 // Begin CB to transition to recording state
7987 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7988 // Can't re-begin. This should trigger error
7989 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007990 m_errorMonitor->VerifyFound();
7991
Karl Schultz6addd812016-02-02 17:17:23 -07007992 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7993 "Attempt to reset command buffer ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007994 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
7995 // Reset attempt will trigger error due to incorrect CommandPool state
7996 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007997 m_errorMonitor->VerifyFound();
7998
Karl Schultz6addd812016-02-02 17:17:23 -07007999 m_errorMonitor->SetDesiredFailureMsg(
8000 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8001 " attempts to implicitly reset cmdBuffer created from ");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008002 // Transition CB to RECORDED state
8003 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
8004 // Now attempting to Begin will implicitly reset, which triggers error
8005 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008006 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07008007}
8008
Karl Schultz6addd812016-02-02 17:17:23 -07008009TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008010 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07008011 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008012
Karl Schultz6addd812016-02-02 17:17:23 -07008013 m_errorMonitor->SetDesiredFailureMsg(
8014 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008015 "Invalid Pipeline CreateInfo State: Vtx Shader required");
8016
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008017 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06008018 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008019
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008020 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008021 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8022 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06008023
8024 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008025 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8026 ds_pool_ci.pNext = NULL;
8027 ds_pool_ci.maxSets = 1;
8028 ds_pool_ci.poolSizeCount = 1;
8029 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06008030
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008031 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008032 err =
8033 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008034 ASSERT_VK_SUCCESS(err);
8035
Tony Barboureb254902015-07-15 12:50:33 -06008036 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008037 dsl_binding.binding = 0;
8038 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8039 dsl_binding.descriptorCount = 1;
8040 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8041 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008042
Tony Barboureb254902015-07-15 12:50:33 -06008043 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008044 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8045 ds_layout_ci.pNext = NULL;
8046 ds_layout_ci.bindingCount = 1;
8047 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06008048
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008049 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008050 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8051 &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008052 ASSERT_VK_SUCCESS(err);
8053
8054 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008055 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008056 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008057 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008058 alloc_info.descriptorPool = ds_pool;
8059 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008060 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8061 &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008062 ASSERT_VK_SUCCESS(err);
8063
Tony Barboureb254902015-07-15 12:50:33 -06008064 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008065 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8066 pipeline_layout_ci.setLayoutCount = 1;
8067 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008068
8069 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008070 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8071 &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008072 ASSERT_VK_SUCCESS(err);
8073
Tobin Ehlise68360f2015-10-01 11:15:13 -06008074 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008075 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06008076
8077 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008078 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8079 vp_state_ci.scissorCount = 1;
8080 vp_state_ci.pScissors = &sc;
8081 vp_state_ci.viewportCount = 1;
8082 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008083
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008084 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8085 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8086 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8087 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8088 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8089 rs_state_ci.depthClampEnable = VK_FALSE;
8090 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8091 rs_state_ci.depthBiasEnable = VK_FALSE;
8092
Tony Barboureb254902015-07-15 12:50:33 -06008093 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008094 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8095 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008096 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008097 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8098 gp_ci.layout = pipeline_layout;
8099 gp_ci.renderPass = renderPass();
Tony Barboureb254902015-07-15 12:50:33 -06008100
8101 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008102 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8103 pc_ci.initialDataSize = 0;
8104 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008105
8106 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06008107 VkPipelineCache pipelineCache;
8108
Karl Schultz6addd812016-02-02 17:17:23 -07008109 err =
8110 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06008111 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008112 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8113 &gp_ci, NULL, &pipeline);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06008114
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008115 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008116
Chia-I Wuf7458c52015-10-26 21:10:41 +08008117 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8118 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8119 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8120 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008121}
Tobin Ehlis912df022015-09-17 08:46:18 -06008122/*// TODO : This test should be good, but needs Tess support in compiler to run
8123TEST_F(VkLayerTest, InvalidPatchControlPoints)
8124{
8125 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06008126 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008127
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07008128 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07008129 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
8130primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008131
Tobin Ehlis912df022015-09-17 08:46:18 -06008132 ASSERT_NO_FATAL_FAILURE(InitState());
8133 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06008134
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008135 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06008136 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008137 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008138
8139 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8140 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8141 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008142 ds_pool_ci.poolSizeCount = 1;
8143 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06008144
8145 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008146 err = vkCreateDescriptorPool(m_device->device(),
8147VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06008148 ASSERT_VK_SUCCESS(err);
8149
8150 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08008151 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06008152 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08008153 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008154 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8155 dsl_binding.pImmutableSamplers = NULL;
8156
8157 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008158 ds_layout_ci.sType =
8159VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06008160 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008161 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07008162 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06008163
8164 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008165 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8166&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06008167 ASSERT_VK_SUCCESS(err);
8168
8169 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07008170 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
8171VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06008172 ASSERT_VK_SUCCESS(err);
8173
8174 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008175 pipeline_layout_ci.sType =
8176VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06008177 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008178 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06008179 pipeline_layout_ci.pSetLayouts = &ds_layout;
8180
8181 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008182 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8183&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06008184 ASSERT_VK_SUCCESS(err);
8185
8186 VkPipelineShaderStageCreateInfo shaderStages[3];
8187 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
8188
Karl Schultz6addd812016-02-02 17:17:23 -07008189 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
8190this);
Tobin Ehlis912df022015-09-17 08:46:18 -06008191 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07008192 VkShaderObj
8193tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
8194this);
8195 VkShaderObj
8196te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
8197this);
Tobin Ehlis912df022015-09-17 08:46:18 -06008198
Karl Schultz6addd812016-02-02 17:17:23 -07008199 shaderStages[0].sType =
8200VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008201 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008202 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07008203 shaderStages[1].sType =
8204VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008205 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008206 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07008207 shaderStages[2].sType =
8208VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06008209 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06008210 shaderStages[2].shader = te.handle();
8211
8212 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008213 iaCI.sType =
8214VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08008215 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06008216
8217 VkPipelineTessellationStateCreateInfo tsCI = {};
8218 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
8219 tsCI.patchControlPoints = 0; // This will cause an error
8220
8221 VkGraphicsPipelineCreateInfo gp_ci = {};
8222 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8223 gp_ci.pNext = NULL;
8224 gp_ci.stageCount = 3;
8225 gp_ci.pStages = shaderStages;
8226 gp_ci.pVertexInputState = NULL;
8227 gp_ci.pInputAssemblyState = &iaCI;
8228 gp_ci.pTessellationState = &tsCI;
8229 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008230 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06008231 gp_ci.pMultisampleState = NULL;
8232 gp_ci.pDepthStencilState = NULL;
8233 gp_ci.pColorBlendState = NULL;
8234 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8235 gp_ci.layout = pipeline_layout;
8236 gp_ci.renderPass = renderPass();
8237
8238 VkPipelineCacheCreateInfo pc_ci = {};
8239 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8240 pc_ci.pNext = NULL;
8241 pc_ci.initialSize = 0;
8242 pc_ci.initialData = 0;
8243 pc_ci.maxSize = 0;
8244
8245 VkPipeline pipeline;
8246 VkPipelineCache pipelineCache;
8247
Karl Schultz6addd812016-02-02 17:17:23 -07008248 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
8249&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06008250 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008251 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8252&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06008253
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008254 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06008255
Chia-I Wuf7458c52015-10-26 21:10:41 +08008256 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8257 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8258 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8259 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06008260}
8261*/
Tobin Ehlise68360f2015-10-01 11:15:13 -06008262// Set scissor and viewport counts to different numbers
Karl Schultz6addd812016-02-02 17:17:23 -07008263TEST_F(VkLayerTest, PSOViewportScissorCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -07008264 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008265
Karl Schultz6addd812016-02-02 17:17:23 -07008266 m_errorMonitor->SetDesiredFailureMsg(
8267 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008268 "Gfx Pipeline viewport count (1) must match scissor count (0).");
8269
Tobin Ehlise68360f2015-10-01 11:15:13 -06008270 ASSERT_NO_FATAL_FAILURE(InitState());
8271 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008272
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008273 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008274 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8275 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008276
8277 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008278 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8279 ds_pool_ci.maxSets = 1;
8280 ds_pool_ci.poolSizeCount = 1;
8281 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008282
8283 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008284 err =
8285 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008286 ASSERT_VK_SUCCESS(err);
8287
8288 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008289 dsl_binding.binding = 0;
8290 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8291 dsl_binding.descriptorCount = 1;
8292 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008293
8294 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008295 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8296 ds_layout_ci.bindingCount = 1;
8297 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008298
8299 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008300 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8301 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008302 ASSERT_VK_SUCCESS(err);
8303
8304 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008305 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008306 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008307 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008308 alloc_info.descriptorPool = ds_pool;
8309 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008310 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8311 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008312 ASSERT_VK_SUCCESS(err);
8313
8314 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008315 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8316 pipeline_layout_ci.setLayoutCount = 1;
8317 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008318
8319 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008320 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8321 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008322 ASSERT_VK_SUCCESS(err);
8323
8324 VkViewport vp = {}; // Just need dummy vp to point to
8325
8326 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008327 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8328 vp_state_ci.scissorCount = 0;
8329 vp_state_ci.viewportCount = 1; // Count mismatch should cause error
8330 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008331
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008332 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8333 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8334 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8335 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8336 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8337 rs_state_ci.depthClampEnable = VK_FALSE;
8338 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8339 rs_state_ci.depthBiasEnable = VK_FALSE;
8340
Cody Northropeb3a6c12015-10-05 14:44:45 -06008341 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008342 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008343
Karl Schultz6addd812016-02-02 17:17:23 -07008344 VkShaderObj vs(m_device, bindStateVertShaderText,
8345 VK_SHADER_STAGE_VERTEX_BIT, this);
8346 VkShaderObj fs(m_device, bindStateFragShaderText,
8347 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008348 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008349 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008350 shaderStages[0] = vs.GetStageCreateInfo();
8351 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008352
8353 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008354 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8355 gp_ci.stageCount = 2;
8356 gp_ci.pStages = shaderStages;
8357 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008358 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008359 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8360 gp_ci.layout = pipeline_layout;
8361 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008362
8363 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008364 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008365
8366 VkPipeline pipeline;
8367 VkPipelineCache pipelineCache;
8368
Karl Schultz6addd812016-02-02 17:17:23 -07008369 err =
8370 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008371 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008372 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8373 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008374
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008375 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008376
Chia-I Wuf7458c52015-10-26 21:10:41 +08008377 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8378 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8379 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8380 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008381}
Karl Schultz6addd812016-02-02 17:17:23 -07008382// Don't set viewport state in PSO. This is an error b/c we always need this
8383// state
Tobin Ehlisd332f282015-10-02 11:00:56 -06008384// for the counts even if the data is going to be set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07008385TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Tobin Ehlise68360f2015-10-01 11:15:13 -06008386 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07008387 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008388
Karl Schultz6addd812016-02-02 17:17:23 -07008389 m_errorMonitor->SetDesiredFailureMsg(
8390 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008391 "Gfx Pipeline pViewportState is null. Even if ");
8392
Tobin Ehlise68360f2015-10-01 11:15:13 -06008393 ASSERT_NO_FATAL_FAILURE(InitState());
8394 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008395
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008396 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008397 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8398 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008399
8400 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008401 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8402 ds_pool_ci.maxSets = 1;
8403 ds_pool_ci.poolSizeCount = 1;
8404 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008405
8406 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008407 err =
8408 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008409 ASSERT_VK_SUCCESS(err);
8410
8411 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008412 dsl_binding.binding = 0;
8413 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8414 dsl_binding.descriptorCount = 1;
8415 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008416
8417 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008418 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8419 ds_layout_ci.bindingCount = 1;
8420 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008421
8422 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008423 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8424 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008425 ASSERT_VK_SUCCESS(err);
8426
8427 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008428 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008429 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008430 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008431 alloc_info.descriptorPool = ds_pool;
8432 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008433 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8434 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008435 ASSERT_VK_SUCCESS(err);
8436
8437 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008438 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8439 pipeline_layout_ci.setLayoutCount = 1;
8440 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008441
8442 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008443 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8444 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008445 ASSERT_VK_SUCCESS(err);
8446
8447 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8448 // Set scissor as dynamic to avoid second error
8449 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008450 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8451 dyn_state_ci.dynamicStateCount = 1;
8452 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008453
Cody Northropeb3a6c12015-10-05 14:44:45 -06008454 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008455 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008456
Karl Schultz6addd812016-02-02 17:17:23 -07008457 VkShaderObj vs(m_device, bindStateVertShaderText,
8458 VK_SHADER_STAGE_VERTEX_BIT, this);
8459 VkShaderObj fs(m_device, bindStateFragShaderText,
8460 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008461 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008462 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008463 shaderStages[0] = vs.GetStageCreateInfo();
8464 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008465
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008466
8467 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8468 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8469 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8470 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8471 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8472 rs_state_ci.depthClampEnable = VK_FALSE;
8473 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8474 rs_state_ci.depthBiasEnable = VK_FALSE;
8475
Tobin Ehlise68360f2015-10-01 11:15:13 -06008476 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008477 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8478 gp_ci.stageCount = 2;
8479 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008480 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008481 gp_ci.pViewportState = NULL; // Not setting VP state w/o dynamic vp state
8482 // should cause validation error
8483 gp_ci.pDynamicState = &dyn_state_ci;
8484 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8485 gp_ci.layout = pipeline_layout;
8486 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008487
8488 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008489 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008490
8491 VkPipeline pipeline;
8492 VkPipelineCache pipelineCache;
8493
Karl Schultz6addd812016-02-02 17:17:23 -07008494 err =
8495 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008496 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008497 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8498 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008499
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008500 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008501
Chia-I Wuf7458c52015-10-26 21:10:41 +08008502 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8503 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8504 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8505 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008506}
8507// Create PSO w/o non-zero viewportCount but no viewport data
Karl Schultz6addd812016-02-02 17:17:23 -07008508// Then run second test where dynamic scissor count doesn't match PSO scissor
8509// count
8510TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
8511 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008512
Karl Schultz6addd812016-02-02 17:17:23 -07008513 m_errorMonitor->SetDesiredFailureMsg(
8514 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008515 "Gfx Pipeline viewportCount is 1, but pViewports is NULL. ");
8516
Tobin Ehlise68360f2015-10-01 11:15:13 -06008517 ASSERT_NO_FATAL_FAILURE(InitState());
8518 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008519
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008520 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008521 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8522 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008523
8524 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008525 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8526 ds_pool_ci.maxSets = 1;
8527 ds_pool_ci.poolSizeCount = 1;
8528 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008529
8530 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07008531 err =
8532 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008533 ASSERT_VK_SUCCESS(err);
8534
8535 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008536 dsl_binding.binding = 0;
8537 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8538 dsl_binding.descriptorCount = 1;
8539 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008540
8541 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008542 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8543 ds_layout_ci.bindingCount = 1;
8544 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008545
8546 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008547 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8548 &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008549 ASSERT_VK_SUCCESS(err);
8550
8551 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008552 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008553 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008554 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008555 alloc_info.descriptorPool = ds_pool;
8556 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008557 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8558 &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008559 ASSERT_VK_SUCCESS(err);
8560
8561 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008562 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8563 pipeline_layout_ci.setLayoutCount = 1;
8564 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008565
8566 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07008567 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8568 &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008569 ASSERT_VK_SUCCESS(err);
8570
8571 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008572 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8573 vp_state_ci.viewportCount = 1;
8574 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
8575 vp_state_ci.scissorCount = 1;
8576 vp_state_ci.pScissors =
8577 NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008578
8579 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8580 // Set scissor as dynamic to avoid that error
8581 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008582 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8583 dyn_state_ci.dynamicStateCount = 1;
8584 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008585
Cody Northropeb3a6c12015-10-05 14:44:45 -06008586 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008587 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008588
Karl Schultz6addd812016-02-02 17:17:23 -07008589 VkShaderObj vs(m_device, bindStateVertShaderText,
8590 VK_SHADER_STAGE_VERTEX_BIT, this);
8591 VkShaderObj fs(m_device, bindStateFragShaderText,
8592 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008593 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008594 // but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008595 shaderStages[0] = vs.GetStageCreateInfo();
8596 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008597
Cody Northropf6622dc2015-10-06 10:33:21 -06008598 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8599 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8600 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008601 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008602 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008603 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008604 vi_ci.pVertexAttributeDescriptions = nullptr;
8605
8606 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8607 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8608 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8609
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008610 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008611 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Cody Northropf6622dc2015-10-06 10:33:21 -06008612 rs_ci.pNext = nullptr;
8613
Mark Youngc89c6312016-03-31 16:03:20 -06008614 VkPipelineColorBlendAttachmentState att = {};
8615 att.blendEnable = VK_FALSE;
8616 att.colorWriteMask = 0xf;
8617
Cody Northropf6622dc2015-10-06 10:33:21 -06008618 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8619 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8620 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008621 cb_ci.attachmentCount = 1;
8622 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008623
Tobin Ehlise68360f2015-10-01 11:15:13 -06008624 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008625 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8626 gp_ci.stageCount = 2;
8627 gp_ci.pStages = shaderStages;
8628 gp_ci.pVertexInputState = &vi_ci;
8629 gp_ci.pInputAssemblyState = &ia_ci;
8630 gp_ci.pViewportState = &vp_state_ci;
8631 gp_ci.pRasterizationState = &rs_ci;
8632 gp_ci.pColorBlendState = &cb_ci;
8633 gp_ci.pDynamicState = &dyn_state_ci;
8634 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8635 gp_ci.layout = pipeline_layout;
8636 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008637
8638 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008639 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008640
8641 VkPipeline pipeline;
8642 VkPipelineCache pipelineCache;
8643
Karl Schultz6addd812016-02-02 17:17:23 -07008644 err =
8645 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008646 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07008647 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8648 &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008649
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008650 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008651
Tobin Ehlisd332f282015-10-02 11:00:56 -06008652 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008653 // First need to successfully create the PSO from above by setting
8654 // pViewports
8655 m_errorMonitor->SetDesiredFailureMsg(
8656 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8657 "Dynamic scissorCount from vkCmdSetScissor() is 2, but PSO "
8658 "scissorCount is 1. These counts must match.");
8659
8660 VkViewport vp = {}; // Just need dummy vp to point to
8661 vp_state_ci.pViewports = &vp;
8662 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8663 &gp_ci, NULL, &pipeline);
8664 ASSERT_VK_SUCCESS(err);
8665 BeginCommandBuffer();
8666 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8667 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
8668 VkRect2D scissors[2] = {}; // don't care about data
8669 // Count of 2 doesn't match PSO count of 1
8670 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 0, 2, scissors);
8671 Draw(1, 0, 0, 0);
8672
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008673 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008674
8675 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8676 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8677 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8678 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008679 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008680}
8681// Create PSO w/o non-zero scissorCount but no scissor data
8682// Then run second test where dynamic viewportCount doesn't match PSO
8683// viewportCount
8684TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8685 VkResult err;
8686
8687 m_errorMonitor->SetDesiredFailureMsg(
8688 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8689 "Gfx Pipeline scissorCount is 1, but pScissors is NULL. ");
8690
8691 ASSERT_NO_FATAL_FAILURE(InitState());
8692 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8693
8694 VkDescriptorPoolSize ds_type_count = {};
8695 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8696 ds_type_count.descriptorCount = 1;
8697
8698 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8699 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8700 ds_pool_ci.maxSets = 1;
8701 ds_pool_ci.poolSizeCount = 1;
8702 ds_pool_ci.pPoolSizes = &ds_type_count;
8703
8704 VkDescriptorPool ds_pool;
8705 err =
8706 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
8707 ASSERT_VK_SUCCESS(err);
8708
8709 VkDescriptorSetLayoutBinding dsl_binding = {};
8710 dsl_binding.binding = 0;
8711 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8712 dsl_binding.descriptorCount = 1;
8713 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8714
8715 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8716 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8717 ds_layout_ci.bindingCount = 1;
8718 ds_layout_ci.pBindings = &dsl_binding;
8719
8720 VkDescriptorSetLayout ds_layout;
8721 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8722 &ds_layout);
8723 ASSERT_VK_SUCCESS(err);
8724
8725 VkDescriptorSet descriptorSet;
8726 VkDescriptorSetAllocateInfo alloc_info = {};
8727 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8728 alloc_info.descriptorSetCount = 1;
8729 alloc_info.descriptorPool = ds_pool;
8730 alloc_info.pSetLayouts = &ds_layout;
8731 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8732 &descriptorSet);
8733 ASSERT_VK_SUCCESS(err);
8734
8735 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8736 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8737 pipeline_layout_ci.setLayoutCount = 1;
8738 pipeline_layout_ci.pSetLayouts = &ds_layout;
8739
8740 VkPipelineLayout pipeline_layout;
8741 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8742 &pipeline_layout);
8743 ASSERT_VK_SUCCESS(err);
8744
8745 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8746 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8747 vp_state_ci.scissorCount = 1;
8748 vp_state_ci.pScissors =
8749 NULL; // Null scissor w/ count of 1 should cause error
8750 vp_state_ci.viewportCount = 1;
8751 vp_state_ci.pViewports =
8752 NULL; // vp is dynamic (below) so this won't cause error
8753
8754 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8755 // Set scissor as dynamic to avoid that error
8756 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8757 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8758 dyn_state_ci.dynamicStateCount = 1;
8759 dyn_state_ci.pDynamicStates = &vp_state;
8760
8761 VkPipelineShaderStageCreateInfo shaderStages[2];
8762 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8763
8764 VkShaderObj vs(m_device, bindStateVertShaderText,
8765 VK_SHADER_STAGE_VERTEX_BIT, this);
8766 VkShaderObj fs(m_device, bindStateFragShaderText,
8767 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -06008768 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -07008769 // but add it to be able to run on more devices
8770 shaderStages[0] = vs.GetStageCreateInfo();
8771 shaderStages[1] = fs.GetStageCreateInfo();
8772
8773 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8774 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8775 vi_ci.pNext = nullptr;
8776 vi_ci.vertexBindingDescriptionCount = 0;
8777 vi_ci.pVertexBindingDescriptions = nullptr;
8778 vi_ci.vertexAttributeDescriptionCount = 0;
8779 vi_ci.pVertexAttributeDescriptions = nullptr;
8780
8781 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8782 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8783 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8784
8785 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8786 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8787 rs_ci.pNext = nullptr;
8788
Mark Youngc89c6312016-03-31 16:03:20 -06008789 VkPipelineColorBlendAttachmentState att = {};
8790 att.blendEnable = VK_FALSE;
8791 att.colorWriteMask = 0xf;
8792
Karl Schultz6addd812016-02-02 17:17:23 -07008793 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8794 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8795 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008796 cb_ci.attachmentCount = 1;
8797 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008798
8799 VkGraphicsPipelineCreateInfo gp_ci = {};
8800 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8801 gp_ci.stageCount = 2;
8802 gp_ci.pStages = shaderStages;
8803 gp_ci.pVertexInputState = &vi_ci;
8804 gp_ci.pInputAssemblyState = &ia_ci;
8805 gp_ci.pViewportState = &vp_state_ci;
8806 gp_ci.pRasterizationState = &rs_ci;
8807 gp_ci.pColorBlendState = &cb_ci;
8808 gp_ci.pDynamicState = &dyn_state_ci;
8809 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8810 gp_ci.layout = pipeline_layout;
8811 gp_ci.renderPass = renderPass();
8812
8813 VkPipelineCacheCreateInfo pc_ci = {};
8814 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8815
8816 VkPipeline pipeline;
8817 VkPipelineCache pipelineCache;
8818
8819 err =
8820 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
8821 ASSERT_VK_SUCCESS(err);
8822 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8823 &gp_ci, NULL, &pipeline);
8824
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008825 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008826
8827 // Now hit second fail case where we set scissor w/ different count than PSO
8828 // First need to successfully create the PSO from above by setting
8829 // pViewports
8830 m_errorMonitor->SetDesiredFailureMsg(
8831 VK_DEBUG_REPORT_ERROR_BIT_EXT,
8832 "Dynamic viewportCount from vkCmdSetViewport() is 2, but PSO "
8833 "viewportCount is 1. These counts must match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008834
Tobin Ehlisd332f282015-10-02 11:00:56 -06008835 VkRect2D sc = {}; // Just need dummy vp to point to
8836 vp_state_ci.pScissors = &sc;
Karl Schultz6addd812016-02-02 17:17:23 -07008837 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8838 &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008839 ASSERT_VK_SUCCESS(err);
8840 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008841 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
8842 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008843 VkViewport viewports[2] = {}; // don't care about data
8844 // Count of 2 doesn't match PSO count of 1
Jon Ashburn19d3bf12015-12-30 14:06:55 -07008845 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 0, 2, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008846 Draw(1, 0, 0, 0);
8847
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008848 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008849
Chia-I Wuf7458c52015-10-26 21:10:41 +08008850 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8851 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8852 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8853 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008854 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008855}
8856
Mark Young7394fdd2016-03-31 14:56:43 -06008857TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8858 VkResult err;
8859
8860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06008861 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008862
8863 ASSERT_NO_FATAL_FAILURE(InitState());
8864 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8865
8866 VkDescriptorPoolSize ds_type_count = {};
8867 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8868 ds_type_count.descriptorCount = 1;
8869
8870 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8871 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8872 ds_pool_ci.maxSets = 1;
8873 ds_pool_ci.poolSizeCount = 1;
8874 ds_pool_ci.pPoolSizes = &ds_type_count;
8875
8876 VkDescriptorPool ds_pool;
8877 err =
8878 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
8879 ASSERT_VK_SUCCESS(err);
8880
8881 VkDescriptorSetLayoutBinding dsl_binding = {};
8882 dsl_binding.binding = 0;
8883 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8884 dsl_binding.descriptorCount = 1;
8885 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8886
8887 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8888 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8889 ds_layout_ci.bindingCount = 1;
8890 ds_layout_ci.pBindings = &dsl_binding;
8891
8892 VkDescriptorSetLayout ds_layout;
8893 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
8894 &ds_layout);
8895 ASSERT_VK_SUCCESS(err);
8896
8897 VkDescriptorSet descriptorSet;
8898 VkDescriptorSetAllocateInfo alloc_info = {};
8899 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8900 alloc_info.descriptorSetCount = 1;
8901 alloc_info.descriptorPool = ds_pool;
8902 alloc_info.pSetLayouts = &ds_layout;
8903 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
8904 &descriptorSet);
8905 ASSERT_VK_SUCCESS(err);
8906
8907 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8908 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8909 pipeline_layout_ci.setLayoutCount = 1;
8910 pipeline_layout_ci.pSetLayouts = &ds_layout;
8911
8912 VkPipelineLayout pipeline_layout;
8913 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
8914 &pipeline_layout);
8915 ASSERT_VK_SUCCESS(err);
8916
8917 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8918 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8919 vp_state_ci.scissorCount = 1;
8920 vp_state_ci.pScissors = NULL;
8921 vp_state_ci.viewportCount = 1;
8922 vp_state_ci.pViewports = NULL;
8923
8924 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT,
8925 VK_DYNAMIC_STATE_SCISSOR,
8926 VK_DYNAMIC_STATE_LINE_WIDTH};
8927 // Set scissor as dynamic to avoid that error
8928 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8929 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8930 dyn_state_ci.dynamicStateCount = 2;
8931 dyn_state_ci.pDynamicStates = dynamic_states;
8932
8933 VkPipelineShaderStageCreateInfo shaderStages[2];
8934 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8935
8936 VkShaderObj vs(m_device, bindStateVertShaderText,
8937 VK_SHADER_STAGE_VERTEX_BIT, this);
8938 VkShaderObj fs(m_device, bindStateFragShaderText,
8939 VK_SHADER_STAGE_FRAGMENT_BIT,
8940 this); // TODO - We shouldn't need a fragment shader
8941 // but add it to be able to run on more devices
8942 shaderStages[0] = vs.GetStageCreateInfo();
8943 shaderStages[1] = fs.GetStageCreateInfo();
8944
8945 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8946 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8947 vi_ci.pNext = nullptr;
8948 vi_ci.vertexBindingDescriptionCount = 0;
8949 vi_ci.pVertexBindingDescriptions = nullptr;
8950 vi_ci.vertexAttributeDescriptionCount = 0;
8951 vi_ci.pVertexAttributeDescriptions = nullptr;
8952
8953 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8954 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8955 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8956
8957 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8958 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8959 rs_ci.pNext = nullptr;
8960
Mark Young47107952016-05-02 15:59:55 -06008961 // Check too low (line width of -1.0f).
8962 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008963
8964 VkPipelineColorBlendAttachmentState att = {};
8965 att.blendEnable = VK_FALSE;
8966 att.colorWriteMask = 0xf;
8967
8968 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8969 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8970 cb_ci.pNext = nullptr;
8971 cb_ci.attachmentCount = 1;
8972 cb_ci.pAttachments = &att;
8973
8974 VkGraphicsPipelineCreateInfo gp_ci = {};
8975 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8976 gp_ci.stageCount = 2;
8977 gp_ci.pStages = shaderStages;
8978 gp_ci.pVertexInputState = &vi_ci;
8979 gp_ci.pInputAssemblyState = &ia_ci;
8980 gp_ci.pViewportState = &vp_state_ci;
8981 gp_ci.pRasterizationState = &rs_ci;
8982 gp_ci.pColorBlendState = &cb_ci;
8983 gp_ci.pDynamicState = &dyn_state_ci;
8984 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8985 gp_ci.layout = pipeline_layout;
8986 gp_ci.renderPass = renderPass();
8987
8988 VkPipelineCacheCreateInfo pc_ci = {};
8989 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8990
8991 VkPipeline pipeline;
8992 VkPipelineCache pipelineCache;
8993
8994 err =
8995 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
8996 ASSERT_VK_SUCCESS(err);
8997 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
8998 &gp_ci, NULL, &pipeline);
8999
9000 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009001 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009002
9003 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9004 "Attempt to set lineWidth to 65536");
9005
9006 // Check too high (line width of 65536.0f).
9007 rs_ci.lineWidth = 65536.0f;
9008
9009 err =
9010 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9011 ASSERT_VK_SUCCESS(err);
9012 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9013 &gp_ci, NULL, &pipeline);
9014
9015 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009016 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009017
9018 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young47107952016-05-02 15:59:55 -06009019 "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06009020
9021 dyn_state_ci.dynamicStateCount = 3;
9022
9023 rs_ci.lineWidth = 1.0f;
9024
9025 err =
9026 vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
9027 ASSERT_VK_SUCCESS(err);
9028 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
9029 &gp_ci, NULL, &pipeline);
9030 BeginCommandBuffer();
9031 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9032 VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
9033
9034 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06009035 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06009036 m_errorMonitor->VerifyFound();
9037
9038 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9039 "Attempt to set lineWidth to 65536");
9040
9041 // Check too high with dynamic setting.
9042 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
9043 m_errorMonitor->VerifyFound();
9044 EndCommandBuffer();
9045
9046 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
9047 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
9048 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9049 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009050 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06009051}
9052
Karl Schultz6addd812016-02-02 17:17:23 -07009053TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009054 // Bind a NULL RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009055 m_errorMonitor->SetDesiredFailureMsg(
9056 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009057 "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009058
9059 ASSERT_NO_FATAL_FAILURE(InitState());
9060 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009061
Tony Barbourfe3351b2015-07-28 10:17:20 -06009062 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009063 // Don't care about RenderPass handle b/c error should be flagged before
9064 // that
9065 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL,
9066 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009067
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009068 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009069}
9070
Karl Schultz6addd812016-02-02 17:17:23 -07009071TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009072 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009073 m_errorMonitor->SetDesiredFailureMsg(
9074 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009075 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009076
9077 ASSERT_NO_FATAL_FAILURE(InitState());
9078 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009079
Tony Barbourfe3351b2015-07-28 10:17:20 -06009080 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009081 // Just create a dummy Renderpass that's non-NULL so we can get to the
9082 // proper error
Chris Forbes38ae7c42016-06-21 20:51:44 +12009083 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
Karl Schultz6addd812016-02-02 17:17:23 -07009084 VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009085
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009086 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009087}
9088
Chris Forbes2eeabe32016-06-21 20:52:34 +12009089TEST_F(VkLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
9090 m_errorMonitor->ExpectSuccess();
9091
9092 ASSERT_NO_FATAL_FAILURE(InitState());
9093 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9094
9095 BeginCommandBuffer(); // framework implicitly begins the renderpass.
9096 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // end implicit.
9097
9098 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
9099 VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9100 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9101 m_errorMonitor->VerifyNotFound();
9102 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo,
9103 VK_SUBPASS_CONTENTS_INLINE);
9104 m_errorMonitor->VerifyNotFound();
9105 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9106 m_errorMonitor->VerifyNotFound();
9107
9108 m_commandBuffer->EndCommandBuffer();
9109 m_errorMonitor->VerifyNotFound();
9110}
9111
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009112TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
9113 TEST_DESCRIPTION("Begin a renderPass where clearValueCount is less than"
9114 "the number of renderPass attachments that use loadOp"
9115 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
9116
9117 ASSERT_NO_FATAL_FAILURE(InitState());
9118 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9119
9120 // Create a renderPass with a single attachment that uses loadOp CLEAR
9121 VkAttachmentReference attach = {};
9122 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
9123 VkSubpassDescription subpass = {};
9124 subpass.inputAttachmentCount = 1;
9125 subpass.pInputAttachments = &attach;
9126 VkRenderPassCreateInfo rpci = {};
9127 rpci.subpassCount = 1;
9128 rpci.pSubpasses = &subpass;
9129 rpci.attachmentCount = 1;
9130 VkAttachmentDescription attach_desc = {};
9131 attach_desc.format = VK_FORMAT_UNDEFINED;
9132 // Set loadOp to CLEAR
9133 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
9134 rpci.pAttachments = &attach_desc;
9135 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9136 VkRenderPass rp;
9137 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
9138
9139 VkCommandBufferInheritanceInfo hinfo = {};
9140 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
9141 hinfo.renderPass = VK_NULL_HANDLE;
9142 hinfo.subpass = 0;
9143 hinfo.framebuffer = VK_NULL_HANDLE;
9144 hinfo.occlusionQueryEnable = VK_FALSE;
9145 hinfo.queryFlags = 0;
9146 hinfo.pipelineStatistics = 0;
9147 VkCommandBufferBeginInfo info = {};
9148 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
9149 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9150 info.pInheritanceInfo = &hinfo;
9151
9152 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
9153 VkRenderPassBeginInfo rp_begin = {};
9154 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
9155 rp_begin.pNext = NULL;
9156 rp_begin.renderPass = renderPass();
9157 rp_begin.framebuffer = framebuffer();
9158 rp_begin.clearValueCount = 0; // Should be 1
9159
9160 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9161 " has a clearValueCount of 0 but the "
9162 "actual number of attachments in "
9163 "renderPass ");
9164
9165 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin,
9166 VK_SUBPASS_CONTENTS_INLINE);
9167
9168 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06009169
9170 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009171}
9172
Cody Northrop3bb4d962016-05-09 16:15:57 -06009173TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
9174
9175 TEST_DESCRIPTION("End a command buffer with an active render pass");
9176
9177 m_errorMonitor->SetDesiredFailureMsg(
9178 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9179 "It is invalid to issue this call inside an active render pass");
9180
9181 ASSERT_NO_FATAL_FAILURE(InitState());
9182 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9183
9184 // The framework's BeginCommandBuffer calls CreateRenderPass
9185 BeginCommandBuffer();
9186
9187 // Call directly into vkEndCommandBuffer instead of the
9188 // the framework's EndCommandBuffer, which inserts a
9189 // vkEndRenderPass
9190 vkEndCommandBuffer(m_commandBuffer->GetBufferHandle());
9191
9192 m_errorMonitor->VerifyFound();
9193
9194 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
9195 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
9196}
9197
Karl Schultz6addd812016-02-02 17:17:23 -07009198TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009199 // Call CmdFillBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07009200 m_errorMonitor->SetDesiredFailureMsg(
9201 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009202 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009203
9204 ASSERT_NO_FATAL_FAILURE(InitState());
9205 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009206
9207 // Renderpass is started here
9208 BeginCommandBuffer();
9209
9210 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009211 vk_testing::Buffer dstBuffer;
9212 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009213
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009214 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009215
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009216 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009217}
9218
Karl Schultz6addd812016-02-02 17:17:23 -07009219TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009220 // Call CmdUpdateBuffer within an active renderpass
Karl Schultz6addd812016-02-02 17:17:23 -07009221 m_errorMonitor->SetDesiredFailureMsg(
9222 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009223 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009224
9225 ASSERT_NO_FATAL_FAILURE(InitState());
9226 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009227
9228 // Renderpass is started here
9229 BeginCommandBuffer();
9230
9231 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009232 vk_testing::Buffer dstBuffer;
9233 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009234
Karl Schultz6addd812016-02-02 17:17:23 -07009235 VkDeviceSize dstOffset = 0;
9236 VkDeviceSize dataSize = 1024;
Karl Schultzee344492016-07-11 15:09:57 -06009237 const void *pData = NULL;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009238
Karl Schultz6addd812016-02-02 17:17:23 -07009239 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(),
9240 dstOffset, dataSize, pData);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009241
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009242 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009243}
9244
Karl Schultz6addd812016-02-02 17:17:23 -07009245TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009246 // Call CmdClearColorImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009247 m_errorMonitor->SetDesiredFailureMsg(
9248 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009249 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009250
9251 ASSERT_NO_FATAL_FAILURE(InitState());
9252 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009253
9254 // Renderpass is started here
9255 BeginCommandBuffer();
9256
Michael Lentine0a369f62016-02-03 16:51:46 -06009257 VkClearColorValue clear_color;
9258 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07009259 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9260 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9261 const int32_t tex_width = 32;
9262 const int32_t tex_height = 32;
9263 VkImageCreateInfo image_create_info = {};
9264 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9265 image_create_info.pNext = NULL;
9266 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9267 image_create_info.format = tex_format;
9268 image_create_info.extent.width = tex_width;
9269 image_create_info.extent.height = tex_height;
9270 image_create_info.extent.depth = 1;
9271 image_create_info.mipLevels = 1;
9272 image_create_info.arrayLayers = 1;
9273 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9274 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
9275 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009276
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009277 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07009278 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
9279 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009280
Karl Schultz6addd812016-02-02 17:17:23 -07009281 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
9282 image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009283
Karl Schultz6addd812016-02-02 17:17:23 -07009284 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(),
9285 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009286
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009287 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009288}
9289
Karl Schultz6addd812016-02-02 17:17:23 -07009290TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009291 // Call CmdClearDepthStencilImage within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009292 m_errorMonitor->SetDesiredFailureMsg(
9293 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009294 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009295
9296 ASSERT_NO_FATAL_FAILURE(InitState());
9297 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009298
9299 // Renderpass is started here
9300 BeginCommandBuffer();
9301
9302 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07009303 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009304 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
9305 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9306 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
9307 image_create_info.extent.width = 64;
9308 image_create_info.extent.height = 64;
9309 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9310 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009311
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009312 vk_testing::Image dstImage;
Karl Schultz6addd812016-02-02 17:17:23 -07009313 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info,
9314 reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009315
Karl Schultz6addd812016-02-02 17:17:23 -07009316 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(
9317 image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009318
Karl Schultz6addd812016-02-02 17:17:23 -07009319 vkCmdClearDepthStencilImage(
9320 m_commandBuffer->GetBufferHandle(), dstImage.handle(),
9321 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
9322 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009323
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009324 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009325}
9326
Karl Schultz6addd812016-02-02 17:17:23 -07009327TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009328 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009329 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009330
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07009331 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07009332 "vkCmdClearAttachments: This call "
9333 "must be issued inside an active "
9334 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009335
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009336 ASSERT_NO_FATAL_FAILURE(InitState());
9337 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009338
9339 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009340 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009341 ASSERT_VK_SUCCESS(err);
9342
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009343 VkClearAttachment color_attachment;
9344 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9345 color_attachment.clearValue.color.float32[0] = 0;
9346 color_attachment.clearValue.color.float32[1] = 0;
9347 color_attachment.clearValue.color.float32[2] = 0;
9348 color_attachment.clearValue.color.float32[3] = 0;
9349 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009350 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
9351 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
9352 &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009353
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009354 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009355}
9356
Karl Schultz9e66a292016-04-21 15:57:51 -06009357TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
9358 // Try to add a buffer memory barrier with no buffer.
9359 m_errorMonitor->SetDesiredFailureMsg(
9360 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9361 "required parameter pBufferMemoryBarriers[i].buffer specified as VK_NULL_HANDLE");
9362
9363 ASSERT_NO_FATAL_FAILURE(InitState());
9364 BeginCommandBuffer();
9365
9366 VkBufferMemoryBarrier buf_barrier = {};
9367 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9368 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9369 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9370 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9371 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9372 buf_barrier.buffer = VK_NULL_HANDLE;
9373 buf_barrier.offset = 0;
9374 buf_barrier.size = VK_WHOLE_SIZE;
9375 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9376 VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
9377 0, 0, nullptr, 1, &buf_barrier, 0, nullptr);
9378
9379 m_errorMonitor->VerifyFound();
9380}
9381
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009382TEST_F(VkLayerTest, InvalidBarriers) {
9383 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
9384
9385 m_errorMonitor->SetDesiredFailureMsg(
9386 VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
9387
9388 ASSERT_NO_FATAL_FAILURE(InitState());
9389 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9390
9391 VkMemoryBarrier mem_barrier = {};
9392 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
9393 mem_barrier.pNext = NULL;
9394 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9395 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9396 BeginCommandBuffer();
9397 // BeginCommandBuffer() starts a render pass
9398 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9399 VK_PIPELINE_STAGE_HOST_BIT,
9400 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
9401 &mem_barrier, 0, nullptr, 0, nullptr);
9402 m_errorMonitor->VerifyFound();
9403
9404 m_errorMonitor->SetDesiredFailureMsg(
9405 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9406 "Image Layout cannot be transitioned to UNDEFINED");
9407 VkImageObj image(m_device);
9408 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
9409 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
9410 ASSERT_TRUE(image.initialized());
9411 VkImageMemoryBarrier img_barrier = {};
9412 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9413 img_barrier.pNext = NULL;
9414 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9415 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9416 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9417 // New layout can't be UNDEFINED
9418 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9419 img_barrier.image = image.handle();
9420 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9421 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9422 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9423 img_barrier.subresourceRange.baseArrayLayer = 0;
9424 img_barrier.subresourceRange.baseMipLevel = 0;
9425 img_barrier.subresourceRange.layerCount = 1;
9426 img_barrier.subresourceRange.levelCount = 1;
9427 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9428 VK_PIPELINE_STAGE_HOST_BIT,
9429 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9430 nullptr, 1, &img_barrier);
9431 m_errorMonitor->VerifyFound();
9432 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9433
9434 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9435 "Subresource must have the sum of the "
9436 "baseArrayLayer");
9437 // baseArrayLayer + layerCount must be <= image's arrayLayers
9438 img_barrier.subresourceRange.baseArrayLayer = 1;
9439 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9440 VK_PIPELINE_STAGE_HOST_BIT,
9441 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9442 nullptr, 1, &img_barrier);
9443 m_errorMonitor->VerifyFound();
9444 img_barrier.subresourceRange.baseArrayLayer = 0;
9445
9446 m_errorMonitor->SetDesiredFailureMsg(
9447 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9448 "Subresource must have the sum of the baseMipLevel");
9449 // baseMipLevel + levelCount must be <= image's mipLevels
9450 img_barrier.subresourceRange.baseMipLevel = 1;
9451 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9452 VK_PIPELINE_STAGE_HOST_BIT,
9453 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9454 nullptr, 1, &img_barrier);
9455 m_errorMonitor->VerifyFound();
9456 img_barrier.subresourceRange.baseMipLevel = 0;
9457
9458 m_errorMonitor->SetDesiredFailureMsg(
9459 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9460 "Buffer Barriers cannot be used during a render pass");
9461 vk_testing::Buffer buffer;
9462 buffer.init(*m_device, 256);
9463 VkBufferMemoryBarrier buf_barrier = {};
9464 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9465 buf_barrier.pNext = NULL;
9466 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9467 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9468 buf_barrier.buffer = buffer.handle();
9469 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9470 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9471 buf_barrier.offset = 0;
9472 buf_barrier.size = VK_WHOLE_SIZE;
9473 // Can't send buffer barrier during a render pass
9474 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9475 VK_PIPELINE_STAGE_HOST_BIT,
9476 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9477 &buf_barrier, 0, nullptr);
9478 m_errorMonitor->VerifyFound();
9479 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9480
9481 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9482 "which is not less than total size");
9483 buf_barrier.offset = 257;
9484 // Offset greater than total size
9485 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9486 VK_PIPELINE_STAGE_HOST_BIT,
9487 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9488 &buf_barrier, 0, nullptr);
9489 m_errorMonitor->VerifyFound();
9490 buf_barrier.offset = 0;
9491
9492 m_errorMonitor->SetDesiredFailureMsg(
9493 VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
9494 buf_barrier.size = 257;
9495 // Size greater than total size
9496 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9497 VK_PIPELINE_STAGE_HOST_BIT,
9498 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9499 &buf_barrier, 0, nullptr);
9500 m_errorMonitor->VerifyFound();
9501 buf_barrier.size = VK_WHOLE_SIZE;
9502
9503 m_errorMonitor->SetDesiredFailureMsg(
9504 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9505 "Image is a depth and stencil format and thus must "
9506 "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
9507 "VK_IMAGE_ASPECT_STENCIL_BIT set.");
9508 VkDepthStencilObj ds_image(m_device);
9509 ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
9510 ASSERT_TRUE(ds_image.initialized());
9511 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9512 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9513 img_barrier.image = ds_image.handle();
9514 // Leave aspectMask at COLOR on purpose
9515 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
9516 VK_PIPELINE_STAGE_HOST_BIT,
9517 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
9518 nullptr, 1, &img_barrier);
9519 m_errorMonitor->VerifyFound();
9520}
9521
Karl Schultz6addd812016-02-02 17:17:23 -07009522TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009523 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009524 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009525
Karl Schultz6addd812016-02-02 17:17:23 -07009526 m_errorMonitor->SetDesiredFailureMsg(
9527 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009528 "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
9529
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009530 ASSERT_NO_FATAL_FAILURE(InitState());
9531 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009532 uint32_t qfi = 0;
9533 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009534 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9535 buffCI.size = 1024;
9536 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9537 buffCI.queueFamilyIndexCount = 1;
9538 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009539
9540 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009541 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009542 ASSERT_VK_SUCCESS(err);
9543
9544 BeginCommandBuffer();
9545 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009546 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9547 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009548 // Should error before calling to driver so don't care about actual data
Karl Schultz6addd812016-02-02 17:17:23 -07009549 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7,
9550 VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009551
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009552 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009553
Chia-I Wuf7458c52015-10-26 21:10:41 +08009554 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009555}
9556
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009557TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9558 // Create an out-of-range queueFamilyIndex
9559 m_errorMonitor->SetDesiredFailureMsg(
9560 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Dustin Gravesde628532016-04-21 16:30:17 -06009561 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
9562 "of the indices specified when the device was created, via the "
9563 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009564
9565 ASSERT_NO_FATAL_FAILURE(InitState());
9566 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9567 VkBufferCreateInfo buffCI = {};
9568 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9569 buffCI.size = 1024;
9570 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9571 buffCI.queueFamilyIndexCount = 1;
9572 // Introduce failure by specifying invalid queue_family_index
9573 uint32_t qfi = 777;
9574 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis24aab042016-03-24 10:54:18 -06009575 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009576
9577 VkBuffer ib;
9578 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
9579
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009580 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06009581 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009582}
9583
Karl Schultz6addd812016-02-02 17:17:23 -07009584TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
9585 // Attempt vkCmdExecuteCommands w/ a primary cmd buffer (should only be
9586 // secondary)
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009587
Karl Schultz6addd812016-02-02 17:17:23 -07009588 m_errorMonitor->SetDesiredFailureMsg(
9589 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009590 "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009591
9592 ASSERT_NO_FATAL_FAILURE(InitState());
9593 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009594
9595 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009596 // ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009597 VkCommandBuffer primCB = m_commandBuffer->GetBufferHandle();
9598 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &primCB);
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009599
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009600 m_errorMonitor->VerifyFound();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009601}
9602
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009603TEST_F(VkLayerTest, DSUsageBitsErrors) {
9604 TEST_DESCRIPTION("Attempt to update descriptor sets for images and buffers "
9605 "that do not have correct usage bits sets.");
9606 VkResult err;
9607
9608 ASSERT_NO_FATAL_FAILURE(InitState());
9609 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9610 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9611 ds_type_count[i].type = VkDescriptorType(i);
9612 ds_type_count[i].descriptorCount = 1;
9613 }
9614 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9615 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9616 ds_pool_ci.pNext = NULL;
9617 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9618 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9619 ds_pool_ci.pPoolSizes = ds_type_count;
9620
9621 VkDescriptorPool ds_pool;
9622 err =
9623 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9624 ASSERT_VK_SUCCESS(err);
9625
9626 // Create 10 layouts where each has a single descriptor of different type
9627 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] =
9628 {};
9629 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9630 dsl_binding[i].binding = 0;
9631 dsl_binding[i].descriptorType = VkDescriptorType(i);
9632 dsl_binding[i].descriptorCount = 1;
9633 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9634 dsl_binding[i].pImmutableSamplers = NULL;
9635 }
9636
9637 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9638 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9639 ds_layout_ci.pNext = NULL;
9640 ds_layout_ci.bindingCount = 1;
9641 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9642 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9643 ds_layout_ci.pBindings = dsl_binding + i;
9644 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci,
9645 NULL, ds_layouts + i);
9646 ASSERT_VK_SUCCESS(err);
9647 }
9648 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9649 VkDescriptorSetAllocateInfo alloc_info = {};
9650 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9651 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9652 alloc_info.descriptorPool = ds_pool;
9653 alloc_info.pSetLayouts = ds_layouts;
9654 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9655 descriptor_sets);
9656 ASSERT_VK_SUCCESS(err);
9657
9658 // Create a buffer & bufferView to be used for invalid updates
9659 VkBufferCreateInfo buff_ci = {};
9660 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9661 // This usage is not valid for any descriptor type
9662 buff_ci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
9663 buff_ci.size = 256;
9664 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9665 VkBuffer buffer;
9666 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9667 ASSERT_VK_SUCCESS(err);
9668
9669 VkBufferViewCreateInfo buff_view_ci = {};
9670 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9671 buff_view_ci.buffer = buffer;
9672 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9673 buff_view_ci.range = VK_WHOLE_SIZE;
9674 VkBufferView buff_view;
9675 err =
9676 vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
9677 ASSERT_VK_SUCCESS(err);
9678
9679 // Create an image to be used for invalid updates
9680 VkImageCreateInfo image_ci = {};
9681 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9682 image_ci.imageType = VK_IMAGE_TYPE_2D;
9683 image_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
9684 image_ci.extent.width = 64;
9685 image_ci.extent.height = 64;
9686 image_ci.extent.depth = 1;
9687 image_ci.mipLevels = 1;
9688 image_ci.arrayLayers = 1;
9689 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
9690 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9691 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
9692 // This usage is not valid for any descriptor type
9693 image_ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
9694 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9695 VkImage image;
9696 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9697 ASSERT_VK_SUCCESS(err);
9698 // Bind memory to image
9699 VkMemoryRequirements mem_reqs;
9700 VkDeviceMemory image_mem;
9701 bool pass;
9702 VkMemoryAllocateInfo mem_alloc = {};
9703 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9704 mem_alloc.pNext = NULL;
9705 mem_alloc.allocationSize = 0;
9706 mem_alloc.memoryTypeIndex = 0;
9707 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9708 mem_alloc.allocationSize = mem_reqs.size;
9709 pass =
9710 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
9711 ASSERT_TRUE(pass);
9712 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9713 ASSERT_VK_SUCCESS(err);
9714 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9715 ASSERT_VK_SUCCESS(err);
9716 // Now create view for image
9717 VkImageViewCreateInfo image_view_ci = {};
9718 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9719 image_view_ci.image = image;
9720 image_view_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
9721 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9722 image_view_ci.subresourceRange.layerCount = 1;
9723 image_view_ci.subresourceRange.baseArrayLayer = 0;
9724 image_view_ci.subresourceRange.levelCount = 1;
9725 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9726 VkImageView image_view;
9727 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
9728 &image_view);
9729 ASSERT_VK_SUCCESS(err);
9730
9731 VkDescriptorBufferInfo buff_info = {};
9732 buff_info.buffer = buffer;
9733 VkDescriptorImageInfo img_info = {};
9734 img_info.imageView = image_view;
9735 VkWriteDescriptorSet descriptor_write = {};
9736 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9737 descriptor_write.dstBinding = 0;
9738 descriptor_write.descriptorCount = 1;
9739 descriptor_write.pTexelBufferView = &buff_view;
9740 descriptor_write.pBufferInfo = &buff_info;
9741 descriptor_write.pImageInfo = &img_info;
9742
9743 // These error messages align with VkDescriptorType struct
9744 const char *error_msgs[] = {
9745 "", // placeholder, no error for SAMPLER descriptor
9746 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
9747 " does not have VK_IMAGE_USAGE_SAMPLED_BIT set.",
9748 " does not have VK_IMAGE_USAGE_STORAGE_BIT set.",
9749 " does not have VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT set.",
9750 " does not have VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set.",
9751 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
9752 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
9753 " does not have VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set.",
9754 " does not have VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set.",
9755 " does not have VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set."};
9756 // Start loop at 1 as SAMPLER desc type has no usage bit error
9757 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9758 descriptor_write.descriptorType = VkDescriptorType(i);
9759 descriptor_write.dstSet = descriptor_sets[i];
9760 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9761 error_msgs[i]);
9762
9763 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0,
9764 NULL);
9765
9766 m_errorMonitor->VerifyFound();
9767 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
9768 }
9769 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9770 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009771 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009772 vkDestroyImageView(m_device->device(), image_view, NULL);
9773 vkDestroyBuffer(m_device->device(), buffer, NULL);
9774 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9775 vkFreeDescriptorSets(m_device->device(), ds_pool,
9776 VK_DESCRIPTOR_TYPE_RANGE_SIZE, descriptor_sets);
9777 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9778}
9779
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009780TEST_F(VkLayerTest, DSBufferInfoErrors) {
9781 TEST_DESCRIPTION(
9782 "Attempt to update buffer descriptor set that has incorrect "
9783 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
9784 "1. offset value greater than buffer size\n"
9785 "2. range value of 0\n"
9786 "3. range value greater than buffer (size - offset)");
9787 VkResult err;
9788
9789 ASSERT_NO_FATAL_FAILURE(InitState());
9790 VkDescriptorPoolSize ds_type_count = {};
9791 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9792 ds_type_count.descriptorCount = 1;
9793
9794 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9795 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9796 ds_pool_ci.pNext = NULL;
9797 ds_pool_ci.maxSets = 1;
9798 ds_pool_ci.poolSizeCount = 1;
9799 ds_pool_ci.pPoolSizes = &ds_type_count;
9800
9801 VkDescriptorPool ds_pool;
9802 err =
9803 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9804 ASSERT_VK_SUCCESS(err);
9805
9806 // Create layout with single uniform buffer descriptor
9807 VkDescriptorSetLayoutBinding dsl_binding = {};
9808 dsl_binding.binding = 0;
9809 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9810 dsl_binding.descriptorCount = 1;
9811 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9812 dsl_binding.pImmutableSamplers = NULL;
9813
9814 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9815 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9816 ds_layout_ci.pNext = NULL;
9817 ds_layout_ci.bindingCount = 1;
9818 ds_layout_ci.pBindings = &dsl_binding;
9819 VkDescriptorSetLayout ds_layout;
9820 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9821 &ds_layout);
9822 ASSERT_VK_SUCCESS(err);
9823
9824 VkDescriptorSet descriptor_set = {};
9825 VkDescriptorSetAllocateInfo alloc_info = {};
9826 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9827 alloc_info.descriptorSetCount = 1;
9828 alloc_info.descriptorPool = ds_pool;
9829 alloc_info.pSetLayouts = &ds_layout;
9830 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9831 &descriptor_set);
9832 ASSERT_VK_SUCCESS(err);
9833
9834 // Create a buffer to be used for invalid updates
9835 VkBufferCreateInfo buff_ci = {};
9836 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9837 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9838 buff_ci.size = 256;
9839 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9840 VkBuffer buffer;
9841 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9842 ASSERT_VK_SUCCESS(err);
9843 // Have to bind memory to buffer before descriptor update
9844 VkMemoryAllocateInfo mem_alloc = {};
9845 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9846 mem_alloc.pNext = NULL;
9847 mem_alloc.allocationSize = 256;
9848 mem_alloc.memoryTypeIndex = 0;
9849
9850 VkMemoryRequirements mem_reqs;
9851 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
9852 bool pass =
9853 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
9854 if (!pass) {
9855 vkDestroyBuffer(m_device->device(), buffer, NULL);
9856 return;
9857 }
9858
9859 VkDeviceMemory mem;
9860 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
9861 ASSERT_VK_SUCCESS(err);
9862 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9863 ASSERT_VK_SUCCESS(err);
9864
9865 VkDescriptorBufferInfo buff_info = {};
9866 buff_info.buffer = buffer;
9867 // First make offset 1 larger than buffer size
9868 buff_info.offset = 257;
9869 buff_info.range = VK_WHOLE_SIZE;
9870 VkWriteDescriptorSet descriptor_write = {};
9871 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9872 descriptor_write.dstBinding = 0;
9873 descriptor_write.descriptorCount = 1;
9874 descriptor_write.pTexelBufferView = nullptr;
9875 descriptor_write.pBufferInfo = &buff_info;
9876 descriptor_write.pImageInfo = nullptr;
9877
9878 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9879 descriptor_write.dstSet = descriptor_set;
9880 m_errorMonitor->SetDesiredFailureMsg(
9881 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9882 " offset of 257 is greater than buffer ");
9883
9884 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9885
9886 m_errorMonitor->VerifyFound();
9887 // Now cause error due to range of 0
9888 buff_info.offset = 0;
9889 buff_info.range = 0;
9890 m_errorMonitor->SetDesiredFailureMsg(
9891 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9892 " range is not VK_WHOLE_SIZE and is zero, which is not allowed.");
9893
9894 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9895
9896 m_errorMonitor->VerifyFound();
9897 // Now cause error due to range exceeding buffer size - offset
9898 buff_info.offset = 128;
9899 buff_info.range = 200;
9900 m_errorMonitor->SetDesiredFailureMsg(
9901 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9902 " range is 200 which is greater than buffer size ");
9903
9904 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9905
9906 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -06009907 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009908 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9909 vkDestroyBuffer(m_device->device(), buffer, NULL);
9910 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9911 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9912}
9913
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009914TEST_F(VkLayerTest, DSAspectBitsErrors) {
9915 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
9916 // are set, but could expand this test to hit more cases.
9917 TEST_DESCRIPTION("Attempt to update descriptor sets for images "
9918 "that do not have correct aspect bits sets.");
9919 VkResult err;
9920
9921 ASSERT_NO_FATAL_FAILURE(InitState());
9922 VkDescriptorPoolSize ds_type_count = {};
9923 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9924 ds_type_count.descriptorCount = 1;
9925
9926 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9927 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9928 ds_pool_ci.pNext = NULL;
9929 ds_pool_ci.maxSets = 5;
9930 ds_pool_ci.poolSizeCount = 1;
9931 ds_pool_ci.pPoolSizes = &ds_type_count;
9932
9933 VkDescriptorPool ds_pool;
9934 err =
9935 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9936 ASSERT_VK_SUCCESS(err);
9937
9938 VkDescriptorSetLayoutBinding dsl_binding = {};
9939 dsl_binding.binding = 0;
9940 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9941 dsl_binding.descriptorCount = 1;
9942 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9943 dsl_binding.pImmutableSamplers = NULL;
9944
9945 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9946 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9947 ds_layout_ci.pNext = NULL;
9948 ds_layout_ci.bindingCount = 1;
9949 ds_layout_ci.pBindings = &dsl_binding;
9950 VkDescriptorSetLayout ds_layout;
9951 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
9952 &ds_layout);
9953 ASSERT_VK_SUCCESS(err);
9954
9955 VkDescriptorSet descriptor_set = {};
9956 VkDescriptorSetAllocateInfo alloc_info = {};
9957 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9958 alloc_info.descriptorSetCount = 1;
9959 alloc_info.descriptorPool = ds_pool;
9960 alloc_info.pSetLayouts = &ds_layout;
9961 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
9962 &descriptor_set);
9963 ASSERT_VK_SUCCESS(err);
9964
9965 // Create an image to be used for invalid updates
9966 VkImageCreateInfo image_ci = {};
9967 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9968 image_ci.imageType = VK_IMAGE_TYPE_2D;
9969 image_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
9970 image_ci.extent.width = 64;
9971 image_ci.extent.height = 64;
9972 image_ci.extent.depth = 1;
9973 image_ci.mipLevels = 1;
9974 image_ci.arrayLayers = 1;
9975 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
9976 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9977 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
9978 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
9979 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9980 VkImage image;
9981 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9982 ASSERT_VK_SUCCESS(err);
9983 // Bind memory to image
9984 VkMemoryRequirements mem_reqs;
9985 VkDeviceMemory image_mem;
9986 bool pass;
9987 VkMemoryAllocateInfo mem_alloc = {};
9988 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9989 mem_alloc.pNext = NULL;
9990 mem_alloc.allocationSize = 0;
9991 mem_alloc.memoryTypeIndex = 0;
9992 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9993 mem_alloc.allocationSize = mem_reqs.size;
9994 pass =
9995 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
9996 ASSERT_TRUE(pass);
9997 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9998 ASSERT_VK_SUCCESS(err);
9999 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10000 ASSERT_VK_SUCCESS(err);
10001 // Now create view for image
10002 VkImageViewCreateInfo image_view_ci = {};
10003 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10004 image_view_ci.image = image;
10005 image_view_ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
10006 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10007 image_view_ci.subresourceRange.layerCount = 1;
10008 image_view_ci.subresourceRange.baseArrayLayer = 0;
10009 image_view_ci.subresourceRange.levelCount = 1;
10010 // Setting both depth & stencil aspect bits is illegal for descriptor
10011 image_view_ci.subresourceRange.aspectMask =
10012 VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
10013
10014 VkImageView image_view;
10015 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL,
10016 &image_view);
10017 ASSERT_VK_SUCCESS(err);
10018
10019 VkDescriptorImageInfo img_info = {};
10020 img_info.imageView = image_view;
10021 VkWriteDescriptorSet descriptor_write = {};
10022 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10023 descriptor_write.dstBinding = 0;
10024 descriptor_write.descriptorCount = 1;
10025 descriptor_write.pTexelBufferView = NULL;
10026 descriptor_write.pBufferInfo = NULL;
10027 descriptor_write.pImageInfo = &img_info;
10028 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10029 descriptor_write.dstSet = descriptor_set;
10030 const char *error_msg = " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10031 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
10032 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10033 error_msg);
10034
10035 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10036
10037 m_errorMonitor->VerifyFound();
10038 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10039 vkDestroyImage(m_device->device(), image, NULL);
10040 vkFreeMemory(m_device->device(), image_mem, NULL);
10041 vkDestroyImageView(m_device->device(), image_view, NULL);
10042 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10043 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10044}
10045
Karl Schultz6addd812016-02-02 17:17:23 -070010046TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010047 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010048 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010049
Karl Schultz6addd812016-02-02 17:17:23 -070010050 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010051 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10052 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10053 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010054
Tobin Ehlis3b780662015-05-28 12:11:26 -060010055 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010056 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010057 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010058 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10059 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010060
10061 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010062 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10063 ds_pool_ci.pNext = NULL;
10064 ds_pool_ci.maxSets = 1;
10065 ds_pool_ci.poolSizeCount = 1;
10066 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010067
Tobin Ehlis3b780662015-05-28 12:11:26 -060010068 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010069 err =
10070 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010071 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010072 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010073 dsl_binding.binding = 0;
10074 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10075 dsl_binding.descriptorCount = 1;
10076 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10077 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010078
Tony Barboureb254902015-07-15 12:50:33 -060010079 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010080 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10081 ds_layout_ci.pNext = NULL;
10082 ds_layout_ci.bindingCount = 1;
10083 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010084
Tobin Ehlis3b780662015-05-28 12:11:26 -060010085 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010086 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10087 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010088 ASSERT_VK_SUCCESS(err);
10089
10090 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010091 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010092 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010093 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010094 alloc_info.descriptorPool = ds_pool;
10095 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010096 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10097 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010098 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010099
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010100 VkSamplerCreateInfo sampler_ci = {};
10101 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10102 sampler_ci.pNext = NULL;
10103 sampler_ci.magFilter = VK_FILTER_NEAREST;
10104 sampler_ci.minFilter = VK_FILTER_NEAREST;
10105 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10106 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10107 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10108 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10109 sampler_ci.mipLodBias = 1.0;
10110 sampler_ci.anisotropyEnable = VK_FALSE;
10111 sampler_ci.maxAnisotropy = 1;
10112 sampler_ci.compareEnable = VK_FALSE;
10113 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10114 sampler_ci.minLod = 1.0;
10115 sampler_ci.maxLod = 1.0;
10116 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10117 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10118 VkSampler sampler;
10119 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10120 ASSERT_VK_SUCCESS(err);
10121
10122 VkDescriptorImageInfo info = {};
10123 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010124
10125 VkWriteDescriptorSet descriptor_write;
10126 memset(&descriptor_write, 0, sizeof(descriptor_write));
10127 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010128 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010129 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010130 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010131 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010132 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010133
10134 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10135
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010136 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010137
Chia-I Wuf7458c52015-10-26 21:10:41 +080010138 vkDestroySampler(m_device->device(), sampler, NULL);
10139 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10140 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010141}
10142
Karl Schultz6addd812016-02-02 17:17:23 -070010143TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010144 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010145 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010146
Karl Schultz6addd812016-02-02 17:17:23 -070010147 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010148 VK_DEBUG_REPORT_ERROR_BIT_EXT,
10149 " binding #0 with 1 total descriptors but update of 1 descriptors "
10150 "starting at binding offset of 0 combined with update array element "
10151 "offset of 1 oversteps the size of this descriptor set.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010152
Tobin Ehlis3b780662015-05-28 12:11:26 -060010153 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010154 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010155 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010156 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10157 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010158
10159 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010160 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10161 ds_pool_ci.pNext = NULL;
10162 ds_pool_ci.maxSets = 1;
10163 ds_pool_ci.poolSizeCount = 1;
10164 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010165
Tobin Ehlis3b780662015-05-28 12:11:26 -060010166 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010167 err =
10168 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010169 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010170
Tony Barboureb254902015-07-15 12:50:33 -060010171 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010172 dsl_binding.binding = 0;
10173 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10174 dsl_binding.descriptorCount = 1;
10175 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10176 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010177
10178 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010179 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10180 ds_layout_ci.pNext = NULL;
10181 ds_layout_ci.bindingCount = 1;
10182 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010183
Tobin Ehlis3b780662015-05-28 12:11:26 -060010184 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010185 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10186 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010187 ASSERT_VK_SUCCESS(err);
10188
10189 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010190 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010191 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010192 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010193 alloc_info.descriptorPool = ds_pool;
10194 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010195 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10196 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010197 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010198
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010199 // Correctly update descriptor to avoid "NOT_UPDATED" error
10200 VkDescriptorBufferInfo buff_info = {};
10201 buff_info.buffer =
10202 VkBuffer(0); // Don't care about buffer handle for this test
10203 buff_info.offset = 0;
10204 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010205
10206 VkWriteDescriptorSet descriptor_write;
10207 memset(&descriptor_write, 0, sizeof(descriptor_write));
10208 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010209 descriptor_write.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070010210 descriptor_write.dstArrayElement =
10211 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010212 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010213 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10214 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010215
10216 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10217
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010218 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010219
Chia-I Wuf7458c52015-10-26 21:10:41 +080010220 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10221 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010222}
10223
Karl Schultz6addd812016-02-02 17:17:23 -070010224TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
10225 // Create layout w/ count of 1 and attempt update to that layout w/ binding
10226 // index 2
10227 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010228
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010229 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10230 " does not have binding 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010231
Tobin Ehlis3b780662015-05-28 12:11:26 -060010232 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010233 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010234 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010235 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10236 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010237
10238 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010239 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10240 ds_pool_ci.pNext = NULL;
10241 ds_pool_ci.maxSets = 1;
10242 ds_pool_ci.poolSizeCount = 1;
10243 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010244
Tobin Ehlis3b780662015-05-28 12:11:26 -060010245 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010246 err =
10247 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010248 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010249
Tony Barboureb254902015-07-15 12:50:33 -060010250 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010251 dsl_binding.binding = 0;
10252 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10253 dsl_binding.descriptorCount = 1;
10254 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10255 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010256
10257 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010258 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10259 ds_layout_ci.pNext = NULL;
10260 ds_layout_ci.bindingCount = 1;
10261 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010262 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010263 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10264 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010265 ASSERT_VK_SUCCESS(err);
10266
10267 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010268 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010269 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010270 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010271 alloc_info.descriptorPool = ds_pool;
10272 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010273 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10274 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010275 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010276
Tony Barboureb254902015-07-15 12:50:33 -060010277 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010278 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10279 sampler_ci.pNext = NULL;
10280 sampler_ci.magFilter = VK_FILTER_NEAREST;
10281 sampler_ci.minFilter = VK_FILTER_NEAREST;
10282 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10283 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10284 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10285 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10286 sampler_ci.mipLodBias = 1.0;
10287 sampler_ci.anisotropyEnable = VK_FALSE;
10288 sampler_ci.maxAnisotropy = 1;
10289 sampler_ci.compareEnable = VK_FALSE;
10290 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10291 sampler_ci.minLod = 1.0;
10292 sampler_ci.maxLod = 1.0;
10293 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10294 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010295
Tobin Ehlis3b780662015-05-28 12:11:26 -060010296 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010297 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010298 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010299
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010300 VkDescriptorImageInfo info = {};
10301 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010302
10303 VkWriteDescriptorSet descriptor_write;
10304 memset(&descriptor_write, 0, sizeof(descriptor_write));
10305 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010306 descriptor_write.dstSet = descriptorSet;
10307 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010308 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010309 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010310 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010311 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010312
10313 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10314
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010315 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010316
Chia-I Wuf7458c52015-10-26 21:10:41 +080010317 vkDestroySampler(m_device->device(), sampler, NULL);
10318 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10319 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010320}
10321
Karl Schultz6addd812016-02-02 17:17:23 -070010322TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10323 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10324 // types
10325 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010326
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070010327 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis660bcdc2016-05-17 10:39:46 -060010328 ".sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010329
Tobin Ehlis3b780662015-05-28 12:11:26 -060010330 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010331
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010332 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010333 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10334 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010335
10336 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010337 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10338 ds_pool_ci.pNext = NULL;
10339 ds_pool_ci.maxSets = 1;
10340 ds_pool_ci.poolSizeCount = 1;
10341 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010342
Tobin Ehlis3b780662015-05-28 12:11:26 -060010343 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010344 err =
10345 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010346 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010347 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010348 dsl_binding.binding = 0;
10349 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10350 dsl_binding.descriptorCount = 1;
10351 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10352 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010353
Tony Barboureb254902015-07-15 12:50:33 -060010354 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010355 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10356 ds_layout_ci.pNext = NULL;
10357 ds_layout_ci.bindingCount = 1;
10358 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010359
Tobin Ehlis3b780662015-05-28 12:11:26 -060010360 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010361 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10362 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010363 ASSERT_VK_SUCCESS(err);
10364
10365 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010366 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010367 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010368 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010369 alloc_info.descriptorPool = ds_pool;
10370 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010371 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10372 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010373 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010374
Tony Barboureb254902015-07-15 12:50:33 -060010375 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010376 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10377 sampler_ci.pNext = NULL;
10378 sampler_ci.magFilter = VK_FILTER_NEAREST;
10379 sampler_ci.minFilter = VK_FILTER_NEAREST;
10380 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10381 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10382 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10383 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10384 sampler_ci.mipLodBias = 1.0;
10385 sampler_ci.anisotropyEnable = VK_FALSE;
10386 sampler_ci.maxAnisotropy = 1;
10387 sampler_ci.compareEnable = VK_FALSE;
10388 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10389 sampler_ci.minLod = 1.0;
10390 sampler_ci.maxLod = 1.0;
10391 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10392 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010393 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010394 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010395 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010396
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010397 VkDescriptorImageInfo info = {};
10398 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010399
10400 VkWriteDescriptorSet descriptor_write;
10401 memset(&descriptor_write, 0, sizeof(descriptor_write));
Karl Schultz6addd812016-02-02 17:17:23 -070010402 descriptor_write.sType =
10403 (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010404 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010405 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010406 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010407 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010408 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010409
10410 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10411
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010412 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010413
Chia-I Wuf7458c52015-10-26 21:10:41 +080010414 vkDestroySampler(m_device->device(), sampler, NULL);
10415 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10416 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010417}
10418
Karl Schultz6addd812016-02-02 17:17:23 -070010419TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010420 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010421 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010422
Karl Schultz6addd812016-02-02 17:17:23 -070010423 m_errorMonitor->SetDesiredFailureMsg(
10424 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010425 "Attempted write update to sampler descriptor with invalid sampler");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010426
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010427 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010428 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10429 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010430 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010431 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10432 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010433
10434 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010435 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10436 ds_pool_ci.pNext = NULL;
10437 ds_pool_ci.maxSets = 1;
10438 ds_pool_ci.poolSizeCount = 1;
10439 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010440
10441 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010442 err =
10443 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010444 ASSERT_VK_SUCCESS(err);
10445
10446 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010447 dsl_binding.binding = 0;
10448 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10449 dsl_binding.descriptorCount = 1;
10450 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10451 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010452
10453 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010454 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10455 ds_layout_ci.pNext = NULL;
10456 ds_layout_ci.bindingCount = 1;
10457 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010458 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010459 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10460 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010461 ASSERT_VK_SUCCESS(err);
10462
10463 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010464 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010465 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010466 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010467 alloc_info.descriptorPool = ds_pool;
10468 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010469 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10470 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010471 ASSERT_VK_SUCCESS(err);
10472
Karl Schultz6addd812016-02-02 17:17:23 -070010473 VkSampler sampler =
10474 (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010475
10476 VkDescriptorImageInfo descriptor_info;
10477 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10478 descriptor_info.sampler = sampler;
10479
10480 VkWriteDescriptorSet descriptor_write;
10481 memset(&descriptor_write, 0, sizeof(descriptor_write));
10482 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010483 descriptor_write.dstSet = descriptorSet;
10484 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010485 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010486 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10487 descriptor_write.pImageInfo = &descriptor_info;
10488
10489 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10490
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010491 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010492
Chia-I Wuf7458c52015-10-26 21:10:41 +080010493 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10494 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010495}
10496
Karl Schultz6addd812016-02-02 17:17:23 -070010497TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10498 // Create a single combined Image/Sampler descriptor and send it an invalid
10499 // imageView
10500 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010501
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010502 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10503 "Attempted write update to combined "
10504 "image sampler descriptor failed due "
Tobin Ehlis63c4b8a2016-05-09 10:29:34 -060010505 "to: Invalid VkImageView:");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010506
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010507 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010508 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010509 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10510 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010511
10512 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010513 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10514 ds_pool_ci.pNext = NULL;
10515 ds_pool_ci.maxSets = 1;
10516 ds_pool_ci.poolSizeCount = 1;
10517 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010518
10519 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010520 err =
10521 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010522 ASSERT_VK_SUCCESS(err);
10523
10524 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010525 dsl_binding.binding = 0;
10526 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10527 dsl_binding.descriptorCount = 1;
10528 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10529 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010530
10531 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010532 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10533 ds_layout_ci.pNext = NULL;
10534 ds_layout_ci.bindingCount = 1;
10535 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010536 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010537 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10538 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010539 ASSERT_VK_SUCCESS(err);
10540
10541 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010542 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010543 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010544 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010545 alloc_info.descriptorPool = ds_pool;
10546 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010547 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10548 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010549 ASSERT_VK_SUCCESS(err);
10550
10551 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010552 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10553 sampler_ci.pNext = NULL;
10554 sampler_ci.magFilter = VK_FILTER_NEAREST;
10555 sampler_ci.minFilter = VK_FILTER_NEAREST;
10556 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10557 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10558 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10559 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10560 sampler_ci.mipLodBias = 1.0;
10561 sampler_ci.anisotropyEnable = VK_FALSE;
10562 sampler_ci.maxAnisotropy = 1;
10563 sampler_ci.compareEnable = VK_FALSE;
10564 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10565 sampler_ci.minLod = 1.0;
10566 sampler_ci.maxLod = 1.0;
10567 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10568 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010569
10570 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010571 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010572 ASSERT_VK_SUCCESS(err);
10573
Karl Schultz6addd812016-02-02 17:17:23 -070010574 VkImageView view =
10575 (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010576
10577 VkDescriptorImageInfo descriptor_info;
10578 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10579 descriptor_info.sampler = sampler;
10580 descriptor_info.imageView = view;
10581
10582 VkWriteDescriptorSet descriptor_write;
10583 memset(&descriptor_write, 0, sizeof(descriptor_write));
10584 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010585 descriptor_write.dstSet = descriptorSet;
10586 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010587 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010588 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10589 descriptor_write.pImageInfo = &descriptor_info;
10590
10591 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10592
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010593 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010594
Chia-I Wuf7458c52015-10-26 21:10:41 +080010595 vkDestroySampler(m_device->device(), sampler, NULL);
10596 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10597 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010598}
10599
Karl Schultz6addd812016-02-02 17:17:23 -070010600TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10601 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10602 // into the other
10603 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010604
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010605 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10606 " binding #1 with type "
10607 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10608 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010609
Tobin Ehlis04356f92015-10-27 16:35:27 -060010610 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010611 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010612 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010613 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10614 ds_type_count[0].descriptorCount = 1;
10615 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10616 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010617
10618 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010619 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10620 ds_pool_ci.pNext = NULL;
10621 ds_pool_ci.maxSets = 1;
10622 ds_pool_ci.poolSizeCount = 2;
10623 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010624
10625 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010626 err =
10627 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010628 ASSERT_VK_SUCCESS(err);
10629 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010630 dsl_binding[0].binding = 0;
10631 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10632 dsl_binding[0].descriptorCount = 1;
10633 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10634 dsl_binding[0].pImmutableSamplers = NULL;
10635 dsl_binding[1].binding = 1;
10636 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10637 dsl_binding[1].descriptorCount = 1;
10638 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10639 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010640
10641 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010642 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10643 ds_layout_ci.pNext = NULL;
10644 ds_layout_ci.bindingCount = 2;
10645 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010646
10647 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010648 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10649 &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010650 ASSERT_VK_SUCCESS(err);
10651
10652 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010653 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010654 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010655 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010656 alloc_info.descriptorPool = ds_pool;
10657 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010658 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10659 &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010660 ASSERT_VK_SUCCESS(err);
10661
10662 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010663 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10664 sampler_ci.pNext = NULL;
10665 sampler_ci.magFilter = VK_FILTER_NEAREST;
10666 sampler_ci.minFilter = VK_FILTER_NEAREST;
10667 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10668 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10669 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10670 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10671 sampler_ci.mipLodBias = 1.0;
10672 sampler_ci.anisotropyEnable = VK_FALSE;
10673 sampler_ci.maxAnisotropy = 1;
10674 sampler_ci.compareEnable = VK_FALSE;
10675 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10676 sampler_ci.minLod = 1.0;
10677 sampler_ci.maxLod = 1.0;
10678 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10679 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010680
10681 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010682 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010683 ASSERT_VK_SUCCESS(err);
10684
10685 VkDescriptorImageInfo info = {};
10686 info.sampler = sampler;
10687
10688 VkWriteDescriptorSet descriptor_write;
10689 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
10690 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010691 descriptor_write.dstSet = descriptorSet;
10692 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080010693 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010694 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10695 descriptor_write.pImageInfo = &info;
10696 // This write update should succeed
10697 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10698 // Now perform a copy update that fails due to type mismatch
10699 VkCopyDescriptorSet copy_ds_update;
10700 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10701 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10702 copy_ds_update.srcSet = descriptorSet;
Mark Young29927482016-05-04 14:38:51 -060010703 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010704 copy_ds_update.dstSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070010705 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
Chia-I Wud50a7d72015-10-26 20:48:51 +080010706 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010707 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10708
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010709 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010710 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070010711 m_errorMonitor->SetDesiredFailureMsg(
10712 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010713 " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -060010714 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10715 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10716 copy_ds_update.srcSet = descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -070010717 copy_ds_update.srcBinding =
10718 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010719 copy_ds_update.dstSet = descriptorSet;
10720 copy_ds_update.dstBinding = 0;
Mark Young29927482016-05-04 14:38:51 -060010721 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010722 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10723
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010724 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010725
Tobin Ehlis04356f92015-10-27 16:35:27 -060010726 // Now perform a copy update that fails due to binding out of bounds
Karl Schultz6addd812016-02-02 17:17:23 -070010727 m_errorMonitor->SetDesiredFailureMsg(
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010728 VK_DEBUG_REPORT_ERROR_BIT_EXT, " binding#1 with offset index of 1 plus "
10729 "update array offset of 0 and update of "
10730 "5 descriptors oversteps total number "
10731 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010732
Tobin Ehlis04356f92015-10-27 16:35:27 -060010733 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10734 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10735 copy_ds_update.srcSet = descriptorSet;
10736 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010737 copy_ds_update.dstSet = descriptorSet;
10738 copy_ds_update.dstBinding = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070010739 copy_ds_update.descriptorCount =
10740 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060010741 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10742
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010743 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010744
Chia-I Wuf7458c52015-10-26 21:10:41 +080010745 vkDestroySampler(m_device->device(), sampler, NULL);
10746 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10747 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010748}
10749
Karl Schultz6addd812016-02-02 17:17:23 -070010750TEST_F(VkLayerTest, NumSamplesMismatch) {
10751 // Create CommandBuffer where MSAA samples doesn't match RenderPass
10752 // sampleCount
10753 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010754
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070010755 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070010756 "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010757
Tobin Ehlis3b780662015-05-28 12:11:26 -060010758 ASSERT_NO_FATAL_FAILURE(InitState());
10759 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010760 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060010761 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010762 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010763
10764 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010765 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10766 ds_pool_ci.pNext = NULL;
10767 ds_pool_ci.maxSets = 1;
10768 ds_pool_ci.poolSizeCount = 1;
10769 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010770
Tobin Ehlis3b780662015-05-28 12:11:26 -060010771 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070010772 err =
10773 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010774 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010775
Tony Barboureb254902015-07-15 12:50:33 -060010776 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080010777 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060010778 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080010779 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010780 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10781 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010782
Tony Barboureb254902015-07-15 12:50:33 -060010783 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10784 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10785 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010786 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070010787 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010788
Tobin Ehlis3b780662015-05-28 12:11:26 -060010789 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010790 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10791 &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010792 ASSERT_VK_SUCCESS(err);
10793
10794 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010795 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010796 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010797 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010798 alloc_info.descriptorPool = ds_pool;
10799 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010800 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
10801 &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010802 ASSERT_VK_SUCCESS(err);
10803
Tony Barboureb254902015-07-15 12:50:33 -060010804 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010805 pipe_ms_state_ci.sType =
10806 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
10807 pipe_ms_state_ci.pNext = NULL;
10808 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10809 pipe_ms_state_ci.sampleShadingEnable = 0;
10810 pipe_ms_state_ci.minSampleShading = 1.0;
10811 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010812
Tony Barboureb254902015-07-15 12:50:33 -060010813 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010814 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10815 pipeline_layout_ci.pNext = NULL;
10816 pipeline_layout_ci.setLayoutCount = 1;
10817 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010818
10819 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070010820 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
10821 &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010822 ASSERT_VK_SUCCESS(err);
10823
Karl Schultz6addd812016-02-02 17:17:23 -070010824 VkShaderObj vs(m_device, bindStateVertShaderText,
10825 VK_SHADER_STAGE_VERTEX_BIT, this);
10826 VkShaderObj fs(m_device, bindStateFragShaderText,
10827 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060010828 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070010829 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010830 VkPipelineObj pipe(m_device);
10831 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010832 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010833 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010834 pipe.SetMSAA(&pipe_ms_state_ci);
10835 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010836
Tony Barbourfe3351b2015-07-28 10:17:20 -060010837 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070010838 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
10839 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010840
Mark Young29927482016-05-04 14:38:51 -060010841 // Render triangle (the error should trigger on the attempt to draw).
10842 Draw(3, 1, 0, 0);
10843
10844 // Finalize recording of the command buffer
10845 EndCommandBuffer();
10846
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010847 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010848
Chia-I Wuf7458c52015-10-26 21:10:41 +080010849 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10850 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10851 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010852}
Mark Young29927482016-05-04 14:38:51 -060010853
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010854TEST_F(VkLayerTest, RenderPassIncompatible) {
10855 TEST_DESCRIPTION("Hit RenderPass incompatible cases. "
10856 "Initial case is drawing with an active renderpass that's "
10857 "not compatible with the bound PSO's creation renderpass");
10858 VkResult err;
10859
10860 ASSERT_NO_FATAL_FAILURE(InitState());
10861 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10862
10863 VkDescriptorSetLayoutBinding dsl_binding = {};
10864 dsl_binding.binding = 0;
10865 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10866 dsl_binding.descriptorCount = 1;
10867 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10868 dsl_binding.pImmutableSamplers = NULL;
10869
10870 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10871 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10872 ds_layout_ci.pNext = NULL;
10873 ds_layout_ci.bindingCount = 1;
10874 ds_layout_ci.pBindings = &dsl_binding;
10875
10876 VkDescriptorSetLayout ds_layout;
10877 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
10878 &ds_layout);
10879 ASSERT_VK_SUCCESS(err);
10880
10881 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10882 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10883 pipeline_layout_ci.pNext = NULL;
10884 pipeline_layout_ci.setLayoutCount = 1;
10885 pipeline_layout_ci.pSetLayouts = &ds_layout;
10886
10887 VkPipelineLayout pipeline_layout;
10888 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
10889 &pipeline_layout);
10890 ASSERT_VK_SUCCESS(err);
10891
10892 VkShaderObj vs(m_device, bindStateVertShaderText,
10893 VK_SHADER_STAGE_VERTEX_BIT, this);
10894 VkShaderObj fs(m_device, bindStateFragShaderText,
10895 VK_SHADER_STAGE_FRAGMENT_BIT,
10896 this); // We shouldn't need a fragment shader
10897 // but add it to be able to run on more devices
10898 // Create a renderpass that will be incompatible with default renderpass
10899 VkAttachmentReference attach = {};
10900 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
10901 VkAttachmentReference color_att = {};
10902 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10903 VkSubpassDescription subpass = {};
10904 subpass.inputAttachmentCount = 1;
10905 subpass.pInputAttachments = &attach;
10906 subpass.colorAttachmentCount = 1;
10907 subpass.pColorAttachments = &color_att;
10908 VkRenderPassCreateInfo rpci = {};
10909 rpci.subpassCount = 1;
10910 rpci.pSubpasses = &subpass;
10911 rpci.attachmentCount = 1;
10912 VkAttachmentDescription attach_desc = {};
10913 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060010914 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
10915 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010916 rpci.pAttachments = &attach_desc;
10917 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
10918 VkRenderPass rp;
10919 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10920 VkPipelineObj pipe(m_device);
10921 pipe.AddShader(&vs);
10922 pipe.AddShader(&fs);
10923 pipe.AddColorAttachment();
10924 VkViewport view_port = {};
10925 m_viewports.push_back(view_port);
10926 pipe.SetViewport(m_viewports);
10927 VkRect2D rect = {};
10928 m_scissors.push_back(rect);
10929 pipe.SetScissor(m_scissors);
10930 pipe.CreateVKPipeline(pipeline_layout, renderPass());
10931
10932 VkCommandBufferInheritanceInfo cbii = {};
10933 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
10934 cbii.renderPass = rp;
10935 cbii.subpass = 0;
10936 VkCommandBufferBeginInfo cbbi = {};
10937 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
10938 cbbi.pInheritanceInfo = &cbii;
10939 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
10940 VkRenderPassBeginInfo rpbi = {};
10941 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
10942 rpbi.framebuffer = m_framebuffer;
10943 rpbi.renderPass = rp;
10944 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi,
10945 VK_SUBPASS_CONTENTS_INLINE);
10946 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
10947 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
10948
10949 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10950 " is incompatible w/ gfx pipeline ");
10951 // Render triangle (the error should trigger on the attempt to draw).
10952 Draw(3, 1, 0, 0);
10953
10954 // Finalize recording of the command buffer
10955 EndCommandBuffer();
10956
10957 m_errorMonitor->VerifyFound();
10958
10959 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10960 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10961 vkDestroyRenderPass(m_device->device(), rp, NULL);
10962}
10963
Mark Youngc89c6312016-03-31 16:03:20 -060010964TEST_F(VkLayerTest, NumBlendAttachMismatch) {
10965 // Create Pipeline where the number of blend attachments doesn't match the
10966 // number of color attachments. In this case, we don't add any color
10967 // blend attachments even though we have a color attachment.
10968 VkResult err;
10969
10970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Young29927482016-05-04 14:38:51 -060010971 "Render pass subpass 0 mismatch with blending state defined and blend state attachment");
Mark Youngc89c6312016-03-31 16:03:20 -060010972
10973 ASSERT_NO_FATAL_FAILURE(InitState());
10974 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10975 VkDescriptorPoolSize ds_type_count = {};
10976 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10977 ds_type_count.descriptorCount = 1;
10978
10979 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10980 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10981 ds_pool_ci.pNext = NULL;
10982 ds_pool_ci.maxSets = 1;
10983 ds_pool_ci.poolSizeCount = 1;
10984 ds_pool_ci.pPoolSizes = &ds_type_count;
10985
10986 VkDescriptorPool ds_pool;
10987 err =
10988 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10989 ASSERT_VK_SUCCESS(err);
10990
10991 VkDescriptorSetLayoutBinding dsl_binding = {};
10992 dsl_binding.binding = 0;
10993 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10994 dsl_binding.descriptorCount = 1;
10995 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10996 dsl_binding.pImmutableSamplers = NULL;
10997
10998 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10999 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11000 ds_layout_ci.pNext = NULL;
11001 ds_layout_ci.bindingCount = 1;
11002 ds_layout_ci.pBindings = &dsl_binding;
11003
11004 VkDescriptorSetLayout ds_layout;
11005 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11006 &ds_layout);
11007 ASSERT_VK_SUCCESS(err);
11008
11009 VkDescriptorSet descriptorSet;
11010 VkDescriptorSetAllocateInfo alloc_info = {};
11011 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11012 alloc_info.descriptorSetCount = 1;
11013 alloc_info.descriptorPool = ds_pool;
11014 alloc_info.pSetLayouts = &ds_layout;
11015 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11016 &descriptorSet);
11017 ASSERT_VK_SUCCESS(err);
11018
11019 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
11020 pipe_ms_state_ci.sType =
11021 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11022 pipe_ms_state_ci.pNext = NULL;
11023 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11024 pipe_ms_state_ci.sampleShadingEnable = 0;
11025 pipe_ms_state_ci.minSampleShading = 1.0;
11026 pipe_ms_state_ci.pSampleMask = NULL;
11027
11028 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11029 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11030 pipeline_layout_ci.pNext = NULL;
11031 pipeline_layout_ci.setLayoutCount = 1;
11032 pipeline_layout_ci.pSetLayouts = &ds_layout;
11033
11034 VkPipelineLayout pipeline_layout;
11035 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11036 &pipeline_layout);
11037 ASSERT_VK_SUCCESS(err);
11038
11039 VkShaderObj vs(m_device, bindStateVertShaderText,
11040 VK_SHADER_STAGE_VERTEX_BIT, this);
11041 VkShaderObj fs(m_device, bindStateFragShaderText,
11042 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011043 this); // We shouldn't need a fragment shader
Mark Youngc89c6312016-03-31 16:03:20 -060011044 // but add it to be able to run on more devices
11045 VkPipelineObj pipe(m_device);
11046 pipe.AddShader(&vs);
11047 pipe.AddShader(&fs);
11048 pipe.SetMSAA(&pipe_ms_state_ci);
11049 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11050
11051 BeginCommandBuffer();
11052 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11053 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11054
Mark Young29927482016-05-04 14:38:51 -060011055 // Render triangle (the error should trigger on the attempt to draw).
11056 Draw(3, 1, 0, 0);
11057
11058 // Finalize recording of the command buffer
11059 EndCommandBuffer();
11060
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011061 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011062
11063 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11064 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11065 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11066}
Mark Young29927482016-05-04 14:38:51 -060011067
Mark Muellerd4914412016-06-13 17:52:06 -060011068TEST_F(VkLayerTest, MissingClearAttachment) {
11069 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment "
11070 "structure passed to vkCmdClearAttachments");
11071 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11072 "vkCmdClearAttachments() attachment index 1 not found in attachment "
11073 "reference array of active subpass 0");
11074
11075 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11076 m_errorMonitor->VerifyFound();
11077}
11078
Karl Schultz6addd812016-02-02 17:17:23 -070011079TEST_F(VkLayerTest, ClearCmdNoDraw) {
11080 // Create CommandBuffer where we add ClearCmd for FB Color attachment prior
11081 // to issuing a Draw
11082 VkResult err;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011083
Karl Schultz6addd812016-02-02 17:17:23 -070011084 m_errorMonitor->SetDesiredFailureMsg(
Tony Barbour7e56d302016-03-02 15:12:01 -070011085 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011086 "vkCmdClearAttachments() issued on CB object ");
11087
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011088 ASSERT_NO_FATAL_FAILURE(InitState());
11089 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011090
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011091 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011092 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11093 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011094
11095 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011096 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11097 ds_pool_ci.pNext = NULL;
11098 ds_pool_ci.maxSets = 1;
11099 ds_pool_ci.poolSizeCount = 1;
11100 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011101
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011102 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011103 err =
11104 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011105 ASSERT_VK_SUCCESS(err);
11106
Tony Barboureb254902015-07-15 12:50:33 -060011107 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011108 dsl_binding.binding = 0;
11109 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11110 dsl_binding.descriptorCount = 1;
11111 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11112 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011113
Tony Barboureb254902015-07-15 12:50:33 -060011114 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011115 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11116 ds_layout_ci.pNext = NULL;
11117 ds_layout_ci.bindingCount = 1;
11118 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011119
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011120 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011121 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11122 &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011123 ASSERT_VK_SUCCESS(err);
11124
11125 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011126 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011127 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011128 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011129 alloc_info.descriptorPool = ds_pool;
11130 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011131 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11132 &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011133 ASSERT_VK_SUCCESS(err);
11134
Tony Barboureb254902015-07-15 12:50:33 -060011135 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011136 pipe_ms_state_ci.sType =
11137 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11138 pipe_ms_state_ci.pNext = NULL;
11139 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11140 pipe_ms_state_ci.sampleShadingEnable = 0;
11141 pipe_ms_state_ci.minSampleShading = 1.0;
11142 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011143
Tony Barboureb254902015-07-15 12:50:33 -060011144 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011145 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11146 pipeline_layout_ci.pNext = NULL;
11147 pipeline_layout_ci.setLayoutCount = 1;
11148 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011149
11150 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011151 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11152 &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011153 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011154
Karl Schultz6addd812016-02-02 17:17:23 -070011155 VkShaderObj vs(m_device, bindStateVertShaderText,
11156 VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011157 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011158 // on more devices
11159 VkShaderObj fs(m_device, bindStateFragShaderText,
11160 VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011161
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011162 VkPipelineObj pipe(m_device);
11163 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011164 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011165 pipe.SetMSAA(&pipe_ms_state_ci);
11166 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011167
11168 BeginCommandBuffer();
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011169
Karl Schultz6addd812016-02-02 17:17:23 -070011170 // Main thing we care about for this test is that the VkImage obj we're
11171 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011172 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011173 VkClearAttachment color_attachment;
11174 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11175 color_attachment.clearValue.color.float32[0] = 1.0;
11176 color_attachment.clearValue.color.float32[1] = 1.0;
11177 color_attachment.clearValue.color.float32[2] = 1.0;
11178 color_attachment.clearValue.color.float32[3] = 1.0;
11179 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -070011180 VkClearRect clear_rect = {
11181 {{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011182
Karl Schultz6addd812016-02-02 17:17:23 -070011183 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1,
11184 &color_attachment, 1, &clear_rect);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011185
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011186 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011187
Chia-I Wuf7458c52015-10-26 21:10:41 +080011188 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11189 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11190 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011191}
11192
Karl Schultz6addd812016-02-02 17:17:23 -070011193TEST_F(VkLayerTest, VtxBufferBadIndex) {
11194 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011195
Karl Schultz6addd812016-02-02 17:17:23 -070011196 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070011197 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinskidfcd9b62015-12-14 15:14:10 -070011198 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011199
Tobin Ehlis502480b2015-06-24 15:53:07 -060011200 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011201 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011202 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011203
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011204 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011205 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11206 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011207
11208 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011209 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11210 ds_pool_ci.pNext = NULL;
11211 ds_pool_ci.maxSets = 1;
11212 ds_pool_ci.poolSizeCount = 1;
11213 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011214
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011215 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070011216 err =
11217 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011218 ASSERT_VK_SUCCESS(err);
11219
Tony Barboureb254902015-07-15 12:50:33 -060011220 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011221 dsl_binding.binding = 0;
11222 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11223 dsl_binding.descriptorCount = 1;
11224 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11225 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011226
Tony Barboureb254902015-07-15 12:50:33 -060011227 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011228 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11229 ds_layout_ci.pNext = NULL;
11230 ds_layout_ci.bindingCount = 1;
11231 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011232
Tobin Ehlis502480b2015-06-24 15:53:07 -060011233 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011234 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
11235 &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011236 ASSERT_VK_SUCCESS(err);
11237
11238 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011239 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011240 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011241 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011242 alloc_info.descriptorPool = ds_pool;
11243 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070011244 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
11245 &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011246 ASSERT_VK_SUCCESS(err);
11247
Tony Barboureb254902015-07-15 12:50:33 -060011248 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011249 pipe_ms_state_ci.sType =
11250 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11251 pipe_ms_state_ci.pNext = NULL;
11252 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11253 pipe_ms_state_ci.sampleShadingEnable = 0;
11254 pipe_ms_state_ci.minSampleShading = 1.0;
11255 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011256
Tony Barboureb254902015-07-15 12:50:33 -060011257 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011258 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11259 pipeline_layout_ci.pNext = NULL;
11260 pipeline_layout_ci.setLayoutCount = 1;
11261 pipeline_layout_ci.pSetLayouts = &ds_layout;
11262 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011263
Karl Schultz6addd812016-02-02 17:17:23 -070011264 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
11265 &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011266 ASSERT_VK_SUCCESS(err);
11267
Karl Schultz6addd812016-02-02 17:17:23 -070011268 VkShaderObj vs(m_device, bindStateVertShaderText,
11269 VK_SHADER_STAGE_VERTEX_BIT, this);
11270 VkShaderObj fs(m_device, bindStateFragShaderText,
11271 VK_SHADER_STAGE_FRAGMENT_BIT,
Karl Schultzbdb75952016-04-19 11:36:49 -060011272 this); // We shouldn't need a fragment shader
Karl Schultz6addd812016-02-02 17:17:23 -070011273 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011274 VkPipelineObj pipe(m_device);
11275 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011276 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011277 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011278 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011279 pipe.SetViewport(m_viewports);
11280 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011281 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011282
11283 BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -070011284 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11285 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011286 // Don't care about actual data, just need to get to draw to flag error
11287 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Karl Schultz6addd812016-02-02 17:17:23 -070011288 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float),
11289 (const void *)&vbo_data);
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011290 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011291 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011292
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011293 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011294
Chia-I Wuf7458c52015-10-26 21:10:41 +080011295 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11296 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11297 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011298}
Mark Muellerdfe37552016-07-07 14:47:42 -060011299
11300TEST_F(VkLayerTest, VertexBufferInvalid) {
11301 TEST_DESCRIPTION("Submit a command buffer using deleted vertex buffer, "
11302 "delete a buffer twice, use an invalid offset for each "
11303 "buffer type, and attempt to bind a null buffer");
11304
11305 const char *deleted_buffer_in_command_buffer = "Cannot submit cmd buffer "
11306 "using deleted buffer ";
11307 const char *double_destroy_message = "Cannot free buffer 0x";
11308 const char *invalid_offset_message = "vkBindBufferMemory(): "
11309 "memoryOffset is 0x";
11310 const char *invalid_storage_buffer_offset_message = "vkBindBufferMemory(): "
11311 "storage memoryOffset "
11312 "is 0x";
11313 const char *invalid_texel_buffer_offset_message = "vkBindBufferMemory(): "
11314 "texel memoryOffset "
11315 "is 0x";
11316 const char *invalid_uniform_buffer_offset_message = "vkBindBufferMemory(): "
11317 "uniform memoryOffset "
11318 "is 0x";
11319 const char *bind_null_buffer_message = "In vkBindBufferMemory, attempting"
11320 " to Bind Obj(0x";
11321 const char *free_invalid_buffer_message = "Request to delete memory "
11322 "object 0x";
11323
11324 ASSERT_NO_FATAL_FAILURE(InitState());
11325 ASSERT_NO_FATAL_FAILURE(InitViewport());
11326 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11327
11328 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
11329 pipe_ms_state_ci.sType =
11330 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
11331 pipe_ms_state_ci.pNext = NULL;
11332 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11333 pipe_ms_state_ci.sampleShadingEnable = 0;
11334 pipe_ms_state_ci.minSampleShading = 1.0;
11335 pipe_ms_state_ci.pSampleMask = nullptr;
11336
11337 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11338 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11339 VkPipelineLayout pipeline_layout;
11340
11341 VkResult err = vkCreatePipelineLayout(m_device->device(),
11342 &pipeline_layout_ci, nullptr,
11343 &pipeline_layout);
11344 ASSERT_VK_SUCCESS(err);
11345
11346 VkShaderObj vs(m_device, bindStateVertShaderText,
11347 VK_SHADER_STAGE_VERTEX_BIT, this);
11348 VkShaderObj fs(m_device, bindStateFragShaderText,
11349 VK_SHADER_STAGE_FRAGMENT_BIT,
11350 this);
11351 VkPipelineObj pipe(m_device);
11352 pipe.AddShader(&vs);
11353 pipe.AddShader(&fs);
11354 pipe.AddColorAttachment();
11355 pipe.SetMSAA(&pipe_ms_state_ci);
11356 pipe.SetViewport(m_viewports);
11357 pipe.SetScissor(m_scissors);
11358 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11359
11360 BeginCommandBuffer();
11361 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
11362 VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
11363
11364 {
11365 // Create and bind a vertex buffer in a reduced scope, which will cause
11366 // it to be deleted upon leaving this scope
11367 const float vbo_data[3] = {1.f, 0.f, 1.f};
11368 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data),
11369 3, vbo_data);
11370 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11371 draw_verticies.AddVertexInputToPipe(pipe);
11372 }
11373
11374 Draw(1, 0, 0, 0);
11375
11376 EndCommandBuffer();
11377
11378 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11379 deleted_buffer_in_command_buffer);
11380 QueueCommandBuffer(false);
11381 m_errorMonitor->VerifyFound();
11382
11383 {
11384 // Create and bind a vertex buffer in a reduced scope, and delete it
11385 // twice, the second through the destructor
11386 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11387 VkBufferTest::eDoubleDelete);
11388 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11389 double_destroy_message);
11390 buffer_test.TestDoubleDestroy();
11391 }
11392 m_errorMonitor->VerifyFound();
11393
11394 if (VkBufferTest::
11395 GetTestConditionValid(m_device,
11396 VkBufferTest::eInvalidMemoryOffset)) {
11397 // Create and bind a memory buffer with an invalid offset.
11398 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11399 invalid_offset_message);
11400 VkBufferTest buffer_test(m_device,
11401 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
11402 VkBufferTest::eInvalidMemoryOffset);
11403 (void) buffer_test;
11404 m_errorMonitor->VerifyFound();
11405 }
11406
11407 if (VkBufferTest::
11408 GetTestConditionValid(m_device,
11409 VkBufferTest::eInvalidDeviceOffset,
11410 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
11411 // Create and bind a memory buffer with an invalid offset again,
11412 // but look for a texel buffer message.
11413 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11414 invalid_texel_buffer_offset_message);
11415 VkBufferTest buffer_test(m_device,
11416 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
11417 VkBufferTest::eInvalidDeviceOffset);
11418 (void) buffer_test;
11419 m_errorMonitor->VerifyFound();
11420 }
11421
11422 if (VkBufferTest::
11423 GetTestConditionValid(m_device,
11424 VkBufferTest::eInvalidDeviceOffset,
11425 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
11426 // Create and bind a memory buffer with an invalid offset again, but
11427 // look for a uniform buffer message.
11428 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11429 invalid_uniform_buffer_offset_message);
11430 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
11431 VkBufferTest::eInvalidDeviceOffset);
11432 (void) buffer_test;
11433 m_errorMonitor->VerifyFound();
11434 }
11435
11436 if (VkBufferTest::
11437 GetTestConditionValid(m_device,
11438 VkBufferTest::eInvalidDeviceOffset,
11439 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
11440 // Create and bind a memory buffer with an invalid offset again, but
11441 // look for a storage buffer message.
11442 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11443 invalid_storage_buffer_offset_message);
11444 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11445 VkBufferTest::eInvalidDeviceOffset);
11446 (void) buffer_test;
11447 m_errorMonitor->VerifyFound();
11448 }
11449
11450 {
11451 // Attempt to bind a null buffer.
11452 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11453 bind_null_buffer_message);
11454 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11455 VkBufferTest::eBindNullBuffer);
11456 (void) buffer_test;
11457 m_errorMonitor->VerifyFound();
11458 }
11459
11460 {
11461 // Attempt to use an invalid handle to delete a buffer.
11462 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11463 free_invalid_buffer_message);
11464 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
11465 VkBufferTest::eFreeInvalidHandle);
11466 (void) buffer_test;
11467 }
11468 m_errorMonitor->VerifyFound();
11469
11470 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11471}
11472
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011473// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11474TEST_F(VkLayerTest, InvalidImageLayout) {
11475 TEST_DESCRIPTION("Hit all possible validation checks associated with the "
11476 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11477 "images in the wrong layout when they're copied or transitioned.");
11478 // 3 in ValidateCmdBufImageLayouts
11479 // * -1 Attempt to submit cmd buf w/ deleted image
11480 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11481 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
11482 m_errorMonitor->SetDesiredFailureMsg(
11483 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11484 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11485
11486 ASSERT_NO_FATAL_FAILURE(InitState());
11487 // Create src & dst images to use for copy operations
11488 VkImage src_image;
11489 VkImage dst_image;
11490
11491 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11492 const int32_t tex_width = 32;
11493 const int32_t tex_height = 32;
11494
11495 VkImageCreateInfo image_create_info = {};
11496 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11497 image_create_info.pNext = NULL;
11498 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11499 image_create_info.format = tex_format;
11500 image_create_info.extent.width = tex_width;
11501 image_create_info.extent.height = tex_height;
11502 image_create_info.extent.depth = 1;
11503 image_create_info.mipLevels = 1;
11504 image_create_info.arrayLayers = 4;
11505 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11506 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11507 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
11508 image_create_info.flags = 0;
11509
11510 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11511 ASSERT_VK_SUCCESS(err);
11512 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11513 ASSERT_VK_SUCCESS(err);
11514
11515 BeginCommandBuffer();
11516 VkImageCopy copyRegion;
11517 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11518 copyRegion.srcSubresource.mipLevel = 0;
11519 copyRegion.srcSubresource.baseArrayLayer = 0;
11520 copyRegion.srcSubresource.layerCount = 1;
11521 copyRegion.srcOffset.x = 0;
11522 copyRegion.srcOffset.y = 0;
11523 copyRegion.srcOffset.z = 0;
11524 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11525 copyRegion.dstSubresource.mipLevel = 0;
11526 copyRegion.dstSubresource.baseArrayLayer = 0;
11527 copyRegion.dstSubresource.layerCount = 1;
11528 copyRegion.dstOffset.x = 0;
11529 copyRegion.dstOffset.y = 0;
11530 copyRegion.dstOffset.z = 0;
11531 copyRegion.extent.width = 1;
11532 copyRegion.extent.height = 1;
11533 copyRegion.extent.depth = 1;
11534 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11535 m_errorMonitor->VerifyFound();
11536 // Now cause error due to src image layout changing
11537 m_errorMonitor->SetDesiredFailureMsg(
11538 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11539 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
11540 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11541 m_errorMonitor->VerifyFound();
11542 // Final src error is due to bad layout type
11543 m_errorMonitor->SetDesiredFailureMsg(
11544 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11545 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
11546 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11547 m_errorMonitor->VerifyFound();
11548 // Now verify same checks for dst
11549 m_errorMonitor->SetDesiredFailureMsg(
11550 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11551 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
11552 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
11553 m_errorMonitor->VerifyFound();
11554 // Now cause error due to src image layout changing
11555 m_errorMonitor->SetDesiredFailureMsg(
11556 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11557 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout VK_IMAGE_LAYOUT_GENERAL.");
11558 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
11559 m_errorMonitor->VerifyFound();
11560 m_errorMonitor->SetDesiredFailureMsg(
11561 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11562 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
11563 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copyRegion);
11564 m_errorMonitor->VerifyFound();
11565 // Now cause error due to bad image layout transition in PipelineBarrier
11566 VkImageMemoryBarrier image_barrier[1] = {};
11567 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11568 image_barrier[0].image = src_image;
11569 image_barrier[0].subresourceRange.layerCount = 2;
11570 image_barrier[0].subresourceRange.levelCount = 2;
11571 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11572 m_errorMonitor->SetDesiredFailureMsg(
11573 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11574 "You cannot transition the layout from VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is VK_IMAGE_LAYOUT_GENERAL.");
11575 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, NULL, 0, NULL, 1, image_barrier);
11576 m_errorMonitor->VerifyFound();
11577
11578 // Finally some layout errors at RenderPass create time
11579 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
11580 VkAttachmentReference attach = {};
11581 // perf warning for GENERAL layout w/ non-DS input attachment
11582 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11583 VkSubpassDescription subpass = {};
11584 subpass.inputAttachmentCount = 1;
11585 subpass.pInputAttachments = &attach;
11586 VkRenderPassCreateInfo rpci = {};
11587 rpci.subpassCount = 1;
11588 rpci.pSubpasses = &subpass;
11589 rpci.attachmentCount = 1;
11590 VkAttachmentDescription attach_desc = {};
11591 attach_desc.format = VK_FORMAT_UNDEFINED;
11592 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011593 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011594 VkRenderPass rp;
11595 m_errorMonitor->SetDesiredFailureMsg(
11596 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11597 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
11598 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11599 m_errorMonitor->VerifyFound();
11600 // error w/ non-general layout
11601 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11602
11603 m_errorMonitor->SetDesiredFailureMsg(
11604 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11605 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
11606 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11607 m_errorMonitor->VerifyFound();
11608 subpass.inputAttachmentCount = 0;
11609 subpass.colorAttachmentCount = 1;
11610 subpass.pColorAttachments = &attach;
11611 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11612 // perf warning for GENERAL layout on color attachment
11613 m_errorMonitor->SetDesiredFailureMsg(
11614 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11615 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
11616 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11617 m_errorMonitor->VerifyFound();
11618 // error w/ non-color opt or GENERAL layout for color attachment
11619 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11620 m_errorMonitor->SetDesiredFailureMsg(
11621 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11622 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
11623 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11624 m_errorMonitor->VerifyFound();
11625 subpass.colorAttachmentCount = 0;
11626 subpass.pDepthStencilAttachment = &attach;
11627 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11628 // perf warning for GENERAL layout on DS attachment
11629 m_errorMonitor->SetDesiredFailureMsg(
11630 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11631 "Layout for depth attachment is GENERAL but should be DEPTH_STENCIL_ATTACHMENT_OPTIMAL.");
11632 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11633 m_errorMonitor->VerifyFound();
11634 // error w/ non-ds opt or GENERAL layout for color attachment
11635 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11636 m_errorMonitor->SetDesiredFailureMsg(
11637 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11638 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be DEPTH_STENCIL_ATTACHMENT_OPTIMAL or GENERAL.");
11639 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11640 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060011641 // For this error we need a valid renderpass so create default one
11642 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11643 attach.attachment = 0;
11644 attach_desc.format = VK_FORMAT_D24_UNORM_S8_UINT;
11645 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
11646 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
11647 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
11648 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
11649 // Can't do a CLEAR load on READ_ONLY initialLayout
11650 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
11651 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11652 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11654 " with invalid first layout "
11655 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
11656 "ONLY_OPTIMAL");
11657 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11658 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011659
11660 vkDestroyImage(m_device->device(), src_image, NULL);
11661 vkDestroyImage(m_device->device(), dst_image, NULL);
11662}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011663#endif // DRAW_STATE_TESTS
11664
Tobin Ehlis0788f522015-05-26 16:11:58 -060011665#if THREADING_TESTS
Mike Stroyanaccf7692015-05-12 16:00:45 -060011666#if GTEST_IS_THREADSAFE
11667struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011668 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011669 VkEvent event;
11670 bool bailout;
11671};
11672
Karl Schultz6addd812016-02-02 17:17:23 -070011673extern "C" void *AddToCommandBuffer(void *arg) {
11674 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011675
Karl Schultz6addd812016-02-02 17:17:23 -070011676 for (int i = 0; i < 10000; i++) {
11677 vkCmdSetEvent(data->commandBuffer, data->event,
11678 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011679 if (data->bailout) {
11680 break;
11681 }
11682 }
11683 return NULL;
11684}
11685
Karl Schultz6addd812016-02-02 17:17:23 -070011686TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060011687 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011688
Karl Schultz6addd812016-02-02 17:17:23 -070011689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11690 "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011691
Mike Stroyanaccf7692015-05-12 16:00:45 -060011692 ASSERT_NO_FATAL_FAILURE(InitState());
11693 ASSERT_NO_FATAL_FAILURE(InitViewport());
11694 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11695
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011696 // Calls AllocateCommandBuffers
11697 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060011698
11699 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011700 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060011701
11702 VkEventCreateInfo event_info;
11703 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060011704 VkResult err;
11705
11706 memset(&event_info, 0, sizeof(event_info));
11707 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11708
Chia-I Wuf7458c52015-10-26 21:10:41 +080011709 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011710 ASSERT_VK_SUCCESS(err);
11711
Mike Stroyanaccf7692015-05-12 16:00:45 -060011712 err = vkResetEvent(device(), event);
11713 ASSERT_VK_SUCCESS(err);
11714
11715 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011716 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060011717 data.event = event;
11718 data.bailout = false;
11719 m_errorMonitor->SetBailout(&data.bailout);
11720 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060011721 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011722 // Add many entries to command buffer from this thread at the same time.
11723 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060011724
Mike Stroyan4268d1f2015-07-13 14:45:35 -060011725 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011726 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060011727
Mike Stroyan10b8cb72016-01-22 15:22:03 -070011728 m_errorMonitor->SetBailout(NULL);
11729
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011730 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060011731
Chia-I Wuf7458c52015-10-26 21:10:41 +080011732 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060011733}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011734#endif // GTEST_IS_THREADSAFE
11735#endif // THREADING_TESTS
11736
Chris Forbes9f7ff632015-05-25 11:13:08 +120011737#if SHADER_CHECKER_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070011738TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011739 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120011740 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011741
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011742 ASSERT_NO_FATAL_FAILURE(InitState());
11743 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11744
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011745 VkShaderModule module;
11746 VkShaderModuleCreateInfo moduleCreateInfo;
11747 struct icd_spv_header spv;
11748
11749 spv.magic = ICD_SPV_MAGIC;
11750 spv.version = ICD_SPV_VERSION;
11751 spv.gen_magic = 0;
11752
11753 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
11754 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070011755 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011756 moduleCreateInfo.codeSize = 4;
11757 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011758 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011759
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011760 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011761}
11762
Karl Schultz6addd812016-02-02 17:17:23 -070011763TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120011765 "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011766
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011767 ASSERT_NO_FATAL_FAILURE(InitState());
11768 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11769
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011770 VkShaderModule module;
11771 VkShaderModuleCreateInfo moduleCreateInfo;
11772 struct icd_spv_header spv;
11773
11774 spv.magic = ~ICD_SPV_MAGIC;
11775 spv.version = ICD_SPV_VERSION;
11776 spv.gen_magic = 0;
11777
11778 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
11779 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070011780 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011781 moduleCreateInfo.codeSize = sizeof(spv) + 10;
11782 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011783 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011784
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011785 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011786}
11787
Chris Forbesb4afd0f2016-04-04 10:48:35 +120011788#if 0
11789// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070011790TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011791 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120011792 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011793
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011794 ASSERT_NO_FATAL_FAILURE(InitState());
11795 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11796
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011797 VkShaderModule module;
11798 VkShaderModuleCreateInfo moduleCreateInfo;
11799 struct icd_spv_header spv;
11800
11801 spv.magic = ICD_SPV_MAGIC;
11802 spv.version = ~ICD_SPV_VERSION;
11803 spv.gen_magic = 0;
11804
11805 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
11806 moduleCreateInfo.pNext = NULL;
11807
Karl Schultz6addd812016-02-02 17:17:23 -070011808 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011809 moduleCreateInfo.codeSize = sizeof(spv) + 10;
11810 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011811 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011812
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011813 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011814}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120011815#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060011816
Karl Schultz6addd812016-02-02 17:17:23 -070011817TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070011818 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011819 "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011820
Chris Forbes9f7ff632015-05-25 11:13:08 +120011821 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060011822 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120011823
11824 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011825 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120011826 "\n"
11827 "layout(location=0) out float x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070011828 "out gl_PerVertex {\n"
11829 " vec4 gl_Position;\n"
11830 "};\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120011831 "void main(){\n"
11832 " gl_Position = vec4(1);\n"
11833 " x = 0;\n"
11834 "}\n";
11835 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011836 "#version 450\n"
Chris Forbes9f7ff632015-05-25 11:13:08 +120011837 "\n"
11838 "layout(location=0) out vec4 color;\n"
11839 "void main(){\n"
11840 " color = vec4(1);\n"
11841 "}\n";
11842
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060011843 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11844 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120011845
11846 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080011847 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120011848 pipe.AddShader(&vs);
11849 pipe.AddShader(&fs);
11850
Chris Forbes9f7ff632015-05-25 11:13:08 +120011851 VkDescriptorSetObj descriptorSet(m_device);
11852 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011853 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120011854
Tony Barbour5781e8f2015-08-04 16:23:11 -060011855 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120011856
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011857 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120011858}
Chris Forbes9f7ff632015-05-25 11:13:08 +120011859
Karl Schultz6addd812016-02-02 17:17:23 -070011860TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011862 "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011863
Chris Forbes59cb88d2015-05-25 11:13:13 +120011864 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060011865 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120011866
11867 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011868 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120011869 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070011870 "out gl_PerVertex {\n"
11871 " vec4 gl_Position;\n"
11872 "};\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120011873 "void main(){\n"
11874 " gl_Position = vec4(1);\n"
11875 "}\n";
11876 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011877 "#version 450\n"
Chris Forbes59cb88d2015-05-25 11:13:13 +120011878 "\n"
11879 "layout(location=0) in float x;\n"
11880 "layout(location=0) out vec4 color;\n"
11881 "void main(){\n"
11882 " color = vec4(x);\n"
11883 "}\n";
11884
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060011885 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11886 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120011887
11888 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080011889 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120011890 pipe.AddShader(&vs);
11891 pipe.AddShader(&fs);
11892
Chris Forbes59cb88d2015-05-25 11:13:13 +120011893 VkDescriptorSetObj descriptorSet(m_device);
11894 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011895 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120011896
Tony Barbour5781e8f2015-08-04 16:23:11 -060011897 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120011898
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011899 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120011900}
11901
Karl Schultz6addd812016-02-02 17:17:23 -070011902TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +130011903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011904 "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130011905
11906 ASSERT_NO_FATAL_FAILURE(InitState());
11907 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11908
11909 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011910 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130011911 "\n"
11912 "out gl_PerVertex {\n"
11913 " vec4 gl_Position;\n"
11914 "};\n"
11915 "void main(){\n"
11916 " gl_Position = vec4(1);\n"
11917 "}\n";
11918 char const *fsSource =
11919 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130011920 "\n"
11921 "in block { layout(location=0) float x; } ins;\n"
11922 "layout(location=0) out vec4 color;\n"
11923 "void main(){\n"
11924 " color = vec4(ins.x);\n"
11925 "}\n";
11926
11927 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11928 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11929
11930 VkPipelineObj pipe(m_device);
11931 pipe.AddColorAttachment();
11932 pipe.AddShader(&vs);
11933 pipe.AddShader(&fs);
11934
11935 VkDescriptorSetObj descriptorSet(m_device);
11936 descriptorSet.AppendDummy();
11937 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
11938
11939 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
11940
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011941 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130011942}
11943
Karl Schultz6addd812016-02-02 17:17:23 -070011944TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Chris Forbes0036fd12016-01-26 14:19:49 +130011945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbese9928822016-02-17 14:44:52 +130011946 "Type mismatch on location 0.0: 'ptr to "
Karl Schultz6addd812016-02-02 17:17:23 -070011947 "output arr[2] of float32' vs 'ptr to "
11948 "input arr[3] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130011949
11950 ASSERT_NO_FATAL_FAILURE(InitState());
11951 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11952
11953 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011954 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130011955 "\n"
11956 "layout(location=0) out float x[2];\n"
11957 "out gl_PerVertex {\n"
11958 " vec4 gl_Position;\n"
11959 "};\n"
11960 "void main(){\n"
11961 " x[0] = 0; x[1] = 0;\n"
11962 " gl_Position = vec4(1);\n"
11963 "}\n";
11964 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011965 "#version 450\n"
Chris Forbes0036fd12016-01-26 14:19:49 +130011966 "\n"
11967 "layout(location=0) in float x[3];\n"
11968 "layout(location=0) out vec4 color;\n"
11969 "void main(){\n"
11970 " color = vec4(x[0] + x[1] + x[2]);\n"
11971 "}\n";
11972
11973 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
11974 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
11975
11976 VkPipelineObj pipe(m_device);
11977 pipe.AddColorAttachment();
11978 pipe.AddShader(&vs);
11979 pipe.AddShader(&fs);
11980
11981 VkDescriptorSetObj descriptorSet(m_device);
11982 descriptorSet.AppendDummy();
11983 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
11984
11985 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
11986
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011987 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130011988}
11989
Karl Schultz6addd812016-02-02 17:17:23 -070011990TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070011991 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070011992 "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011993
Chris Forbesb56af562015-05-25 11:13:17 +120011994 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060011995 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120011996
11997 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120011998 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120011999 "\n"
12000 "layout(location=0) out int x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070012001 "out gl_PerVertex {\n"
12002 " vec4 gl_Position;\n"
12003 "};\n"
Chris Forbesb56af562015-05-25 11:13:17 +120012004 "void main(){\n"
12005 " x = 0;\n"
12006 " gl_Position = vec4(1);\n"
12007 "}\n";
12008 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012009 "#version 450\n"
Chris Forbesb56af562015-05-25 11:13:17 +120012010 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012011 "layout(location=0) in float x;\n" /* VS writes int */
Chris Forbesb56af562015-05-25 11:13:17 +120012012 "layout(location=0) out vec4 color;\n"
12013 "void main(){\n"
12014 " color = vec4(x);\n"
12015 "}\n";
12016
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012017 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12018 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120012019
12020 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012021 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120012022 pipe.AddShader(&vs);
12023 pipe.AddShader(&fs);
12024
Chris Forbesb56af562015-05-25 11:13:17 +120012025 VkDescriptorSetObj descriptorSet(m_device);
12026 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012027 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120012028
Tony Barbour5781e8f2015-08-04 16:23:11 -060012029 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120012030
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012031 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120012032}
12033
Karl Schultz6addd812016-02-02 17:17:23 -070012034TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Chris Forbesa3e85f62016-01-15 14:53:11 +130012035 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012036 "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130012037
12038 ASSERT_NO_FATAL_FAILURE(InitState());
12039 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12040
12041 char const *vsSource =
12042 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130012043 "\n"
12044 "out block { layout(location=0) int x; } outs;\n"
12045 "out gl_PerVertex {\n"
12046 " vec4 gl_Position;\n"
12047 "};\n"
12048 "void main(){\n"
12049 " outs.x = 0;\n"
12050 " gl_Position = vec4(1);\n"
12051 "}\n";
12052 char const *fsSource =
12053 "#version 450\n"
Chris Forbesa3e85f62016-01-15 14:53:11 +130012054 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012055 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
Chris Forbesa3e85f62016-01-15 14:53:11 +130012056 "layout(location=0) out vec4 color;\n"
12057 "void main(){\n"
12058 " color = vec4(ins.x);\n"
12059 "}\n";
12060
12061 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12062 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12063
12064 VkPipelineObj pipe(m_device);
12065 pipe.AddColorAttachment();
12066 pipe.AddShader(&vs);
12067 pipe.AddShader(&fs);
12068
12069 VkDescriptorSetObj descriptorSet(m_device);
12070 descriptorSet.AppendDummy();
12071 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12072
12073 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12074
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012075 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130012076}
12077
12078TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
12079 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12080 "location 0.0 which is not written by vertex shader");
12081
12082 ASSERT_NO_FATAL_FAILURE(InitState());
12083 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12084
12085 char const *vsSource =
12086 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130012087 "\n"
12088 "out block { layout(location=1) float x; } outs;\n"
12089 "out gl_PerVertex {\n"
12090 " vec4 gl_Position;\n"
12091 "};\n"
12092 "void main(){\n"
12093 " outs.x = 0;\n"
12094 " gl_Position = vec4(1);\n"
12095 "}\n";
12096 char const *fsSource =
12097 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130012098 "\n"
12099 "in block { layout(location=0) float x; } ins;\n"
12100 "layout(location=0) out vec4 color;\n"
12101 "void main(){\n"
12102 " color = vec4(ins.x);\n"
12103 "}\n";
12104
12105 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12106 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12107
12108 VkPipelineObj pipe(m_device);
12109 pipe.AddColorAttachment();
12110 pipe.AddShader(&vs);
12111 pipe.AddShader(&fs);
12112
12113 VkDescriptorSetObj descriptorSet(m_device);
12114 descriptorSet.AppendDummy();
12115 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12116
12117 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12118
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012119 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130012120}
12121
12122TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
12123 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12124 "location 0.1 which is not written by vertex shader");
12125
12126 ASSERT_NO_FATAL_FAILURE(InitState());
12127 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12128
12129 char const *vsSource =
12130 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130012131 "\n"
12132 "out block { layout(location=0, component=0) float x; } outs;\n"
12133 "out gl_PerVertex {\n"
12134 " vec4 gl_Position;\n"
12135 "};\n"
12136 "void main(){\n"
12137 " outs.x = 0;\n"
12138 " gl_Position = vec4(1);\n"
12139 "}\n";
12140 char const *fsSource =
12141 "#version 450\n"
Chris Forbese9928822016-02-17 14:44:52 +130012142 "\n"
12143 "in block { layout(location=0, component=1) float x; } ins;\n"
12144 "layout(location=0) out vec4 color;\n"
12145 "void main(){\n"
12146 " color = vec4(ins.x);\n"
12147 "}\n";
12148
12149 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12150 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12151
12152 VkPipelineObj pipe(m_device);
12153 pipe.AddColorAttachment();
12154 pipe.AddShader(&vs);
12155 pipe.AddShader(&fs);
12156
12157 VkDescriptorSetObj descriptorSet(m_device);
12158 descriptorSet.AppendDummy();
12159 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12160
12161 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12162
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012163 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130012164}
12165
Karl Schultz6addd812016-02-02 17:17:23 -070012166TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012167 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012168 "location 0 not consumed by VS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012169
Chris Forbesde136e02015-05-25 11:13:28 +120012170 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012171 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120012172
12173 VkVertexInputBindingDescription input_binding;
12174 memset(&input_binding, 0, sizeof(input_binding));
12175
12176 VkVertexInputAttributeDescription input_attrib;
12177 memset(&input_attrib, 0, sizeof(input_attrib));
12178 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12179
12180 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012181 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120012182 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070012183 "out gl_PerVertex {\n"
12184 " vec4 gl_Position;\n"
12185 "};\n"
Chris Forbesde136e02015-05-25 11:13:28 +120012186 "void main(){\n"
12187 " gl_Position = vec4(1);\n"
12188 "}\n";
12189 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012190 "#version 450\n"
Chris Forbesde136e02015-05-25 11:13:28 +120012191 "\n"
12192 "layout(location=0) out vec4 color;\n"
12193 "void main(){\n"
12194 " color = vec4(1);\n"
12195 "}\n";
12196
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012197 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12198 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120012199
12200 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012201 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120012202 pipe.AddShader(&vs);
12203 pipe.AddShader(&fs);
12204
12205 pipe.AddVertexInputBindings(&input_binding, 1);
12206 pipe.AddVertexInputAttribs(&input_attrib, 1);
12207
Chris Forbesde136e02015-05-25 11:13:28 +120012208 VkDescriptorSetObj descriptorSet(m_device);
12209 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012210 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120012211
Tony Barbour5781e8f2015-08-04 16:23:11 -060012212 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120012213
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012214 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120012215}
12216
Karl Schultz6addd812016-02-02 17:17:23 -070012217TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070012218 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070012219 "location 0 not consumed by VS");
Chris Forbes7d83cd52016-01-15 11:32:03 +130012220
12221 ASSERT_NO_FATAL_FAILURE(InitState());
12222 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12223
12224 VkVertexInputBindingDescription input_binding;
12225 memset(&input_binding, 0, sizeof(input_binding));
12226
12227 VkVertexInputAttributeDescription input_attrib;
12228 memset(&input_attrib, 0, sizeof(input_attrib));
12229 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12230
12231 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012232 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130012233 "\n"
12234 "layout(location=1) in float x;\n"
12235 "out gl_PerVertex {\n"
12236 " vec4 gl_Position;\n"
12237 "};\n"
12238 "void main(){\n"
12239 " gl_Position = vec4(x);\n"
12240 "}\n";
12241 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012242 "#version 450\n"
Chris Forbes7d83cd52016-01-15 11:32:03 +130012243 "\n"
12244 "layout(location=0) out vec4 color;\n"
12245 "void main(){\n"
12246 " color = vec4(1);\n"
12247 "}\n";
12248
12249 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12250 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12251
12252 VkPipelineObj pipe(m_device);
12253 pipe.AddColorAttachment();
12254 pipe.AddShader(&vs);
12255 pipe.AddShader(&fs);
12256
12257 pipe.AddVertexInputBindings(&input_binding, 1);
12258 pipe.AddVertexInputAttribs(&input_attrib, 1);
12259
12260 VkDescriptorSetObj descriptorSet(m_device);
12261 descriptorSet.AppendDummy();
12262 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12263
12264 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12265
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012266 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130012267}
12268
Karl Schultz6addd812016-02-02 17:17:23 -070012269TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
12270 m_errorMonitor->SetDesiredFailureMsg(
12271 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012272 "VS consumes input at location 0 but not provided");
12273
Chris Forbes62e8e502015-05-25 11:13:29 +120012274 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012275 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120012276
12277 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012278 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120012279 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012280 "layout(location=0) in vec4 x;\n" /* not provided */
Tony Barboure804d202016-01-05 13:37:45 -070012281 "out gl_PerVertex {\n"
12282 " vec4 gl_Position;\n"
12283 "};\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120012284 "void main(){\n"
12285 " gl_Position = x;\n"
12286 "}\n";
12287 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012288 "#version 450\n"
Chris Forbes62e8e502015-05-25 11:13:29 +120012289 "\n"
12290 "layout(location=0) out vec4 color;\n"
12291 "void main(){\n"
12292 " color = vec4(1);\n"
12293 "}\n";
12294
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012295 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12296 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120012297
12298 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012299 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120012300 pipe.AddShader(&vs);
12301 pipe.AddShader(&fs);
12302
Chris Forbes62e8e502015-05-25 11:13:29 +120012303 VkDescriptorSetObj descriptorSet(m_device);
12304 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012305 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120012306
Tony Barbour5781e8f2015-08-04 16:23:11 -060012307 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120012308
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012309 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120012310}
12311
Karl Schultz6addd812016-02-02 17:17:23 -070012312TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
12313 m_errorMonitor->SetDesiredFailureMsg(
12314 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012315 "location 0 does not match VS input type");
12316
Chris Forbesc97d98e2015-05-25 11:13:31 +120012317 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012318 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120012319
12320 VkVertexInputBindingDescription input_binding;
12321 memset(&input_binding, 0, sizeof(input_binding));
12322
12323 VkVertexInputAttributeDescription input_attrib;
12324 memset(&input_attrib, 0, sizeof(input_attrib));
12325 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12326
12327 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012328 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120012329 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012330 "layout(location=0) in int x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070012331 "out gl_PerVertex {\n"
12332 " vec4 gl_Position;\n"
12333 "};\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120012334 "void main(){\n"
12335 " gl_Position = vec4(x);\n"
12336 "}\n";
12337 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012338 "#version 450\n"
Chris Forbesc97d98e2015-05-25 11:13:31 +120012339 "\n"
12340 "layout(location=0) out vec4 color;\n"
12341 "void main(){\n"
12342 " color = vec4(1);\n"
12343 "}\n";
12344
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012345 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12346 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120012347
12348 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012349 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120012350 pipe.AddShader(&vs);
12351 pipe.AddShader(&fs);
12352
12353 pipe.AddVertexInputBindings(&input_binding, 1);
12354 pipe.AddVertexInputAttribs(&input_attrib, 1);
12355
Chris Forbesc97d98e2015-05-25 11:13:31 +120012356 VkDescriptorSetObj descriptorSet(m_device);
12357 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012358 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120012359
Tony Barbour5781e8f2015-08-04 16:23:11 -060012360 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120012361
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012362 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120012363}
12364
Chris Forbesc68b43c2016-04-06 11:18:47 +120012365TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
12366 m_errorMonitor->SetDesiredFailureMsg(
12367 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12368 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
12369
12370 ASSERT_NO_FATAL_FAILURE(InitState());
12371 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12372
12373 char const *vsSource =
12374 "#version 450\n"
12375 "\n"
12376 "out gl_PerVertex {\n"
12377 " vec4 gl_Position;\n"
12378 "};\n"
12379 "void main(){\n"
12380 " gl_Position = vec4(1);\n"
12381 "}\n";
12382 char const *fsSource =
12383 "#version 450\n"
12384 "\n"
12385 "layout(location=0) out vec4 color;\n"
12386 "void main(){\n"
12387 " color = vec4(1);\n"
12388 "}\n";
12389
12390 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12391 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12392
12393 VkPipelineObj pipe(m_device);
12394 pipe.AddColorAttachment();
12395 pipe.AddShader(&vs);
12396 pipe.AddShader(&vs);
12397 pipe.AddShader(&fs);
12398
12399 VkDescriptorSetObj descriptorSet(m_device);
12400 descriptorSet.AppendDummy();
12401 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12402
12403 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12404
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012405 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120012406}
12407
Karl Schultz6addd812016-02-02 17:17:23 -070012408TEST_F(VkLayerTest, CreatePipelineAttribMatrixType) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012409 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130012410
12411 ASSERT_NO_FATAL_FAILURE(InitState());
12412 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12413
12414 VkVertexInputBindingDescription input_binding;
12415 memset(&input_binding, 0, sizeof(input_binding));
12416
12417 VkVertexInputAttributeDescription input_attribs[2];
12418 memset(input_attribs, 0, sizeof(input_attribs));
12419
12420 for (int i = 0; i < 2; i++) {
12421 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
12422 input_attribs[i].location = i;
12423 }
12424
12425 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012426 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012427 "\n"
12428 "layout(location=0) in mat2x4 x;\n"
Tony Barboure804d202016-01-05 13:37:45 -070012429 "out gl_PerVertex {\n"
12430 " vec4 gl_Position;\n"
12431 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012432 "void main(){\n"
12433 " gl_Position = x[0] + x[1];\n"
12434 "}\n";
12435 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012436 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012437 "\n"
12438 "layout(location=0) out vec4 color;\n"
12439 "void main(){\n"
12440 " color = vec4(1);\n"
12441 "}\n";
12442
12443 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12444 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12445
12446 VkPipelineObj pipe(m_device);
12447 pipe.AddColorAttachment();
12448 pipe.AddShader(&vs);
12449 pipe.AddShader(&fs);
12450
12451 pipe.AddVertexInputBindings(&input_binding, 1);
12452 pipe.AddVertexInputAttribs(input_attribs, 2);
12453
12454 VkDescriptorSetObj descriptorSet(m_device);
12455 descriptorSet.AppendDummy();
12456 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12457
12458 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12459
12460 /* expect success */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012461 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130012462}
12463
Chris Forbes2682b242015-11-24 11:13:14 +130012464TEST_F(VkLayerTest, CreatePipelineAttribArrayType)
12465{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012466 m_errorMonitor->ExpectSuccess();
Chris Forbes2682b242015-11-24 11:13:14 +130012467
12468 ASSERT_NO_FATAL_FAILURE(InitState());
12469 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12470
12471 VkVertexInputBindingDescription input_binding;
12472 memset(&input_binding, 0, sizeof(input_binding));
12473
12474 VkVertexInputAttributeDescription input_attribs[2];
12475 memset(input_attribs, 0, sizeof(input_attribs));
12476
12477 for (int i = 0; i < 2; i++) {
12478 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
12479 input_attribs[i].location = i;
12480 }
12481
12482 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012483 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012484 "\n"
12485 "layout(location=0) in vec4 x[2];\n"
Tony Barboure804d202016-01-05 13:37:45 -070012486 "out gl_PerVertex {\n"
12487 " vec4 gl_Position;\n"
12488 "};\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012489 "void main(){\n"
12490 " gl_Position = x[0] + x[1];\n"
12491 "}\n";
12492 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012493 "#version 450\n"
Chris Forbes2682b242015-11-24 11:13:14 +130012494 "\n"
12495 "layout(location=0) out vec4 color;\n"
12496 "void main(){\n"
12497 " color = vec4(1);\n"
12498 "}\n";
12499
12500 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12501 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12502
12503 VkPipelineObj pipe(m_device);
12504 pipe.AddColorAttachment();
12505 pipe.AddShader(&vs);
12506 pipe.AddShader(&fs);
12507
12508 pipe.AddVertexInputBindings(&input_binding, 1);
12509 pipe.AddVertexInputAttribs(input_attribs, 2);
12510
12511 VkDescriptorSetObj descriptorSet(m_device);
12512 descriptorSet.AppendDummy();
12513 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12514
12515 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12516
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012517 m_errorMonitor->VerifyNotFound();
Chris Forbes2682b242015-11-24 11:13:14 +130012518}
Chris Forbes2682b242015-11-24 11:13:14 +130012519
Chris Forbesbc290ce2016-07-06 12:01:49 +120012520TEST_F(VkLayerTest, CreatePipelineAttribComponents)
12521{
12522 m_errorMonitor->ExpectSuccess();
12523
12524 ASSERT_NO_FATAL_FAILURE(InitState());
12525 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12526
12527 VkVertexInputBindingDescription input_binding;
12528 memset(&input_binding, 0, sizeof(input_binding));
12529
12530 VkVertexInputAttributeDescription input_attribs[3];
12531 memset(input_attribs, 0, sizeof(input_attribs));
12532
12533 for (int i = 0; i < 3; i++) {
12534 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
12535 input_attribs[i].location = i;
12536 }
12537
12538 char const *vsSource =
12539 "#version 450\n"
12540 "\n"
12541 "layout(location=0) in vec4 x;\n"
12542 "layout(location=1) in vec3 y1;\n"
12543 "layout(location=1, component=3) in float y2;\n"
12544 "layout(location=2) in vec4 z;\n"
12545 "out gl_PerVertex {\n"
12546 " vec4 gl_Position;\n"
12547 "};\n"
12548 "void main(){\n"
12549 " gl_Position = x + vec4(y1, y2) + z;\n"
12550 "}\n";
12551 char const *fsSource =
12552 "#version 450\n"
12553 "\n"
12554 "layout(location=0) out vec4 color;\n"
12555 "void main(){\n"
12556 " color = vec4(1);\n"
12557 "}\n";
12558
12559 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12560 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12561
12562 VkPipelineObj pipe(m_device);
12563 pipe.AddColorAttachment();
12564 pipe.AddShader(&vs);
12565 pipe.AddShader(&fs);
12566
12567 pipe.AddVertexInputBindings(&input_binding, 1);
12568 pipe.AddVertexInputAttribs(input_attribs, 3);
12569
12570 VkDescriptorSetObj descriptorSet(m_device);
12571 descriptorSet.AppendDummy();
12572 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12573
12574 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12575
12576 m_errorMonitor->VerifyNotFound();
12577}
12578
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012579TEST_F(VkLayerTest, CreatePipelineSimplePositive)
12580{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012581 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012582
12583 ASSERT_NO_FATAL_FAILURE(InitState());
12584 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12585
12586 char const *vsSource =
12587 "#version 450\n"
12588 "out gl_PerVertex {\n"
12589 " vec4 gl_Position;\n"
12590 "};\n"
12591 "void main(){\n"
12592 " gl_Position = vec4(0);\n"
12593 "}\n";
12594 char const *fsSource =
12595 "#version 450\n"
12596 "\n"
12597 "layout(location=0) out vec4 color;\n"
12598 "void main(){\n"
12599 " color = vec4(1);\n"
12600 "}\n";
12601
12602 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12603 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12604
12605 VkPipelineObj pipe(m_device);
12606 pipe.AddColorAttachment();
12607 pipe.AddShader(&vs);
12608 pipe.AddShader(&fs);
12609
12610 VkDescriptorSetObj descriptorSet(m_device);
12611 descriptorSet.AppendDummy();
12612 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12613
12614 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12615
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012616 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012617}
12618
Chris Forbes912c9192016-04-05 17:50:35 +120012619TEST_F(VkLayerTest, CreatePipelineRelaxedTypeMatch)
12620{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012621 m_errorMonitor->ExpectSuccess();
Chris Forbes912c9192016-04-05 17:50:35 +120012622
12623 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
12624
12625 ASSERT_NO_FATAL_FAILURE(InitState());
12626 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12627
12628 char const *vsSource =
12629 "#version 450\n"
12630 "out gl_PerVertex {\n"
12631 " vec4 gl_Position;\n"
12632 "};\n"
12633 "layout(location=0) out vec3 x;\n"
12634 "layout(location=1) out ivec3 y;\n"
12635 "layout(location=2) out vec3 z;\n"
12636 "void main(){\n"
12637 " gl_Position = vec4(0);\n"
12638 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
12639 "}\n";
12640 char const *fsSource =
12641 "#version 450\n"
12642 "\n"
12643 "layout(location=0) out vec4 color;\n"
12644 "layout(location=0) in float x;\n"
12645 "layout(location=1) flat in int y;\n"
12646 "layout(location=2) in vec2 z;\n"
12647 "void main(){\n"
12648 " color = vec4(1 + x + y + z.x);\n"
12649 "}\n";
12650
12651 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12652 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12653
12654 VkPipelineObj pipe(m_device);
12655 pipe.AddColorAttachment();
12656 pipe.AddShader(&vs);
12657 pipe.AddShader(&fs);
12658
12659 VkDescriptorSetObj descriptorSet(m_device);
12660 descriptorSet.AppendDummy();
12661 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12662
Mike Stroyan255e9582016-06-24 09:49:32 -060012663 VkResult err = VK_SUCCESS;
12664 err =
12665 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12666 ASSERT_VK_SUCCESS(err);
12667
Chris Forbes912c9192016-04-05 17:50:35 +120012668
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012669 m_errorMonitor->VerifyNotFound();
Chris Forbes912c9192016-04-05 17:50:35 +120012670}
12671
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012672TEST_F(VkLayerTest, CreatePipelineTessPerVertex)
12673{
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012674 m_errorMonitor->ExpectSuccess();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012675
12676 ASSERT_NO_FATAL_FAILURE(InitState());
12677 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12678
Chris Forbesc1e852d2016-04-04 19:26:42 +120012679 if (!m_device->phy().features().tessellationShader) {
12680 printf("Device does not support tessellation shaders; skipped.\n");
12681 return;
12682 }
12683
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012684 char const *vsSource =
12685 "#version 450\n"
12686 "void main(){}\n";
12687 char const *tcsSource =
12688 "#version 450\n"
12689 "layout(location=0) out int x[];\n"
12690 "layout(vertices=3) out;\n"
12691 "void main(){\n"
12692 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
12693 " gl_TessLevelInner[0] = 1;\n"
12694 " x[gl_InvocationID] = gl_InvocationID;\n"
12695 "}\n";
12696 char const *tesSource =
12697 "#version 450\n"
12698 "layout(triangles, equal_spacing, cw) in;\n"
12699 "layout(location=0) in int x[];\n"
12700 "out gl_PerVertex { vec4 gl_Position; };\n"
12701 "void main(){\n"
12702 " gl_Position.xyz = gl_TessCoord;\n"
12703 " gl_Position.w = x[0] + x[1] + x[2];\n"
12704 "}\n";
12705 char const *fsSource =
12706 "#version 450\n"
12707 "layout(location=0) out vec4 color;\n"
12708 "void main(){\n"
12709 " color = vec4(1);\n"
12710 "}\n";
12711
12712 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12713 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
12714 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
12715 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12716
12717 VkPipelineInputAssemblyStateCreateInfo iasci{
12718 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
12719 nullptr,
12720 0,
12721 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
12722 VK_FALSE};
12723
Chris Forbesb4cacb62016-04-04 19:15:00 +120012724 VkPipelineTessellationStateCreateInfo tsci{
12725 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
12726 nullptr,
12727 0,
12728 3};
12729
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012730 VkPipelineObj pipe(m_device);
12731 pipe.SetInputAssembly(&iasci);
Chris Forbesb4cacb62016-04-04 19:15:00 +120012732 pipe.SetTessellation(&tsci);
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012733 pipe.AddColorAttachment();
12734 pipe.AddShader(&vs);
12735 pipe.AddShader(&tcs);
12736 pipe.AddShader(&tes);
12737 pipe.AddShader(&fs);
12738
12739 VkDescriptorSetObj descriptorSet(m_device);
12740 descriptorSet.AppendDummy();
12741 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12742
12743 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12744
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012745 m_errorMonitor->VerifyNotFound();
Chris Forbes4ea14fc2016-04-04 18:52:54 +120012746}
12747
Chris Forbesa0ab8152016-04-20 13:34:27 +120012748TEST_F(VkLayerTest, CreatePipelineGeometryInputBlockPositive)
12749{
12750 m_errorMonitor->ExpectSuccess();
12751
12752 ASSERT_NO_FATAL_FAILURE(InitState());
12753 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12754
12755 if (!m_device->phy().features().geometryShader) {
12756 printf("Device does not support geometry shaders; skipped.\n");
12757 return;
12758 }
12759
12760 char const *vsSource =
12761 "#version 450\n"
12762 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
12763 "void main(){\n"
12764 " vs_out.x = vec4(1);\n"
12765 "}\n";
12766 char const *gsSource =
12767 "#version 450\n"
12768 "layout(triangles) in;\n"
12769 "layout(triangle_strip, max_vertices=3) out;\n"
12770 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
12771 "out gl_PerVertex { vec4 gl_Position; };\n"
12772 "void main() {\n"
12773 " gl_Position = gs_in[0].x;\n"
12774 " EmitVertex();\n"
12775 "}\n";
12776 char const *fsSource =
12777 "#version 450\n"
12778 "layout(location=0) out vec4 color;\n"
12779 "void main(){\n"
12780 " color = vec4(1);\n"
12781 "}\n";
12782
12783 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12784 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
12785 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12786
12787 VkPipelineObj pipe(m_device);
12788 pipe.AddColorAttachment();
12789 pipe.AddShader(&vs);
12790 pipe.AddShader(&gs);
12791 pipe.AddShader(&fs);
12792
12793 VkDescriptorSetObj descriptorSet(m_device);
12794 descriptorSet.AppendDummy();
12795 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12796
12797 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12798
12799 m_errorMonitor->VerifyNotFound();
12800}
12801
Chris Forbesa0193bc2016-04-04 19:19:47 +120012802TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch)
12803{
12804 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12805 "is per-vertex in tessellation control shader stage "
12806 "but per-patch in tessellation evaluation shader stage");
12807
12808 ASSERT_NO_FATAL_FAILURE(InitState());
12809 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12810
Chris Forbesc1e852d2016-04-04 19:26:42 +120012811 if (!m_device->phy().features().tessellationShader) {
12812 printf("Device does not support tessellation shaders; skipped.\n");
12813 return;
12814 }
12815
Chris Forbesa0193bc2016-04-04 19:19:47 +120012816 char const *vsSource =
12817 "#version 450\n"
12818 "void main(){}\n";
12819 char const *tcsSource =
12820 "#version 450\n"
12821 "layout(location=0) out int x[];\n"
12822 "layout(vertices=3) out;\n"
12823 "void main(){\n"
12824 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
12825 " gl_TessLevelInner[0] = 1;\n"
12826 " x[gl_InvocationID] = gl_InvocationID;\n"
12827 "}\n";
12828 char const *tesSource =
12829 "#version 450\n"
12830 "layout(triangles, equal_spacing, cw) in;\n"
12831 "layout(location=0) patch in int x;\n"
12832 "out gl_PerVertex { vec4 gl_Position; };\n"
12833 "void main(){\n"
12834 " gl_Position.xyz = gl_TessCoord;\n"
12835 " gl_Position.w = x;\n"
12836 "}\n";
12837 char const *fsSource =
12838 "#version 450\n"
12839 "layout(location=0) out vec4 color;\n"
12840 "void main(){\n"
12841 " color = vec4(1);\n"
12842 "}\n";
12843
12844 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12845 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
12846 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
12847 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12848
12849 VkPipelineInputAssemblyStateCreateInfo iasci{
12850 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
12851 nullptr,
12852 0,
12853 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
12854 VK_FALSE};
12855
12856 VkPipelineTessellationStateCreateInfo tsci{
12857 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
12858 nullptr,
12859 0,
12860 3};
12861
12862 VkPipelineObj pipe(m_device);
12863 pipe.SetInputAssembly(&iasci);
12864 pipe.SetTessellation(&tsci);
12865 pipe.AddColorAttachment();
12866 pipe.AddShader(&vs);
12867 pipe.AddShader(&tcs);
12868 pipe.AddShader(&tes);
12869 pipe.AddShader(&fs);
12870
12871 VkDescriptorSetObj descriptorSet(m_device);
12872 descriptorSet.AppendDummy();
12873 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12874
12875 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12876
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012877 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120012878}
12879
Karl Schultz6addd812016-02-02 17:17:23 -070012880TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
12881 m_errorMonitor->SetDesiredFailureMsg(
12882 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060012883 "Duplicate vertex input binding descriptions for binding 0");
12884
Chris Forbes280ba2c2015-06-12 11:16:41 +120012885 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060012886 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120012887
12888 /* Two binding descriptions for binding 0 */
12889 VkVertexInputBindingDescription input_bindings[2];
12890 memset(input_bindings, 0, sizeof(input_bindings));
12891
12892 VkVertexInputAttributeDescription input_attrib;
12893 memset(&input_attrib, 0, sizeof(input_attrib));
12894 input_attrib.format = VK_FORMAT_R32_SFLOAT;
12895
12896 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012897 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120012898 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070012899 "layout(location=0) in float x;\n" /* attrib provided float */
Tony Barboure804d202016-01-05 13:37:45 -070012900 "out gl_PerVertex {\n"
12901 " vec4 gl_Position;\n"
12902 "};\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120012903 "void main(){\n"
12904 " gl_Position = vec4(x);\n"
12905 "}\n";
12906 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120012907 "#version 450\n"
Chris Forbes280ba2c2015-06-12 11:16:41 +120012908 "\n"
12909 "layout(location=0) out vec4 color;\n"
12910 "void main(){\n"
12911 " color = vec4(1);\n"
12912 "}\n";
12913
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060012914 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12915 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120012916
12917 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080012918 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120012919 pipe.AddShader(&vs);
12920 pipe.AddShader(&fs);
12921
12922 pipe.AddVertexInputBindings(input_bindings, 2);
12923 pipe.AddVertexInputAttribs(&input_attrib, 1);
12924
Chris Forbes280ba2c2015-06-12 11:16:41 +120012925 VkDescriptorSetObj descriptorSet(m_device);
12926 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012927 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120012928
Tony Barbour5781e8f2015-08-04 16:23:11 -060012929 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120012930
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012931 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120012932}
Chris Forbes8f68b562015-05-25 11:13:32 +120012933
Chris Forbes35efec72016-04-21 14:32:08 +120012934TEST_F(VkLayerTest, CreatePipeline64BitAttributesPositive) {
12935 m_errorMonitor->ExpectSuccess();
12936
12937 ASSERT_NO_FATAL_FAILURE(InitState());
12938 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12939
Chris Forbes91cf3a82016-06-28 17:51:35 +120012940 if (!m_device->phy().features().shaderFloat64) {
Chris Forbes35efec72016-04-21 14:32:08 +120012941 printf("Device does not support 64bit vertex attributes; skipped.\n");
12942 return;
12943 }
12944
12945 VkVertexInputBindingDescription input_bindings[1];
12946 memset(input_bindings, 0, sizeof(input_bindings));
12947
12948 VkVertexInputAttributeDescription input_attribs[4];
12949 memset(input_attribs, 0, sizeof(input_attribs));
12950 input_attribs[0].location = 0;
12951 input_attribs[0].offset = 0;
12952 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
12953 input_attribs[1].location = 2;
12954 input_attribs[1].offset = 32;
12955 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
12956 input_attribs[2].location = 4;
12957 input_attribs[2].offset = 64;
12958 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
12959 input_attribs[3].location = 6;
12960 input_attribs[3].offset = 96;
12961 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
12962
12963 char const *vsSource =
12964 "#version 450\n"
12965 "\n"
12966 "layout(location=0) in dmat4 x;\n"
12967 "out gl_PerVertex {\n"
12968 " vec4 gl_Position;\n"
12969 "};\n"
12970 "void main(){\n"
12971 " gl_Position = vec4(x[0][0]);\n"
12972 "}\n";
12973 char const *fsSource =
12974 "#version 450\n"
12975 "\n"
12976 "layout(location=0) out vec4 color;\n"
12977 "void main(){\n"
12978 " color = vec4(1);\n"
12979 "}\n";
12980
12981 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12982 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12983
12984 VkPipelineObj pipe(m_device);
12985 pipe.AddColorAttachment();
12986 pipe.AddShader(&vs);
12987 pipe.AddShader(&fs);
12988
12989 pipe.AddVertexInputBindings(input_bindings, 1);
12990 pipe.AddVertexInputAttribs(input_attribs, 4);
12991
12992 VkDescriptorSetObj descriptorSet(m_device);
12993 descriptorSet.AppendDummy();
12994 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
12995
12996 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
12997
12998 m_errorMonitor->VerifyNotFound();
12999}
13000
Karl Schultz6addd812016-02-02 17:17:23 -070013001TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013002 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013003 "Attachment 0 not written by FS");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013004
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013005 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013006
13007 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013008 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013009 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013010 "out gl_PerVertex {\n"
13011 " vec4 gl_Position;\n"
13012 "};\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013013 "void main(){\n"
13014 " gl_Position = vec4(1);\n"
13015 "}\n";
13016 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013017 "#version 450\n"
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013018 "\n"
13019 "void main(){\n"
13020 "}\n";
13021
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013022 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13023 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013024
13025 VkPipelineObj pipe(m_device);
13026 pipe.AddShader(&vs);
13027 pipe.AddShader(&fs);
13028
Chia-I Wu08accc62015-07-07 11:50:03 +080013029 /* set up CB 0, not written */
13030 pipe.AddColorAttachment();
13031 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013032
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013033 VkDescriptorSetObj descriptorSet(m_device);
13034 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013035 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013036
Tony Barbour5781e8f2015-08-04 16:23:11 -060013037 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013038
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013039 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120013040}
13041
Karl Schultz6addd812016-02-02 17:17:23 -070013042TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Karl Schultz6addd812016-02-02 17:17:23 -070013043 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski510e20d2016-02-11 09:26:16 -070013044 VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013045 "FS writes to output location 1 with no matching attachment");
13046
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013047 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013048
13049 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013050 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013051 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013052 "out gl_PerVertex {\n"
13053 " vec4 gl_Position;\n"
13054 "};\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013055 "void main(){\n"
13056 " gl_Position = vec4(1);\n"
13057 "}\n";
13058 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013059 "#version 450\n"
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013060 "\n"
13061 "layout(location=0) out vec4 x;\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013062 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013063 "void main(){\n"
13064 " x = vec4(1);\n"
13065 " y = vec4(1);\n"
13066 "}\n";
13067
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013068 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13069 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013070
13071 VkPipelineObj pipe(m_device);
13072 pipe.AddShader(&vs);
13073 pipe.AddShader(&fs);
13074
Chia-I Wu08accc62015-07-07 11:50:03 +080013075 /* set up CB 0, not written */
13076 pipe.AddColorAttachment();
13077 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013078 /* FS writes CB 1, but we don't configure it */
13079
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013080 VkDescriptorSetObj descriptorSet(m_device);
13081 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013082 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013083
Tony Barbour5781e8f2015-08-04 16:23:11 -060013084 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013085
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013086 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120013087}
13088
Karl Schultz6addd812016-02-02 17:17:23 -070013089TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013090 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013091 "does not match FS output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013092
Chris Forbesa36d69e2015-05-25 11:13:44 +120013093 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013094
13095 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013096 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120013097 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013098 "out gl_PerVertex {\n"
13099 " vec4 gl_Position;\n"
13100 "};\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120013101 "void main(){\n"
13102 " gl_Position = vec4(1);\n"
13103 "}\n";
13104 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013105 "#version 450\n"
Chris Forbesa36d69e2015-05-25 11:13:44 +120013106 "\n"
Karl Schultz6addd812016-02-02 17:17:23 -070013107 "layout(location=0) out ivec4 x;\n" /* not UNORM */
Chris Forbesa36d69e2015-05-25 11:13:44 +120013108 "void main(){\n"
13109 " x = ivec4(1);\n"
13110 "}\n";
13111
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013112 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13113 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120013114
13115 VkPipelineObj pipe(m_device);
13116 pipe.AddShader(&vs);
13117 pipe.AddShader(&fs);
13118
Chia-I Wu08accc62015-07-07 11:50:03 +080013119 /* set up CB 0; type is UNORM by default */
13120 pipe.AddColorAttachment();
13121 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013122
Chris Forbesa36d69e2015-05-25 11:13:44 +120013123 VkDescriptorSetObj descriptorSet(m_device);
13124 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013125 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120013126
Tony Barbour5781e8f2015-08-04 16:23:11 -060013127 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120013128
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013129 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120013130}
Chris Forbes7b1b8932015-06-05 14:43:36 +120013131
Karl Schultz6addd812016-02-02 17:17:23 -070013132TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013133 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013134 "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013135
Chris Forbes556c76c2015-08-14 12:04:59 +120013136 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120013137
13138 char const *vsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013139 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120013140 "\n"
Tony Barboure804d202016-01-05 13:37:45 -070013141 "out gl_PerVertex {\n"
13142 " vec4 gl_Position;\n"
13143 "};\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120013144 "void main(){\n"
13145 " gl_Position = vec4(1);\n"
13146 "}\n";
13147 char const *fsSource =
Chris Forbes38467712016-04-04 17:28:05 +120013148 "#version 450\n"
Chris Forbes556c76c2015-08-14 12:04:59 +120013149 "\n"
13150 "layout(location=0) out vec4 x;\n"
13151 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
13152 "void main(){\n"
13153 " x = vec4(bar.y);\n"
13154 "}\n";
13155
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013156 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13157 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120013158
Chris Forbes556c76c2015-08-14 12:04:59 +120013159 VkPipelineObj pipe(m_device);
13160 pipe.AddShader(&vs);
13161 pipe.AddShader(&fs);
13162
13163 /* set up CB 0; type is UNORM by default */
13164 pipe.AddColorAttachment();
13165 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13166
13167 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013168 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120013169
13170 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13171
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013172 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120013173}
13174
Chris Forbes5c59e902016-02-26 16:56:09 +130013175TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
13176 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13177 "not declared in layout");
13178
13179 ASSERT_NO_FATAL_FAILURE(InitState());
13180
13181 char const *vsSource =
13182 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130013183 "\n"
13184 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13185 "out gl_PerVertex {\n"
13186 " vec4 gl_Position;\n"
13187 "};\n"
13188 "void main(){\n"
13189 " gl_Position = vec4(consts.x);\n"
13190 "}\n";
13191 char const *fsSource =
13192 "#version 450\n"
Chris Forbes5c59e902016-02-26 16:56:09 +130013193 "\n"
13194 "layout(location=0) out vec4 x;\n"
13195 "void main(){\n"
13196 " x = vec4(1);\n"
13197 "}\n";
13198
13199 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13200 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13201
13202 VkPipelineObj pipe(m_device);
13203 pipe.AddShader(&vs);
13204 pipe.AddShader(&fs);
13205
13206 /* set up CB 0; type is UNORM by default */
13207 pipe.AddColorAttachment();
13208 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13209
13210 VkDescriptorSetObj descriptorSet(m_device);
13211 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13212
13213 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13214
13215 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013216 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130013217}
13218
Chris Forbes10eb9ae2016-05-31 16:09:42 +120013219TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
13220 m_errorMonitor->SetDesiredFailureMsg(
13221 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13222 "Shader uses descriptor slot 0.0");
13223
13224 ASSERT_NO_FATAL_FAILURE(InitState());
13225
13226 char const *csSource =
13227 "#version 450\n"
13228 "\n"
13229 "layout(local_size_x=1) in;\n"
13230 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13231 "void main(){\n"
13232 " x = vec4(1);\n"
13233 "}\n";
13234
13235 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13236
13237 VkDescriptorSetObj descriptorSet(m_device);
13238 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13239
13240 VkComputePipelineCreateInfo cpci = {
13241 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
13242 nullptr, 0, {
13243 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
13244 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
13245 cs.handle(), "main", nullptr
13246 },
13247 descriptorSet.GetPipelineLayout(),
13248 VK_NULL_HANDLE, -1
13249 };
13250
13251 VkPipeline pipe;
13252 VkResult err = vkCreateComputePipelines(
13253 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
13254
13255 m_errorMonitor->VerifyFound();
13256
13257 if (err == VK_SUCCESS) {
13258 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13259 }
13260}
13261
13262TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
13263 m_errorMonitor->ExpectSuccess();
13264
13265 ASSERT_NO_FATAL_FAILURE(InitState());
13266
13267 char const *csSource =
13268 "#version 450\n"
13269 "\n"
13270 "layout(local_size_x=1) in;\n"
13271 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
13272 "void main(){\n"
13273 " // x is not used.\n"
13274 "}\n";
13275
13276 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
13277
13278 VkDescriptorSetObj descriptorSet(m_device);
13279 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13280
13281 VkComputePipelineCreateInfo cpci = {
13282 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
13283 nullptr, 0, {
13284 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
13285 nullptr, 0, VK_SHADER_STAGE_COMPUTE_BIT,
13286 cs.handle(), "main", nullptr
13287 },
13288 descriptorSet.GetPipelineLayout(),
13289 VK_NULL_HANDLE, -1
13290 };
13291
13292 VkPipeline pipe;
13293 VkResult err = vkCreateComputePipelines(
13294 m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
13295
13296 m_errorMonitor->VerifyNotFound();
13297
13298 if (err == VK_SUCCESS) {
13299 vkDestroyPipeline(m_device->device(), pipe, nullptr);
13300 }
13301}
13302
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013303#endif // SHADER_CHECKER_TESTS
13304
13305#if DEVICE_LIMITS_TESTS
Mark Youngc48c4c12016-04-11 14:26:49 -060013306TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Karl Schultz6addd812016-02-02 17:17:23 -070013307 m_errorMonitor->SetDesiredFailureMsg(
13308 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013309 "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013310
13311 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013312
13313 // Create an image
13314 VkImage image;
13315
Karl Schultz6addd812016-02-02 17:17:23 -070013316 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
13317 const int32_t tex_width = 32;
13318 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013319
13320 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013321 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13322 image_create_info.pNext = NULL;
13323 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13324 image_create_info.format = tex_format;
13325 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013326 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070013327 image_create_info.extent.depth = 1;
13328 image_create_info.mipLevels = 1;
13329 image_create_info.arrayLayers = 1;
13330 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13331 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13332 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
13333 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013334
13335 // Introduce error by sending down a bogus width extent
13336 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013337 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013338
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013339 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060013340}
13341
Mark Youngc48c4c12016-04-11 14:26:49 -060013342TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
13343 m_errorMonitor->SetDesiredFailureMsg(
13344 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13345 "CreateImage extents is 0 for at least one required dimension");
13346
13347 ASSERT_NO_FATAL_FAILURE(InitState());
13348
13349 // Create an image
13350 VkImage image;
13351
13352 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
13353 const int32_t tex_width = 32;
13354 const int32_t tex_height = 32;
13355
13356 VkImageCreateInfo image_create_info = {};
13357 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13358 image_create_info.pNext = NULL;
13359 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13360 image_create_info.format = tex_format;
13361 image_create_info.extent.width = tex_width;
13362 image_create_info.extent.height = tex_height;
13363 image_create_info.extent.depth = 1;
13364 image_create_info.mipLevels = 1;
13365 image_create_info.arrayLayers = 1;
13366 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13367 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13368 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
13369 image_create_info.flags = 0;
13370
13371 // Introduce error by sending down a bogus width extent
13372 image_create_info.extent.width = 0;
13373 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
13374
13375 m_errorMonitor->VerifyFound();
13376}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013377#endif // DEVICE_LIMITS_TESTS
Chris Forbesa36d69e2015-05-25 11:13:44 +120013378
Tobin Ehliscde08892015-09-22 10:11:37 -060013379#if IMAGE_TESTS
Karl Schultz6addd812016-02-02 17:17:23 -070013380TEST_F(VkLayerTest, InvalidImageView) {
13381 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060013382
Karl Schultz6addd812016-02-02 17:17:23 -070013383 m_errorMonitor->SetDesiredFailureMsg(
13384 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013385 "vkCreateImageView called with baseMipLevel 10 ");
13386
Tobin Ehliscde08892015-09-22 10:11:37 -060013387 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060013388
Mike Stroyana3082432015-09-25 13:39:21 -060013389 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070013390 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060013391
Karl Schultz6addd812016-02-02 17:17:23 -070013392 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
13393 const int32_t tex_width = 32;
13394 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060013395
13396 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013397 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13398 image_create_info.pNext = NULL;
13399 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13400 image_create_info.format = tex_format;
13401 image_create_info.extent.width = tex_width;
13402 image_create_info.extent.height = tex_height;
13403 image_create_info.extent.depth = 1;
13404 image_create_info.mipLevels = 1;
13405 image_create_info.arrayLayers = 1;
13406 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13407 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13408 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
13409 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060013410
Chia-I Wuf7458c52015-10-26 21:10:41 +080013411 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060013412 ASSERT_VK_SUCCESS(err);
13413
13414 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013415 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13416 image_view_create_info.image = image;
13417 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
13418 image_view_create_info.format = tex_format;
13419 image_view_create_info.subresourceRange.layerCount = 1;
13420 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
13421 image_view_create_info.subresourceRange.levelCount = 1;
13422 image_view_create_info.subresourceRange.aspectMask =
13423 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060013424
13425 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070013426 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
13427 &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060013428
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013429 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060013430 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060013431}
Mike Stroyana3082432015-09-25 13:39:21 -060013432
Mark Youngd339ba32016-05-30 13:28:35 -060013433TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
13434 VkResult err;
13435
13436 m_errorMonitor->SetDesiredFailureMsg(
13437 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13438 "vkCreateImageView called with invalid memory ");
13439
13440 ASSERT_NO_FATAL_FAILURE(InitState());
13441
13442 // Create an image and try to create a view with no memory backing the image
13443 VkImage image;
13444
13445 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
13446 const int32_t tex_width = 32;
13447 const int32_t tex_height = 32;
13448
13449 VkImageCreateInfo image_create_info = {};
13450 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13451 image_create_info.pNext = NULL;
13452 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13453 image_create_info.format = tex_format;
13454 image_create_info.extent.width = tex_width;
13455 image_create_info.extent.height = tex_height;
13456 image_create_info.extent.depth = 1;
13457 image_create_info.mipLevels = 1;
13458 image_create_info.arrayLayers = 1;
13459 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13460 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13461 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
13462 image_create_info.flags = 0;
13463
13464 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
13465 ASSERT_VK_SUCCESS(err);
13466
13467 VkImageViewCreateInfo image_view_create_info = {};
13468 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13469 image_view_create_info.image = image;
13470 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
13471 image_view_create_info.format = tex_format;
13472 image_view_create_info.subresourceRange.layerCount = 1;
13473 image_view_create_info.subresourceRange.baseMipLevel = 0;
13474 image_view_create_info.subresourceRange.levelCount = 1;
13475 image_view_create_info.subresourceRange.aspectMask =
13476 VK_IMAGE_ASPECT_COLOR_BIT;
13477
13478 VkImageView view;
13479 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
13480 &view);
13481
13482 m_errorMonitor->VerifyFound();
13483 vkDestroyImage(m_device->device(), image, NULL);
13484 // If last error is success, it still created the view, so delete it.
13485 if (err == VK_SUCCESS) {
13486 vkDestroyImageView(m_device->device(), view, NULL);
13487 }
13488
13489}
13490
Karl Schultz6addd812016-02-02 17:17:23 -070013491TEST_F(VkLayerTest, InvalidImageViewAspect) {
Tobin Ehlis1f567a22016-05-25 16:15:18 -060013492 TEST_DESCRIPTION(
13493 "Create an image and try to create a view with an invalid aspectMask");
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013494 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -070013495 "vkCreateImageView: Color image "
13496 "formats must have ONLY the "
13497 "VK_IMAGE_ASPECT_COLOR_BIT set");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013498
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013499 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013500
Karl Schultz6addd812016-02-02 17:17:23 -070013501 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060013502 VkImageObj image(m_device);
13503 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT,
13504 VK_IMAGE_TILING_LINEAR, 0);
13505 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013506
13507 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013508 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060013509 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070013510 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
13511 image_view_create_info.format = tex_format;
13512 image_view_create_info.subresourceRange.baseMipLevel = 0;
13513 image_view_create_info.subresourceRange.levelCount = 1;
13514 // Cause an error by setting an invalid image aspect
13515 image_view_create_info.subresourceRange.aspectMask =
13516 VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013517
13518 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060013519 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013520
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013521 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060013522}
13523
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013524TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070013525 VkResult err;
13526 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060013527
Karl Schultz6addd812016-02-02 17:17:23 -070013528 m_errorMonitor->SetDesiredFailureMsg(
13529 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013530 "vkCmdCopyImage: number of layers in source and destination subresources for pRegions");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013531
Mike Stroyana3082432015-09-25 13:39:21 -060013532 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060013533
13534 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070013535 VkImage srcImage;
13536 VkImage dstImage;
13537 VkDeviceMemory srcMem;
13538 VkDeviceMemory destMem;
13539 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060013540
13541 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013542 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13543 image_create_info.pNext = NULL;
13544 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13545 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
13546 image_create_info.extent.width = 32;
13547 image_create_info.extent.height = 32;
13548 image_create_info.extent.depth = 1;
13549 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013550 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070013551 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13552 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
13553 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
13554 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013555
Karl Schultz6addd812016-02-02 17:17:23 -070013556 err =
13557 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060013558 ASSERT_VK_SUCCESS(err);
13559
Karl Schultz6addd812016-02-02 17:17:23 -070013560 err =
13561 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060013562 ASSERT_VK_SUCCESS(err);
13563
13564 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013565 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070013566 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
13567 memAlloc.pNext = NULL;
13568 memAlloc.allocationSize = 0;
13569 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013570
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060013571 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060013572 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070013573 pass =
13574 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060013575 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013576 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060013577 ASSERT_VK_SUCCESS(err);
13578
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013579 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060013580 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070013581 pass =
13582 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060013583 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013584 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060013585 ASSERT_VK_SUCCESS(err);
13586
13587 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
13588 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013589 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060013590 ASSERT_VK_SUCCESS(err);
13591
13592 BeginCommandBuffer();
13593 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080013594 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060013595 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060013596 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013597 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060013598 copyRegion.srcOffset.x = 0;
13599 copyRegion.srcOffset.y = 0;
13600 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080013601 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013602 copyRegion.dstSubresource.mipLevel = 0;
13603 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060013604 // Introduce failure by forcing the dst layerCount to differ from src
13605 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013606 copyRegion.dstOffset.x = 0;
13607 copyRegion.dstOffset.y = 0;
13608 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060013609 copyRegion.extent.width = 1;
13610 copyRegion.extent.height = 1;
13611 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070013612 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
13613 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060013614 EndCommandBuffer();
13615
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013616 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060013617
Chia-I Wuf7458c52015-10-26 21:10:41 +080013618 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013619 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080013620 vkFreeMemory(m_device->device(), srcMem, NULL);
13621 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060013622}
13623
Tony Barbourd6673642016-05-05 14:46:39 -060013624TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
13625
13626 TEST_DESCRIPTION("Creating images with unsuported formats ");
13627
13628 ASSERT_NO_FATAL_FAILURE(InitState());
13629 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13630 VkImageObj image(m_device);
13631 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
13632 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
13633 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
13634 VK_IMAGE_TILING_OPTIMAL, 0);
13635 ASSERT_TRUE(image.initialized());
13636
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013637 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
13638 VkImageCreateInfo image_create_info;
13639 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13640 image_create_info.pNext = NULL;
13641 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13642 image_create_info.format = VK_FORMAT_UNDEFINED;
13643 image_create_info.extent.width = 32;
13644 image_create_info.extent.height = 32;
13645 image_create_info.extent.depth = 1;
13646 image_create_info.mipLevels = 1;
13647 image_create_info.arrayLayers = 1;
13648 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13649 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
13650 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
13651 image_create_info.flags = 0;
13652
13653 m_errorMonitor->SetDesiredFailureMsg(
13654 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13655 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
13656
13657 VkImage localImage;
13658 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
13659 m_errorMonitor->VerifyFound();
13660
Tony Barbourd6673642016-05-05 14:46:39 -060013661 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013662 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060013663 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
13664 VkFormat format = static_cast<VkFormat>(f);
13665 VkFormatProperties fProps = m_device->format_properties(format);
13666 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 &&
13667 fProps.optimalTilingFeatures == 0) {
13668 unsupported = format;
13669 break;
13670 }
13671 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013672
Tony Barbourd6673642016-05-05 14:46:39 -060013673 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060013674 image_create_info.format = unsupported;
Tony Barbourd6673642016-05-05 14:46:39 -060013675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013676 "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060013677
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060013678 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060013679 m_errorMonitor->VerifyFound();
13680 }
13681}
13682
13683TEST_F(VkLayerTest, ImageLayerViewTests) {
13684 VkResult ret;
13685 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
13686
13687 ASSERT_NO_FATAL_FAILURE(InitState());
13688
13689 VkImageObj image(m_device);
13690 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
13691 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
13692 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
13693 VK_IMAGE_TILING_OPTIMAL, 0);
13694 ASSERT_TRUE(image.initialized());
13695
13696 VkImageView imgView;
13697 VkImageViewCreateInfo imgViewInfo = {};
13698 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13699 imgViewInfo.image = image.handle();
13700 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
13701 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
13702 imgViewInfo.subresourceRange.layerCount = 1;
13703 imgViewInfo.subresourceRange.baseMipLevel = 0;
13704 imgViewInfo.subresourceRange.levelCount = 1;
13705 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13706
13707 m_errorMonitor->SetDesiredFailureMsg(
13708 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13709 "vkCreateImageView called with baseMipLevel");
13710 // View can't have baseMipLevel >= image's mipLevels - Expect
13711 // VIEW_CREATE_ERROR
13712 imgViewInfo.subresourceRange.baseMipLevel = 1;
13713 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13714 m_errorMonitor->VerifyFound();
13715 imgViewInfo.subresourceRange.baseMipLevel = 0;
13716
13717 m_errorMonitor->SetDesiredFailureMsg(
13718 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13719 "vkCreateImageView called with baseArrayLayer");
13720 // View can't have baseArrayLayer >= image's arraySize - Expect
13721 // VIEW_CREATE_ERROR
13722 imgViewInfo.subresourceRange.baseArrayLayer = 1;
13723 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13724 m_errorMonitor->VerifyFound();
13725 imgViewInfo.subresourceRange.baseArrayLayer = 0;
13726
13727 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13728 "vkCreateImageView called with 0 in "
13729 "pCreateInfo->subresourceRange."
13730 "levelCount");
13731 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
13732 imgViewInfo.subresourceRange.levelCount = 0;
13733 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13734 m_errorMonitor->VerifyFound();
13735 imgViewInfo.subresourceRange.levelCount = 1;
13736
13737 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13738 "vkCreateImageView called with 0 in "
13739 "pCreateInfo->subresourceRange."
13740 "layerCount");
13741 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
13742 imgViewInfo.subresourceRange.layerCount = 0;
13743 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13744 m_errorMonitor->VerifyFound();
13745 imgViewInfo.subresourceRange.layerCount = 1;
13746
13747 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13748 "but both must be color formats");
13749 // Can't use depth format for view into color image - Expect INVALID_FORMAT
13750 imgViewInfo.format = VK_FORMAT_D24_UNORM_S8_UINT;
13751 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13752 m_errorMonitor->VerifyFound();
13753 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
13754
13755 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13756 "Formats MUST be IDENTICAL unless "
13757 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
13758 "was set on image creation.");
13759 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
13760 // VIEW_CREATE_ERROR
13761 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
13762 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13763 m_errorMonitor->VerifyFound();
13764 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
13765
13766 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13767 "can support ImageViews with "
13768 "differing formats but they must be "
13769 "in the same compatibility class.");
13770 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
13771 // VIEW_CREATE_ERROR
13772 VkImageCreateInfo mutImgInfo = image.create_info();
13773 VkImage mutImage;
13774 mutImgInfo.format = VK_FORMAT_R8_UINT;
13775 assert(
13776 m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures &
13777 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
13778 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
13779 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
13780 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
13781 ASSERT_VK_SUCCESS(ret);
13782 imgViewInfo.image = mutImage;
13783 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
13784 m_errorMonitor->VerifyFound();
13785 imgViewInfo.image = image.handle();
13786 vkDestroyImage(m_device->handle(), mutImage, NULL);
13787}
13788
13789TEST_F(VkLayerTest, MiscImageLayerTests) {
13790
13791 TEST_DESCRIPTION("Image layer tests that don't belong elsewhare");
13792
13793 ASSERT_NO_FATAL_FAILURE(InitState());
13794
13795 VkImageObj image(m_device);
13796 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
13797 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
13798 VK_IMAGE_USAGE_TRANSFER_DST_BIT,
13799 VK_IMAGE_TILING_OPTIMAL, 0);
13800 ASSERT_TRUE(image.initialized());
13801
13802 m_errorMonitor->SetDesiredFailureMsg(
13803 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13804 "number of layers in image subresource is zero");
13805 vk_testing::Buffer buffer;
13806 VkMemoryPropertyFlags reqs = 0;
13807 buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
13808 VkBufferImageCopy region = {};
13809 region.bufferRowLength = 128;
13810 region.bufferImageHeight = 128;
13811 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13812 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
13813 region.imageSubresource.layerCount = 0;
13814 region.imageExtent.height = 4;
13815 region.imageExtent.width = 4;
13816 region.imageExtent.depth = 1;
13817 m_commandBuffer->BeginCommandBuffer();
13818 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
13819 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
13820 1, &region);
13821 m_errorMonitor->VerifyFound();
13822 region.imageSubresource.layerCount = 1;
13823
13824 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13825 "aspectMasks for each region must "
13826 "specify only COLOR or DEPTH or "
13827 "STENCIL");
13828 // Expect MISMATCHED_IMAGE_ASPECT
13829 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
13830 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(),
13831 image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
13832 1, &region);
13833 m_errorMonitor->VerifyFound();
13834 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13835
13836 m_errorMonitor->SetDesiredFailureMsg(
13837 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13838 "If the format of srcImage is a depth, stencil, depth stencil or "
13839 "integer-based format then filter must be VK_FILTER_NEAREST");
13840 // Expect INVALID_FILTER
13841 VkImageObj intImage1(m_device);
13842 intImage1.init(128, 128, VK_FORMAT_R8_UINT,
13843 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
13844 0);
13845 VkImageObj intImage2(m_device);
13846 intImage2.init(128, 128, VK_FORMAT_R8_UINT,
13847 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
13848 0);
13849 VkImageBlit blitRegion = {};
13850 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13851 blitRegion.srcSubresource.baseArrayLayer = 0;
13852 blitRegion.srcSubresource.layerCount = 1;
13853 blitRegion.srcSubresource.mipLevel = 0;
13854 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13855 blitRegion.dstSubresource.baseArrayLayer = 0;
13856 blitRegion.dstSubresource.layerCount = 1;
13857 blitRegion.dstSubresource.mipLevel = 0;
13858
13859 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(),
13860 intImage1.layout(), intImage2.handle(), intImage2.layout(),
13861 16, &blitRegion, VK_FILTER_LINEAR);
13862 m_errorMonitor->VerifyFound();
13863
13864 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13865 "called with 0 in ppMemoryBarriers");
13866 VkImageMemoryBarrier img_barrier;
13867 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
13868 img_barrier.pNext = NULL;
13869 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
13870 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
13871 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
13872 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
13873 img_barrier.image = image.handle();
13874 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
13875 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
13876 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13877 img_barrier.subresourceRange.baseArrayLayer = 0;
13878 img_barrier.subresourceRange.baseMipLevel = 0;
13879 // layerCount should not be 0 - Expect INVALID_IMAGE_RESOURCE
13880 img_barrier.subresourceRange.layerCount = 0;
13881 img_barrier.subresourceRange.levelCount = 1;
13882 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
13883 VK_PIPELINE_STAGE_HOST_BIT,
13884 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
13885 nullptr, 1, &img_barrier);
13886 m_errorMonitor->VerifyFound();
13887 img_barrier.subresourceRange.layerCount = 1;
13888}
13889
13890TEST_F(VkLayerTest, ImageFormatLimits) {
13891
13892 TEST_DESCRIPTION("Exceed the limits of image format ");
13893
13894 m_errorMonitor->SetDesiredFailureMsg(
13895 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13896 "CreateImage extents exceed allowable limits for format");
13897 VkImageCreateInfo image_create_info = {};
13898 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13899 image_create_info.pNext = NULL;
13900 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13901 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
13902 image_create_info.extent.width = 32;
13903 image_create_info.extent.height = 32;
13904 image_create_info.extent.depth = 1;
13905 image_create_info.mipLevels = 1;
13906 image_create_info.arrayLayers = 1;
13907 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13908 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13909 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
13910 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
13911 image_create_info.flags = 0;
13912
13913 VkImage nullImg;
13914 VkImageFormatProperties imgFmtProps;
13915 vkGetPhysicalDeviceImageFormatProperties(
13916 gpu(), image_create_info.format, image_create_info.imageType,
13917 image_create_info.tiling, image_create_info.usage,
13918 image_create_info.flags, &imgFmtProps);
13919 image_create_info.extent.depth = imgFmtProps.maxExtent.depth + 1;
13920 // Expect INVALID_FORMAT_LIMITS_VIOLATION
13921 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
13922 m_errorMonitor->VerifyFound();
13923 image_create_info.extent.depth = 1;
13924
13925 m_errorMonitor->SetDesiredFailureMsg(
13926 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13927 "exceeds allowable maximum supported by format of");
13928 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
13929 // Expect INVALID_FORMAT_LIMITS_VIOLATION
13930 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
13931 m_errorMonitor->VerifyFound();
13932 image_create_info.mipLevels = 1;
13933
13934 m_errorMonitor->SetDesiredFailureMsg(
13935 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13936 "exceeds allowable maximum supported by format of");
13937 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
13938 // Expect INVALID_FORMAT_LIMITS_VIOLATION
13939 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
13940 m_errorMonitor->VerifyFound();
13941 image_create_info.arrayLayers = 1;
13942
13943 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13944 "is not supported by format");
13945 int samples = imgFmtProps.sampleCounts >> 1;
13946 image_create_info.samples = (VkSampleCountFlagBits)samples;
13947 // Expect INVALID_FORMAT_LIMITS_VIOLATION
13948 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
13949 m_errorMonitor->VerifyFound();
13950 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13951
13952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13953 "pCreateInfo->initialLayout, must be "
13954 "VK_IMAGE_LAYOUT_UNDEFINED or "
13955 "VK_IMAGE_LAYOUT_PREINITIALIZED");
13956 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
13957 // Expect INVALID_LAYOUT
13958 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
13959 m_errorMonitor->VerifyFound();
13960 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
13961}
13962
Karl Schultz6addd812016-02-02 17:17:23 -070013963TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060013964 VkResult err;
13965 bool pass;
13966
13967 // Create color images with different format sizes and try to copy between them
13968 m_errorMonitor->SetDesiredFailureMsg(
13969 VK_DEBUG_REPORT_ERROR_BIT_EXT,
13970 "vkCmdCopyImage called with unmatched source and dest image format sizes");
13971
13972 ASSERT_NO_FATAL_FAILURE(InitState());
13973
13974 // Create two images of different types and try to copy between them
13975 VkImage srcImage;
13976 VkImage dstImage;
13977 VkDeviceMemory srcMem;
13978 VkDeviceMemory destMem;
13979 VkMemoryRequirements memReqs;
13980
13981 VkImageCreateInfo image_create_info = {};
13982 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
13983 image_create_info.pNext = NULL;
13984 image_create_info.imageType = VK_IMAGE_TYPE_2D;
13985 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
13986 image_create_info.extent.width = 32;
13987 image_create_info.extent.height = 32;
13988 image_create_info.extent.depth = 1;
13989 image_create_info.mipLevels = 1;
13990 image_create_info.arrayLayers = 1;
13991 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
13992 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
13993 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
13994 image_create_info.flags = 0;
13995
13996 err =
13997 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
13998 ASSERT_VK_SUCCESS(err);
13999
14000 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
14001 // Introduce failure by creating second image with a different-sized format.
14002 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
14003
14004 err =
14005 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
14006 ASSERT_VK_SUCCESS(err);
14007
14008 // Allocate memory
14009 VkMemoryAllocateInfo memAlloc = {};
14010 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14011 memAlloc.pNext = NULL;
14012 memAlloc.allocationSize = 0;
14013 memAlloc.memoryTypeIndex = 0;
14014
14015 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
14016 memAlloc.allocationSize = memReqs.size;
14017 pass =
14018 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
14019 ASSERT_TRUE(pass);
14020 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
14021 ASSERT_VK_SUCCESS(err);
14022
14023 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
14024 memAlloc.allocationSize = memReqs.size;
14025 pass =
14026 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
14027 ASSERT_TRUE(pass);
14028 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
14029 ASSERT_VK_SUCCESS(err);
14030
14031 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14032 ASSERT_VK_SUCCESS(err);
14033 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
14034 ASSERT_VK_SUCCESS(err);
14035
14036 BeginCommandBuffer();
14037 VkImageCopy copyRegion;
14038 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14039 copyRegion.srcSubresource.mipLevel = 0;
14040 copyRegion.srcSubresource.baseArrayLayer = 0;
14041 copyRegion.srcSubresource.layerCount = 0;
14042 copyRegion.srcOffset.x = 0;
14043 copyRegion.srcOffset.y = 0;
14044 copyRegion.srcOffset.z = 0;
14045 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
14046 copyRegion.dstSubresource.mipLevel = 0;
14047 copyRegion.dstSubresource.baseArrayLayer = 0;
14048 copyRegion.dstSubresource.layerCount = 0;
14049 copyRegion.dstOffset.x = 0;
14050 copyRegion.dstOffset.y = 0;
14051 copyRegion.dstOffset.z = 0;
14052 copyRegion.extent.width = 1;
14053 copyRegion.extent.height = 1;
14054 copyRegion.extent.depth = 1;
14055 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14056 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
14057 EndCommandBuffer();
14058
14059 m_errorMonitor->VerifyFound();
14060
14061 vkDestroyImage(m_device->device(), srcImage, NULL);
14062 vkDestroyImage(m_device->device(), dstImage, NULL);
14063 vkFreeMemory(m_device->device(), srcMem, NULL);
14064 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014065}
14066
Karl Schultz6addd812016-02-02 17:17:23 -070014067TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
14068 VkResult err;
14069 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014070
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014071 // Create a color image and a depth/stencil image and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014072 m_errorMonitor->SetDesiredFailureMsg(
14073 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014074 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014075
Mike Stroyana3082432015-09-25 13:39:21 -060014076 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014077
14078 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014079 VkImage srcImage;
14080 VkImage dstImage;
14081 VkDeviceMemory srcMem;
14082 VkDeviceMemory destMem;
14083 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014084
14085 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014086 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14087 image_create_info.pNext = NULL;
14088 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14089 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14090 image_create_info.extent.width = 32;
14091 image_create_info.extent.height = 32;
14092 image_create_info.extent.depth = 1;
14093 image_create_info.mipLevels = 1;
14094 image_create_info.arrayLayers = 1;
14095 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14096 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14097 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14098 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014099
Karl Schultz6addd812016-02-02 17:17:23 -070014100 err =
14101 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014102 ASSERT_VK_SUCCESS(err);
14103
Karl Schultzbdb75952016-04-19 11:36:49 -060014104 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
14105
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014106 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070014107 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060014108 image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
14109 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014110
Karl Schultz6addd812016-02-02 17:17:23 -070014111 err =
14112 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014113 ASSERT_VK_SUCCESS(err);
14114
14115 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014116 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014117 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14118 memAlloc.pNext = NULL;
14119 memAlloc.allocationSize = 0;
14120 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014121
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014122 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014123 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014124 pass =
14125 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014126 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014127 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014128 ASSERT_VK_SUCCESS(err);
14129
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014130 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014131 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014132 pass =
14133 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014134 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014135 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014136 ASSERT_VK_SUCCESS(err);
14137
14138 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14139 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014140 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014141 ASSERT_VK_SUCCESS(err);
14142
14143 BeginCommandBuffer();
14144 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014145 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014146 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014147 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014148 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014149 copyRegion.srcOffset.x = 0;
14150 copyRegion.srcOffset.y = 0;
14151 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014152 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014153 copyRegion.dstSubresource.mipLevel = 0;
14154 copyRegion.dstSubresource.baseArrayLayer = 0;
14155 copyRegion.dstSubresource.layerCount = 0;
14156 copyRegion.dstOffset.x = 0;
14157 copyRegion.dstOffset.y = 0;
14158 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014159 copyRegion.extent.width = 1;
14160 copyRegion.extent.height = 1;
14161 copyRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014162 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14163 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014164 EndCommandBuffer();
14165
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014166 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014167
Chia-I Wuf7458c52015-10-26 21:10:41 +080014168 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014169 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014170 vkFreeMemory(m_device->device(), srcMem, NULL);
14171 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014172}
14173
Karl Schultz6addd812016-02-02 17:17:23 -070014174TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
14175 VkResult err;
14176 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014177
Karl Schultz6addd812016-02-02 17:17:23 -070014178 m_errorMonitor->SetDesiredFailureMsg(
14179 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014180 "vkCmdResolveImage called with source sample count less than 2.");
14181
Mike Stroyana3082432015-09-25 13:39:21 -060014182 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014183
14184 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070014185 VkImage srcImage;
14186 VkImage dstImage;
14187 VkDeviceMemory srcMem;
14188 VkDeviceMemory destMem;
14189 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014190
14191 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014192 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14193 image_create_info.pNext = NULL;
14194 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14195 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14196 image_create_info.extent.width = 32;
14197 image_create_info.extent.height = 1;
14198 image_create_info.extent.depth = 1;
14199 image_create_info.mipLevels = 1;
14200 image_create_info.arrayLayers = 1;
14201 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14202 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14203 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
14204 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014205
Karl Schultz6addd812016-02-02 17:17:23 -070014206 err =
14207 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014208 ASSERT_VK_SUCCESS(err);
14209
Karl Schultz6addd812016-02-02 17:17:23 -070014210 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014211
Karl Schultz6addd812016-02-02 17:17:23 -070014212 err =
14213 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014214 ASSERT_VK_SUCCESS(err);
14215
14216 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014217 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014218 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14219 memAlloc.pNext = NULL;
14220 memAlloc.allocationSize = 0;
14221 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014222
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014223 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014224 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014225 pass =
14226 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014227 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014228 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014229 ASSERT_VK_SUCCESS(err);
14230
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014231 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014232 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014233 pass =
14234 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014235 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014236 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014237 ASSERT_VK_SUCCESS(err);
14238
14239 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14240 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014241 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014242 ASSERT_VK_SUCCESS(err);
14243
14244 BeginCommandBuffer();
14245 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070014246 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
14247 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060014248 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014249 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014250 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014251 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014252 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014253 resolveRegion.srcOffset.x = 0;
14254 resolveRegion.srcOffset.y = 0;
14255 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014256 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014257 resolveRegion.dstSubresource.mipLevel = 0;
14258 resolveRegion.dstSubresource.baseArrayLayer = 0;
14259 resolveRegion.dstSubresource.layerCount = 0;
14260 resolveRegion.dstOffset.x = 0;
14261 resolveRegion.dstOffset.y = 0;
14262 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014263 resolveRegion.extent.width = 1;
14264 resolveRegion.extent.height = 1;
14265 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014266 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14267 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014268 EndCommandBuffer();
14269
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014270 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014271
Chia-I Wuf7458c52015-10-26 21:10:41 +080014272 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014273 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014274 vkFreeMemory(m_device->device(), srcMem, NULL);
14275 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014276}
14277
Karl Schultz6addd812016-02-02 17:17:23 -070014278TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
14279 VkResult err;
14280 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014281
Karl Schultz6addd812016-02-02 17:17:23 -070014282 m_errorMonitor->SetDesiredFailureMsg(
14283 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014284 "vkCmdResolveImage called with dest sample count greater than 1.");
14285
Mike Stroyana3082432015-09-25 13:39:21 -060014286 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014287
Chris Forbesa7530692016-05-08 12:35:39 +120014288 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070014289 VkImage srcImage;
14290 VkImage dstImage;
14291 VkDeviceMemory srcMem;
14292 VkDeviceMemory destMem;
14293 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014294
14295 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014296 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14297 image_create_info.pNext = NULL;
14298 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14299 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14300 image_create_info.extent.width = 32;
14301 image_create_info.extent.height = 1;
14302 image_create_info.extent.depth = 1;
14303 image_create_info.mipLevels = 1;
14304 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120014305 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070014306 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14307 // Note: Some implementations expect color attachment usage for any
14308 // multisample surface
14309 image_create_info.usage =
14310 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14311 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014312
Karl Schultz6addd812016-02-02 17:17:23 -070014313 err =
14314 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014315 ASSERT_VK_SUCCESS(err);
14316
Karl Schultz6addd812016-02-02 17:17:23 -070014317 // Note: Some implementations expect color attachment usage for any
14318 // multisample surface
14319 image_create_info.usage =
14320 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014321
Karl Schultz6addd812016-02-02 17:17:23 -070014322 err =
14323 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014324 ASSERT_VK_SUCCESS(err);
14325
14326 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014327 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014328 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14329 memAlloc.pNext = NULL;
14330 memAlloc.allocationSize = 0;
14331 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014332
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014333 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014334 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014335 pass =
14336 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014337 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014338 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014339 ASSERT_VK_SUCCESS(err);
14340
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014341 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014342 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014343 pass =
14344 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014345 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014346 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014347 ASSERT_VK_SUCCESS(err);
14348
14349 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14350 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014351 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014352 ASSERT_VK_SUCCESS(err);
14353
14354 BeginCommandBuffer();
14355 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070014356 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
14357 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060014358 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014359 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014360 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014361 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014362 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014363 resolveRegion.srcOffset.x = 0;
14364 resolveRegion.srcOffset.y = 0;
14365 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014366 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014367 resolveRegion.dstSubresource.mipLevel = 0;
14368 resolveRegion.dstSubresource.baseArrayLayer = 0;
14369 resolveRegion.dstSubresource.layerCount = 0;
14370 resolveRegion.dstOffset.x = 0;
14371 resolveRegion.dstOffset.y = 0;
14372 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014373 resolveRegion.extent.width = 1;
14374 resolveRegion.extent.height = 1;
14375 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014376 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14377 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014378 EndCommandBuffer();
14379
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014380 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014381
Chia-I Wuf7458c52015-10-26 21:10:41 +080014382 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014383 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014384 vkFreeMemory(m_device->device(), srcMem, NULL);
14385 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014386}
14387
Karl Schultz6addd812016-02-02 17:17:23 -070014388TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
14389 VkResult err;
14390 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014391
Karl Schultz6addd812016-02-02 17:17:23 -070014392 m_errorMonitor->SetDesiredFailureMsg(
14393 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014394 "vkCmdResolveImage called with unmatched source and dest formats.");
14395
Mike Stroyana3082432015-09-25 13:39:21 -060014396 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014397
14398 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014399 VkImage srcImage;
14400 VkImage dstImage;
14401 VkDeviceMemory srcMem;
14402 VkDeviceMemory destMem;
14403 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014404
14405 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014406 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14407 image_create_info.pNext = NULL;
14408 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14409 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14410 image_create_info.extent.width = 32;
14411 image_create_info.extent.height = 1;
14412 image_create_info.extent.depth = 1;
14413 image_create_info.mipLevels = 1;
14414 image_create_info.arrayLayers = 1;
14415 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
14416 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14417 // Note: Some implementations expect color attachment usage for any
14418 // multisample surface
14419 image_create_info.usage =
14420 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14421 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014422
Karl Schultz6addd812016-02-02 17:17:23 -070014423 err =
14424 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014425 ASSERT_VK_SUCCESS(err);
14426
Karl Schultz6addd812016-02-02 17:17:23 -070014427 // Set format to something other than source image
14428 image_create_info.format = VK_FORMAT_R32_SFLOAT;
14429 // Note: Some implementations expect color attachment usage for any
14430 // multisample surface
14431 image_create_info.usage =
14432 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14433 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014434
Karl Schultz6addd812016-02-02 17:17:23 -070014435 err =
14436 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014437 ASSERT_VK_SUCCESS(err);
14438
14439 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014440 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014441 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14442 memAlloc.pNext = NULL;
14443 memAlloc.allocationSize = 0;
14444 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014445
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014446 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014447 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014448 pass =
14449 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014450 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014451 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014452 ASSERT_VK_SUCCESS(err);
14453
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014454 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014455 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014456 pass =
14457 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014458 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014459 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014460 ASSERT_VK_SUCCESS(err);
14461
14462 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14463 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014464 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014465 ASSERT_VK_SUCCESS(err);
14466
14467 BeginCommandBuffer();
14468 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070014469 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
14470 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060014471 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014472 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014473 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014474 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014475 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014476 resolveRegion.srcOffset.x = 0;
14477 resolveRegion.srcOffset.y = 0;
14478 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014479 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014480 resolveRegion.dstSubresource.mipLevel = 0;
14481 resolveRegion.dstSubresource.baseArrayLayer = 0;
14482 resolveRegion.dstSubresource.layerCount = 0;
14483 resolveRegion.dstOffset.x = 0;
14484 resolveRegion.dstOffset.y = 0;
14485 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014486 resolveRegion.extent.width = 1;
14487 resolveRegion.extent.height = 1;
14488 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014489 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14490 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014491 EndCommandBuffer();
14492
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014493 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014494
Chia-I Wuf7458c52015-10-26 21:10:41 +080014495 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014496 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014497 vkFreeMemory(m_device->device(), srcMem, NULL);
14498 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014499}
14500
Karl Schultz6addd812016-02-02 17:17:23 -070014501TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
14502 VkResult err;
14503 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060014504
Karl Schultz6addd812016-02-02 17:17:23 -070014505 m_errorMonitor->SetDesiredFailureMsg(
14506 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014507 "vkCmdResolveImage called with unmatched source and dest image types.");
14508
Mike Stroyana3082432015-09-25 13:39:21 -060014509 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060014510
14511 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070014512 VkImage srcImage;
14513 VkImage dstImage;
14514 VkDeviceMemory srcMem;
14515 VkDeviceMemory destMem;
14516 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060014517
14518 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014519 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14520 image_create_info.pNext = NULL;
14521 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14522 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
14523 image_create_info.extent.width = 32;
14524 image_create_info.extent.height = 1;
14525 image_create_info.extent.depth = 1;
14526 image_create_info.mipLevels = 1;
14527 image_create_info.arrayLayers = 1;
14528 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
14529 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14530 // Note: Some implementations expect color attachment usage for any
14531 // multisample surface
14532 image_create_info.usage =
14533 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14534 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014535
Karl Schultz6addd812016-02-02 17:17:23 -070014536 err =
14537 vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014538 ASSERT_VK_SUCCESS(err);
14539
Karl Schultz6addd812016-02-02 17:17:23 -070014540 image_create_info.imageType = VK_IMAGE_TYPE_1D;
14541 // Note: Some implementations expect color attachment usage for any
14542 // multisample surface
14543 image_create_info.usage =
14544 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14545 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014546
Karl Schultz6addd812016-02-02 17:17:23 -070014547 err =
14548 vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060014549 ASSERT_VK_SUCCESS(err);
14550
14551 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014552 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014553 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
14554 memAlloc.pNext = NULL;
14555 memAlloc.allocationSize = 0;
14556 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014557
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060014558 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014559 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014560 pass =
14561 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014562 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014563 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014564 ASSERT_VK_SUCCESS(err);
14565
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014566 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060014567 memAlloc.allocationSize = memReqs.size;
Karl Schultz6addd812016-02-02 17:17:23 -070014568 pass =
14569 m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060014570 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014571 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060014572 ASSERT_VK_SUCCESS(err);
14573
14574 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
14575 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014576 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060014577 ASSERT_VK_SUCCESS(err);
14578
14579 BeginCommandBuffer();
14580 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070014581 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
14582 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060014583 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014584 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060014585 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060014586 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014587 resolveRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014588 resolveRegion.srcOffset.x = 0;
14589 resolveRegion.srcOffset.y = 0;
14590 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080014591 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014592 resolveRegion.dstSubresource.mipLevel = 0;
14593 resolveRegion.dstSubresource.baseArrayLayer = 0;
14594 resolveRegion.dstSubresource.layerCount = 0;
14595 resolveRegion.dstOffset.x = 0;
14596 resolveRegion.dstOffset.y = 0;
14597 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060014598 resolveRegion.extent.width = 1;
14599 resolveRegion.extent.height = 1;
14600 resolveRegion.extent.depth = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070014601 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage,
14602 VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Mike Stroyana3082432015-09-25 13:39:21 -060014603 EndCommandBuffer();
14604
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014605 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060014606
Chia-I Wuf7458c52015-10-26 21:10:41 +080014607 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014608 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014609 vkFreeMemory(m_device->device(), srcMem, NULL);
14610 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060014611}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014612
Karl Schultz6addd812016-02-02 17:17:23 -070014613TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014614 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070014615 // to using a DS format, then cause it to hit error due to COLOR_BIT not
14616 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014617 // The image format check comes 2nd in validation so we trigger it first,
14618 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070014619 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014620
Karl Schultz6addd812016-02-02 17:17:23 -070014621 m_errorMonitor->SetDesiredFailureMsg(
14622 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014623 "Combination depth/stencil image formats can have only the ");
14624
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014625 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014626
Chia-I Wu1b99bb22015-10-27 19:25:11 +080014627 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014628 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
14629 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014630
14631 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014632 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
14633 ds_pool_ci.pNext = NULL;
14634 ds_pool_ci.maxSets = 1;
14635 ds_pool_ci.poolSizeCount = 1;
14636 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014637
14638 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -070014639 err =
14640 vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014641 ASSERT_VK_SUCCESS(err);
14642
14643 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014644 dsl_binding.binding = 0;
14645 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
14646 dsl_binding.descriptorCount = 1;
14647 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
14648 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014649
14650 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014651 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
14652 ds_layout_ci.pNext = NULL;
14653 ds_layout_ci.bindingCount = 1;
14654 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014655 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070014656 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
14657 &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014658 ASSERT_VK_SUCCESS(err);
14659
14660 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014661 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080014662 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070014663 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014664 alloc_info.descriptorPool = ds_pool;
14665 alloc_info.pSetLayouts = &ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -070014666 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info,
14667 &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014668 ASSERT_VK_SUCCESS(err);
14669
Karl Schultz6addd812016-02-02 17:17:23 -070014670 VkImage image_bad;
14671 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014672 // One bad format and one good format for Color attachment
Tobin Ehlis269f0322016-05-25 16:24:21 -060014673 const VkFormat tex_format_bad = VK_FORMAT_D24_UNORM_S8_UINT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014674 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070014675 const int32_t tex_width = 32;
14676 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014677
14678 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014679 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14680 image_create_info.pNext = NULL;
14681 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14682 image_create_info.format = tex_format_bad;
14683 image_create_info.extent.width = tex_width;
14684 image_create_info.extent.height = tex_height;
14685 image_create_info.extent.depth = 1;
14686 image_create_info.mipLevels = 1;
14687 image_create_info.arrayLayers = 1;
14688 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14689 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14690 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
14691 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
14692 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014693
Karl Schultz6addd812016-02-02 17:17:23 -070014694 err =
14695 vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014696 ASSERT_VK_SUCCESS(err);
14697 image_create_info.format = tex_format_good;
Karl Schultz6addd812016-02-02 17:17:23 -070014698 image_create_info.usage =
14699 VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
14700 err = vkCreateImage(m_device->device(), &image_create_info, NULL,
14701 &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014702 ASSERT_VK_SUCCESS(err);
14703
14704 VkImageViewCreateInfo image_view_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070014705 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14706 image_view_create_info.image = image_bad;
14707 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
14708 image_view_create_info.format = tex_format_bad;
14709 image_view_create_info.subresourceRange.baseArrayLayer = 0;
14710 image_view_create_info.subresourceRange.baseMipLevel = 0;
14711 image_view_create_info.subresourceRange.layerCount = 1;
14712 image_view_create_info.subresourceRange.levelCount = 1;
14713 image_view_create_info.subresourceRange.aspectMask =
14714 VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014715
14716 VkImageView view;
Karl Schultz6addd812016-02-02 17:17:23 -070014717 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL,
14718 &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014719
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014720 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014721
Chia-I Wuf7458c52015-10-26 21:10:41 +080014722 vkDestroyImage(m_device->device(), image_bad, NULL);
14723 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080014724 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
14725 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060014726}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060014727
14728TEST_F(VkLayerTest, ClearImageErrors) {
14729 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and "
14730 "ClearDepthStencilImage with a color image.");
14731
14732 ASSERT_NO_FATAL_FAILURE(InitState());
14733 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14734
14735 // Renderpass is started here so end it as Clear cmds can't be in renderpass
14736 BeginCommandBuffer();
14737 m_commandBuffer->EndRenderPass();
14738
14739 // Color image
14740 VkClearColorValue clear_color;
14741 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
14742 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
14743 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
14744 const int32_t img_width = 32;
14745 const int32_t img_height = 32;
14746 VkImageCreateInfo image_create_info = {};
14747 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
14748 image_create_info.pNext = NULL;
14749 image_create_info.imageType = VK_IMAGE_TYPE_2D;
14750 image_create_info.format = color_format;
14751 image_create_info.extent.width = img_width;
14752 image_create_info.extent.height = img_height;
14753 image_create_info.extent.depth = 1;
14754 image_create_info.mipLevels = 1;
14755 image_create_info.arrayLayers = 1;
14756 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
14757 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
14758 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
14759
14760 vk_testing::Image color_image;
14761 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info,
14762 reqs);
14763
14764 const VkImageSubresourceRange color_range =
14765 vk_testing::Image::subresource_range(image_create_info,
14766 VK_IMAGE_ASPECT_COLOR_BIT);
14767
14768 // Depth/Stencil image
14769 VkClearDepthStencilValue clear_value = {0};
14770 reqs = 0; // don't need HOST_VISIBLE DS image
14771 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
14772 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
14773 ds_image_create_info.format = VK_FORMAT_D24_UNORM_S8_UINT;
14774 ds_image_create_info.extent.width = 64;
14775 ds_image_create_info.extent.height = 64;
14776 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
14777 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
14778
14779 vk_testing::Image ds_image;
14780 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info,
14781 reqs);
14782
14783 const VkImageSubresourceRange ds_range =
14784 vk_testing::Image::subresource_range(ds_image_create_info,
14785 VK_IMAGE_ASPECT_DEPTH_BIT);
14786
14787 m_errorMonitor->SetDesiredFailureMsg(
14788 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14789 "vkCmdClearColorImage called with depth/stencil image.");
14790
14791 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
14792 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
14793 &color_range);
14794
14795 m_errorMonitor->VerifyFound();
14796
Tony Barbour26434b92016-06-02 09:43:50 -060014797 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14798 "vkCmdClearColorImage called with "
14799 "image created without "
14800 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
14801
14802 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(),
14803 VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
14804 &color_range);
14805
14806 m_errorMonitor->VerifyFound();
14807
Tobin Ehlis6e23d772016-05-19 11:08:34 -060014808 // Call CmdClearDepthStencilImage with color image
14809 m_errorMonitor->SetDesiredFailureMsg(
14810 VK_DEBUG_REPORT_ERROR_BIT_EXT,
14811 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
14812
14813 vkCmdClearDepthStencilImage(
14814 m_commandBuffer->GetBufferHandle(), color_image.handle(),
14815 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, &clear_value, 1,
14816 &ds_range);
14817
14818 m_errorMonitor->VerifyFound();
14819}
Tobin Ehliscde08892015-09-22 10:11:37 -060014820#endif // IMAGE_TESTS
14821
Tony Barbour300a6082015-04-07 13:44:53 -060014822int main(int argc, char **argv) {
14823 int result;
14824
Cody Northrop8e54a402016-03-08 22:25:52 -070014825#ifdef ANDROID
14826 int vulkanSupport = InitVulkan();
14827 if (vulkanSupport == 0)
14828 return 1;
14829#endif
14830
Tony Barbour300a6082015-04-07 13:44:53 -060014831 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060014832 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060014833
14834 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
14835
14836 result = RUN_ALL_TESTS();
14837
Tony Barbour6918cd52015-04-09 12:58:51 -060014838 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060014839 return result;
14840}